@longj
2018-06-26T15:23:22.000000Z
字数 2405
阅读 2340
由于 Docker 给出的官方源是在国外,国内使用 Docker 进行镜像的拉取和构建的时候会很慢,本篇博文则介绍如何提高在国内进行 Docker 容器构建部署的加速。
进入 阿里云 Docker hub,进行相关的用户注册和登录
进入管理中心后,点击镜像加速器,选择你部署 Docker 的宿主机系统环境,根据对应给出的说明进行配置即可。
第一步让我们可以加快了基础镜像的拉取,然后我们可以通过使用清华源来加速基础镜像 Build 我们想要的容器的过程。
由于每一个 Docker 容器是一个微小的操作系统,所以这个操作就是更换该容器中的软件源,从而加速依赖的安装,如 apt install <package>
的速度。
进入 Ubuntu 16.04 清华源, 复制我们需要的软件源文件到 sources.list
。
然后在 Dockerfile 中将保存好的 sources.list
放入构建缓存中再进行 apt install
即可以加速软件包下载的过程。
eg. 以在 ubuntu 16.04 基础镜像中安装 python3 支持为例,Dockerfile 的部分应如下:
## Install python3 and pip3, to support Chinese
## change source.list, use Chinese mirror
COPY sources.list /etc/apt/
RUN apt-get update \
&& apt-get install -y python3-pip python3-dev locales\
&& pip3 install --upgrade pip
我们可以利用 Docker 构建缓存的机制,合理地组织 Dockerfile 文件的结构,来加速 Docker 容器的 build 过程。
对于一个 Dockerfile 的例子:
FROM python:3.5-alpine
LABEL maintainer="longjj"
ENV LANG C.UTF-8
RUN apk add --no-cache bash
RUN apk add --no-cache bash
ADD . /code
WORKDIR /code/app/
# RUN pip install -r requirements.txt
COPY ./requirements.txt ./requirements.txt
RUN pip install -r requirements.txt
RUN pip install flask-cors --upgrade
构建的时候我们可以看到类似下面的输出:
Building web
Step 1/11 : FROM python:3.5-alpine
---> f714424659a5
Step 2/11 : LABEL maintainer="longjj"
---> Using cache
---> baa5198889cd
Step 3/11 : ENV LANG C.UTF-8
---> Using cache
---> 2e2065f61c35
Step 4/11 : RUN apk add --no-cache bash
---> Using cache
---> 49141ba76aa8
Step 5/11 : RUN apk add --no-cache bash
---> Using cache
---> 638c15a7f531
Step 6/11 : ADD . /code
---> e6857bf18ea7
Step 7/11 : WORKDIR /code/app/
Removing intermediate container 0ee81564978a
---> 2483e2da941e
Step 8/11 : COPY ./requirements.txt ./requirements.txt
---> ad4bc59aae5e
Step 9/11 : RUN pip install -r requirements.txt
---> Running in ca38d8cf340c
Collecting flask>=0.10 (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB)
...
当Docker构建一个镜像的时候,它不会仅仅构建一个单一的镜像;它实际上在整个构建过程中会构建出多个镜像。实际上我们可以从以上的输出看到,在每一步之后,Docker都创建了一个新的镜像。
Step 8/11 : COPY ./requirements.txt ./requirements.txt
---> ad4bc59aae5e
上面片段中的最后一行,实际上是Docker在告诉我们创建了一个新的镜像,它通过输出镜像ID来告诉我们这一点 ad4bc59aae5e 。这个策略的一个有用之处在于Docker能够使用这些镜像作为后续构建步骤的缓存。这很有用,因为它能让Docker加快相同容器的新构建的构建过程。如果仔细我们看上面的例子,我们可以发现 Docker 能够使用一个已经缓存了的镜像,而不是重新安装 bash 支持。然而,因为你在测试中会修改 requirements.txt 的内容,导致 Docker 无法找到一个执行过 COPY
命令的构建的缓存,这之后每一个后续的步骤都执行了。
通过这个策略,在 Dockerfile 中,我们可以把不容易变的,环境需要的依赖安装先放在容器构建的前面,然后,再把我们可能会频繁改变的文件复制放在后面,这样每次我们需要重新 Build 测试新的容器的时候就可以最大限度地利用了之前的构建缓存,节约我们的时间。