# 正确示例
services:
web:
image: nginx:latest
# 错误示例,缩进错误会导致解析问题
services:
web:
image: nginx:latest
# 正确示例
environment:
KEY: value
# 错误示例,冒号后缺少空格
environment:
KEY:value
version
字段:配置文件开头的 version
字段指定了 Docker Compose 文件的版本,不同版本支持的功能有所差异。要根据使用的 Docker Compose 版本选择合适的 version
,并了解该版本的特性和限制。例如,version 3
是较常用的版本,它对 Docker Swarm 有更好的支持。version: '3'
latest
标签。因为 latest
标签可能会导致不同时间拉取的镜像版本不一致,从而影响应用的稳定性。# 推荐使用明确的版本标签
services:
db:
image: mysql:8.0.26
services:
app:
image: myapp:1.0
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
depends_on
时要注意,它只能保证服务的启动顺序,不能保证依赖的服务已经完全就绪。例如,数据库服务启动后可能还需要一些时间来初始化数据,这时可以使用脚本进行健康检查。services:
web:
image: mywebapp:1.0
depends_on:
db:
condition: service_healthy
db:
image: mysql:8.0.26
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
services:
web:
image: nginx:latest
networks:
- my_network
app:
image: myapp:1.0
networks:
- my_network
networks:
my_network:
services:
web:
image: nginx:latest
ports:
- "8080:80" # 确保 8080 端口在主机上未被占用
services:
db:
image: mysql:8.0.26
volumes:
- ./data:/var/lib/mysql # 确保主机上的 ./data 目录有正确的权限
services:
db:
image: mysql:8.0.26
environment:
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
secrets:
- mysql_root_password
secrets:
mysql_root_password:
file: ./mysql_root_password.txt
root
用户运行容器,减少安全风险。可以在 Dockerfile 中指定非 root
用户运行应用。# 在 Dockerfile 中指定非 root 用户
RUN groupadd -r myuser && useradd -r -g myuser myuser
USER myuser
docker-compose.yml
或 docker-compose.yaml
,以保持一致性。# 这是一个 Web 服务,使用 Nginx 作为代理
services:
web:
image: nginx:latest
...
docker-compose config
命令:该命令会验证 docker-compose.yml
文件的语法是否正确,并显示解析后的配置。如果配置文件存在语法错误,会输出相应的错误信息。docker-compose config
yaml.parser.ParserError
的错误信息,帮助你定位问题。docker pull
命令手动拉取镜像,检查是否能正常下载。docker pull nginx:latest
depends_on
来定义服务之间的依赖关系,要确保依赖的服务能够正常启动。例如,一个 Web 服务依赖于数据库服务,需要保证数据库服务能够正常初始化和运行。docker-compose up
命令:该命令会根据配置文件创建并启动所有服务。可以添加 -d
参数以守护进程模式运行容器,方便在后台查看日志。docker-compose up -d
docker-compose logs
命令:该命令可以查看所有服务或指定服务的日志信息,帮助你了解服务的运行状态和可能出现的错误。# 查看所有服务的日志
docker-compose logs
# 查看指定服务的日志
docker-compose logs web
ModuleNotFoundError
的错误信息,提示缺少某个 Python 模块。docker-compose ps
命令:该命令可以查看所有服务对应的容器的运行状态,包括容器 ID、状态、端口映射等信息。docker-compose ps
Exited
,说明该容器可能在启动过程中出现了问题。docker-compose exec
命令:该命令可以进入正在运行的容器内部,执行命令进行调试。例如,可以进入一个数据库容器,检查数据库的连接和配置。docker-compose exec db bash
mysql -u root -p
命令登录数据库,检查数据库是否正常运行。docker network inspect
命令:该命令可以查看 Docker 网络的详细信息,包括网络中的容器、IP 地址等。可以检查服务之间的网络连接是否正常。docker network inspect myapp_default
curl
或浏览器:如果配置文件中定义了端口映射,可以使用 curl
命令或浏览器访问相应的端口,测试服务是否能够正常响应。curl http://localhost:8080
curl
命令访问 http://localhost:8080
应该能够看到 Nginx 的默认页面。docker-compose up -d db
docker-compose up -d web
docker-compose.prod.yml
用于模拟生产环境的配置。可以使用 -f
参数指定不同的配置文件进行测试。docker-compose -f docker-compose.prod.yml up -d
services:
db:
environment:
- DB_HOST=${DB_HOST}
- DB_PASSWORD=${DB_PASSWORD}
# 在开发环境中设置环境变量
export DB_HOST=localhost
export DB_PASSWORD=devpassword
docker-compose up -d
通过以上方法,可以逐步排查 Docker Compose 配置文件中可能存在的问题,确保应用程序能够稳定运行。
期待您你能关注公众号
原宏Cloud运维栈
每天带你进步一点。