本章节主要对DockerFile进行一个全面的基础学习。主要了解DockerFile的组成,DockerFile的指令,以及通过自己编写DockerFile来构建一个自己的镜像
DockerFile
DockerFile介绍
dockerfile 是用来构建docker镜像的文件!命令参数脚本! 构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像
查看centos的github仓库
很多官方的镜像都是基础包,很多功能没有,我们通常会搭建自己的镜像!
官方既然可以制作镜像,那我们也可以
DockerFile构建过程
基础知识:
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序执行
-
表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像组件成为企业交付的标准,必须掌握
步骤:开发,部署,运维。。。缺一不可
DockerFile:构建文件,定义了一起的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来的服务器
DockerFile的指令
FROM # 基础镜像,一起从这里开始构建
MAINTAINER # 镜像是谁写的 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
例:要下载vim命令 RUN yum -y install vim # -y 所有安装配置选yes
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容。 如果添加压缩包会自动解压
文件路径 要放置到容器的目录
例: ADD xxx.gz /usr/local
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置 -p
CMD # 指定这个容器启动的时候要运行的命令 cmd echo, 只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令 可以追加命令
ONBUILD # 当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令。触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
文件路径 要放置到容器的目录
例: COPY xxx.txt /usr/local/xxx.txt
ENV # 构建的时候设置环境变量
实战测试
Docker Hub中 99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建
创建一个自己的centos
# 1 编写DockerFile文件
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# vim mydockerfile01
FROM centos:centos7 # 最新版的可能安装vim会出错
MAINTAINER queqian<xxx@gmail.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 build -f dockerfile文件路径 -t 镜像名字:[tag]
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker build -f mydockerfile01 -t mycentos:0.1 .
# 3 查看镜像
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 8d3cc10df709 About a minute ago 514MB
# 运行测试
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker run -it mycentos:0.1
[root@0ff19891269e local]# pwd
/usr/local
[root@0ff19891269e local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.4 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:04 txqueuelen 0 (Ethernet)
RX packets 13 bytes 1165 (1.1 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
[root@0ff19891269e local]# vim test
# 之前的centos官方镜像是没有ifconfig以及vim指令,且默认工作路径为/ 我们这边修改为/usr/local
查看镜像历史变更 history
我们可以列出镜像本地进行的变更历史 通过docker history 镜像id
我们平时拿到一个镜像,可以研究一下它是怎么做的
CMD和ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令 cmd echo, 只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令 可以追加命令
# 测试CMD
# 编写一个CMD命令的 dockerfile文件
FROM centos
CMD ["ls","-a"]
# 构建镜像
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker build -f dockerfile-test -t test-cmd-dockerfile .
[+] Building 0.0s (5/5) FINISHED docker:default
...
# 运行镜像 发现ls -a命令生效
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker run test-cmd-dockerfile
.
..
.dockerenv
bin
dev
# 测试 想追加命令-l 即ls -al
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker run test-cmd-dockerfile -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container:
# cmd的指令下 -l替换了CMD ["ls", "-a"] 命令,-l 不是命令所以报错
# 测试ENTRYPOINT
# 编写一个测试ENTRYPOINT命令的 dockerfile文件
FROM centos
测试ENTRYPOINT ["ls","-a"]
# 构建镜像
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker build -f test-entrypoint-dockerfile -t test-entrypoint-dockerfile .
[+] Building 0.0s (5/5) FINISHED docker:default
...
# 测试 想追加命令-l 即ls -al 成功执行
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker run test-entrypoint-dockerfile -l
total 56
drwxr-xr-x 1 root root 4096 Dec 4 09:45 .
drwxr-xr-x 1 root root 4096 Dec 4 09:45 ..
-rwxr-xr-x 1 root root 0 Dec 4 09:45 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Dec 4 09:45 dev
drwxr-xr-x 1 root root 4096 Dec 4 09:45 etc
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
# 我们的追加命令 是直接拼接在ENTRYPOINT命令的后面