流程:开发应用=>DockerFile=>打包为镜像=>上传到仓库(私有仓库,公有仓库)=> 下载镜像 => 启动运行。
6.1 DockerFile 是什么
DockerFile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
- 构建步骤
- 编写 DockerFile 文件
- docker build 构建镜像
- docker run
6.2 DockerFile 构建过程
6.2.1 基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
#
表示注释- 每条指令都会创建一个新的镜像层,并对镜像进行提交
6.2.2 流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似 docker commit 的操作提交一个新的镜像层
- Docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成!
6.2.3 说明
从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
- DockerFile 是软件的原材料 (代码)
- Docker 镜像则是软件的交付品 (.apk)
- Docker 容器则是软件的运行状态 (客户下载安装执行)
DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!
- DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权限控制)等等。
- Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行Docker 镜像时,会真正开始提供服务;
- Docker容器:容器是直接提供服务的。
6.3 DockerFile 指令
6.3.1 关键字
FROM # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER # 镜像维护者的姓名混合邮箱地址
RUN # 容器构建时需要运行的命令
EXPOSE # 当前容器对外保留出的端口
WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV # 用来在构建镜像过程中设置环境变量
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY # 类似ADD,拷贝文件和目录到镜像中!
VOLUME # 容器数据卷,用于数据保存和持久化工作
CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在子镜像继承后,父镜像ONBUILD被触发
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文件:
FROM centos # 指定父镜像
MAINTAINER edwarddamon<2810315114@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
6.4.2 构建镜像
docker build -f dockerfile地址 -t 新镜像名字:TAG . # 如果DockerFile名不是 DockerFile docker build -t 新镜像名字:TAG . # 如果DockerFile名是 DockerFile
# 从 DockerFile 文件所在文件夹进入cmd,我这里DockerFile的文件名为 dockerFile
C:\Users\Edward\Desktop>docker build -f dockerFile -t mycentos:1.0 .
[+] Building 21.9s (9/9) FINISHED
=> [internal] load build definition from dockerFile 0.0s
=> => transferring dockerfile: 269B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 3.5s
=> [auth] library/centos:pull token for registry-1.docker.io 0.0s
=> CACHED [1/4] FROM docker.io/library/centos@sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c0 0.0s
=> [2/4] WORKDIR /usr/local 0.0s
=> [3/4] RUN yum -y install vim 15.6s
=> [4/4] RUN yum -y install net-tools 2.2s
=> exporting to image 0.4s
=> => exporting layers 0.4s
=> => writing image sha256:e2d8f553fbadb92d285024f281dfbac2d7777ad7828c7432936a80204b773cb3 0.0s
=> => naming to docker.io/library/mycentos:1.0
6.4.3 运行容器
docker run -it 新镜像名字:TAG
C:\Users\Edward\Desktop>docker run -it mycentos:1.0
[root@3c5deb8bb2c2 local]# pwd
/usr/local # DockerFile 文件中的的 WORKDIR
6.4.4 查看镜像构建历史
docker history 镜像名:TAG
C:\Users\ECCOM\Edward>docker history mycentos:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
e2d8f553fbad 2 minutes ago CMD ["/bin/sh" "-c" "/bin/bash"] 0B buildkit.dockerfile.v0
<missing> 2 minutes ago CMD ["/bin/sh" "-c" "echo \"-------end------… 0B buildkit.dockerfile.v0
<missing> 2 minutes ago CMD ["/bin/sh" "-c" "echo $MYPATH"] 0B buildkit.dockerfile.v0
<missing> 2 minutes ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 2 minutes ago RUN /bin/sh -c yum -y install net-tools # bu… 14.4MB buildkit.dockerfile.v0
<missing> 2 minutes ago RUN /bin/sh -c yum -y install vim # buildkit 68.1MB buildkit.dockerfile.v0
<missing> 3 minutes ago WORKDIR /usr/local 0B buildkit.dockerfile.v0
<missing> 3 minutes ago ENV MYPATH=/usr/local 0B buildkit.dockerfile.v0
<missing> 3 minutes ago MAINTAINER edwarddamon<2810315114@qq.com> 0B buildkit.dockerfile.v0
<missing> 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
6.5 发布镜像
发布镜像到:DockerHub 注册dockerhub https://hub.docker.com/signup,需要有一个账号
6.5.1 查看登录命令
docker login —help
C:\Users\Edward\Desktop>docker login --help
Log in to a Docker registry or cloud backend.
If no registry server is specified, the default is defined by the daemon.
Usage:
docker login [OPTIONS] [SERVER] [flags]
docker login [command]
Available Commands:
azure Log in to azure
Flags:
-h, --help Help for login
-p, --password string password
--password-stdin Take the password from stdin
-u, --username string username
Use "docker login [command] --help" for more information about a command.
6.5.2 登录
C:\Users\Edward\Desktop>docker login -u edwarddamon
Password:
Login Succeeded
- 阿里云远程仓库登录
docker login --username=xxxx registry.cnbeijing.aliyuncs.com
6.5.3 改镜像名
当镜像名和期望的镜像名不一致时,可通过如下命令更改镜像名
eg: docker tag 镜像id 新镜像名:新TAG
C:\Users\Edward\Desktop>docker tag e2d8f553fbad edwarddamon/mycentos:1.0
6.5.4 发布镜像
将本地镜像发布到远程仓库
eg: docker push 镜像名:TAG
C:\Users\Edward\Desktop>docker push edwarddamon/mycentos:1.0
The push refers to repository [docker.io/edwarddamon/mycentos]
9cf2eaebc466: Pushed
0139fae45e24: Pushed
5f70bf18a086: Pushed
2653d992f4ef: Mounted from library/centos
1.0: digest: sha256:687e85aefc646c96348278475d124a65af66077ea52f8f576ab210f73691de62 size: 1158