Docker网络模式
桥接网络:你的网络和宿主机的同等关系,连接了同一个路由器同一个交换机网段也是一样的
nat:他把你宿主机的网络做成了一个类似于路由器的设备,它实现了网络地址转换,宿主机能联网,他就能联网,但是他们的网段是不一样的
仅主机:仅仅是让你的宿主机和虚拟机进行连接
host模式
使用方法:docker run时使用--net=host指定
docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip
container模式
使用方法:--net=container:container_id/container_name
多个容器使用共同的网络,看到的ip是一样的
none模式
扫描二维码关注公众号,回复: 12151734 查看本文章
使用方法:--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