此篇笔记的意义:

  • 上次Docker的学习是好久好久以前,基础的概念和实际使用也是可以的,但是在实际工作中却很少使用(哪怕是真的方便好用),面试时候问相关知识还记得但说不出来,很尴尬。此篇笔记用作复习回忆和指导书型存档。

Docker是什么?

Docker是一个虚拟环境容器,基于Go语言,可以将开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。

Docker的三个关键概念

镜像(Image)

镜像类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。

容器(Container)

容器类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。

仓库(Repository)

仓库类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。

架构

Docker的常用命令

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 拉取镜像
docker pull centos:7
# 启动容器 -i: 交互式操作。 -t: 终端。 -d: 在后台运行。 centos: centos镜像。 /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
docker run -it centos /bin/bash
# 退出终端
exit
# 运行web应用 -d:让容器在后台运行。 -P:将容器内部使用的网络端口随机映射到我们使用的主机上。
docker run -d -P training/webapp python app.py
# 运行web应用指定端口
docker run -d -p 5000:5000 training/webapp python app.py
# 停止web应用容器
docker stop redis(CONTAINER)
# 查看运行的容器
docker ps
# 查看web应用日志(docker logs可以像使用 tail -f 一样来输出容器内部的标准输出)
docker logs -f <CONTAINER_ID>(容器ID)
# 查看应用容器进程
docker top redis(CONTAINER)

容器命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看所有容器
docker ps -a
# 启动已停止运行的容器
docker start <CONTAINER_ID>
# 停止一个容器
docker stop <CONTAINER_ID>
# 进入容器
docker attach <CONTAINER_ID> 输入exit从容器退出后,容器会停止。
docker exec -it <CONTAINER_ID> 输入exit从容器退出后,容器不会停止。
# 导出容器
docker export <CONTAINER_ID> > centos.tar
# 删除容器
docker rm -f <CONTAINER_ID>

镜像命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 列出镜像列表    说明:REPOSITORY:表示镜像的仓库源。 TAG:镜像的标签。 IMAGE ID:镜像ID。 CREATED:镜像创建时间。 SIZE:镜像大小。
docker images
# 查找镜像 说明:NAME: 镜像仓库源的名称。 DESCRIPTION: 镜像的描述。 OFFICIAL: 是否 docker 官方发布。 stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。 AUTOMATED: 自动构建。
docker search hello-world
# 删除镜像
docker rmi hello-world
# 创建镜像 1、从已经创建的容器中更新镜像,并且提交这个镜像 2、使用 Dockerfile 指令来创建一个新的镜像 说明:-m: 提交的描述信息。 -a: 指定镜像作者。 e218edb10551:容器 ID。 lixiang707/haha:v2: 指定要创建的目标镜像名。
docker commit -m="MOSS INIT" -a="caoofduty" e218edb10551 caoofduty/moss:v1
# 构建镜像 -t :指定要创建的目标镜像名。 . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径。
cat Dockerfile
docker build -t lixiang707/centos:6.7 .
# 本地保存镜像
docker save -o moss.tar caoofduty/moss:v1
# 设置镜像标签
docker tag 860c279d2aaa lixiang707/haha:dev

Dockerfile

FROM

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN

RUN:用于执行后面跟着的命令行命令。

COPY

COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

ADD

ADD: ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似。ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

CMD: 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:CMD 在docker run 时运行。RUN 是在 docker build。 作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

ENTRYPOINT

ENTRYPOIN: 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。 优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。 注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

ENV

ENV: 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ARG

ARG: 构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

VOLUME

VOLUME: 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

EXPOSE

EXPOSE: 仅仅只是声明端口。

WORKDIR

WORKDIR: 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

USER

USER: 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

HEALTHCHECK

HEALTHCHECK: 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

ONBUILD

ONBUILD: 用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

LABEL

LABEL 指令用来给镜像添加一些元数据(metadata)。