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 容器。


原始标题:How to Access Docker Container From Host Using Container Name