dockerfile是用来构建docker镜像的文件! 命令参数脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库 私有/共有)
查看官方是怎么做的:
可以看到官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
1、dockerfile基础知识
-
每个指令都必须是大写字母
-
按照从上到下顺序执行
-
*#*表示注释
-
每一个指令都会创建体检一个新的镜像层,并提交
2、dockerfile指令
FROM # 基础镜像 比如centos
MAINTAINER # 镜像是谁写的 姓名+邮箱
RUN # 镜像构建时需要运行的命令
ADD # 添加,比如添加一个tomcat压缩包
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露端口,跟-p一个道理
RUN # 最终要运行的
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,而且可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令
COPY # 将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
3、构建自己的centos
官方的dockerfile
编写dockerfile
#
[root@localhost dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAINER liang<xx@163.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
[root@localhost dockerfile]#
构建镜像
docker build -f mydockerfile-centos -t mycentos:1.0 .
测试运行
[root@localhost dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 e608cc40dc5e 4 minutes ago 295MB
liang/centos 1.0 b48afcb6e4d5 3 days ago 215MB
tomcat02 1.0 a5fc1e2c406a 4 days ago 652MB
mysql 5.7 d589ea3123e0 7 days ago 448MB
redis latest 41de2cc0b30e 10 days ago 104MB
tomcat latest d5eef28cf41d 10 days ago 647MB
nginx latest 4bb46517cac3 4 weeks ago 133MB
centos latest 0d120b6ccaa8 4 weeks ago 215MB
[root@localhost dockerfile]# docker run -it mycentos:1.0
[root@0f1eeda36db7 local]# pwd
/usr/local #工作目录
[root@0f1eeda36db7 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.8 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:08 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.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
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@0f1eeda36db7 local]#
查看镜像构建的历史记录
[root@localhost dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 e608cc40dc5e 9 minutes ago 295MB
liang/centos 1.0 b48afcb6e4d5 3 days ago 215MB
tomcat02 1.0 a5fc1e2c406a 4 days ago 652MB
mysql 5.7 d589ea3123e0 7 days ago 448MB
redis latest 41de2cc0b30e 10 days ago 104MB
tomcat latest d5eef28cf41d 10 days ago 647MB
nginx latest 4bb46517cac3 4 weeks ago 133MB
centos latest 0d120b6ccaa8 4 weeks ago 215MB
[root@localhost dockerfile]# docker image history e608cc40dc5e
IMAGE CREATED CREATED BY SIZE COMMENT
e608cc40dc5e 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
a87d0e9aacba 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
56c3a14fb55a 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
11d311a0cc27 9 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
ad4cd221134f 9 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
ec6f401f40f9 9 minutes ago /bin/sh -c yum -y install vim 57.2MB
c19fca11ba61 9 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
a8df36d8b1e3 9 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
a628f4b86f12 9 minutes ago /bin/sh -c #(nop) MAINTAINER liang<xx@163.c… 0B
0d120b6ccaa8 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 4 weeks ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
[root@localhost dockerfile]#
CMD与ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,而且可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
# 编写dockerfile
[root@localhost dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
# 构建
[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:1.0 .
# 执行
[root@localhost dockerfile]# docker run 52ab6ffa0c59
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost dockerfile]#
# 想追加一个命令 -l ls -al
[root@localhost dockerfile]# docker run 52ab6ffa0c59 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
# CMD命令下 -l 替换了 CMD ["ls","-a"], -l不是命令所以报错
测试ENTRYPOINT
# 编写dockerfile
[root@localhost dockerfile]# vim dockerfle-entrypoint-test
FROM centos
ENTRYPOINT ["ls", "-a"]
# 构建
docker build -f dockerfle-entrypoint-test -t entrypoint-test .
# 执行
[root@localhost dockerfile]# docker run 51a3c8ca8862
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 添加命令 实际变成了 ls -al
[root@localhost dockerfile]# docker run 51a3c8ca8862 -l
total 0
drwxr-xr-x. 1 root root 6 Sep 12 09:37 .
drwxr-xr-x. 1 root root 6 Sep 12 09:37 ..
-rwxr-xr-x. 1 root root 0 Sep 12 09:37 .dockerenv
lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Sep 12 09:37 dev
drwxr-xr-x. 1 root root 66 Sep 12 09:37 etc
drwxr-xr-x. 2 root root 6 May 11 2019 home
lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------. 2 root root 6 Aug 9 21:40 lost+found
drwxr-xr-x. 2 root root 6 May 11 2019 media
drwxr-xr-x. 2 root root 6 May 11 2019 mnt
drwxr-xr-x. 2 root root 6 May 11 2019 opt
dr-xr-xr-x. 240 root root 0 Sep 12 09:37 proc
dr-xr-x---. 2 root root 162 Aug 9 21:40 root
drwxr-xr-x. 11 root root 163 Aug 9 21:40 run
lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 May 11 2019 srv
dr-xr-xr-x. 13 root root 0 Sep 5 13:37 sys
drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp
drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr
drwxr-xr-x. 20 root root 262 Aug 9 21:40 var
[root@localhost dockerfile]#
4、实战:Tomcat镜像
- 准备tomcat压缩包, jdk压缩包
- 编写Dockerfile文件