从Docker Hub拉取镜像在VM上通过docker-compose up运行的操作步骤
VM 端 Docker Compose 部署全流程
1. 前置环境配置
首先在目标VM上安装Docker和Docker Compose环境,以Ubuntu/Debian系为例,执行以下命令:
# 更新软件源 sudo apt update && sudo apt upgrade -y # 安装Docker sudo apt install docker.io -y # 安装Docker Compose sudo apt install docker-compose -y # 设置Docker开机自启 sudo systemctl enable --now docker # (可选)将当前登录用户加入docker用户组,后续执行docker命令无需加sudo sudo usermod -aG docker $USER newgrp docker
安装完成后执行docker -v和docker-compose -v,能正常输出版本号即代表环境就绪。
注意:如果是CentOS/RHEL系系统,替换包管理器命令为
yum即可,核心安装逻辑一致。
2. 适配部署场景的Compose配置调整
你本地使用的docker-compose.yml是开发环境配置,直接在VM上使用会触发本地构建失败、容器内代码被空目录覆盖的问题,需要先做两处必要调整:
- 删除
build: .字段:VM端不需要本地构建镜像,直接拉取Docker Hub上的预构建镜像即可 - 删除根目录挂载
volumes: - .:/rest-api-scraper:该配置是开发时用于代码热更新的,VM端无对应本地源码的话会把容器内的项目文件全部覆盖为空,导致服务启动失败;如果你的Django服务使用SQLite数据库需要持久化,单独给数据库文件目录配置挂载即可。
3. 创建部署目录与Compose文件
在VM上新建专门的部署目录,在目录内创建docker-compose.yml文件,写入以下配置(同时包含前端、后端两个服务,一次命令即可启动全部组件):
version: '3' services: # Angular前端服务 frontend: image: andreclerigo/bom_e_barato:latest container_name: bom-e-barato-frontend ports: - "80:80" restart: always depends_on: - backend # Django REST API后端服务 backend: image: andreclerigo/rest-api-scraper:latest container_name: rest-api-scraper command: bash -c "python backend/manage.py makemigrations && python backend/manage.py migrate && python backend/manage.py runserver 0.0.0.0:8000" ports: - "8000:8000" restart: always # 如果你使用SQLite需要持久化数据,放开下面的volumes配置 # volumes: # - ./db_data:/rest-api-scraper/backend
配置说明:添加
restart: always字段后,VM重启或者服务异常退出时会自动拉起容器,不需要手动干预重启。
4. 拉取镜像并启动服务
在docker-compose.yml所在的目录下,依次执行以下命令:
# 从Docker Hub拉取最新版本的两个镜像 docker-compose pull # 后台启动所有服务 docker-compose up -d
5. 服务可用性验证
启动完成后执行以下检查确认服务正常:
- 执行
docker-compose ps,查看两个容器的状态是否为Up - 执行
curl http://localhost:80,能返回Nginx页面的HTML内容即代表前端服务正常 - 执行
curl http://localhost:8000,能返回Django接口的响应内容即代表后端服务正常 - 如果需要公网访问,记得在VM的安全组/防火墙规则中放开80、8000端口的入方向访问权限
6. 常用运维操作
- 查看服务运行日志:
docker-compose logs -f - 重启所有服务:
docker-compose restart - 停止所有服务:
docker-compose down - 更新镜像版本:重新执行
docker-compose pull后执行docker-compose up -d即可完成更新
内容的提问来源于stack exchange,提问作者André Clérigo
相关产品推荐
相关产品推荐

