dockerfile介绍
dockerfile 是用来构建docker镜像的文件,是一些命令参数所编写的脚本
构建步骤
1 编写一个dockerfile文件
2 docker build 构建成为一个镜像
3 docker run 运行镜像
4 docker push 发布镜像(dockerhub、阿里云仓库)
查看一下官方是怎么做的 点我
很多官方镜像都是基础包,很多功能没有,我们通常会搭建自己的镜像
官方既然可以制作镜像,那我们也可以
dockerfile构建过程
基础知识
1 每个保留关键字(指令)都必须是大写字母
2 执行从上到下顺序执行
3 #表示注释
4 每一个指定都会创建并且提交一个新的镜像层
dockerfile是面向开发的,我们以后要发布项目,制作镜像,就需要编写dockerfile文件,这个文件十分简单
docker镜像逐渐成为企业交付的标准
dockerfile:构建文件,定义了一切的步骤,源代码
docker images:通过dockerfile构建生成的镜像,最终发布和运行的产品
docker容器:容器就是镜像运行起来提供服务
dockerfile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,例如添加tomcat压缩包,会自动解压
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,会被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承dockerfile,这个时候就会运行ONBUILD的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建镜像的时候设置环境变量
练习:创建一个centos镜像
# 1 编写dockerfile的文件
FROM centos
MAINTAINER alnk<1029612787@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 build -f 文件路径 -t 镜像名[:tag] .
[root@alnk diy_centos]# pwd
/root/diy_centos
[root@alnk diy_centos]# cat DockerFile
FROM centos
MAINTAINER alnk<1029612787@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
[root@alnk diy_centos]# docker build -f ./DockerFile -t mycentos:0.1 .
Step 1/10 : FROM centos
Step 2/10 : MAINTAINER alnk<1029612787@qq.com>
Step 3/10 : ENV MYPATH /usr/local
Step 4/10 : WORKDIR $MYPATH
Step 5/10 : RUN yum -y install vim
Step 6/10 : RUN yum -y install net-tools
Step 7/10 : EXPOSE 80
Step 8/10 : CMD echo $MYPATH
Step 9/10 : CMD echo "---end---"
Step 10/10 : CMD /bin/bash
Successfully built 57db65f9db70
Successfully tagged mycentos:0.1
[root@alnk diy_centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 57db65f9db70 7 seconds ago 307MB
centos latest 300e315adb2f 8 months ago 209MB
# 3 测试运行
# 官方的centos没有 ifconfig 和 vim 命令
# 官方默认的工作目录是 / 目录
[root@alnk diy_centos]# docker run -it --name mycentos01 mycentos:0.1 /bin/bash
[root@77ac0fd33484 local]# pwd
/usr/local
[root@77ac0fd33484 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.2 netmask 255.255.0.0 broadcast 172.18.255.255
[root@77ac0fd33484 local]# vi
... vim
# 4 列出该镜像的变更历史
[root@alnk diy_centos]# docker history 57db65f9db70
IMAGE CREATED CREATED BY SIZE COMMENT
57db65f9db70 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
11f16407289b 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
110af6c27d7f 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
c61839342400 5 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
20468d0a15c7 5 minutes ago /bin/sh -c yum -y install net-tools 29.5MB
c3b52ed45701 6 minutes ago /bin/sh -c yum -y install vim 68.1MB
0e902d08e457 6 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
76bca7b3b4f3 6 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
5b47927ad0f9 6 minutes ago /bin/sh -c #(nop) MAINTAINER alnk<102961278… 0B
300e315adb2f 8 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 8 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD和ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,会被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD指令
# 1 编写dockerfile
[root@alnk cmd_entrypoint]# cat dockerfile-test-cmd
FROM centos
CMD ["ls", "-a"]
# 2 构建镜像
[root@alnk cmd_entrypoint]# docker build -f ./dockerfile-test-cmd -t cmd-test:0.1 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls", "-a"]
---> Running in 4a0a23d2daeb
Removing intermediate container 4a0a23d2daeb
---> 782b4a33fa9e
Successfully built 782b4a33fa9e
Successfully tagged cmd-test:0.1
# 3 运行镜像
# 3.1 直接运行镜像
[root@alnk cmd_entrypoint]# docker run -it cmd-test:0.1
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
# 3.2 运行镜像时执行 ls -al 命令
[root@alnk cmd_entrypoint]# docker run -it cmd-test:0.1 ls -al
total 56
drwxr-xr-x 1 root root 4096 Aug 24 07:31 .
drwxr-xr-x 1 root root 4096 Aug 24 07:31 ..
# 3.3 运行镜像的时候想追加命令参数 -l 使命令成为 ls -al
# cmd 的情况下 -l 替换了 CMD [“ls”, “-a”]。 所以报错了
[root@alnk cmd_entrypoint]# docker run cmd-test:0.1 -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.
测试ENTRYPOINT指令
# 1 编写dockerfile
[root@alnk cmd_entrypoint]# cat dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls", "-a"]
# 2 构建镜像
[root@alnk cmd_entrypoint]# docker build -f ./dockerfile-test-entrypoint -t entrypoint:0.1 .
Successfully built 33ef43867938
Successfully tagged entrypoint:0.1
# 3 运行镜像
# 3.1 直接运行镜像
[root@alnk cmd_entrypoint]# docker run -it entrypoint:0.1
. .dockerenv dev home lib64 media opt root sbin sys usr
# 3.2 运行镜像时执行 ls -al 命令
# 这里报错的原因是entrypoint会把后面的命令和参数当做参数传递到容器
# 就变成了 ls -a ls -al 所以报错了
[root@alnk cmd_entrypoint]# docker run -it entrypoint:0.1 ls -al
ls: cannot access ‘ls‘: No such file or directory
# 3.3 运行镜像的时候想追加命令参数 -l 使命令成为 ls -al
# ls -a -l
[root@alnk cmd_entrypoint]# docker run -it entrypoint:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 Aug 24 07:34 .
练习:制作tomcat镜像
软件下载
# 1 准备tomcat压缩包和jdk压缩包,上传到服务器
[root@alnk tomcat]# pwd
/root/tomcat
[root@alnk tomcat]# ls
apache-tomcat-9.0.52.tar.gz jdk-8u11-linux-x64.tar.gz readme.txt
# 2 编写dockerfile文件,官方建议命名为Dockerfile,这样build的时候就会自动去寻找这个文件了
[root@alnk tomcat]# cat Dockerfile
# 基础镜像
FROM centos
# 作者信息
MAINTAINER alnk<1029612787@qq.com>
# 拷贝readme文件
COPY readme.txt /usr/local/readme.txt
# 复制解压软件包
ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.52.tar.gz /usr/local
# 安装vim
RUN yum -y install vim
# 设置工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
# tomcat jdk 环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.52
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.52
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 暴露8080端口
EXPOSE 8080
# 启动tomcat并且追踪日志
CMD /usr/local/apache-tomcat-9.0.52/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.52/bin/logs/catalina.out
# 3 构建镜像
[root@alnk tomcat]# ls
apache-tomcat-9.0.52.tar.gz Dockerfile jdk-8u11-linux-x64.tar.gz readme.txt
# 如果dockerfile文件的名称为 Dockerfile ,并且在该文件同一个目录build的时候,不需要-f参数
[root@alnk tomcat]# docker build -t diytomcat .
# 4 启动镜像
[root@alnk tomcat]# docker run -d -p 8080:8080 --name alnktomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.52/webapps/test -v /home/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.52/logs diytomcat
# 测试
# 访问IP:PORT
# 发布项目的话,直接在本地发布就可以了,因为做了卷挂载
发布镜像到阿里云仓库
1 登录阿里云
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
2 找到容器镜像服务
3 创建命名空间
4 创建镜像仓库
5 推送镜像到阿里云镜像仓库
# 1 登录阿里云镜像仓库[root@alnk test]# docker login --username=1029612787@qq.com registry.cn-hangzhou.aliyuncs.comPassword: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded# 2 推送镜像到阿里云仓库[root@alnk test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZEdiytomcat latest fe79c3ff26e2 27 minutes ago 617MB[root@alnk test]# docker tag diytomcat registry.cn-hangzhou.aliyuncs.com/alnktest/alnk-tomcat:1.0[root@alnk test]# docker push registry.cn-hangzhou.aliyuncs.com/alnktest/alnk-tomcat:1.0The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alnktest/alnk-tomcat]e96f5b4dfd86: Layer already exists 8f84ad351287: Layer already exists f30777748718: Pushing [> ] 1.594MB/324MBcb899b665885: Layer already exists 2653d992f4ef: Layer already exists
6 测试
可以到阿里云后台查看