8,docker基础之---桥接主机模式与特权指令

时间:2022-12-12 00:39:54

#安装docker之后默认三种网络模式
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5e1a189fbfa1 bridge bridge local #bridge就是桥接模式
8b974a9681af host host local #host就是主机模式
0456f88c6851 none null local #none就是无网络模式
[root@docker ~]#

bridge桥接实战

8,docker基础之---桥接主机模式与特权指令

如果开启两个容器再看则是:

#开启一个容器
[root@docker ~]# docker run -itd centos:7
afe3bc308a229066a896711844cd133419ddd9a2ed0ac4de5535e4b0288aed64
#开启第二个容器
[root@docker ~]# docker run -itd centos:7
3866dbef91952a87fa17cc975f3197f26460b8bee50b6f49a60e7760c17174aa
#查看运行状态
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3866dbef9195 centos:7 "/bin/bash" 12 seconds ago Up 11 seconds friendly_tesla
afe3bc308a22 centos:7 "/bin/bash" 15 seconds ago Up 13 seconds serene_shaw
[root@docker ~]#使用ip ad再次进行查看一下

8,docker基础之---桥接主机模式与特权指令

例如进去一个容器进行查看:

#进入容器
[root@docker ~]# docker exec -it 3866dbef9195 /bin/bash
#查看IP发现执行命令错误没有安装扩展安装net-tools即可
[root@3866dbef9195 /]# ifconfig
bash: ifconfig: command not found
#进行安装
[root@3866dbef9195 /]# yum install net-tools -y

8,docker基础之---桥接主机模式与特权指令

查看路由表:

[root@b60f6ffa49a1 /]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
[root@b60f6ffa49a1 /]#从上面可以看出172.17.0.1是他的网关
ROOT目录下安装bridge-utils【作用:可以查看这台机器的桥接作用】

[root@docker ~]# yum install bridge-utils -y
安装好之后查看docker容器的桥接情况:

[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56a8ff3cce88 centos:7 "/bin/bash" 2 minutes ago Up 2 minutes distracted_mendeleev
b60f6ffa49a1 centos:7 "/bin/bash" 9 minutes ago Up 9 minutes jovial_jepsen
[root@docker ~]#
[root@docker ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024235cd6ee4 no veth04ad9f4
veth9195668
[root@docker ~]#看尾数一样即可
例如我们在开启一台容器然后进行查看一下:

8,docker基础之---桥接主机模式与特权指令

注意:外面机器无法直接访问容器必须容器进行端口映射才可进行访问

host主机实战

例如我们开启nginx镜像进行测试:

#查看镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos nginx d5a3dabc2f10 2 minutes ago 522MB
centos 7 eeb6ee3f44bd 17 months ago 204MB
[root@docker ~]#
启动镜像:(选取主机host模式)

[root@docker ~]# docker run -itd --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
b88bff9005cf622b78b2702e76de150751a746ae480e189c2ea75bb399e5ede2
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b88bff9005cf mycentos:nginx "/usr/local/nginx/sb…" 6 seconds ago Up 6 seconds lucid_murdock
[root@docker ~]#


docker run -itd --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
#这里的--net=host可以选取主机模式不写则默认为桥接docker0模式
--net=host 主机模式
查看IP地址:(如图所示没有新启动容器的IP地址如果没有设置host主机模式则会出现一个容器地址)

8,docker基础之---桥接主机模式与特权指令

查看此容器的详情信息:

[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b88bff9005cf mycentos:nginx "/usr/local/nginx/sb…" 4 minutes ago Up 4 minutes lucid_murdock
[root@docker ~]# docker inspect b88bff9005cf

8,docker基础之---桥接主机模式与特权指令

因为nginx的端口默认80启动之后会占用咱们的宿主机所以咱们查看一下端口占用情况:(可以看到已经被占用)

[root@docker ~]# netstat -tunlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4562/nginx: master
[root@docker ~]#
宿主机访问测试:(发现访问不了检查防火墙)

8,docker基础之---桥接主机模式与特权指令

查看防火墙允许:

8,docker基础之---桥接主机模式与特权指令

放行80端口即可:

[root@docker ~]# firewall-cmd --znotallow=public --add-port=80/tcp --permanent
success
[root@docker ~]#
重新加载防火墙:

[root@docker ~]# firewall-cmd --reload
success
[root@docker ~]#
再次进行访问测试:

8,docker基础之---桥接主机模式与特权指令

删除容器重新进行测试:

[root@docker ~]# docker rm -f $(docker ps -a -q)
b88bff9005cf
[root@docker ~]#
如果不指定host主机模式:

[root@docker ~]# docker run -itd mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
56c46cc0db37f7e7763d5926ab3372073b6f91d73317cc277d2d1f2662ee9ccd
[root@docker ~]#
是访问不了的:

8,docker基础之---桥接主机模式与特权指令

none无网络实战

在这种模式下不会有IP地址的:(例如我们启动一个centos设置none模式)

[root@docker ~]# docker run -itd --net=none centos:7 /bin/bash
9367d758f52a8925377bef8b2ab97ae34cbf501be9f15a77bfb75b3453de0045
[root@docker ~]#
查看IP看一下:

8,docker基础之---桥接主机模式与特权指令

查看一下此容器的详情信息:

[root@docker ~]# docker inspect 9367d758f52a

8,docker基础之---桥接主机模式与特权指令

也就是说他没有IP地址也就是断网的意思一般用于测试学习很少用(无法连接外网)

Link实现单向通信

例如我们开启一台mysql和centos:

[root@docker ~]# docker run --name mydb -e MYSQL_ROOT_PASSWORD=adb123456 -d mysql:5.7
a376a219d21a1891960e3d5b346b1ee9bf6245e8b6076b63d41f05c57304f7a9
[root@docker ~]#
[root@docker ~]# docker run -itd centos:7
324da167f637bd818ba3e76f797e6a18e20acd1222a42f098174276b076a9a02
[root@docker ~]#
进行查看启动:

[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
324da167f637 centos:7 "/bin/bash" 44 seconds ago Up 43 seconds charming_torvalds
a376a219d21a mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp mydb
[root@docker ~]#
进行查看一下mysql的IP地址:

[root@docker ~]# docker inspect a376a219d21a

8,docker基础之---桥接主机模式与特权指令

进行查看一下centos的IP地址:

[root@docker ~]# docker inspect 324da167f637

8,docker基础之---桥接主机模式与特权指令

一般情况下MySQL和centos的IP会互相通信因为他们都是桥接docker0的网卡

注意:由于一台或者多台容器对应mysql数据库但是每次启动IP地址都不唯一所以咱们采用Link的方式及以命名进行单项通信不用管IP地址。

#我们重新启动两台centos命名为tomcat1和2作为实验link
[root@docker ~]# docker run -itd --name tomcat1 --link mydb centos:7
ee972f975128650106b28da403bbb65dda883c26da36127441e0fc190b678878
[root@docker ~]# docker run -itd --name tomcat2 --link mydb centos:7
042cab2e5d1cbc8724e38ed0138b90a7c85a5e2f497cfd8661d2e89dc43e444e
[root@docker ~]#
进入tomcat1容器测试:

[root@docker ~]# docker exec -it ee972f975 /bin/bash
#pingIP地址测试OK的
[root@ee972f975128 /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.226 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.100 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 0.100/0.163/0.226/0.063 ms
#ping数据库的命名测试也是OK的
[root@ee972f975128 /]# ping mydb
PING mydb (172.17.0.2) 56(84) bytes of data.
64 bytes from mydb (172.17.0.2): icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from mydb (172.17.0.2): icmp_seq=2 ttl=64 time=0.168 ms
^C
--- mydb ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.057/0.112/0.168/0.056 ms
[root@ee972f975128 /]#
进入mysql容器进行测试;

8,docker基础之---桥接主机模式与特权指令

#可以看到上面打开的tomcat1的Ip地址是172.17.0.4
#进入mysql进行ping测试

[root@docker ~]# docker exec -it a376a219d21a /bin/bash

#发现数据库中没有ping命令所以需要手动安装
root@a376a219d21a:/# ping 172.17.0.4
bash: ping: command not found
root@a376a219d21a:/#
#先更新然后安装

root@a376a219d21a:/# apt-get update
root@a376a219d21a:/# apt-get install net-tools
root@a376a219d21a:/# apt-get install iputils-ping -y


#再次进行ping测试
root@a376a219d21a:/# ping tomcat1
ping: tomcat1: Name or service not known
root@a376a219d21a:/# ping tomcat2
ping: tomcat2: Name or service not known

root@a376a219d21a:/#发现ping不通说明咱们的link已经执行只有toumcat进行单向通信

brige桥接实现双向通信

下面实验进行双向通信的实验:

#查看网络模式
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
11ec5878b5e9 bridge bridge local
8b974a9681af host host local
0456f88c6851 none null local
[root@docker ~]#
#新添加一个网桥
[root@docker ~]# docker network create -d bridge my_bridge
446f47686eaacda025e6ba532b64113b3f5d80922a8779238978a938fde6516f
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
11ec5878b5e9 bridge bridge local
8b974a9681af host host local
446f47686eaa my_bridge bridge local #新添加的网桥
0456f88c6851 none null local
[root@docker ~]#
新启动两个容器命名为tomcat:

[root@docker ~]# docker run -itd --name tomcat centos:7
195622117fedf62cb97737779bff9e0cdd38166f388646a06f6bdc9a34685a01
再次启动一台命名为redis:

[root@docker ~]# docker run -itd --name redis centos:7
bb1e58cdd9292b21740b8fd58bc06702466460255d782f352b59b8fafef109e9
假如这两台容器能够进行双向通信tomcat能够访问redis同样redis也可以访问tomcat:

只需把这两个容器加入到咱们新创建的网桥中:

[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
11ec5878b5e9 bridge bridge local
8b974a9681af host host local
446f47686eaa my_bridge bridge local #加入到这个网桥
0456f88c6851 none null local
[root@docker ~]# docker network connect my_bridge tomcat
[root@docker ~]# docker network connect my_bridge redis
[root@docker ~]#
进行测试:

#进入容器测试:
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb1e58cdd929 centos:7 "/bin/bash" 4 minutes ago Up 4 minutes redis
195622117fed centos:7 "/bin/bash" 5 minutes ago Up 5 minutes tomcat
#进入redis与tomcat进行测试
[root@docker ~]# docker exec -it bb1e58cdd929 /bin/bash
[root@bb1e58cdd929 /]# ping tomcat
PING tomcat (172.18.0.2) 56(84) bytes of data.
64 bytes from tomcat.my_bridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.105 ms
64 bytes from tomcat.my_bridge (172.18.0.2): icmp_seq=2 ttl=64 time=0.102 ms
^C
--- tomcat ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 0.102/0.103/0.105/0.010 ms
[root@bb1e58cdd929 /]# exit
exit
#进入redis与tomcat通信测试
[root@docker ~]# docker exec -it 195622117fed /bin/bash
[root@195622117fed /]# ping redis
PING redis (172.18.0.3) 56(84) bytes of data.
64 bytes from redis.my_bridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from redis.my_bridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.297 ms
64 bytes from redis.my_bridge (172.18.0.3): icmp_seq=3 ttl=64 time=0.273 ms
^C
--- redis ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.046/0.205/0.297/0.113 ms
[root@195622117fed /]#

docker容器的特权模式

先启动一个centos:7并且命名为mycentos的容器:

[root@docker ~]# docker run -itd --name mycentos centos:7 /bin/bash
be5646d3d2184a4d957f564193ac39f5350860980c9b00608dfe65d079423692
#进入容器
[root@docker ~]# docker exec -it be5646d /bin/bash
#安装net-tools进行查看路由表
[root@be5646d3d218 /]# yum install net-tools
#查看路由表
[root@be5646d3d218 /]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
[root@be5646d3d218 /]#如果我们不想要这个网关可以给他进行删除测试
[root@be5646d3d218 /]# route del default gw 172.17.0.1
SIOCDELRT: Operation not permitted
[root@be5646d3d218 /]#执行之后发现删除报错不能删除没有权限
[root@be5646d3d218 /]#所以我们需要给这个容器开启特权模式
新开启一台容器命名为mycentos1并且为他赋予特权模式:

[root@docker ~]# docker run -itd --privileged=true --name mycentos1 centos:7 /bin/bash
24e3e228967b40abc08988146b0e97b792b3231e803e218dec4cda23db486533
#进入容器
[root@docker ~]# docker exec -it 24e3e22 /bin/bash
#安装网络工具
[root@24e3e228967b /]# yum install net-tools
#查看路由表
[root@24e3e228967b /]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
[root@24e3e228967b /]#进行删除网关测试
[root@24e3e228967b /]# route del default gw 172.17.0.1
#删除成功再次进行查看路由表
[root@24e3e228967b /]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
[root@24e3e228967b /]#

Volume数据共享

创建一个dockerfile设置一个volume挂载点:

FROM centos:7
VOLUME ["/usr/local"]
[root@docker ~]# cat dockerfile
FROM centos:7
VOLUME ["/usr/local"]
[root@docker ~]#
#进行执行创建
[root@docker ~]# docker build -t centos:v1 .
启动一个容器:

[root@docker ~]# docker run -itd --name centos7 4e60f71029a5 /bin/bash
b62cc708914542cf68ccb1969565ebb019b8e9cbcfcb1bc2bbda92b4346d76d9
[root@docker ~]#
查看此容器的详情信息:

[root@docker ~]# docker inspect b62cc7

8,docker基础之---桥接主机模式与特权指令

咱们把宿主机路径进行复制然后进入此路径:

[root@docker ~]# cd /var/lib/docker/volumes/082d1ae329ef15538bac8a72aecef31d69291107884b05c3338d195f046ddda6/_data
[root@docker _data]#
#通过ll可以看到有很多文件也就是容器里面的文件
[root@docker _data]# ll
总用量 0
drwxr-xr-x 2 root root 6 411 2018 bin
drwxr-xr-x 2 root root 6 411 2018 etc
drwxr-xr-x 2 root root 6 411 2018 games
drwxr-xr-x 2 root root 6 411 2018 include
drwxr-xr-x 2 root root 6 411 2018 lib
drwxr-xr-x 2 root root 6 411 2018 lib64
drwxr-xr-x 2 root root 6 411 2018 libexec
drwxr-xr-x 2 root root 6 411 2018 sbin
drwxr-xr-x 5 root root 49 217 09:31 share
drwxr-xr-x 2 root root 6 411 2018 src
[root@docker _data]#
进入容器查看一下:

[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b62cc7089145 4e60f71029a5 "/bin/bash" 6 minutes ago Up 6 minutes centos7
[root@docker ~]# docker exec -it b62cc7089145 /bin/bash
[root@b62cc7089145 /]#
进入/usr/local通过ll查看发现其内容文件均且一样:

[root@b62cc7089145 ~]# cd /usr/local/

8,docker基础之---桥接主机模式与特权指令

8,docker基础之---桥接主机模式与特权指令

在此路径进行创建一个文本文档在容器进行查看发现一致说明同步:

[root@docker _data]# cat > 123.txt
666
[root@docker _data]# cat 123.txt
666
[root@docker _data]#
[root@b62cc7089145 local]# cat 123.txt
666
[root@b62cc7089145 local]#

实验1(在宿主机启动nginx修改网页的html内容为thins is my nginx然后挂载到新开启的三个nginx容器中进行同步内容)

#启动nginx
[root@docker nginx-1.16.0]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#防火墙为开启状态放行80端口即可
[root@docker nginx-1.16.0]# firewall-cmd --add-service=http --permanent
[root@docker nginx-1.16.0]# firewall-cmd --add-port=80/tcp --permanent
#重启防火墙
[root@docker nginx-1.16.0]# firewall-cmd --reload
[root@docker nginx-1.16.0]#查看是否启动成功
[root@docker nginx-1.16.0]# ps -ef | grep nginx
root 4516 1 0 09:51 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 4517 4516 0 09:51 ? 00:00:00 nginx: worker process
root 4521 1510 0 09:52 pts/0 00:00:00 grep --color=auto nginx

8,docker基础之---桥接主机模式与特权指令

#进行修改内容
[root@docker ~]# cd /usr/local/nginx/html/
[root@docker html]# cat > index.html
thins is my nginx
[root@docker html]# cat index.html
thins is my nginx
[root@docker html]#

8,docker基础之---桥接主机模式与特权指令

启动nginx1

[root@docker html]# docker run -itd -p 8080:80 -v /usr/local/nginx/html:/usr/local/nginx/html --name nginx1 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
c2add1ea75b032a0c9ead2f09914e0db45899a5a15b72510f0ccf953033ca927
[root@docker html]#执行成功之后即可访问容器的8080端口即可与宿主机一致

-p 8080:80表示宿主机的8080端口映射的容器nginx的80端口
-v /usr/local/nginx/html:/usr/local/nginx/html 冒号前面表示宿主机路径后面表示容器路径
--name nginx1 mycentos:nginx 表示启动容器mycentos:nginx命名为nginx1
/usr/local/nginx/sbin/nginx -g "daemon off;" 表示以前台运行启动

8,docker基础之---桥接主机模式与特权指令

启动nginx2(容器与容器之间共享)

[root@docker html]# docker run -itd -p 8081:80 --volumes-from nginx1 --name nginx2 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
78eb87dcc1cfd5f60b3994c1b875b212cc07508fcf8f7e05f10059fee8603027
[root@docker html]#直接访问8081端口即可
--volumes-from nginx1 表示共享nginx1的网页内容

8,docker基础之---桥接主机模式与特权指令

启动nginx3

[root@docker html]# docker run -itd -p 8082:80 --volumes-from nginx1 --name nginx3 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
fd1aa606a1986b48d5f872d77838d851c2aafa5dd56e2f6f831b130fe297471b
[root@docker html]#

8,docker基础之---桥接主机模式与特权指令

现在进行修改宿主机的html内容看一下是否均可同步:

[root@docker ~]# cd /usr/local/nginx/html/
[root@docker html]# cat > index.html
docker
^C
[root@docker html]# cat index.html
docker
[root@docker html]#

8,docker基础之---桥接主机模式与特权指令

8,docker基础之---桥接主机模式与特权指令

8,docker基础之---桥接主机模式与特权指令

实验所得:假如其中nginx2挂掉了重新启动一台命名和端口一样数据都是且共享的