一、Docker 里到底有哪些"名字"?
Docker 里有 3 种名字,很多人会混淆:
| 名称 | 示例 | 出现位置 | 用途 | 是否影响 MySQL 主从 |
|---|---|---|---|---|
| 容器名(container_name) | mysql-container |
docker run / compose | 给人看的名字,用于 docker 命令 | ❌ 不影响 |
| 服务名(service name) | mysql |
docker-compose.yml | Docker 内部 DNS 主机名 | ✔ 仅在 compose 内部网络有效 |
| 主机名(hostname) | 默认=容器名 | 容器内部 | Linux 主机名 | ❌ 一般不用 |
| IP 地址 | 192.168.10.143 |
宿主机 / 局域网 | 跨容器、跨服务器通信 | ✔ 经常用 |
二、什么是 Docker 服务名?
只有 docker-compose.yml 才有服务名。
例如:
yaml
services:
mysql:
redis:
backend:
这里的:
-
mysql -
redis -
backend
就是 服务名(service name)。
✔ 服务名的作用
在 Docker Compose 内部网络中:
backend → mysql
就像访问一个域名一样。
✔ 服务名 = Docker 内部 DNS 主机名
Compose 会自动创建一个内部网络:
mysql → 172.18.0.2
redis → 172.18.0.3
backend → 172.18.0.4
所以 Django (web)可以这样访问 MySQL:
HOST = "mysql"
三、docker run 没有服务名
你这条命令:
docker run --name mysql-container ...
这里的:
--name mysql-container
是 容器名,不是服务名。
docker run 不会创建 service name。
四、你为什么感觉"我部署项目时没用到服务名"?
因为你部署主从复制时:
-
主库是一个容器
-
从库是另一个容器
-
它们之间通过 宿主机 IP 通信
你的主从复制命令是:
MASTER_HOST='192.168.10.143'
所以你根本不会用到:
-
mysql -
mysql-master -
mysql-slave
这些 service 名。
你用的是 IP,不是 Docker 内部网络。
五、TLS 证书到底应该匹配什么?
最关键的一句话:
🔥 TLS 证书必须匹配你在 CHANGE MASTER TO 里写的 MASTER_HOST。
你写的是:
MASTER_HOST='192.168.10.143'
所以证书必须:
mkcert 192.168.10.143
和 service 名完全无关。
六、什么时候才需要用服务名?
只有一种情况:
✔ 主库和从库都在同一个 docker-compose.yml 里
例如:
yaml
services:
mysql-master:
mysql-slave:
主从复制写法:
MASTER_HOST='mysql-master'
证书必须:
mkcert mysql-master
但现在不是这种架构。
七、最终总结(最重要)
我给你一句最关键的总结:
docker-compose 才有服务名;docker run 没有服务名。 主从复制使用什么 Host,就必须用这个 Host 来生成 TLS 证书。 你现在用的是 IP,所以证书必须用 IP。