Docker系列6:Docker网络管理-创新互联

一、创建容器时候的选项

公司主营业务:成都做网站、网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出广水免费做网站回馈大家。
  • --network xx:指定容器使用的网络类型

  • --hostname xx:指定容器使用的主机名

  • --dns x.x.x.x:指定容器使用的DNS地址

  • --dns-search xxx:指定搜索域,默认搜索域是宿主机

  • --add-host 域名:地址 在hosts文件添加记录

二、创建封闭式网络容器

创建容器的时候,默认用none网络

  • 可以再创建容器的时候,用network选项来指定容器的类型是 none

创建容器

[root@host1 ~]# docker run --name t1 -it --rm \ > --network none --hostname t1 --dns 114.114.114.114 \ > --dns-search linux.io \ > --add-host www.baidu.com:1.2.3.4 > busybox
  • 此时这个容器是没有地址的

三、暴露容器地址到网络

  • 安装容器的目的是让用户访问容器的服务

  • 而容器通常是以nat方式工作,也就是隐藏在docker0网桥后,用户无法访问

  • 因此需要将容器暴露在网络中才可以

1、将容器端口指定暴露到宿主机的动态端口

案例:启动一个apache,并将其80端口暴露出来

[root@host1 ~]# docker run --name httpd1 -it -p 80 --rm busybox WARNING: IPv4 forwarding is disabled. Networking will not work. / #  / # mkdir /html / # echo "

test page

">>/html/index.html / #  / # httpd -h /html/ / #  / # netstat -an Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address           Foreign Address         State        tcp        0      0 :::80                   :::*                    LISTEN

此时,就可以在宿主机访问了

[root@host1 ~]# curl 172.17.0.2 test page

在其他主机上想访问这个nginx的页面,需要宿主机上的个动态端口

  • 将docker的端口暴漏到外面,需要iptables规则来实现的,所以查看nat表规则如下

[root@host1 ~]# iptables -L -n -t nat    ...    ...    ... Chain DOCKER (2 references) target     prot opt source               destination          RETURN     all  --  0.0.0.0/0            0.0.0.0/0            DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:32770 to:172.17.0.2:80

docker命令可以查看端口映射关系

[root@host1 ~]# docker port httpd1 80/tcp -> 0.0.0.0:32770

在其他主机上访问这个主机上的容器

Docker系列6:Docker网络管理

  • 当这个容器被删除了,这个端口映射规则自动删除

2、将容器端口指定暴露到宿主机的指定端口

案例:创建apache容器,将80端口映射到宿主机的8081端口

[root@host1 ~]# docker run --name httpd1 -it -p 80:8081 --rm busybox / #[root@host1 ~]# docker port httpd1 8081/tcp -> 0.0.0.0:80

3、将容器的指定端口暴漏到宿主机指定IP的动态端口

  • 方法1中的效果是将容器的端口映射到宿主机的随机端口,这个端口会绑定在宿主机的所有IP上面。

  • -p 宿主机ip::容器端口

4、将容器的指定端口暴漏到宿主机指定IP的指定端口

  • 方法3中的效果是将容器的端口映射到宿主机的指定端口,这个端口会绑定在宿主机的所有IP上面。

  • -p 宿主机ip:宿主机端口:容器端口

如果需要暴漏出多个端口,那么就可以使用多次-p选项

四、创建联盟式网络容器

  • 联盟式容器,其实就是让多个容器共享网络等三个名称空间

1、将容加入其它容器的名称空间

先创建容器

[root@host1 ~]# docker run --name httpd1 -it --rm busybox  / #  / # ip addr  1: lo:  mtu 65536 qdisc noqueue 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 13: eth0@if14:  mtu 1500 qdisc noqueue      link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff     inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0        valid_lft forever preferred_lft forever / #  / # hostname 2ce8cf2a2f28 / #  / # mkdir /html / # echo "test page">/html/index.html / # httpd -h /html/ / #  / # wget -O - -q 127.0.0.1 test page / #

再创建一个容器,并加入上个容器的名称空间中

[root@host1 ~]# docker run --name httpd2 --network container:httpd1 --rm -it busybox / #  / # ip addr 1: lo:  mtu 65536 qdisc noqueue 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 13: eth0@if14:  mtu 1500 qdisc noqueue      link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff     inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0        valid_lft forever preferred_lft forever / #  / # hostname 2ce8cf2a2f28 / #  / # wget -O - -q 127.0.0.1 test page / #
  • 两个容器的主机名、地址、IPC都是相同的

  • 在一个容器里启动进程,在另一个容器里是可以用127.0.0.1来访问

  • 但是两个容器的文件系统不是共享的,比如在一个主机中创建的文件或者目录,在另一个主机中是访问不到的

2、将容器加入到宿主机的名称空间

[root@host1 ~]# docker run --name httpd1 -it --rm --network host busybox  / # ip addr 1: lo:  mtu 65536 qdisc noqueue 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 2: ens33:  mtu 1500 qdisc pfifo_fast qlen 1000     link/ether 00:0c:29:3f:bf:cf brd ff:ff:ff:ff:ff:ff     inet 192.168.114.132/24 brd 192.168.114.255 scope global dynamic ens33        valid_lft 1653sec preferred_lft 1653sec     inet6 fe80::b487:3618:3453:eabe/64 scope link         valid_lft forever preferred_lft forever 3: ens37:  mtu 1500 qdisc pfifo_fast qlen 1000     link/ether 00:0c:29:3f:bf:d9 brd ff:ff:ff:ff:ff:ff     inet 192.168.64.130/24 brd 192.168.64.255 scope global dynamic ens37        valid_lft 1648sec preferred_lft 1648sec     inet 172.16.100.5/24 brd 172.16.100.255 scope global ens37        valid_lft forever preferred_lft forever     inet6 fe80::e81:e5e0:505:f39b/64 scope link         valid_lft forever preferred_lft forever 4: docker0:  mtu 1500 qdisc noqueue      link/ether 02:42:37:b9:09:55 brd ff:ff:ff:ff:ff:ff     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0        valid_lft forever preferred_lft forever     inet6 fe80::42:37ff:feb9:955/64 scope link         valid_lft forever preferred_lft forever / #  / #  / # hostname host1 / #

五、修改的默认网络和网桥

1、修改Docker0

  • docker0网桥的默认地址是172.17的

  • 修改这个需要修改配置文件:/etc/docker/daemon.json

Docker系列6:Docker网络管理

  • bip是知道docker0的ip地址

2、创建自定义网桥

创建一个网桥,名称为mybr0

[root@host1 ~]# docker network create \ > --subnet "30.0.0.0/8" --gateway "30.0.0.1" \ > mybr0[root@host1 ~]# docker network ls NETWORK ID          NAME                DRIVER              SCOPE 5e905c47ac51        bridge              bridge              local 386d8dc4beb8        host                host                local 256a8b6832cb        mybr0               bridge              local eb7b7cf29f29        none                null                local
  • mybr0是网络名称,不是网络接口名称

[root@host1 ~]# ip addr     ...     ...     ... 15: br-256a8b6832cb:  mtu 1500 qdisc noqueue state DOWN group default      link/ether 02:42:c9:f6:5d:cd brd ff:ff:ff:ff:ff:ff     inet 30.0.0.1/8 brd 30.255.255.255 scope global br-256a8b6832cb        valid_lft forever preferred_lft forever

创建容器使用这个网桥设备

[root@host1 ~]# docker run --name httpd1 -it --rm --network mybr0 busybox  / #  / #  / # ip addr 1: lo:  mtu 65536 qdisc noqueue 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 16: eth0@if17:  mtu 1500 qdisc noqueue      link/ether 02:42:1e:00:00:02 brd ff:ff:ff:ff:ff:ff     inet 30.0.0.2/8 brd 30.255.255.255 scope global eth0        valid_lft forever preferred_lft forever / #

扩展:在一个主机上做了两个网桥(其实就相当于两个虚拟交换机),然后每个交换机上安装一个容器,这两个容器不在同一个网段

  Docker系列6:Docker网络管理

想实现两个容器通信,其实只需要在宿主机上启动路由转发功能就可以了,原因 有两个

  • 容器的网关指向了虚拟交换机地址

  • 虚拟交换机本身就在宿主机上

  • 有一点需要注意,默认会在防火墙上添加一些规则阻止这种情况下的容器之间的通信,所以,要想实现容器之间的通信,需要去修改itpables规则。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站标题:Docker系列6:Docker网络管理-创新互联
路径分享:http://scjbc.cn/article/diiioe.html

其他资讯