1、建立容器时候的选项
html
--network xx:指定容器使用的网络类型linux
--hostname xx:指定容器使用的主机名nginx
--dns x.x.x.x:指定容器使用的DNS地址docker
--dns-search xxx:指定搜索域,默认搜索域是宿主机apache
--add-host 域名:地址 在hosts文件添加记录
json
2、建立封闭式网络容器bash
建立容器的时候,默认用none网络网络
能够再建立容器的时候,用network选项来指定容器的类型是 nonecurl
建立容器tcp
[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
此时这个容器是没有地址的
3、暴露容器地址到网络
安装容器的目的是让用户访问容器的服务
而容器一般是以nat方式工做,也就是隐藏在docker0网桥后,用户没法访问
所以须要将容器暴露在网络中才能够
一、将容器端口指定暴露到宿主机的动态端口
案例:启动一个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 "<h1>test page</h1>">>/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
在其余主机上访问这个主机上的容器
当这个容器被删除了,这个端口映射规则自动删除
二、将容器端口指定暴露到宿主机的指定端口
案例:建立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
三、将容器的指定端口暴漏到宿主机指定IP的动态端口
方法1中的效果是将容器的端口映射到宿主机的随机端口,这个端口会绑定在宿主机的全部IP上面。
-p 宿主机ip::容器端口
四、将容器的指定端口暴漏到宿主机指定IP的指定端口
方法3中的效果是将容器的端口映射到宿主机的指定端口,这个端口会绑定在宿主机的全部IP上面。
-p 宿主机ip:宿主机端口:容器端口
【若是须要暴漏出多个端口,那么就能够使用屡次-p选项】
4、建立联盟式网络容器
联盟式容器,其实就是让多个容器共享网络等三个名称空间
一、将容加入其它容器的名称空间
先建立容器
[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 / #
两个容器的主机名、地址、IPC都是相同的
在一个容器里启动进程,在另外一个容器里是能够用127.0.0.1来访问
可是两个容器的文件系统不是共享的,好比在一个主机中建立的文件或者目录,在另外一个主机中是访问不到的
二、将容器加入到宿主机的名称空间
[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 / #
五、修改的默认网络和网桥
一、修改Docker0
docker0网桥的默认地址是172.17的
修改这个须要修改配置文件:/etc/docker/daemon.json
bip是知道docker0的ip地址
二、建立自定义网桥
建立一个网桥,名称为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: <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 / #
扩展:在一个主机上作了两个网桥(其实就至关于两个虚拟交换机),而后每一个交换机上安装一个容器,这两个容器不在同一个网段
想实现两个容器通讯,其实只须要在宿主机上启动路由转发功能就能够了,缘由 有两个
容器的网关指向了虚拟交换机地址
虚拟交换机自己就在宿主机上
有一点须要注意,默认会在防火墙上添加一些规则阻止这种状况下的容器之间的通讯,因此,要想实现容器之间的通讯,须要去修改itpables规则。