Docker支持3种网络形式:none,host, bridge(默认模式)。
![]() |
docker network ls #显示当前docker的默认网卡状况 |
![]() |
ip address #宿主机的网卡状态 |
- none模式
容器和宿主机之间无法网络通信。
使用场景:不明。如果无法和外部通信,容器就是个孤岛。 - host模式
容器共享宿主机的网卡,利于和外部网络通信。
使用场景:作为本宿主机上的一个服务,供宿主机之外,或外部网络机器访问。
注意事项:默认的端口可能被宿主机占用,需要分配其他端口。
如:80端口已经被宿主机的IIS占用,Docker容器内的Tomcat就无法使用80。 - bridge模式(Docker容器的默认启动模式)
安装docker后,默认会产生一张docker0的网卡,默认ip:172.17.0.1/16。
备注:/16代表16个1的子网掩码255.255.0.0。
使用场景:虚拟内部网络,内部网络间可以相互通信,模拟分布式计算。
Docker容器的IP地址确认:
- docker run 启动一个容器(比如oracle)后,通过docker exec -it containerid bash进入容器后,通过ifconfig命令,查看容器的ip, 发现以下输出
root@a837d8deb6fb:/# ifconfigeth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:16 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:1312 (1.3 KB) TX bytes:0 (0.0 B)
- 再启动一个mysql容器,然后同样docker exec -it containerid bash进入容器,
执行ifconfig
root@d5cfaf9bc203:/bin# ifconfig
bash: ifconfig: command not found这个容器内没ifconfig, 只好换一种方式:hostname -iroot@d5cfaf9bc203:/# hostname -i172.17.0.3
重新通过docker network ls 查看网络状况。发现网络状况没有变化root@linux-dxjo:~> docker network lsNETWORK ID NAME DRIVER SCOPEeced4efd22c4 bridge bridge local006540679f04 host host localbb6717ea195a none null localroot@linux-dxjo:~>
新建容器网络
- 新建bridge网络,名称为lq01.net:
root@linux-dxjo:~> docker network create -d bridge lq01.net
0317a8cd7bd67758d981470ed4d8d06dccf0e52df05ffd345a5c186a160a99a9
#查看现在的网络状况.
root@linux-dxjo:~> docker network ls
NETWORK ID NAME DRIVER SCOPE
eced4efd22c4 bridge bridge local
006540679f04 host host local
0317a8cd7bd6 lq01.net bridge local
bb6717ea195a none null local
查看网络详细
root@linux-dxjo:~> docker network inspect lq01.net
[
{
"Name": "lq01.net",
"Id": "0317a8cd7bd67758d981470ed4d8d06dccf0e52df05ffd345a5c186a160a99a9",
"Created": "2020-03-26T03:18:35.758811904-04:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
root@linux-dxjo:~> - 在新网络内执行开启镜像。即在创建容器时显式将该容器连接到该网络。
先查看所有镜像
root@linux-dxjo:~> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres latest cf879a45faaa 7 weeks ago 394MB
mysql latest 791b6e40940c 7 weeks ago 465MB
martinsthiago/oraclexe-11g-fig latest 8253c6cad9fe 4 years ago 1.93GB
在新的网络内开启postgres的镜像,必须设定明确的IP,不然启动不起来。docker run --name postgres1802 -e POSTGRES_PASSWORD=mysecretpassword -d postgres --network lq01.net --ip 172.18.0.2 97aa95cebfca6eb84d1be09dbed66e7db6037de044540af3b41f1174745be121 root@linux-dxjo:~> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 97aa95cebfca postgres "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 5432/tcp postgres1802 4e886ce92b11 postgres "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 5432/tcp postgresdb2 a837d8deb6fb martinsthiago/oraclexe-11g-fig "/startup.sh --name …" 3 weeks ago Up About an hour 0.0.0.0:1521->1521/tcp, 0.0.0.0:8088->8080/tcp distracted_payne d5cfaf9bc203 mysql "docker-entrypoint.s…" 6 weeks ago Up About an hour 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-test root@linux-dxjo:~>
root@linux-dxjo:~> docker run -itd --name nginx02 --network LBSnet --ip 172.20.1.11 nginx:latest root@linux-dxjo:~> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a2558eac3579 nginx:latest "nginx -g 'daemon of…" 5 seconds ago Up 3 seconds 80/tcp nginx02 8c01025fcaf3 nginx:latest "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp nginx01 4
root@linux-dxjo:~> docker run -itd --name nginx01 --network LBSnet --ip 172.20.1.10 nginx:latest
root@linux-dxjo:~> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2558eac3579 nginx:latest "nginx -g 'daemon of…" 5 seconds ago Up 3 seconds 80/tcp nginx02
root@linux-dxjo:~> docker run -itd --name nginx02 --network LBSnet --ip 172.20.1.11 nginx:latest
既存网络:lq01.net:172.18.0.1/8
创建新的网络:
docker network create -d bridge --subnet 172.20.1.0/24 --gateway 172.20.1.1 LBSnet
然后将容器链接到指定的网络。
docker network connect lq01.net nginx01
容器仅能在网络内通信,不能跨网络进行通信。
一个连接到两个网络的容器可与每个网络中的成员容器进行通信。
当一个容器连接到多个网络时,外部连接通过第一个(按词典顺序)非内部网络提供。
0 件のコメント:
コメントを投稿