Docker 的网络
在开始接触 docker 的时候, 由于其多个 container 之间, 默认是存在网络隔离的, 导致一开始对如何将多个服务分放在多个容器中很是困惑. 有些人甚至像使用虚拟机一样, 将服务, 数据库, 前端页面等, 都放在相同的容器下, 这显然是不正确的. 那么今天就先讲一下如何构建网络.
在 linux 主机使用 ip link show
可以查看当前的网卡, 其中有一个 docker0
的网络接口.
docker0
即为构建在 OSI 数据链路层
上的网桥, 作用将多个网段在数据链路层链接起来, 可以单独设置 IP 地址, 可视为隐藏的虚拟网卡.
Docker 的网络模式
Docker 目前支持 4 种网络模式, host, container, none, bridge.
使用 --network
在 docker run 命令中指定, 使用 network:
在 docker compose 中指定.
1. host
Docker 通过 Linux 系统的命名空间, PID 空间隔离进程, Mount 空间隔离文件系统, Network 空间隔离网络.
一个容器一般会分一个独立的网络空间, 这将使用独立的网络环境, 将网卡, 路由, IPtable 规则与其他容器区分开来. 但是如果启动的时候, 给容器指定了 host
模式, 将不会单独创建网络, 而是与主机共享网络 ip, 端口.
2. container
此模式与 host 模式类似, 只不过不是与主机共享网络, 而是与已经存在的另一个容器共享网络 ip 和端口.
3. none
此模式创建时不初始化网络, 需要自己手动创建网卡, 配置 IP.
4. bridge
默认模式, 会分配独立的 Network 命名空间, 配置 IP 地址, 并且将其链接到网桥上.
Docker 网络通信
默认情况下, 使用 bridge 方式, 同一主机的多个容器间的网络是通过 docker0 链接到一起的. (自定义网桥情况除外)
一般情况下, 容器内是可以直接访问外部网络的. 但是从外部访问容器内部, 就需要通过端口映射.
使用 -p 外:内
可以在 docker run 的时候指定端口映射. 使用 ports:
可以在 docker compose 中指定.