在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参数。
|
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
|
3 检查桥接网卡的IP和子网掩码信息。
|
4 创建一对veth pair接口A和B,绑定A到网桥docker0,并启用它。
|
5 将B放到容器的网络命名空间,命名为eth0,启动它并配置一个可用IP(桥接网段)和默认网关。
|
以上,就是Docker配置网络的具体过程。
查看更改后的容器IP。
|
测试连通性
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中如何配置网络,并自行配置容器的网络连接,使其具有访问网络的权限。