DockerFile
DockerFile 介绍
dockerfile 是用来构建docker镜像的文件!就是命令参数脚本
构建步骤:
1.编写一个 dockerfile 文件
2.docker build 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(DockerHub、阿里云镜像仓库)
很多官方镜像都是基础包,很多功能都没有,我们需要自己构建自己的镜像。
DockerFile 构建过程
- 基础知识
1.每个保留关键字(指令)必须是大写字母
2.执行从上到下
3.#表示注释
4.每一个指令都会创建提交一个新的镜像层,并提交!
DockerFile是面向开发的,我们以后要发布项目,做镜像都需要编写dockerfile文件,这个文件十分简单!
Docker 镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维。。。缺一不可
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImage:通过DockerFile 构建生成的镜像,最终发布和运行的产品,原来是jar war
Docker容器:容器就是镜像运行起来,提供服务
DockerFile 的指令
以前是使用别人的,现在我们知道这些指令之后,可以自己构建镜像。
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录(目录是否存在都行,会自动创建,绝对相对路径都行)
VOLUME # 挂载目录
EXPOSE # 保留端口配置(只是给使用者看,不会影响 docker -p)
CMD # 指定这个容器启动的时候要运行的命令 ,只有最后一个会生效,可被替代,一般用来给 entrypoint 传递参数
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令,一般写一个容器固定的指令,cmd 和 entrypoint 配合使用的时候必须使用 json 数组的语法,多个 entrypoint 只有最后一个会生效
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,出发指令。
COPY # 类似ADD,将我们的文件拷贝到镜像中。但是COPY不会自动解压
ENV # 构建的时候设置环境变量
Dockerfile 示例
FROM centos:latest
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum clean all && yum makecache
RUN yum update -y
RUN yum -y install vim
#RUN ["yum","-y","install","vim"]
# 这个命令仅仅是声明当前容器中的服务端口
EXPOSE 8081
# 不止可以指定进入容器的默认路径,还可以为 RUN、CMD、ENTRYPOINT、COPY和ADD指定设置工作目录,不存在的目录会被1创建
ENV BASE_PATH=/apps/data
WORKDIR $BASE_PATH
# 将宿主机中上下文中的test.txt文件拷贝到 /apps/data 目录下
# ADD test.txt .
# ADD 与 COPY 区别在于,除了将文件拷贝到容器内部的功能,ADD还能处理url以及解压tar包
ADD https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.63/bin/apache-tomcat-9.0.63.tar.gz .
RUN tar -zxvf apache-tomcat-9.0.63.tar.gz -C .
RUN rm -f apache-tomcat-9.0.63.tar.gz
COPY test.txt .
# 这里仅仅是一个声明,告诉使用者容器中可以挂在这个目录到宿主机中
VOLUME $BASE_PATH
# json 数组支持传参,即在启动容器时 docker run 镜像:版本号 覆盖自定义的命令
# CMD ["ls",$BASE_PATH]
# entrypoint 覆盖命令为 docker run --entrypoint=覆盖的指令 镜像:版本号 传递的参数
# docker run --entrypoint=sh mycentos:1.0 -c "ls /"
# ENTRYPOINT ls $BASE_PATH
# ENTRYPOINT ["sh","-c","ls $BASE_PATH"]
# 一般ENTRYPOINT 和 CMD 配合使用
ENTRYPOINT ["ls"]
CMD ["/apps/data"]
实战测试
Docker Hub中,99%的镜像都是从这个基础镜像过来的FROM scratch
,然后配置需要的软件和配置来进行构建。
创建一个自己的 CentOS
- 1.编写Dockerfile文件
FROM centos
MAINTAINER hudu<2591786734@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash
- 2.通过这个文件构建镜像
# docker bulid -f dockerfile文件路径 -t 镜像名:[tag]
$ docker build -f ~/File/dockerfile/mydockerfile -t mycentos:1.0 .
- 3.测试运行
对比:之前的原生的 CentOS
我们可以列出本地镜像的变更历史
$ docker history 镜像id
我们平时拿到一个镜像,可以了解一下它是怎么做的
CMD 和 ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候要运行的命令 ,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
- 1.测试 CMD 编写一个dockerfile文件
FROM centos
CMD ["ls","-a"]
- 2.编译镜像
$ docker build -f ~/File/dockerfile/dockerfile-cmd-test -t cmdtest .
# 运行容器测试
$ docker run cmdtest
# 想追加命令,形成 ls -al,发现报错
$ docker run cmdtest -l
解释:cmd的情况下-l
替换了 CMD ["ls","-a"]
命令,-l
不是命令,所以报错!
# 所以使用
$ docker run cmdtest ls -al
- 测试 ENTRYPOINT
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker build -f dockerfile文件 -t 构建镜像文件名 目标目录
我们的追加命令是直接拼接在原来的命令之后的。
实战:Tomcat 镜像
1.准备镜像文件tomcat
压缩包,jdk
的压缩包
2.编写dockerfile文件,官方命名Dockerfile
,build会自动寻找这个文件,就不需要-f
指定了!
FROM centos
MAINTAINER hudu<2591786734@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u261-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_261
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/logs/catalina.out
3.构建镜像
$ docker build -t diytomcat:1.0 .
4.启动容器
$ docker run -d -p 9090:8080 --name hudutomcat -v ~/File/build/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v ~/File/build/tomcat/logs:/usr/local/apache-tomcat-9.0.37/logs diytomcat:1.0
5.访问测试
6.发布项目
由于我们做了卷挂载,我们直接在本地编写项目就可以发布了
目录结构
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
index.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
</head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
System.out.println("---my test web logs---");
%>
</body>
</html>
最终发布效果
查看一下日志文件,看到日志打印
发现项目部署成功,开发步骤,需要掌握Dockerfile的编写,我们之后的一切都是使用docker镜像来运行发布的。
发布自己的镜像
DockerHub
1、地址 hub.docker.com/ 注册自己的账号
2、在我们服务器上提交自己的镜像
$ docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
$ docker login -u 用户名
3、登陆完毕之后就可以提交镜像了,就是一步docker push
$ docker push hudu/diytomcat[:tag]
常见问题:
The push refers to repository [docker.io/hudu/diytomcat]
An image does not exist locally with the tag: hudu/diytomcat
解决办法:给镜像增加tag
# docker tag 镜像id 镜像名:...
$ docker tag 226dd335e7db sakuraso/tomcat:1.0
这里要注意,镜像前面要和自己的账号名保持一致。
发现可以上传了,提交的时候也是按照镜像的层级来提交的。
发布到阿里云镜像服务上
1、登陆阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
登陆
$ docker login --username=樱花庄rwby registry.cn-shanghai.aliyuncs.com
$ docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/sakuraso/hudu-test:[镜像版本号]
$ docker push registry.cn-shanghai.aliyuncs.com/sakuraso/hudu-test:[镜像版本号]
本作品采用《CC 协议》,转载必须注明作者和本文链接