端口映射与容器互联
约 746 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Docker › 网络(在新窗口打开) › 端口映射与容器互联
端口映射详解
# 基础语法:-p [宿主机地址:]宿主机端口:容器端口[/协议]
docker run -d -p 8080:80 nginx:alpine
# 指定监听地址
docker run -d -p 127.0.0.1:8080:80 nginx # 仅本机访问
docker run -d -p 0.0.0.0:8080:80 nginx # 所有网卡
# 多端口
docker run -d -p 8080:80 -p 443:443 nginx
# UDP 端口
docker run -d -p 53:53/udp -p 53:53/tcp dns-image
# 随机端口(由 Docker 自动分配,避免冲突)
docker run -d -p 80 nginx
docker port $(docker ps -ql)
# 80/tcp -> 0.0.0.0:32768查看端口映射
# 查看所有映射
docker port web
# 80/tcp -> 0.0.0.0:8080
# inspect 查看
docker inspect web --format '{{json .NetworkSettings.Ports}}'容器互联:Web + MySQL 实例
# 1. 创建自定义网络
docker network create app-net
# 2. 启动 MySQL
docker run -d \
--network app-net \
--name mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=app \
-v mysql-data:/var/lib/mysql \
mysql:8.4
# 3. 启动 Web 应用(连接到同一网络)
docker run -d \
--network app-net \
--name web \
-p 8080:3000 \
-e DB_HOST=mysql \
-e DB_USER=root \
-e DB_PASSWORD=secret \
-e DB_NAME=app \
myapp:latest
# 4. 验证连通性
docker exec web ping mysql
docker exec web curl -s http://mysql:3306关键点:
- 同一自定义网络中的容器通过容器名(
mysql、web)互相访问。 DB_HOST=mysql在应用代码中直接使用主机名连接数据库。
暴露端口给宿主机
# 只暴露给其他容器(不映射宿主机端口)
# 使用 --expose 在 Dockerfile 中声明,或直接不写 -p
docker run -d --network app-net --name api --expose 3000 myapp
# 同一网络的其他容器可以访问
docker exec web curl http://api:3000
# 宿主机不能直接访问(因为没有 -p 映射)
# curl http://localhost:3000 → 连接失败网络隔离场景
# 创建两个不同网络
docker network create frontend-net
docker network create backend-net
# 前端服务(暴露给外部)
docker run -d \
--network frontend-net \
--name nginx \
-p 80:80 \
nginx:alpine
# 后端服务(不暴露外部)
docker run -d \
--network backend-net \
--name api \
myapp:latest
# 如果 nginx 需要访问 api,把它也连接到 backend-net
docker network connect backend-net nginx--link(已废弃)
# 旧写法,不推荐在新项目中使用
docker run -d --name web --link mysql:mysql myapp从 Docker 自定义网络(1.10+)起,--link 已被自定义网络 DNS 解析替代。现有项目应迁移到自定义网络。
小结
-p 宿主机端口:容器端口将容器端口暴露到宿主机;不加-p则仅在容器网络中可达。- 同一自定义 bridge 网络上的容器通过容器名互相通信(内置 DNS)。
- 网络隔离:不同网络的容器彼此不可见;一个容器可同时连接到多个网络。
--link已废弃,自定义网络是容器互联的推荐方案。
上一节:Docker 网络模型 下一节:自定义网络与 DNS
