Skip to content

Docker 容器技术入门

· 9 min

1. Docker 的安装(省略,后续补充)#

1.1 Centos#

1.2 Ubautu#

2. Docker Container#

2.1 Image & Container#

Image 镜像

  • 镜像是一个read-only的文件

  • 相当于一个模板,我们可以通过这个模板实例化出来很多容器

  • image其实就是一个文件系统(Union FS),它与宿主机的内核一起为程序提供一个虚拟的linux环境

2.2 Container 基本操作#

Container 容器

  • 实质是复制image并在image最上层加上一层 read-write 的层 (称之为 container layer ,容器层)

  • 基于同一个image可以创建多个container层,是一个运行中的Docker Image


如果容器过多的话一个个删除很麻烦,我们可以批量删除:

  1. 手动批量删除:docker container rm <id_1 id_2 id_3 …>

  2. 脚本查询方式删除:docker container rm $(docker container ps -aq)

我们知道docker container ps 是查看运行中的容器,后面加上 -aq 参数可以查到所有的容器名,如下图所示:👇

2.3 Container Mode 容器运行模式#

在linux系统中(windows不受影响),我们使用 docker container run -p 80:80 nginx 运行的话是在前台运行,当我们 CTRL+C 后,会导致容器停止。一般不推荐使用

2.4 连接容器的shell#

  1. 创建一个容器并且进入交互模式:docker container run -it -p 80:80 nginx sh 这样启动的容器我们在CTRL+C 后,同样也会导致容器停止。

  2. 在已经启动的容器执行额外command:docker container exec -it <id> sh

2.5 Docker container run 经历了什么?#

docker container run -d -p 80<80> nginx

  1. 在本地查找是否有nginx这个image镜像,但是没有发现

  2. 去远程的image registry查找nginx镜像(默认的registry是Docker Hub)

  3. 下载最新版本的nginx镜像 (nginx 默认)

  4. 基于nginx镜像来创建一个新的容器,并且准备运行

  5. docker engine分配给这个容器一个虚拟IP地址

  6. 在宿主机上打开80端口并把容器的80端口转发到宿主机上

  7. 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)

3. Docker Image #

3.1 Image 基本操作#

4. Dockerfile指南#

4.1 Docker Build #

Docker Build是Docker提供的一个命令,用于根据Dockerfile构建自定义的镜像。

4.1.1 语法#

4.1.2 OPTIONS#

具体用法参考:Docker Build语法用法示例详解

4.2 FROM 基础镜像选择#

  1. 原则上官方镜像优先于非官方镜像

  2. 使用固定版本tag,而不是每次都直接使用latest

  3. 选择体积较小的镜像

4.3 RUN 执行命令的优化#

RUN 主要用于在Image里执行指令,比如安装软件,下载文件等。

4.4 ADD COPY 操作#

ADD 和 COPY 都是往镜像里面复制文件的操作

在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则:所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。

4.5 ARG vs ENV 参数构建和环境变量#

4.5.1 ARG 和 ENV 的基础用法#

我们可以在dockerfile 中自定义一个变量,在后面引入,我们来看具体用法:

通过对比我们发现,这两个的用法基本一样,那他们的区别在哪儿呢?

4.5.2 ARG 和 ENV 的区别#

docker image build -f .\Dockerfile-arg -t ipinfo-arg-2.0.0 --build-arg VERSION=2.0.0

4.6 CMD vs ENTRYPOINT 容器启动时执行#

4.6.1 CMD#

CMD 可以设置容器启动默认执行的命令

4.6.2 ENTRYPOINT #

4.6.3 Shell 格式和Exec格式#

假如我们要把上面的CMD改成Exec格式,下面这样改是不行的,它会打印出 hello $NAME , 而不是 hello docker ,那么需要怎么写呢? 我们需要以shell脚本的方式去执行

4.7 Dockerfile 使用技巧#

4.7.1 合理使用缓存#

把经常发生变化的内容放在下面执行,这样他就会最大程度的利用缓存,举个例子,我有一个dockerfile,里面经常会发生变化的操作是COPY操作,最好的做法是把他放在下面执行

4.7.2 Dockerignore 的使用#

我们在构建一个image的时候会使用下面这个命令:docker image build -t demo:1.0 .最后面的点是我们构建时使用的文件夹,我们应该使用类似 git ignore 的文件来忽略那些我们构建时不需要的内容,提高构建的效率

4.7.3 镜像的多阶段构建#

5. Docker 的存储#

5.1 Docker Volume(存储卷)#

5.1.1 什么是存储卷?#

存储卷是将服务器一个文件目录和容器文件系统某一个目录建立绑定关系,这个服务器文件的目录就是存储卷。存储卷可以同步容器内的数据,并且容器销毁之后不会影响到存储卷的数据。

存储卷就好比我们租了个仓库,有了仓库钥匙后,即使房子被毁了,仓库内的东西还在。

5.1.2 存储卷的分类#

Docker 主要提供了两种方式将数据从宿主机挂载到容器中: