Docker学习

Docker学习

  1. linux操作系统由内核空间和用户空间组成

    在这里插入图片描述
    如上图所示:
    内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。
    用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。
    对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。

  2. base镜像提供的是最小安装的linux发行版本

构建镜像

对于 Docker 用户来说,最好的情况是不需要自己创建镜像。几乎所有常用的数据库、中间件、应用软件等都有现成的 Docker 官方镜像或其他人和组织创建的镜像,我们只需要稍作配置就可以直接使用。

使用现成镜像的好处除了省去自己做镜像的工作量外,更重要的是可以利用前人的经验。特别是使用那些官方镜像,因为 Docker 的工程师知道如何更好的在容器中运行软件。

当然,某些情况下我们也不得不自己构建镜像,比如:

  1. 找不到现成的镜像,比如自己开发的应用程序。
  2. 需要在镜像中加入特定的功能,比如官方镜像几乎都不提供 ssh。

Docker 提供了两种构建镜像的方法:

  1. docker commit 命令
  2. Dockerfile 构建文件

然而,Docker 并不建议用户通过这种方式构建镜像。原因如下:

  1. 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。
  2. 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。

既然 docker commit 不是推荐的方法,我们干嘛还要花时间学习呢?

原因是:即便是用 Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。学习 docker commit 能够帮助我们更加深入地理解构建过程和镜像的分层结构。

Dockerfile 构建镜像

Dockerfile 是一个文本文件,记录了镜像构建的所有步骤。

第一个 Dockerfile

用 Dockerfile 创建上节的 ubuntu-with-vi,其内容则为:

FROM ubuntu
RUN apt-get update && apt-get install -y vim

下面我们运行 docker build 命令构建镜像并详细分析每个细节:

sanjay@: pwd # 1
/Users/sanjay/Documents/GitHub/Practices/docker

sanjay@: ls # 2
Dockerfile

sanjay@: sudo docker build -t ubuntu-with-vi-dockerfile . # 3
Password:
Sending build context to Docker daemon  2.048kB # 4
Step 1/2 : FROM ubuntu # 5
latest: Pulling from library/ubuntu
423ae2b273f4: Pull complete
de83a2304fa1: Pull complete
f9a83bce3af0: Pull complete
b6b53be908de: Pull complete
Digest: sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Status: Downloaded newer image for ubuntu:latest
 ---> 72300a873c2c
Step 2/2 : RUN apt-get update && apt-get install -y vim # 6
 ---> Running in d69e956cf673 # 7
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [824 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:5 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
....(这里省略)
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Removing intermediate container d69e956cf673 # 9
 ---> 8418d983d149 # 8
Successfully built 8418d983d149 # 10
Successfully tagged ubuntu-with-vi-dockerfile:latest

① 当前目录为 /root(我的并不是)。

② Dockerfile 准备就绪。

③ 运行 docker build 命令,-t 将新镜像命名为 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置。

④ 从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。
Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。

所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 //usr 作为 build context,否则构建过程会相当缓慢甚至失败。

⑤ Step 1:执行 FROM,将 ubuntu 作为 base 镜像。
ubuntu 镜像 ID 为 72300a873c2c。

⑥ Step 2:执行 RUN,安装 vim,具体步骤为 ⑦、⑧、⑨。

⑦ 启动 ID 为 d69e956cf673 的临时容器,在容器中通过 apt-get 安装 vim。

⑧ 安装成功后,将容器保存为镜像,其 ID 为8418d983d149。

这一步底层使用的是类似 docker commit 的命令

⑨ 删除临时容器 d69e956cf673。

⑩ 镜像构建成功。

在上面的构建过程中,我们要特别注意指令 RUN 的执行过程 ⑦、⑧、⑨。Docker 会在启动的临时容器中执行操作,并通过 commit 保存为新的镜像。

查看镜像分层结构

ubuntu-with-vi-dockerfile 是通过在 base 镜像的顶部添加一个新的镜像层而得到的。

在这里插入图片描述

这个新镜像层的内容由 RUN apt-get update && apt-get install -y vim 生成。这一点我们可以通过 docker history 命令验证。
在这里插入图片描述

docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程。

ubuntu-with-vi-dockerfile 与 ubuntu 镜像相比,确实只是多了顶部的一层 8418d983d149,由 apt-get 命令创建,大小为 88MB。docker history 也向我们展示了镜像的分层结构,每一层由上至下排列。

注: missing表示无法获取 IMAGE ID,通常从 Docker Hub 下载的镜像会有这个问题。

Dockerfile常用指令

  1. FROM

    指定base镜像

  2. COPY

    将文件从build context复制到镜像,语法为COPY src dst

    note:src只能指定build context中的文件或目录

  3. ADD

    与COPY类似,从build context复制文件到镜像。不同的是,如果src是压缩文件,文件会被自动解压到dst

  4. ENV

    设置环境变量,环境变量可以被后面的指令使用

    eg. ENV MY_VERSION 1.3

  5. WORKDIR

    设置镜像当前的工作目录

  6. RUN

    在容器中运行指定的命令

  7. CMD

    容器启动时运行指定的命令。

    语法:CMD ["executable", "param1", "param2"]

    Eg. CMD echo "Hello world"

    note:可以有多个CMD指令,但只有最后一个生效。CMD可以被docker run之后的参数替换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值