[关闭]
@longj 2018-06-26T07:23:22.000000Z 字数 2405 阅读 2248

Docker 加速部署


由于 Docker 给出的官方源是在国外,国内使用 Docker 进行镜像的拉取和构建的时候会很慢,本篇博文则介绍如何提高在国内进行 Docker 容器构建部署的加速。

使用阿里云的 Docker 源加速镜像的拉取

进入 阿里云 Docker hub,进行相关的用户注册和登录

Screenshot from 2018-06-26 14-48-58.png-70.8kB

进入管理中心后,点击镜像加速器,选择你部署 Docker 的宿主机系统环境,根据对应给出的说明进行配置即可。

Snipaste_2018-06-26_15-22-41.jpg-96.5kB

使用清华源来加速 Docker 容器的 build 过程

第一步让我们可以加快了基础镜像的拉取,然后我们可以通过使用清华源来加速基础镜像 Build 我们想要的容器的过程。

由于每一个 Docker 容器是一个微小的操作系统,所以这个操作就是更换该容器中的软件源,从而加速依赖的安装,如 apt install <package> 的速度。

进入 Ubuntu 16.04 清华源, 复制我们需要的软件源文件到 sources.list

Screenshot from 2018-06-26 14-59-02.png-117kB

然后在 Dockerfile 中将保存好的 sources.list 放入构建缓存中再进行 apt install 即可以加速软件包下载的过程。

eg. 以在 ubuntu 16.04 基础镜像中安装 python3 支持为例,Dockerfile 的部分应如下:

  1. ## Install python3 and pip3, to support Chinese
  2. ## change source.list, use Chinese mirror
  3. COPY sources.list /etc/apt/
  4. RUN apt-get update \
  5. && apt-get install -y python3-pip python3-dev locales\
  6. && pip3 install --upgrade pip

合理组织 Dockerfile 的书写顺序来加速 Docker 容器的 build 过程

我们可以利用 Docker 构建缓存的机制,合理地组织 Dockerfile 文件的结构,来加速 Docker 容器的 build 过程。

对于一个 Dockerfile 的例子:

  1. FROM python:3.5-alpine
  2. LABEL maintainer="longjj"
  3. ENV LANG C.UTF-8
  4. RUN apk add --no-cache bash
  5. RUN apk add --no-cache bash
  6. ADD . /code
  7. WORKDIR /code/app/
  8. # RUN pip install -r requirements.txt
  9. COPY ./requirements.txt ./requirements.txt
  10. RUN pip install -r requirements.txt
  11. RUN pip install flask-cors --upgrade

构建的时候我们可以看到类似下面的输出:

  1. Building web
  2. Step 1/11 : FROM python:3.5-alpine
  3. ---> f714424659a5
  4. Step 2/11 : LABEL maintainer="longjj"
  5. ---> Using cache
  6. ---> baa5198889cd
  7. Step 3/11 : ENV LANG C.UTF-8
  8. ---> Using cache
  9. ---> 2e2065f61c35
  10. Step 4/11 : RUN apk add --no-cache bash
  11. ---> Using cache
  12. ---> 49141ba76aa8
  13. Step 5/11 : RUN apk add --no-cache bash
  14. ---> Using cache
  15. ---> 638c15a7f531
  16. Step 6/11 : ADD . /code
  17. ---> e6857bf18ea7
  18. Step 7/11 : WORKDIR /code/app/
  19. Removing intermediate container 0ee81564978a
  20. ---> 2483e2da941e
  21. Step 8/11 : COPY ./requirements.txt ./requirements.txt
  22. ---> ad4bc59aae5e
  23. Step 9/11 : RUN pip install -r requirements.txt
  24. ---> Running in ca38d8cf340c
  25. Collecting flask>=0.10 (from -r requirements.txt (line 1))
  26. Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB)
  27. ...

当Docker构建一个镜像的时候,它不会仅仅构建一个单一的镜像;它实际上在整个构建过程中会构建出多个镜像。实际上我们可以从以上的输出看到,在每一步之后,Docker都创建了一个新的镜像。

  1. Step 8/11 : COPY ./requirements.txt ./requirements.txt
  2. ---> ad4bc59aae5e

上面片段中的最后一行,实际上是Docker在告诉我们创建了一个新的镜像,它通过输出镜像ID来告诉我们这一点 ad4bc59aae5e 。这个策略的一个有用之处在于Docker能够使用这些镜像作为后续构建步骤的缓存。这很有用,因为它能让Docker加快相同容器的新构建的构建过程。如果仔细我们看上面的例子,我们可以发现 Docker 能够使用一个已经缓存了的镜像,而不是重新安装 bash 支持。然而,因为你在测试中会修改 requirements.txt 的内容,导致 Docker 无法找到一个执行过 COPY 命令的构建的缓存,这之后每一个后续的步骤都执行了。

通过这个策略,在 Dockerfile 中,我们可以把不容易变的,环境需要的依赖安装先放在容器构建的前面,然后,再把我们可能会频繁改变的文件复制放在后面,这样每次我们需要重新 Build 测试新的容器的时候就可以最大限度地利用了之前的构建缓存,节约我们的时间。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注