概述
DockerFile是用来构建Docker镜像的文件,是一个命令参数脚本。
构建步骤
- 编写一个DockerFile文件
docker build
构建成为一个镜像docker run
运行镜像docker push
发布镜像(Docker Hub、阿里云仓库)
Docker构建过程
基础知识
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层
- Dockerfile:是定义了构建镜像文件的源代码,能够构建镜像文件
- Docker Images:通过DockerFile构建生成的镜像,最终发布和运行的产品
- Docker Container:容器就是镜像运行起来提供服务的
Dockerfile的指令
#指定基础镜像,一切从这里构建
FROM
#镜像是谁写的,姓名+邮箱
MAINTAINER
#镜像构建运行时需要运行的命令
RUN
#添加的内容
ADD
#指定镜像的工作目录
WORKDIR
#指定挂载的容器卷
VOLUME
#指定暴露的端口
EXPOSE
#指定容器启动时要运行的命令,只有最后一个会生效,可被替代
CMD
#指定容器启动时要运行的命令,可以追加命令
ENTRYPOINT
#当构建一个被继承的DockerFile,这个时候就会运行ONBUILD指令
ONBUILD
#类似ADD,将文件拷贝进镜像中
COPY
#构建的时候设置环境变量
ENV
CMD和ENTRYPOINT的区别
#指定容器启动时要运行的命令,只有最后一个会生效,可被替代
CMD
#指定容器启动时要运行的命令,可以追加命令
ENTRYPOINT
测试CMD
#编写Dockerfile
FROM ubuntu
CMD ["ls","-a"]
#构建镜像
docker build -f dockerfile-cmd -t cmdtest .
#执行镜像
docker run cmdtest
.
..
.dockerenv
bin
boot
dev
etc
home
lib
lib32
...
var
#执行镜像,追加命令-l,应该变成ls -al
docker run cmdtest -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
#会发现报错,因为使用CMD的情况下,-l会替换原本的命令,-l变成了单独的命令,导致报错
测试ENTRYPOINT
#编写Dockerfile
FROM ubuntu
ENTRYPOINT ["ls","-a"]
#构建镜像
docker build -f dockerfile-entrypoint -t entrypointtest .
#执行镜像
docker run entrypointtest
.
..
.dockerenv
bin
boot
dev
etc
home
lib
lib32
...
var
#执行镜像,追加命令-l,直接拼接到ENTRYPOINT后面
docker run entrypointtest -l
total 56
drwxr-xr-x 1 root root 4096 Jan 17 09:05 .
drwxr-xr-x 1 root root 4096 Jan 17 09:05 ..
-rwxr-xr-x 1 root root 0 Jan 17 09:05 .dockerenv
lrwxrwxrwx 1 root root 7 Oct 6 16:47 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 15 2020 boot
drwxr-xr-x 5 root root 340 Jan 17 09:05 dev
drwxr-xr-x 1 root root 4096 Jan 17 09:05 etc
drwxr-xr-x 2 root root 4096 Apr 15 2020 home
...
drwxr-xr-x 11 root root 4096 Oct 6 16:58 var
实战测试
Docker Hub上大部分镜像都是从基础镜像构建的 FROM scratch
,然后配置需要的软件和配置来进行的构建。
创建一个CentOS
下面我们来搭建一个CentOS
mkdir dockerfile
cd dockerfile
vim dockerfile-centos
#编写配置文件dockerfile-centos
FROM centos
MAINTAINER feng<123456@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
#构建镜像,注意末尾的"."
docker build -f dockerfile-centos -t mycentos:1.0 .
#运行镜像
docker run -it mycentos:1.0
#测试
[root@37bb0803a98b local]# pwd
/usr/local
[root@37bb0803a98b local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 22 bytes 2780 (2.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我们还可以列出本地镜像的变更历史,使用 docker history id
命令
docker history id
#结果
IMAGE CREATED CREATED BY SIZE COMMENT
740b9ca37f79 14 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
933c400b6f16 14 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
ab7d683e5eb2 14 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
f2838ef81fb5 14 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
e2affb226eee 14 minutes ago /bin/sh -c yum -y install net-tools 28.4MB
a103352528f6 14 minutes ago /bin/sh -c yum -y install vim 66.3MB
4930d5f8e64d 15 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
3d1caaea603f 15 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
4449580bc428 15 minutes ago /bin/sh -c #(nop) MAINTAINER feng<123456@qq… 0B
5d0da3dc9764 4 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 4 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
创建Tomcat镜像
步骤
- 准备镜像文件 tomcat压缩包、jdk的压缩包
- 编写Dockerfile文件,官方命名为
Dockerfile
下载准备文件
#也可使用scp命令
#主机搭建简易python服务器
python3 -m http.server 1234 --directory Y:\Java
#Linux从主机下载文件
wget http://192.168.43.162:1234/apache-tomcat-9.0.55.tar.gz
wget http://192.168.43.162:1234/jdk1.8.0_65.tar.gz
编写Dockerfile
FROM centos
MAINTAINER feng<123456@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk1.8.0_65.tar.gz /usr/local/
ADD apache-tomcat-9.0.55.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_65
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.55
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.55
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.55/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.55/logs/catalina.out
#生成镜像文件
docker build -t mytomcat .
#启动容器
docker run -d -p 9090:8080 --name mytomcat01 -v /home/tomcat/test:/url/local/apache-tomcat-9.0.55/webapps/test -v /home/tomcat/logs:/url/local/apache-tomcat-9.0.55/logs mytomcat
发布自己的镜像
Docker Hub
- Docker Hub上注册账号
- 在服务器上登陆账号并提交镜像
#登陆Docker Hub
docker login -usename
Login Succeeded
#更改tag
docker tag id name:tag
#提交镜像,尽量带上版本号
docker push username/name:tag
阿里云镜像服务
- 登陆阿里云
- 找到镜像容器服务
- 创建命名空间
- 创建容器镜像
登陆阿里云后可以参考官方文档
参考文章