4、Docker容器化部署:Docker安装与配置、编写Dockerfile、构建镜像与推送仓库

容器化部署,说白了就是把你的应用连同它的运行环境一起打包。我刚开始接触Docker时,觉得这玩意儿不就是个轻量级虚拟机吗?后来踩过坑才明白——它比虚拟机灵活得多,也坑得多。

这一章,我们聚焦在自动策略生成系统的容器化。我会把Docker安装、Dockerfile编写、镜像构建和推送仓库这几个环节串起来讲。嗯,都是实战中反复验证过的套路。

4.1 Docker安装与配置

先说说安装。不同操作系统,安装方式差别挺大。我个人习惯在Linux上跑Docker,尤其是CentOS 7和Ubuntu 20.04这两个版本,踩坑最少。

4.1.1 在CentOS 7上安装

# 卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 安装依赖
sudo yum install -y yum-utils

# 添加Docker官方仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

安装完成后,记得验证一下:

sudo docker version
sudo docker run hello-world

如果看到Hello World的输出,说明安装成功了。我曾经遇到过一个问题——安装后docker命令需要sudo才能执行。这其实是个权限问题。

避坑指南: 将当前用户加入docker组,避免每次敲sudo。
sudo usermod -aG docker $USER
newgrp docker
注意:加入组后需要重新登录终端才能生效。

4.1.2 配置镜像加速器

国内拉取镜像,速度是个大问题。我记得第一次部署时,拉一个几百兆的镜像等了快半小时。后来配置了阿里云加速器,速度直接起飞。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://你的加速器地址.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

加速器地址从哪里来?去阿里云容器镜像服务申请一个,免费的。你想想看,这个配置能省下多少等待时间。

4.2 编写Dockerfile

Dockerfile是构建镜像的蓝图。写得好不好,直接决定了镜像大小、构建速度和运行稳定性。我见过不少新手把Dockerfile写成了一锅粥——所有东西塞一层,镜像体积动辄几个G。

4.2.1 基础镜像选择

对于自动策略生成系统,我推荐使用Python官方镜像作为基础。为什么?因为我们的核心逻辑是Python写的,依赖管理方便。

# 使用Python 3.9 slim版本,体积小
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 8080

# 启动命令
CMD ["python", "app.py"]

这里有个细节:python:3.9-slimpython:3.9 小了将近1GB。我在项目中遇到过,用完整版镜像构建出来的镜像有1.2GB,换成slim版后只有400MB。部署到生产环境,这个差距就是磁盘和带宽的实打实成本。

4.2.2 多阶段构建

如果系统需要编译一些C扩展(比如numpy、pandas),多阶段构建是必须的。说白了,就是先在一个大镜像里编译,再把编译产物复制到小镜像里。

# 第一阶段:编译
FROM python:3.9 AS builder

WORKDIR /build
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 第二阶段:运行
FROM python:3.9-slim

WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY . .

EXPOSE 8080
CMD ["python", "app.py"]

为什么要这么做?因为编译工具链(gcc、make等)在运行时根本不需要。把它们留在最终镜像里,纯粹是浪费空间。我曾经帮一个团队优化过,他们的镜像从1.8GB降到了350MB,部署速度提升了5倍。

4.2.3 优化层缓存

Docker构建时,每一层都会缓存。利用好这个特性,能大幅提升构建速度。我的经验是:把不常变动的指令放在前面,经常变动的放在后面。

# 先复制依赖文件,安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 再复制应用代码
COPY . .

你想想看,如果先复制代码再安装依赖,每次代码改动都会导致依赖重新安装。而依赖文件通常很少变动,这样缓存就能命中,构建时间从几分钟缩短到几秒。

核心原则: 把「慢且不变」的操作放在前面,把「快且常变」的操作放在后面。

4.3 构建镜像与推送仓库

Dockerfile写好了,接下来就是构建和推送。这部分相对简单,但有几个坑需要注意。

4.3.1 构建镜像

# 构建镜像,指定标签
docker build -t auto-policy-system:v1.0 .

# 查看本地镜像
docker images

# 运行容器测试
docker run -d -p 8080:8080 --name policy-test auto-policy-system:v1.0

构建时,我习惯加上 --no-cache 参数来强制重新构建,避免缓存导致的问题。但平时开发迭代时,我会去掉这个参数,利用缓存加速。

注意: 构建上下文(. 指定的目录)不要包含敏感文件。比如 .envconfig.yaml 等。建议使用 .dockerignore 文件排除它们。
# .dockerignore
.git
__pycache__
*.pyc
.env
config.yaml

4.3.2 推送镜像到仓库

镜像构建好了,得推送到仓库才能让其他机器拉取。我一般用阿里云容器镜像服务(ACR)或者Docker Hub。

# 登录仓库
docker login --username=你的用户名 registry.cn-hangzhou.aliyuncs.com

# 给镜像打标签
docker tag auto-policy-system:v1.0 \
  registry.cn-hangzhou.aliyuncs.com/你的命名空间/auto-policy-system:v1.0

# 推送镜像
docker push registry.cn-hangzhou.aliyuncs.com/你的命名空间/auto-policy-system:v1.0

推送时,网络速度是个瓶颈。我记得有一次推送一个500MB的镜像,花了将近20分钟。后来我用了分块推送和压缩传输,速度快了不少。

4.3.3 镜像版本管理

版本管理是个容易被忽视的点。我见过有人只用 latest 标签,结果回滚时根本不知道哪个版本是稳定的。

标签策略 示例 适用场景
语义化版本 v1.0.0, v1.1.0 正式发布版本
Git提交哈希 git-a1b2c3d 开发测试环境
时间戳 20240101-1200 自动化构建
环境标识 prod-v1.0.0, dev-latest 多环境部署

我个人习惯用「语义化版本+环境标识」的组合。比如 prod-v1.0.0 表示生产环境的1.0.0版本,dev-latest 表示开发环境的最新构建。这样既清晰又方便回滚。

小技巧: 在CI/CD流水线中,自动生成版本号并打标签。比如用Git的commit hash作为版本号的一部分,这样每个镜像都能追溯到对应的代码版本。

4.4 本章知识体系

下面这张图,把Docker容器化部署的核心流程串起来了。从安装配置到镜像推送,每一步都有对应的操作和注意事项。

Docker容器化部署核心流程 1. Docker安装与配置 安装引擎 + 配置加速器 2. 编写Dockerfile 基础镜像 + 多阶段构建 3. 构建镜像 docker build + 版本标签 4. 推送仓库 docker push + 版本管理 关键知识点 镜像加速器配置:国内必配,速度提升10倍+ 多阶段构建:编译与运行分离,镜像体积减少70% 层缓存优化:不常变动的指令放前面,构建速度提升5倍 版本标签策略:语义化版本+环境标识,方便回滚 .dockerignore:排除敏感文件和构建缓存 CI/CD集成:自动构建+自动推送,实现持续部署

这张图把整个流程串起来了。从安装配置开始,到编写Dockerfile,再到构建镜像和推送仓库,每一步都有对应的最佳实践。你想想看,掌握了这些,自动策略生成系统的容器化部署基本就稳了。

嗯,这一章的内容就到这里。记住,Docker容器化不是终点,而是自动化部署的起点。下一章我们会聊聊如何用Docker Compose编排多容器服务,把整个系统跑起来。


公众号:蓝海资料掘金营,微信deep3321