1. docker-compose文件中文乱码
在 Docker Compose 的 YAML 文件中,中文注释出现乱码通常是因为文件编码不是 UTF-8,导致 Docker 或编辑器无法正确解析中文字符。
推荐使用:VS Code:右下角点击编码(如 UTF-8 或 GBK),选择 另存为 UTF-8。
Notepad++:顶部菜单 编码 → 选择 UTF-8 无 BOM。
可以使用 docker-compose config 命令来检查读取是否正常。
2. Docker容器的名称,如何避免重复
在 Docker 里,容器名称(--name 或 container_name)必须是唯一的。如果尝试启动一个名为 nginx 的容器,而已经存在一个同名容器(哪怕是已退出的),就会报错。
避免方案:
1)一次性运行容器(临时)
不要手动指定名称,让 Docker 自动生成唯一名称。比如:nginx_quirky_leakey
2)长期运行的服务(如用 Docker Compose)
在 docker-compose.yml 中:不要写 container_name,让 Compose 自动生成唯一名称(基于项目名 + 服务名 + 序号)。
如果非要固定名称,可以加一个唯一前缀或动态后缀。
3)使用 Docker Compose 时避免项目名冲突
Docker Compose 默认用目录名作为项目名,可能导致多个项目容器名冲突。有的项目的docker compose文件放在工程下的docker目录中,这样导致前缀是docker-xxxx。而且很难辨识。这个时候最好在启动的时候手动指定项目名:
docker-compose -p mysite up -d
# 容器名会是:mysite_nginx_1
3. Docker容器之间的访问
在 Docker 容器中,使用 localhost 或 127.0.0.1 访问 类似 MySQL 容器是行不通的,因为每个容器都有自己的网络命名空间,localhost 指的是当前容器自身,而不是 MySQL 容器。
在 Docker 中连接另一个容器,要使用容器名或 Compose 服务名作为主机名,而不是 localhost。
推荐使用 Docker Compose,Docker Compose 会自动为服务创建一个网络,服务名就是主机名。
version: '3.8'
services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: testdb
ports:
- "3306:3306"
app:
build: .
depends_on:
- db
environment:
DB_HOST: db
DB_USER: root
DB_PASS: root
DB_NAME: testdb
4. Docker compose文件的环境变量
1)env_file: - .env.api 配置
不会复制文件到容器内,但会把变量注入容器环境,编译期拿不到,运行期可以。除非在 dockerfile 里显示处理。
services:
api:
image: my-api:latest
env_file:
- .env.api
- 不会把 .env.api 文件本身复制到镜像或容器文件系统里;
- 会在启动容器时,把 .env.api 里定义的 KEY=value 逐条注入为容器的环境变量;
- 这些变量对容器内运行的进程可见,就像 export KEY=value 一样。
对源码编译的影响
镜像构建阶段(docker build):如果 .env.api 不在 Dockerfile 里显式 COPY,编译时拿不到这些变量。构建阶段的环境变量需要通过 ARG 或 ENV 显式传入。
容器运行阶段(docker run/docker compose up):容器启动后,.env.api 中的变量会成为运行环境的一部分,应用进程可以通过 os.Getenv()、process.env 等方式读取。
2)根目录的 .env文件配置
.env 是 Docker Compose 的“默认环境变量文件”。只要它放在 docker-compose.yml 同目录,不需要任何额外声明,Docker Compose 会自动把它加载进来,里面的 KEY=value 可以在 compose 文件中用 ${KEY} 或 ${KEY:-默认值} 直接使用。
.env 里的变量只用于解析 compose 文件本身(如 ${VAR} 占位符),不会自动变成容器里的环境变量,除非在 environment: 里显式引用;或者在 env_file: 里再次把 .env 列进去。
3)根目录的 .env.api 文件配置
放在项目根目录时,Docker Compose 会自动加载它,把里面的变量注入到 所有服务的运行环境。
不需要在 docker-compose.yml 里写 env_file。适合放所有服务共用的变量。
还可以使用 .env.api.vars(自定义命名)
Docker Compose 不会自动加载,必须在 docker-compose.yml 里手动声明:
services:
api:
image: my-api:latest
env_file:
- .env.api.vars
适合按服务拆分配置,例如:
# .env.api.vars
DB_HOST=db
DB_USER=api_user
DB_PASS=api_pass
两者可以共存:
- .env.api 放通用变量(自动加载);
- .env.api.vars 放某个服务专用变量(手动加载)。
5. DockerFile文件设置加速
如果在国内运行镜像编译,而不是提交到github自动构建,那么设置国内加速源,非常有必要。参考代码如下:
# 第一阶段:构建Python依赖
FROM python:3.10-slim AS builder
# 安装系统依赖,包括编译工具
# 换国内 Debian 源(可选,加速 apt-get)
#RUN sed -i 's@http://deb.debian.org@https://mirrors.aliyun.com@g' /etc/apt/sources.list && \
# 不成功,因为source文件路径有问题
RUN sed -i 's|http://deb.debian.org|https://mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources && \
apt-get update && apt-get install -y \
gcc \
g++ \
make \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装Python依赖
# RUN pip install --no-cache-dir -r requirements.txt
# 国内源
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple -r requirements.txt
...
如果设置后有效果,可以通过输出看到:
## 加速设置无效,仍然走的国外
Hit:1 http://deb.debian.org/debian trixie InRelease
=> => # Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
## 生效
=> [builder 2/5] RUN sed -i 's|http://deb.debian.org|https://mirrors.aliyun.com|g' /etc/apt/sources.list.d/debi 17.1s
=> => # Get:1 https://mirrors.aliyun.com/debian trixie InRelease [140 kB]
=> => # Get:2 https://mirrors.aliyun.com/debian trixie-updates InRelease [47.3 kB]
=> => # Get:3 https://mirrors.aliyun.com/debian-security trixie-security InRelease [43.4 kB]
=> => # Get:4 https://mirrors.aliyun.com/debian trixie/main amd64 Packages [9669 kB]
...

3607

被折叠的 条评论
为什么被折叠?



