您现在的位置是:首页 >技术交流 >在Docker中自定义网络配置,实现容器与主机的连通性网站首页技术交流

在Docker中自定义网络配置,实现容器与主机的连通性

傻傻的心动 2024-07-24 12:01:02
简介在Docker中自定义网络配置,实现容器与主机的连通性

在Docker中自定义网络配置,实现容器与主机的连通性

【实验步骤】

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33

ONBOOT=yes

[root@localhost ~]# systemctl restart network

[root@localhost ~]# mkdir /opt/centos -p  

[root@localhost ~]# mount /dev/cdrom /opt/centos/

mount: /dev/sr0 is write-protected, mounting read-only

[root@localhost ~]# cd /opt/

[root@localhost opt]# ls -l      \查看是否有以下文件centos,Packages.tar.gz ,postgres.tar

total 472742

drwxrwxr-x. 8 root root      2048 Nov 26  2018 centos

-rw-r--r--. 1 root root 108512388 Jun  2 17:51 Packages.tar.gz

-rw-r--r--. 1 root root 375567360 Jun  2 17:52 postgres.tar

[root@localhost opt]# tar -zxvf Packages.tar.gz

[root@localhost opt]# ls -l

total 472758

drwxrwxr-x. 8 root root      2048 Nov 26  2018 centos

drwxr-xr-x. 3 root root     12288 Mar  8  2020 Packages

-rw-r--r--. 1 root root 108512388 Jun  2 17:51 Packages.tar.gz

-rw-r--r--. 1 root root 375567360 Jun  2 17:52 postgres.tar

[root@localhost opt]#

[root@localhost opt]# vi /etc/yum.repos.d/CentOS-Base.repo 

[centos]

name=centos

baseurl=file:///opt/centos

gpgcheck=0

enabled=1

[Packages]

name=Packages

baseurl=file:///opt/Packages

gpgcheck=0

enabled=1

使用yum安装docker容器

[root@localhost opt]#  yum -y install docker-io

启动docker容器服务

[root@localhost opt]# systemctl start docker

查看当前docker状态

[root@localhost opt]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

上传一个镜像 postgres.tar

将镜像上传docker容器

[root@localhost opt]# docker load -i postgres.tar

再次查看当前docker状态

[root@localhost opt]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

training/postgres   latest              1ca72400eeb5        9 years ago         364.6 MB

[root@localhost opt]#

用户使用--net=none后,可以自行配置网络,让容器达到跟平常一样具有访问网络的权限。通过这个过程,可以了解Docker配置网络的细节。

1 首先,启动一个/bin/bash容器,指定--net=none参数。

[root@localhost opt]# docker run -i -t --rm --net=none  training/postgres  /bin/bash

root@7792787a5b3b:/#

2 重新打开一个远程连接在本地主机查找容器的进程id,并为它创建网络命名空间。

 [root@localhost ~]# docker ps -a    //用于查找docker容器的name

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

7792787a5b3b        training/postgres   "/bin/bash"         43 seconds ago      Up 42 seconds                           jolly_pike

[root@localhost ~]# docker inspect -f '{{.State.Pid}}' 7792787a5b3b

2559

[root@localhost ~]# pid=2559

[root@localhost ~]# mkdir -p /var/run/netns

[root@localhost ~]# ln -s /proc/$pid/ns/net /var/run/netns/$pid

3 检查桥接网卡的IP和子网掩码信息。

[root@localhost ~]# ip addr show docker0

4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000

    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff

    inet 172.17.42.1/16 scope global docker0

       valid_lft forever preferred_lft forever

[root@localhost ~]#

4 创建一对veth pair接口A和B,绑定A到网桥docker0,并启用它。

[root@localhost ~]# ip link add A type veth peer name B

[root@localhost ~]#  brctl addif docker0 A

[root@localhost ~]# ip link set A up

[root@localhost ~]# ip  add

…….

5: B@A: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

    link/ether 4a:20:7f:7e:72:98 brd ff:ff:ff:ff:ff:ff

6: A@B: <NO-CARRIER,BROADCAST,MULTICAST,UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 state LOWERLAYERDOWN group default qlen 1000

    link/ether 2a:dd:f7:26:8d:12 brd ff:ff:ff:ff:ff:ff

[root@localhost ~]#

查看到A@B当前的状态是UP

5 将B放到容器的网络命名空间,命名为eth0,启动它并配置一个可用IP(桥接网段)和默认网关。

[root@localhost ~]#  ip link set B netns $pid

[root@localhost ~]# ip netns exec $pid ip link set dev B name eth0

[root@localhost ~]# ip netns exec $pid ip link set eth0 up

[root@localhost ~]#  ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0

[root@localhost ~]# ip netns exec $pid ip route add default via 172.17.42.1

[root@localhost ~]#

以上,就是Docker配置网络的具体过程。

查看更改后的容器IP。

root@7792787a5b3b:/# ip add

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

    link/ether 4a:20:7f:7e:72:98 brd ff:ff:ff:ff:ff:ff

    inet 172.17.42.99/16 scope global eth0

       valid_lft forever preferred_lft forever

    inet6 fe80::4820:7fff:fe7e:7298/64 scope link

       valid_lft forever preferred_lft forever

root@7792787a5b3b:/#

测试连通性

root@7792787a5b3b:/# ping -c 4 192.168.50.128

PING 192.168.50.128 (192.168.50.128) 56(84) bytes of data.

64 bytes from 192.168.50.128: icmp_seq=1 ttl=64 time=0.315 ms

64 bytes from 192.168.50.128: icmp_seq=2 ttl=64 time=0.081 ms

64 bytes from 192.168.50.128: icmp_seq=3 ttl=64 time=0.080 ms

64 bytes from 192.168.50.128: icmp_seq=4 ttl=64 time=0.164 ms

--- 192.168.50.128 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3001ms

rtt min/avg/max/mdev = 0.080/0.160/0.315/0.095 ms

root@7792787a5b3b:/#

[root@localhost ~]# ping -c 4 172.17.42.99

PING 172.17.42.99 (172.17.42.99) 56(84) bytes of data.

64 bytes from 172.17.42.99: icmp_seq=1 ttl=64 time=0.326 ms

64 bytes from 172.17.42.99: icmp_seq=2 ttl=64 time=0.073 ms

64 bytes from 172.17.42.99: icmp_seq=3 ttl=64 time=0.070 ms

64 bytes from 172.17.42.99: icmp_seq=4 ttl=64 time=0.072 ms

--- 172.17.42.99 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3000ms

rtt min/avg/max/mdev = 0.070/0.135/0.326/0.110 ms

[root@localhost ~]#

【步骤解释】

  • 在编辑器中打开 /etc/sysconfig/network-scripts/ifcfg-ens33 文件,并将 ONBOOT 参数设置为 yes。这样可以在启动时自动激活网络接口。
  • 使用 systemctl restart network 命令重启网络服务,以使更改生效。
  • 创建一个目录 /opt/centos,并将光盘设备 /dev/cdrom 挂载到该目录下。如果光盘是只读的,会显示 "mount: /dev/sr0 is write-protected, mounting read-only"。
  • 进入 /opt/ 目录,使用 ls -l 命令查看是否存在以下文件:centos、Packages.tar.gz、postgres.tar。
  • 使用 tar -zxvf Packages.tar.gz 命令解压 Packages.tar.gz 文件。
  • 编辑 /etc/yum.repos.d/CentOS-Base.repo 文件,在文件中添加一个名为 centos 的仓库,其 baseurl 设置为 file:///opt/centos,同时将 enabled 参数设置为 1。
  • 使用 yum -y install docker-io 命令安装 Docker 容器。
  • 使用 systemctl start docker 命令启动 Docker 服务。
  • 使用 docker images 命令查看当前可用的 Docker 镜像。
  • 使用 docker load -i postgres.tar 命令将 postgres.tar 镜像加载到 Docker 容器中。
  • 再次使用 docker images 命令确认镜像加载成功。
  • 使用 docker run -i -t --rm --net=none training/postgres /bin/bash 命令启动一个名为 training/postgres 的容器,并指定 --net=none 参数以便自行配置网络。
  • 在本地主机上打开一个新的终端连接,并使用 docker ps -a 命令查找容器的进程 ID(CONTAINER ID)。
  • 使用 docker inspect -f '{{.State.Pid}}' <CONTAINER ID> 命令获取容器的进程 ID(PID)。
  • 创建一个网络命名空间,将容器的网络命名空间链接到本地主机的 /var/run/netns 目录。
  • 使用 ip addr show docker0 命令检查桥接网卡 docker0 的 IP 地址和子网掩码信息。
  • 创建一对 veth 接口 A 和 B,将接口 A 绑定到桥接网卡 docker0 上,并启用它。
  • 将接口 B 移动到容器的网络命名空间中,并将其重命名为 eth0,然后启用接口 eth0 并为其配置一个可用的 IP 地址(在桥接网段中)和默认网关。
  • 使用 ip add 命令检查更改后容器中的 IP 地址。
  • 进行连通性测试,使用 ping 命令测试容器和本地主机之间的连通性。

通过这个实验,您可以了解到在Docker中如何配置网络,并自行配置容器的网络连接,使其具有访问网络的权限。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。