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才能执行。这其实是个权限问题。
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-slim 比 python: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 参数来强制重新构建,避免缓存导致的问题。但平时开发迭代时,我会去掉这个参数,利用缓存加速。
. 指定的目录)不要包含敏感文件。比如 .env、config.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 表示开发环境的最新构建。这样既清晰又方便回滚。
4.4 本章知识体系
下面这张图,把Docker容器化部署的核心流程串起来了。从安装配置到镜像推送,每一步都有对应的操作和注意事项。
这张图把整个流程串起来了。从安装配置开始,到编写Dockerfile,再到构建镜像和推送仓库,每一步都有对应的最佳实践。你想想看,掌握了这些,自动策略生成系统的容器化部署基本就稳了。
嗯,这一章的内容就到这里。记住,Docker容器化不是终点,而是自动化部署的起点。下一章我们会聊聊如何用Docker Compose编排多容器服务,把整个系统跑起来。
公众号:蓝海资料掘金营,微信deep3321