如何在企业内部私有Docker仓库发布容器并实现自动更新?
Hey there! 作为Docker新手,你完全不用一开始就纠结K8s或者Swarm这些复杂工具——咱们先从最基础、最适合小团队的方案入手,一步步实现你要的目标:内部镜像打包、私有仓库存储,还有简易的容器自动更新。
首先得把你的Django应用和脚本分别打包成Docker镜像,这是容器化的基础。
Django Web应用的Dockerfile示例
选个轻量的Python基础镜像,然后把你的应用依赖、代码都打包进去:
# 使用官方Python基础镜像(slim版本更小巧) FROM python:3.11-slim # 设置容器内的工作目录 WORKDIR /app # 先复制依赖文件,利用Docker缓存优化构建速度 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制Django应用的所有代码 COPY . . # 暴露Django服务的端口(比如默认的8000,如果你用gunicorn也可以改成对应的端口) EXPOSE 8000 # 启动生产环境的Django服务(推荐用gunicorn替代自带的runserver) CMD ["gunicorn", "--bind", "0.0.0.0:8000", "your_project_name.wsgi:application"]
构建镜像命令(记得替换成你的镜像名和版本):
docker build -t internal-django-app:v1 .
脚本类应用的Dockerfile示例
如果是定时脚本或者一次性执行的脚本,同样用Python镜像打包,调整启动命令即可:
FROM python:3.11-slim WORKDIR /script # 安装脚本依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制脚本文件 COPY your_script.py . # 脚本启动命令(如果是定时任务,可以后续结合cron或者Docker的调度工具) CMD ["python", "your_script.py"]
构建命令:
docker build -t internal-script-app:v1 .
不用找复杂的第三方工具,官方的registry镜像就能快速搭建一个轻量的私有仓库,完全满足内部使用需求。
- 启动私有仓库容器:
docker run -d -p 5000:5000 --name internal-registry --restart always registry:2
这条命令会启动一个监听5000端口的仓库容器,并且设置开机自启。
- 给本地镜像打私有仓库标签:
要把镜像推送到私有仓库,得先给镜像加上仓库地址的前缀(比如仓库所在机器的IP是192.168.1.100):
# 给Django镜像打标签 docker tag internal-django-app:v1 192.168.1.100:5000/internal-django-app:v1 # 给脚本镜像打标签 docker tag internal-script-app:v1 192.168.1.100:5000/internal-script-app:v1
- 推送镜像到私有仓库:
docker push 192.168.1.100:5000/internal-django-app:v1 docker push 192.168.1.100:5000/internal-script-app:v1
如果其他机器要拉取这个仓库的镜像,需要在那些机器的Docker配置里添加私有仓库为“可信仓库”:编辑/etc/docker/daemon.json,添加"insecure-registries": ["192.168.1.100:5000"],然后重启Docker服务即可。
从私有仓库拉取镜像并启动容器,命令很简单:
# 启动Django应用容器,映射端口到宿主机80,设置开机自启 docker run -d -p 80:8000 --name django-app --restart always 192.168.1.100:5000/internal-django-app:v1 # 启动脚本应用容器 docker run -d --name script-app --restart always 192.168.1.100:5000/internal-script-app:v1
对于小规模部署,用watchtower工具就足够实现自动更新——它会自动监听私有仓库的镜像版本变化,拉取新镜像并重启容器,完全不用手动操作。
推荐用docker-compose来管理你的应用容器和watchtower,配置更清晰:
创建docker-compose.yml文件:
version: '3' services: django-app: image: 192.168.1.100:5000/internal-django-app:v1 ports: - "80:8000" restart: always script-app: image: 192.168.1.100:5000/internal-script-app:v1 restart: always watchtower: image: containrrr/watchtower volumes: # 挂载Docker套接字,让watchtower能管理本地容器 - /var/run/docker.sock:/var/run/docker.sock # 设置每天检查一次镜像更新(单位是秒,86400=24小时,可按需调整) # --cleanup参数会自动清理旧的镜像,节省磁盘空间 command: --interval 86400 --cleanup
启动所有服务:
docker-compose up -d
之后,只要你更新了私有仓库里的镜像(比如推送v2版本),watchtower就会自动检测到,然后拉取新镜像、替换旧容器。如果想手动触发一次更新,也可以运行:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once django-app script-app
这些编排工具确实功能强大,但学习成本很高,对于当前小规模的内部部署来说,Docker Registry + docker-compose + watchtower的组合已经完全够用——操作简单、维护成本低,能快速实现你要的所有需求。等后续你的应用规模变大、需要更复杂的功能(比如负载均衡、滚动更新、服务发现)时,再考虑迁移到K8s也完全来得及。
内容的提问来源于stack exchange,提问作者Bring Coffee Bring Beer

