1. 概述
Docker 是一种操作系统级别的虚拟化平台,广泛用于软件的开发、打包、分发和运行。我们通过镜像启动容器,每个容器都具有独立的文件系统、网络配置和 IP 地址,运行在宿主机的 Docker 引擎之上。
虽然容器本质上是一个虚拟化的 Linux 系统,但我们往往需要从宿主机访问容器内部的服务或执行命令。本文将介绍三种常见的通过容器名称访问 Docker 容器的方法,适用于不同使用场景。
2. 通过共享网络访问容器
Docker 提供了灵活的网络功能,允许容器之间通过容器名称进行通信。我们可以创建一个自定义网络,并将多个容器加入该网络,从而实现基于名称的访问。
示例:
创建一个自定义网络:
docker network create my-network
运行一个名为 test
的 Nginx 容器:
docker run --name test --net my-network -d nginx:alpine
接着运行一个 busybox
容器,并通过容器名 test
发起 ping 请求:
docker run --net my-network busybox:latest ping test
输出示例:
PING test (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.097 ms
...
✅ 该方法适用于多个容器在同一网络中通信,且无需额外配置,推荐用于微服务架构中的容器间通信。
3. 使用 docker exec 命令访问容器
docker exec
命令允许我们在运行中的容器内执行命令。通过容器名称,我们可以直接进入容器的 Shell 环境进行调试或操作。
示例:
运行一个名为 redis-stack
的 Redis 容器:
docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest
进入容器并启动 redis-cli
:
docker exec -it redis-stack redis-cli
在 Redis CLI 中执行命令:
127.0.0.1:6379> SET hello:1 "Hello Redis!"
OK
127.0.0.1:6379> GET hello:1
"Hello Redis!"
✅ 适用于需要直接操作容器内部服务的场景,如调试、数据操作等。
⚠️ 注意:容器中必须安装了目标命令的可执行文件,且用户需有相应权限。
4. 通过配置 /etc/hosts 文件访问容器
如果希望在宿主机上通过容器名称访问容器(例如连接数据库),可以将容器的 IP 地址与名称映射到 /etc/hosts
文件中。
示例:
启动一个 MySQL 容器:
docker run --name mysql_container -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:8.4.2
查看容器的 IP 地址:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql_container
输出示例:
172.17.0.2
编辑 /etc/hosts
文件,添加映射:
172.17.0.2 mysql_container
安装 MySQL 客户端并连接:
sudo apt install mysql-client-core-8.0
mysql -h mysql_container -P 3306 --protocol=tcp -u root
输出示例:
Welcome to the MySQL monitor. Commands end with ; or \g.
...
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
✅ 适用于需要从宿主机通过名称访问容器服务的场景,如远程连接数据库。
⚠️ 注意:每次容器重启 IP 地址可能变化,需手动更新 /etc/hosts
。
5. 总结
我们介绍了三种通过容器名称访问 Docker 容器的方法:
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
共享网络通信 | 容器间通信 | 简洁、无需额外配置 | 仅限同一网络容器 |
docker exec | 容器内部操作 | 直接进入容器执行命令 | 需要容器正在运行 |
/etc/hosts 映射 | 宿主机访问容器服务 | 支持外部服务连接 | 需手动维护 IP 映射 |
根据具体需求选择合适的方法,可以更高效地管理 Docker 容器。