3.docker网络模式,桥接模式

Docker网络模式

桥接网络:你的网络和宿主机的同等关系,连接了同一个路由器同一个交换机网段也是一样的

nat:他把你宿主机的网络做成了一个类似于路由器的设备,它实现了网络地址转换,宿主机能联网,他就能联网,但是他们的网段是不一样的

仅主机:仅仅是让你的宿主机和虚拟机进行连接

  • host模式

使用方法:docker run时使用--net=host指定

docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip

  • container模式

使用方法:--net=container:container_id/container_name

多个容器使用共同的网络,看到的ip是一样的

  • none模式

使用方法:--net=none指定

这种模式下,不会配置任何网络,没网卡,也不联网

  • bridge模式

使用方法:--net=bridge指定默认模式,不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。


Docker网络管理-外部访问容器

思路:首先使用centos镜像新建一个容器,然后在该容器中安装nginx服务,并启动,再把该容器导成一个新的镜像(centos_nginx),然后再使用新镜像创建容器,并指定宿主机端口映射

创建新镜像:docker run -itd -p 8888:80 centos_nginx bash  //-p 可以指定端口映射,本例中将容器的80端口映射为本地的8888端口

进入新镜像:docker exec -it container_id  bash 

安装nginx:yum install -y nginx

启动nginx: systemctl start nginx

退出该容器:exit

测试: curl 127.0.0.1:8888

  • -p后面也支持IP:port:ip:port 的格式,比如

-p 127.0.0.1:8080:80 

  • 也可以不写本地的端口,只写ip,这样会随意分配一个端口

-p 127.0.0.1::80 //注意这里是两个冒号

另一台机器访问:docker租主机IP:8888也可以访问了

解决启动nginx时的报错Operation not permitted

新建的容器,启动nginx或者httpd服务的时候会报错

[root@34b9c062b8d9 /]# systemctl start nginx
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to get D-Bus connection: Operation not permitted

这是因为dbus-daemon没有启动,解决该问题可以这样做

启动容器时,要加上--privileged -e "container=docker" 参数,并且最后面的命令改为/usr/sbin/init

格式:docker run -itd -p 8888:80 --privileged -e "container=docker" centos_with_nginx /usr/sbin/init

或者加上:--privileged=true

docker run -itd -p 8888:80 --privileged -e "container=true" centos_nginx /usr/sbin/init

[root@bogon ~]# docker run -itd -p 8888:80 --privileged -e "container=true" centos_nginx /usr/sbin/init
20df5c59352256a8bae6d8e8315f65a1f06831a68ec4dc8fc51aa56d1d2bde60
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                    NAMES
73bda065303e   centos_nginx   "/usr/sbin/init"         12 minutes ago   Up 12 minutes   0.0.0.0:8888->80/tcp     wizardly_taussig
df3b494539d4   300e315adb2f   "bash"                   31 minutes ago   Up 31 minutes                            hopeful_haibt
f251f778055e   registry       "/entrypoint.sh /etc…"   57 minutes ago   Up 57 minutes   0.0.0.0:5000->5000/tcp   cranky_ramanujan


Docker网络管理-配置桥接网络

这种模式可以使你的docker容器和宿主机使用同一个交换机,他们在同一个网段下,这样就可以直接跟外面的机器通信,也可以把这个docker看成是一个独立的服务器一样

为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。

首先进入到网卡配置目录下:

cd /etc/sysconfig/network-scripts/

拷贝一个新的网卡出来

cp ifcfg-ens33  ifcfg-br0

  • 更改br0配置:

vim ifcfg-br0

首先更改第一行TYPE=Bridge

再更改名字:NAME=br0;DEVICE=br0;UUID也注释掉

  • 更改ens33配置

vi ifcfg-ens33 //最后一行增加BRIDGE=br0,注释掉:UUID,IPADDR,NETMASK,GATEWAY,DNS1

其实就是把ens33的ip配置到新的虚拟网卡br0上来,然后ens33在进行桥接

重启网卡:systemctl restart network

配置成功以后br0网卡就会继承ens33的ip,而ens33就没有了

[root@localhost network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.18.141  netmask 255.255.255.0  broadcast 192.168.18.255
        inet6 fe80::5b35:7d8a:d448:fcf1  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:b8:0f:33  txqueuelen 1000  (Ethernet)
        RX packets 66  bytes 5379 (5.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 73  bytes 8400 (8.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:74ff:fe8a:e688  prefixlen 64  scopeid 0x20<link>
        ether 02:42:74:8a:e6:88  txqueuelen 0  (Ethernet)
        RX packets 7464  bytes 330335 (322.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12839  bytes 27117685 (25.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:b8:0f:33  txqueuelen 1000  (Ethernet)
        RX packets 243167  bytes 341083270 (325.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 60420  bytes 5248917 (5.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

安装pipwork

克隆:git clone https://github.com/jpetazzo/pipework

[root@localhost ~]# git clone https://github.com/jpetazzo/pipework
正克隆到 'pipework'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 518 (delta 2), reused 5 (delta 2), pack-reused 510
接收对象中: 100% (518/518), 182.72 KiB | 14.00 KiB/s, done.
处理 delta 中: 100% (272/272), done.

拷贝文件到可执行目录下:

cp pipework/pipework /usr/local/bin/

开启一个容器:(--net=none参数意思是不设置网络)

docker run -itd --net=none centos_with_nettool  bash

[root@localhost pipework]# docker run -itd --net=none 772d8347a1d7 bash
62cb0a73d01b26b4b3f7972f45806b8960c0762eacd486ff5e4f578c716051b0

进入到容器里,现在是没有网卡ip的

[root@localhost pipework]# docker exec -it 62cb0a bash
[root@62cb0a73d01b /]# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@62cb0a73d01b /]#

退出并设置IP:

pipework br0 62cb0a73d01b 192.168.18.142/[email protected]  #192.168.18.142为自定义容器的ip,@后面的ip为网关ip

[root@localhost pipework]# pipework br0 62cb0a73d01b 192.168.18.142/[email protected]

在进入容器就有IP了,而且还能ping外网,其他机器也可以ping它,在里边安装一些服务(nginx,httpd)就可以直接ip端口访问了

[root@localhost pipework]# docker exec -it 62cb0a bash
[root@62cb0a73d01b /]# ifconfig
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.18.142  netmask 255.255.255.0  broadcast 192.168.18.255
        ether 2a:d0:c4:88:ba:63  txqueuelen 1000  (Ethernet)
        RX packets 12  bytes 896 (896.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1  bytes 42 (42.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在容器ping外网

[root@62cb0a73d01b /]# ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=128 time=47.4 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=128 time=44.6 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=128 time=46.10 ms

其他机器ping该容器

[root@localhost ~]# ping 192.168.18.141
PING 192.168.18.141 (192.168.18.141) 56(84) bytes of data.
64 bytes from 192.168.18.141: icmp_seq=42 ttl=64 time=0.486 ms
64 bytes from 192.168.18.141: icmp_seq=43 ttl=64 time=0.313 ms
64 bytes from 192.168.18.141: icmp_seq=44 ttl=64 time=0.296 ms
64 bytes from 192.168.18.141: icmp_seq=45 ttl=64 time=0.372 ms
64 bytes from 192.168.18.141: icmp_seq=46 ttl=64 time=0.220 ms
64 bytes from 192.168.18.141: icmp_seq=47 ttl=64 time=0.297 ms


猜你喜欢

转载自blog.51cto.com/12922638/2591046