Docker系列6:Docker网络管理

发布时间:2020-07-26 09:22:44 作者:zxhk
来源:网络 阅读:176

一、创建容器时候的选项

二、创建封闭式网络容器

创建容器的时候,默认用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

三、暴露容器地址到网络

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 "<h2>test page</h2>">>/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的页面,需要宿主机上的个动态端口

[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的动态端口

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

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

四、创建联盟式网络容器

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

先创建容器

[root@host1 ~]# docker run --name httpd1 -it --rm busybox 
/ # 
/ # ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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
/ #

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

[root@host1 ~]# docker run --name httpd1 -it --rm --network host busybox 
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <NO-CARRIER,BROADCAST,MULTICAST,UP> 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

  Docker系列6:Docker网络管理

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
[root@host1 ~]# ip addr
    ...
    ...
    ...
15: br-256a8b6832cb: <NO-CARRIER,BROADCAST,MULTICAST,UP> 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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网络管理

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



推荐阅读:
  1. Docker系列10:docker file指令详解(2)
  2. Docker系列9:Docker file指令详解(1)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker k8s 容器

上一篇:Apache的站点安全技术

下一篇:go实现双向链表并使用iterater遍历

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》