同一服务器上UAT与生产环境Docker Compose无法同时启动问题
问题:同一服务器部署UAT与生产环境无法同时运行
- 同一服务器部署UAT和生产环境,代码一致仅后端端口不同
- 先启动UAT服务状态正常,启动生产环境后UAT服务自动停止
- 已设置唯一
container_name,问题仍存在
相关配置及版本信息
UAT环境docker-compose.yml
version: "2.2" services: webbackend: build: . network_mode: "host" container_name: atms-webapp-backend-test restart: always volumes: - .:/code command: "python3.7 app.py --port=5002" # "gunicorn --workers=2 --bind=0.0.0.0:9000 utootuweb.wsgi:application"
Dockerfile
FROM ubuntu:18.04 WORKDIR /code ADD . /code RUN apt-get update && apt-get upgrade -y && apt-get clean ENV NODE_VERSION=16.16.0 RUN apt-get install -y curl RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash ENV NVM_DIR=/root/.nvm RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION} RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION} RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION} ENV PATH="/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}" RUN node --version RUN npm --version WORKDIR /code/frontend RUN npm install RUN npm run build # RUN npm install -g serve # RUN serve -s build # RUN yarn # RUN yarn build # # Upgrade installed packages # RUN apt-get update && apt-get upgrade -y && apt-get clean # # Python package management and basic dependencies # # RUN apt-get install -y curl python3.7 python3.7-dev python3.7-distutils curl # # node install # RUN curl -sL https://deb.nodesource.com/setup_18.x | bash - # RUN apt-get install -y nodejs # # npm install # RUN apt install -y npm # RUN npm install -g npm@latest # # Python package management and basic dependencies RUN apt-get install -y curl python3.7 python3.7-dev python3.7-distutils # Register the version in alternatives RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1 # Set python 3 as the default python RUN update-alternatives --set python /usr/bin/python3.7 RUN apt-get install -y build-essential python3.7 python3.7-dev python3-pip python3.7-venv libgl1 RUN apt-get install -y git # update pip RUN python3.7 -m pip install pip --upgrade RUN python3.7 -m pip install wheel # build frontend # WORKDIR /code/frontend # # RUN npm install # RUN npm run build # install backend code WORKDIR /code RUN python3.7 -m pip install -r requirements.txt WORKDIR /code/backend CMD ["python3" ,"app.py"]
版本信息
- Docker版本:20.10.10,build b485636
- docker-compose版本:1.29.2,build 5becea4c
问题原因及解决方法
核心原因
使用network_mode: "host"模式后,容器直接复用宿主机网络栈。此时若两个环境的应用存在端口冲突(即使你以为配置了不同端口,可能代码默认端口未被正确覆盖),后启动的容器会抢占端口,导致先启动的容器被强制停止。此外,host模式几乎丧失网络隔离性,极易引发此类冲突。
解决步骤
移除
network_mode: "host",改用Docker桥接网络- 删除docker-compose.yml中的
network_mode: "host"配置 - 添加端口映射,确保两个环境的宿主机端口唯一:
# UAT环境 ports: - "5002:5002" # 生产环境 ports: - "5003:5003"
- 删除docker-compose.yml中的
确认端口配置被正确覆盖
- 检查
app.py中的默认端口设置,确保启动命令的--port=xxx参数能完全覆盖默认值 - 避免硬写固定端口,优先通过命令行参数或环境变量传递端口
- 检查
可选:为环境创建独立Docker网络
进一步隔离两个环境的网络:# 创建UAT专属网络 docker network create uat-network # 创建生产专属网络 docker network create prod-network在各自的docker-compose.yml中添加:
networks: default: external: name: uat-network # 生产环境替换为prod-network验证服务运行
先停止所有相关容器:docker-compose down分别启动UAT和生产环境服务,通过
docker ps确认两个服务同时运行且无端口冲突。
内容的提问来源于stack exchange,提问作者abak1802
相关产品推荐
相关产品推荐

