流程:开发应用=>DockerFile=>打包为镜像=>上传到仓库(私有仓库,公有仓库)=> 下载镜像 => 启动运行。

6.1 DockerFile 是什么

DockerFile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本

  • 构建步骤
    • 编写 DockerFile 文件
    • docker build 构建镜像
    • docker run

6.2 DockerFile 构建过程

6.2.1 基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. # 表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

6.2.2 流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似 docker commit 的操作提交一个新的镜像层
  4. Docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成!

6.2.3 说明

从应用软件的角度来看,DockerFiledocker镜像docker容器分别代表软件的三个不同阶段。

  • DockerFile 是软件的原材料 (代码)
  • Docker 镜像则是软件的交付品 (.apk)
  • Docker 容器则是软件的运行状态 (客户下载安装执行)

DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!
image.png

  • DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权限控制)等等。
  • Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行Docker 镜像时,会真正开始提供服务;
  • Docker容器:容器是直接提供服务的。

6.3 DockerFile 指令

6.3.1 关键字

  1. FROM # 基础镜像,当前新镜像是基于哪个镜像的
  2. MAINTAINER # 镜像维护者的姓名混合邮箱地址
  3. RUN # 容器构建时需要运行的命令
  4. EXPOSE # 当前容器对外保留出的端口
  5. WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
  6. ENV # 用来在构建镜像过程中设置环境变量
  7. ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  8. COPY # 类似ADD,拷贝文件和目录到镜像中!
  9. VOLUME # 容器数据卷,用于数据保存和持久化工作
  10. CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
  11. ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
  12. ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在子镜像继承后,父镜像ONBUILD被触发

image.png
image.png

6.3.2 CMD 和 ENTRYPOINT 的区别

我们之前说过,两个命令都是指定一个容器启动时要运行的命令

  • CMD
    • Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换!
  • ENTRYPOINT
    • docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合

6.4 测试案例(自定义一个CentOs)

Docker Hub 中99% 的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的。

6.4.1 编写 DockerFile

dockerFile文件:

  1. FROM centos # 指定父镜像
  2. MAINTAINER edwarddamon<2810315114@qq.com> # 指定构建者
  3. ENV MYPATH /usr/local # 指定进入容器后的默认路径
  4. WORKDIR $MYPATH
  5. RUN yum -y install vim
  6. RUN yum -y install net-tools
  7. EXPOSE 80
  8. CMD echo $MYPATH
  9. CMD echo "-------end------"
  10. CMD /bin/bash

6.4.2 构建镜像

docker build -f dockerfile地址 -t 新镜像名字:TAG . # 如果DockerFile名不是 DockerFile docker build -t 新镜像名字:TAG . # 如果DockerFile名是 DockerFile

  1. # 从 DockerFile 文件所在文件夹进入cmd,我这里DockerFile的文件名为 dockerFile
  2. C:\Users\Edward\Desktop>docker build -f dockerFile -t mycentos:1.0 .
  3. [+] Building 21.9s (9/9) FINISHED
  4. => [internal] load build definition from dockerFile 0.0s
  5. => => transferring dockerfile: 269B 0.0s
  6. => [internal] load .dockerignore 0.0s
  7. => => transferring context: 2B 0.0s
  8. => [internal] load metadata for docker.io/library/centos:latest 3.5s
  9. => [auth] library/centos:pull token for registry-1.docker.io 0.0s
  10. => CACHED [1/4] FROM docker.io/library/centos@sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c0 0.0s
  11. => [2/4] WORKDIR /usr/local 0.0s
  12. => [3/4] RUN yum -y install vim 15.6s
  13. => [4/4] RUN yum -y install net-tools 2.2s
  14. => exporting to image 0.4s
  15. => => exporting layers 0.4s
  16. => => writing image sha256:e2d8f553fbadb92d285024f281dfbac2d7777ad7828c7432936a80204b773cb3 0.0s
  17. => => naming to docker.io/library/mycentos:1.0

6.4.3 运行容器

docker run -it 新镜像名字:TAG

  1. C:\Users\Edward\Desktop>docker run -it mycentos:1.0
  2. [root@3c5deb8bb2c2 local]# pwd
  3. /usr/local # DockerFile 文件中的的 WORKDIR

6.4.4 查看镜像构建历史

docker history 镜像名:TAG

  1. C:\Users\ECCOM\Edward>docker history mycentos:1.0
  2. IMAGE CREATED CREATED BY SIZE COMMENT
  3. e2d8f553fbad 2 minutes ago CMD ["/bin/sh" "-c" "/bin/bash"] 0B buildkit.dockerfile.v0
  4. <missing> 2 minutes ago CMD ["/bin/sh" "-c" "echo \"-------end------… 0B buildkit.dockerfile.v0
  5. <missing> 2 minutes ago CMD ["/bin/sh" "-c" "echo $MYPATH"] 0B buildkit.dockerfile.v0
  6. <missing> 2 minutes ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
  7. <missing> 2 minutes ago RUN /bin/sh -c yum -y install net-tools # bu… 14.4MB buildkit.dockerfile.v0
  8. <missing> 2 minutes ago RUN /bin/sh -c yum -y install vim # buildkit 68.1MB buildkit.dockerfile.v0
  9. <missing> 3 minutes ago WORKDIR /usr/local 0B buildkit.dockerfile.v0
  10. <missing> 3 minutes ago ENV MYPATH=/usr/local 0B buildkit.dockerfile.v0
  11. <missing> 3 minutes ago MAINTAINER edwarddamon<2810315114@qq.com> 0B buildkit.dockerfile.v0
  12. <missing> 8 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  13. <missing> 8 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
  14. <missing> 8 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB

6.5 发布镜像

发布镜像到:DockerHub 注册dockerhub https://hub.docker.com/signup,需要有一个账号

6.5.1 查看登录命令

docker login —help

  1. C:\Users\Edward\Desktop>docker login --help
  2. Log in to a Docker registry or cloud backend.
  3. If no registry server is specified, the default is defined by the daemon.
  4. Usage:
  5. docker login [OPTIONS] [SERVER] [flags]
  6. docker login [command]
  7. Available Commands:
  8. azure Log in to azure
  9. Flags:
  10. -h, --help Help for login
  11. -p, --password string password
  12. --password-stdin Take the password from stdin
  13. -u, --username string username
  14. Use "docker login [command] --help" for more information about a command.

6.5.2 登录

  1. C:\Users\Edward\Desktop>docker login -u edwarddamon
  2. Password:
  3. Login Succeeded
  • 阿里云远程仓库登录
    1. docker login --username=xxxx registry.cnbeijing.aliyuncs.com

6.5.3 改镜像名

当镜像名和期望的镜像名不一致时,可通过如下命令更改镜像名

eg: docker tag 镜像id 新镜像名:新TAG

  1. C:\Users\Edward\Desktop>docker tag e2d8f553fbad edwarddamon/mycentos:1.0

6.5.4 发布镜像

将本地镜像发布到远程仓库

eg: docker push 镜像名:TAG

  1. C:\Users\Edward\Desktop>docker push edwarddamon/mycentos:1.0
  2. The push refers to repository [docker.io/edwarddamon/mycentos]
  3. 9cf2eaebc466: Pushed
  4. 0139fae45e24: Pushed
  5. 5f70bf18a086: Pushed
  6. 2653d992f4ef: Mounted from library/centos
  7. 1.0: digest: sha256:687e85aefc646c96348278475d124a65af66077ea52f8f576ab210f73691de62 size: 1158

6.6 总结

image.png