⑥ DockerFile
6.1 DockerFile介绍
dockerfile
是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
在DockerHub中找一个镜像(centos为例)
点击后跳到一个Dockerfile
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
6.2 DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序
3、#表示注释
4、每一个指令都会创建提交一个新的镜像,并提交!
其中可写容器层为run启动后新增的一个镜像层
6.3 DockerFile的指令
FROM # from:基础镜像,一切从这里开始构建
MAINTAINER # maintainer:镜像是谁写的, 姓名+邮箱
RUN # run:镜像构建的时候需要运行的命令
ADD # add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # workdir:镜像的工作目录
VOLUME # volume:挂载的目录
EXPOSE # expose:保留端口配置
CMD # cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # onbuild:当构建一个被继承DockerFile这个时候就会运行onbuild的指令,触发指令
COPY # copy:类似ADD,将我们文件拷贝到镜像中
ENV # env:构建的时候设置环境变量!
6.4 实战测试
由DockerHub中查看到centos的dockerfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20200504" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-05-04 00:00:00+01:00"
CMD ["/bin/bash"]
Docker Hub 中 99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建。
创建一个自己的centos
原生的centos镜像好多命令都不能用,自定义一个可以用vim,ifconfig的centos
# 1./home下新建dockerfile目录
[root@cVzhanshi home]# mkdir dockerfile
# 2. dockerfile目录下新建mydockerfile-centos文件
[root@cVzhanshi dockerfile]# vim mydockerfile-centos
# vim的内容
FROM centos # 基础镜像是官方原生的centos
MAINTAINER cvzhanshi<cvzhanshi@qq.com> # 作者
ENV MYPATH /usr/local # 配置环境变量的目录
WORKDIR $MYPATH # 将工作目录设置为 MYPATH
RUN yum -y install vim # 给官方原生的centos 增加 vim指令
RUN yum -y install net-tools # 给官方原生的centos 增加 ifconfig命令
EXPOSE 80 # 暴露端口号为80
CMD echo $MYPATH # 输出下 MYPATH 路径
CMD echo "-----end----"
CMD /bin/bash # 启动后进入 /bin/bash
# 4.通过这个文件构建镜像
# 命令: docker build -f 文件路径 -t 镜像名:[tag] .
# 5.出现如下语句说明构建成功
Successfully built 111bd8424a21
Successfully tagged mycentos:1.0
# 运行测试
[root@cVzhanshi dockerfile]# docker run -it mycentos:1.0
我们可以列出本地进行的变更历史
[root@cVzhanshi dockerfile]# docker history 111bd8424a21
我们平时拿到一个镜像,可以用 “docker history 镜像id” 研究一下是什么做的
CMD 和 ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
# 编写dockerfile文件
[root@cVzhanshi dockerfile]# vim dockerfile-test-cmd
[root@cVzhanshi dockerfile]# cat dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]
# 构建镜像
[root@cVzhanshi dockerfile]# docker build -f dockerfile-test-cmd -t cmd-test:1.0 .
# 启动镜像 由结果可得,运行后就执行了 ls -a 命令
[root@cVzhanshi dockerfile]# docker run cmd-test:1.0
# 想追加一个命令 -l 成为ls -al:展示列表详细数据
# 重新启动镜像
[root@cVzhanshi dockerfile]# docker run cmd-test:1.0 -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.
# cmd的情况下 -l 替换了CMD["ls","-l"] 而 -l 不是命令所以报错
测试ENTRYPOINT
# 编写dockerfile文件
[root@cVzhanshi dockerfile]# vim dockerfile-test-entrypoint
[root@cVzhanshi dockerfile]# cat dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
[root@cVzhanshi dockerfile]#
# 构建镜像
[root@cVzhanshi dockerfile]# docker build -f dockerfile-test-entrypoint -t entrypoint-test:1.0 .
# 启动镜像
[root@cVzhanshi dockerfile]# docker run 7bfbded97091
# 追加命令启动镜像
[root@cVzhanshi dockerfile]# docker run 7bfbded97091 -l
6.5 实战:Tomcat镜像
准备环境
准备tomcat 和 jdk 到当前目录,编写好README
编写dockerfile文件
FROM centos # 基础镜像centos
MAINTAINER cvzhanshi<cvzhanshi@qq.com> # 作者
COPY README.txt /usr/local/README.txt # 复制README文件
ADD jdk-8u301-linux-x64.tar.gz /usr/local/ # 添加jdk,ADD 命令会自动解压
ADD apache-tomcat-9.0.50.tar.gz /usr/local/ # 添加tomcat,ADD 命令会自动解压
RUN yum -y install vim # 安装 vim 命令
ENV MYPATH /usr/local # 环境变量设置 工作目录
WORKDIR $MYPATH # 色设置工作目录
ENV JAVA_HOME /usr/local/jdk1.8.0_301 # 环境变量: JAVA_HOME环境变量
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.50 # 环境变量: tomcat环境变量
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.50
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 设置环境变量 分隔符是:
EXPOSE 8080 # 设置暴露的端口
CMD /usr/local/apache-tomcat-9.0.50/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.50/logs/catalina.out # 设置默认命令
构建镜像
# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
[root@cVzhanshi tomcat-diy]# docker build -t mytomcat:1.0 .
Successfully built 4636ac252f82
Successfully tagged mytomcat:1.0
启动镜像
[root@cVzhanshi tomcat-diy]# docker run -d -p 9090:8080 --name cvzhanshitomact -v /home/cvzhanshi/build/tomcat-diy/test:/usr/local/apache-tomcat-9.0.50/webapps/test -v /home/cvzhanshi/build/tomcat-diy/tomcatlogs:/usr/local/apache-tomcat-9.0.50/logs mytomcat:1.0
# 命令解释
-d # 后台运行
-p 9090:8080 # 把8080对外暴露成9090
--name # cvzhanshitomcat 设置名字
-v /home/cvzhanshi/build/tomcat-diy/test:/usr/local/apache-tomcat-9.0.50/webapps/test # 挂载目录
-v /home/cvzhanshi/build/tomcat-diy/tomcatlogs:/usr/local/apache-tomcat-9.0.50/logs # 挂载目录
- 在主机上查看挂在目录
- 测试tomcat
[root@cVzhanshi tomcat-diy]# curl localhost:9090
- 在外面访问
在tomcat发布Hello world项目
由于做了卷挂载,我们直接在本地编写项目就可以发布
- 直接在挂载的test文件夹下面创建index.html
内容如下
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
Hello World!
</body>
</html>
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
6.6 发布自己的镜像
发布到Docker Hub
- 地址 https://hub.docker.com/ ,进入创建账号
- 确定这个账号可以登录
- 登录 -> 发布
[root@cVzhanshi tomcat-diy]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
# 登录
[root@cVzhanshi tomcat-diy]# docker login -u cvzhanshi
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- 发布
# 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library
# 解决方法:
# 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了
[root@cVzhanshi tomcat-diy]# docker build -t cvzhanshi/mytomcat:0.1 .
# 第二种 使用docker tag #然后再次push
[root@cVzhanshi tomcat-diy]# docker tag 容器id cvzhanshi/mytomcat:1.0 #然后再次push
[root@cVzhanshi tomcat-diy]# docker push cvzhanshi/diytomcat:1.0
发布到阿里云镜像上
- 登录aliyun
- 找到容器镜像服务
- 创建命名空间
- 创建容器镜像
- 点进镜像中会有详细的教程
- 进行推送
- 上传成功后查看阿里云的镜像层,发现,每一个镜像层就是我们的一条命令
6.7 小结
其中save和load是备份的命令,把镜像打包成tar
[root@cVzhanshi test]# docker save --help
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
-o, --output string Write to a file, instead of STDOUT # 打包存储的路径