目录
一、DockerFile是什么
DockerFile是用来构建docker镜像的文件,是一组命令参数脚本
构建步骤
1.编写一个DockerFile文件
2.通过docker build构建为一个镜像
3.docker run运行镜像
4.docker push发布镜像(DockerHub、阿里云镜像)
二、DockerFile的构建过程
构建命令脚本基础知识:
1.每个保留关键字(指令)都必须是大写字母
2.从上到下顺序执行
3.#表示注释
4.每个指令都会创建提交一个新的镜像层,并提交
DockerFile:构建文件,定义一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来的实例,用来提供服务
三、DockerFile指令说明
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
四、创建一个自己的centos镜像
1.编写DockerFile文件
[root@WRF dockerfile]# vim mydockerfile-centos
[root@WRF dockerfile]# cat mydockerfile-centos
FROM centos #基础镜像
MAINTAINER WRF<651856247@qq.com>
ENV MYPATH /user/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.通过镜像文件mydockerfile-centos构建镜像
命令:docker build -f dockerfile文件路径 -t 镜像名:[tag版本] .
[root@WRF dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
[+] Building 56.8s (8/8) FINISHED docker:default
=> [internal] load build definition from mydockerfile-centos 0.0s
=> => transferring dockerfile: 259B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 16.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/4] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 9.2s
=> => resolve docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 0.0s
=> => sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 1.20kB / 1.20kB 0.0s
=> => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B 0.0s
=> => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB 0.0s
=> => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB 6.2s
=> => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 2.6s
=> [2/4] WORKDIR /user/local 1.3s
=> [3/4] RUN yum -y install vim 23.8s
=> [4/4] RUN yum -y install net-tools 4.0s
=> exporting to image 2.2s
=> => exporting layers 2.2s
=> => writing image sha256:41f11fc9253da370995064cef10d44f3601fc6eaaa38c37bf2e5ec1869e95733 0.0s
=> => naming to docker.io/library/mycentos:0.1
3.对比官方centos和自己创建的mycentos
官方的
[root@WRF /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 2 years ago 448MB
centos latest 5d0da3dc9764 2 years ago 231MB
elasticsearch 7.6.2 f29a1ee41030 3 years ago 791MB
[root@WRF /]# docker run -it centos
[root@e66add697e6a /]# pwd #工作目录为根目录
/
[root@e66add697e6a /]# vim
bash: vim: command not found
[root@e66add697e6a /]# ifconfig #命令不可用
bash: ifconfig: command not found
自己的
[root@WRF dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 41f11fc9253d 2 minutes ago 525MB
mysql 5.7 c20987f18b13 2 years ago 448MB
centos latest 5d0da3dc9764 2 years ago 231MB
elasticsearch 7.6.2 f29a1ee41030 3 years ago 791MB
[root@WRF dockerfile]# docker run -it mycentos:0.1
[root@401061f01bfb local]# ifconfig #命令可用
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 12 bytes 1035 (1.0 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@401061f01bfb local]# pwd #工作目录为构建时添加的目录
/user/local
结论:DockerHub上提供的镜像只是最基础的,需要自己丰富完善做增强
4.列出本地镜像变更历史
命令:docker history 镜像ID
[root@WRF dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 41f11fc9253d 19 minutes ago 525MB
mysql 5.7 c20987f18b13 2 years ago 448MB
centos latest 5d0da3dc9764 2 years ago 231MB
elasticsearch 7.6.2 f29a1ee41030 3 years ago 791MB
[root@WRF dockerfile]# docker history 41f11fc9253d
IMAGE CREATED CREATED BY SIZE COMMENT
41f11fc9253d 19 minutes ago CMD ["/bin/sh" "-c" "/bin/bash"] 0B buildkit.dockerfile.v0
<missing> 19 minutes ago CMD ["/bin/sh" "-c" "echo \"----end----\""] 0B buildkit.dockerfile.v0
<missing> 19 minutes ago CMD ["/bin/sh" "-c" "echo $MYPATH"] 0B buildkit.dockerfile.v0
<missing> 19 minutes ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 19 minutes ago RUN /bin/sh -c yum -y install net-tools # bu… 25MB buildkit.dockerfile.v0
<missing> 19 minutes ago RUN /bin/sh -c yum -y install vim # buildkit 296MB buildkit.dockerfile.v0
<missing> 20 minutes ago WORKDIR /user/local 0B buildkit.dockerfile.v0
<missing> 20 minutes ago ENV MYPATH=/user/local 0B buildkit.dockerfile.v0
<missing> 20 minutes ago MAINTAINER WRF<651856247@qq.com> 0B buildkit.dockerfile.v0
<missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
五、CMD和ENTRYPOINT的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
1.测试CMD
#1.编写dockerfile文件
[root@WRF dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls", "-a"]
#2.构建镜像
[root@WRF dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
#3.run运行
[root@WRF dockerfile]# docker run 06f2cc65ea4a
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#4.追加一个命令-l,变成ls -al
[root@WRF dockerfile]# docker run 06f2cc65ea4a -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: context canceled
#CMD命令,-l替换了["ls", "-a"]命令,-l不是命令,所以报错了
2.测试ENTRYPOINT
#1.编写dockerfile文件
[root@WRF dockerfile]# vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls", "-a"]
#2.构建文件
[root@WRF dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test:0.1 .
#3.run运行 发现我们的ls -a 命令同样生效
[root@WRF /]# docker run entrypoint-test:0.1
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#4.追加命令-l, 是直接拼接到ENTRYPOINT命令的后面的
[root@WRF /]# docker run entrypoint-test:0.1 -l
total 64
drwxr-xr-x 1 root root 4096 Mar 7 09:54 .
drwxr-xr-x 1 root root 4096 Mar 7 09:54 ..
-rwxr-xr-x 1 root root 0 Mar 7 09:54 .dockerenv
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Mar 7 09:54 dev
drwxr-xr-x 1 root root 4096 Mar 7 09:54 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 176 root root 0 Mar 7 09:54 proc
dr-xr-x--- 2 root root 4096 Nov 13 2020 root
drwxr-xr-x 11 root root 4096 Nov 13 2020 run
lrwxrwxrwx 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Mar 7 09:54 sys
drwxrwxrwt 7 root root 4096 Nov 13 2020 tmp
drwxr-xr-x 13 root root 4096 Nov 13 2020 usr
drwxr-xr-x 18 root root 4096 Nov 13 2020 var
六、DockerFile制作tomcat镜像
...
七、发布自己的镜像
...
狂神笔记:狂神docker基础笔记