Docker 网络与容器通信实践笔记
·
1. SSH 服务与客户端包名差异
- Rocky Linux 中 SSH 服务包名为
sshd,客户端包名为openssh-clients。 - Ubuntu 中 SSH 服务包名为
ssh,客户端包名为openssh-client。
2. 网络基础概念
- NAT (Network Address Translation):网络地址转换。
- WAN (Wide Area Network):广域网。
- LAN (Local Area Network):局域网。
3. 启动指定版本的 Nginx 容器
目标:启动一个名为 jian-1 的 Nginx 容器,使用镜像版本 1.28.3,连接到自定义网络 changsha,并将宿主机的 8066 端口映射到容器的 80 端口,修改其首页内容为 “welcome to changsha”。
3.1 下载并重命名镜像
# 从华为云镜像仓库拉取指定版本的 Nginx 镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.28.3-alpine
为镜像打上更通用的标签
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.28.3-alpine docker.io/nginx:1.28.3
3.2 创建网络并启动容器
# 创建名为 changsha 的 Docker 网络
docker network create changsha
启动容器,映射端口并指定网络
docker run -d --name jian-1 -p 8066:80 --network changsha nginx:1.28.3
3.3 修改容器首页内容
首页文件路径:/usr/share/nginx/html/index.html
修改思路:
- 直接进入容器内部修改。
- 使用
docker cp将文件复制到宿主机,修改后再复制回容器。
常用编辑命令:vi、tee、cat > index.html << EOF、sed。
4. Docker cp 命令示例
# 将宿主机 /etc/passwd 文件复制到当前目录并重命名为 sc_passwd
cp /etc/passwd sc_passwd
将容器内的 index.html 文件复制到宿主机当前目录
docker cp jian-1:/usr/share/nginx/html/index.html .
将宿主机修改后的 index.html 文件复制回容器
docker cp index.html jian-1:/usr/share/nginx/html/index.html
5. NAT 类型与 SCOPE
- SNAT (Source NAT):修改数据包中的源 IP 地址,通常用于容器访问外网。
- DNAT (Destination NAT):修改数据包中的目的 IP 地址。
- SCOPE:作用域,表示有效的范围。
local表示本地机器。
6. Docker 网络模式
6.1 单宿主机内容器通信
- bridge:默认的桥接网络。
- host:与宿主机共享网络命名空间。
- null:无网络(none)。
6.2 跨宿主机容器通信
- ipvlan
- macvlan
- overlay
7. 创建 ipvlan 网络
7.1 命令语法与参数说明
docker network create -d ipvlan \
--subnet=192.168.10.0/24 \
--gateway=192.168.10.2 \
-o ipvlan_mode=l2 \
-o parent=ens33 \
--ip-range=192.168.10.64/26 \
db_net
--subnet:指定容器获得 IP 地址的网段。--gateway:指定容器的网关 IP。-o ipvlan_mode=l2:指定 ipvlan 模式为 L2。-o parent=ens33:指定容器网络与宿主机的哪个物理接口连接到同一交换机。--ip-range:指定使用的 IP 地址子网范围。db_net:网络名称。
7.2 在不同系统上创建 ipvlan 网络
# 在 Ubuntu 上创建
docker network create -d ipvlan \
--subnet=192.168.10.0/24 \
--gateway=192.168.10.2 \
-o ipvlan_mode=l2 \
--ip-range=192.168.10.0/26 \
-o parent=ens33 \
sc_net
在 Rocky Linux 上创建
docker network create -d ipvlan
--subnet=192.168.10.0/24
--gateway=192.168.10.2
-o ipvlan_mode=l2
--ip-range=192.168.10.64/26
-o parent=ens160
sc_net
8. 启动容器并验证网络
8.1 拉取并重命名镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.28.3-alpine
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.28.3-alpine docker.io/nginx:1.28.3-alpine
8.2 在 CentOS/Rocky 上启动容器
# 启动两个容器,使用 sc_net 网络,并分配静态 IP
docker run -d --net=sc_net --name zhangpeng-1 --ip=192.168.10.10 nginx:1.28.3-alpine
docker run -d --net=sc_net --name zhangpeng-2 --ip=192.168.10.11 nginx:1.28.3-alpine
8.3 在 Ubuntu 上启动容器
docker run -d --net=sc_net --name zhangpeng-3 nginx:1.28.3-alpine
docker run -d --net=sc_net --name zhangpeng-4 nginx:1.28.3-alpine
8.4 验证容器 IP 与网络连通性
# 启动一个指定 IP 的容器并进入查看
docker run -d --net=sc_net --name zhangpeng-5 --ip=192.168.10.188 nginx:1.28.3-alpine
docker exec -it zhangpeng-5 sh
/ # ip add
# 输出将显示容器的 IP 地址,例如 192.168.10.188/24
/ # ping 192.168.10.10 # 测试与另一台宿主机上容器的连通性
9. 综合练习:创建 ipvlan 网络并测试跨主机通信
目标:创建一个名为 feng_net 的 ipvlan 网络,网段为 192.168.80.0/24。在 Rocky 和 Ubuntu 宿主机上分别启动一个 Nginx 容器,并测试它们之间的网络连通性。
9.1 创建 ipvlan 网络
# 在 Ubuntu 宿主机上创建网络(一个网络接口只能创建一个 ipvlan)
docker network create -d ipvlan \
--subnet=192.168.80.0/24 \
--gateway=192.168.80.2 \
-o parent=ens33 \
feng_net
注意:删除网络前,需要先删除使用该网络的所有容器。
9.2 在 Rocky 和 Ubuntu 上启动容器
# 在 Rocky 宿主机上启动容器 fengdy-1,并指定 IP
docker run -d --name fengdy-1 --net=feng_net --ip=192.168.80.10 nginx:1.28.3
在 Ubuntu 宿主机上启动容器 fengdy-2,并指定 IP
docker run -d --name fengdy-2 --net=feng_net --ip=192.168.80.11 nginx:1.28.3
9.3 测试网络连通性
# 进入 Ubuntu 宿主机上的容器 fengdy-2
docker exec -it fengdy-2 sh
查看容器 IP 地址
/ # ip add
应显示类似:inet 192.168.80.11/24 ...
测试 ping Rocky 宿主机上的容器 fengdy-1
/ # ping 192.168.80.10
成功输出示例:
PING 192.168.80.10 (192.168.80.10): 56 data bytes
64 bytes from 192.168.80.10: seq=0 ttl=64 time=1.504 ms
...
10. 网络模型基础
10.1 OSI 七层参考模型
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
10.2 TCP/IP 五层模型
- 物理层:网线、网卡等物理设备。
- 数据链路层:MAC 地址(源 MAC 和目的 MAC),设备如交换机。MAC 地址全球唯一,由网卡硬件决定。
- 网络层:IP 地址(源 IP 和目的 IP),设备如路由器。公网 IP 地址全球唯一。
- 传输层:端口号(范围 0~65535,其中 1~1024 为经典端口),解决从一台机器的 A 程序到另一台机器的 B 程序的通信问题。
- 应用层:应用程序协议。
数据封装:从上到下(应用层 → 物理层)。
数据解封装:从下到上(物理层 → 应用层)。
10.3 查看网络接口信息示例
ip add
# 输出示例:
# 2: ens160: mtu 1500 ...
# link/ether 00:0c:29:c3:73:e0 brd ff:ff:ff:ff:ff:ff
# inet 192.168.10.228/24 brd 192.168.10.255 scope global noprefixroute ens160
# valid_lft forever preferred_lft forever
其中 00:0c:29:c3:73:e0 为 MAC 地址:00:0c:29 是厂商编号,c3:73:e0 是厂商内部唯一编号。
更多推荐

所有评论(0)