Docker网络和端口映射详细指南

Docker网络和端口映射详细指南

发布时间:2024-10-09 02:18:22

1. docker网络基础

docker使用网络驱动程序来提供网络功能。docker内置了几种网络驱动程序:

  • bridge: 默认网络驱动程序,适用于单机环境
  • host: 直接使用主机网络
  • overlay: 用于跨多个docker守护进程的swarm服务
  • macvlan: 允许为容器分配mac地址
  • none: 禁用所有网络

1.1 查看网络列表

bash
docker network ls

1.2 检查网络

bash
docker network inspect bridge

2. 创建自定义网络

2.1 创建bridge网络

bash
docker network create --driver bridge my_network

2.2 创建具有特定子网和网关的网络

bash
docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 my_custom_network

3. 连接容器到网络

3.1 启动时连接

bash
docker run -d --name my_container --network my_network nginx

3.2 连接运行中的容器

bash
docker network connect my_network my_container

4. 端口映射

端口映射允许外部访问容器内的服务。

4.1 在运行时映射端口

bash
docker run -d -p 8080:80 nginx

这将主机的8080端口映射到容器的80端口。

4.2 在docker compose中映射端口

yaml

version: '3'
services:
web:
image: nginx
ports:
- "8080:80"

4.3 映射多个端口

bash
docker run -d -p 8080:80 -p 443:443 nginx

4.4 映射到随机端口

bash
docker run -d -p 80 nginx

查看分配的端口:

bash
docker port <container_id>

5. 网络故障排查

5.1 容器无法连接到网络

  1. 检查网络配置:
    bash
    docker network inspect <network_name>
  2. 确保容器已连接到正确的网络:
    bash
    docker inspect <container_name> | grep networksettings -a 20
  3. 尝试重新连接容器到网络:
    bash

    docker network disconnect
    docker network connect

5.2 端口映射不工作

  1. 检查端口映射:
    bash
    docker port <container_name>
  2. 确保没有端口冲突:
    bash
    netstat -tuln | grep <port_number>
  3. 检查容器内部服务是否正在运行:
    bash
    docker exec <container_name> ps aux | grep <process_name>
  4. 检查docker防火墙规则:
    bash
    sudo iptables -l -n

5.3 容器间通信问题

  1. 确保容器在同一网络中:
    bash
    docker network inspect <network_name>
  2. 使用docker dns进行服务发现: 容器可以通过容器名称相互访问。
  3. 尝试使用docker-compose创建一个共享网络。

6. 高级网络配置

6.1 设置静态ip

docker-compose.yml中:

yaml

version: '3'
services:
web:
image: nginx
networks:
app_net:
ipv4_address: 172.16.238.10

networks:
app_net:
driver: bridge
ipam:
config:
- subnet: 172.16.238.0/24

6.2 使用host网络

bash
docker run --network host nginx

6.3 配置dns

daemon.json中设置dns:

json

{
"dns": ["8.8.8.8", "8.8.4.4"]
}

重启docker服务:

bash
sudo systemctl restart docker

7. 常见问题和解决方案

  1. 问题: 容器无法访问外网 解决: 检查dns配置和防火墙规则
  2. 问题: 端口已被占用 解决: 更改映射端口或停止占用端口的服务
  3. 问题: 跨主机网络通信失败 解决: 考虑使用overlay网络或第三方网络插件
  4. 问题: 容器ip地址冲突 解决: 使用自定义网络和指定的ip范围
  5. 问题: 网络性能问题 解决: 考虑使用host网络模式或优化网络驱动配置

记住,网络问题可能涉及多个层面,从docker配置到主机网络设置,再到应用程序本身。系统地排查每一层可以帮助你更快地找到问题所在。

-------------------------------------------------------------------------

上面是一个详细的docker网络和端口映射指南作为markdown文档。这个指南涵盖了以下主要内容:

  1. docker网络基础
  2. 创建自定义网络
  3. 连接容器到网络
  4. 端口映射
  5. 网络故障排查
  6. 高级网络配置
  7. 常见问题和解决方案

这个指南应该能够帮助您深入理解docker的网络机制和端口映射,以及如何处理常见的网络问题。它包含了许多实用的命令和配置示例,可以直接在您的docker环境中使用。

感谢提供:05互联