1、容器互联
默认情况:
[root@ip-10-249-100-205 ~]# docker run --rm=true --name=mysqlserver -e MYSQL_ROOT_PASSWORD=123456 mysql
[root@ip-10-249-100-205 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7ef8ad390e5 mysql "docker-entrypoint.sh" 16 seconds ago Up 14 seconds 3306/tcp mysqlserver
3484b2072d5d java "/bin/bash" 6 minutes ago Up 6 minutes sick_davinci
ac910ed2aff3 myjava "/bin/bash" 8 days ago Up 8 days awesome_hugle
[root@ip-10-249-100-205 ~]# docker run --rm=true java curl 172.17.0.1:3306
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0curl: (7) Failed to connect to 172.17.0.1 port 3306: Connection refused
容器默认情况下是直接互联的。
上面命令创建了一个新的容器mysqlserver。
2、link方式:
docker默认是允许container互通,通过--icc=false关闭互通,一旦关闭互通,只能通过-link name:alias命令连接指定的container。
--link redis:db别名,会在/etc/hosts中生成对应的ip映射
docker提供了一种机制,可以让一个容器和另一个容器很方便的连接起来。
这里引入了一个新的标记 --link,其参数部分的myweb表示要连接的容器,web是要连接的容器的别名。
--link=mysqlserver:myjava
myjava给一个主机名(dns名称)用来代替ip地址访问
mysqlserver目标容器(需要连接的容器)
[root@ip-10-249-100-205 ~]# docker run --rm=true --name=mysqlserver -it java /bin/bash
root@a3ee464a059a:/#
root@a3ee464a059a:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
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
74: eth0@if75: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
[root@ip-10-249-100-205 ~]# docker run --rm=true --link=mysqlserver:myjava3 -it java /bin/bash
root@3484b2072d5d:/# ping myjava3
PING myjava3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.111 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.118 ms
^C--- myjava3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.111/0.114/0.118/0.000 ms
root@3484b2072d5d:/# ping mysqlserver
PING myjava3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.139 ms
^C--- myjava3 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.139/0.139/0.139/0.000 ms
root@3484b2072d5d:/#
[root@ip-10-249-100-205 ~]# docker run --rm=true --link=mysqlserver:java -it java ping java
PING java (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.123 ms
docker network create #自定义网络
docker network connect #连接完了
docker network ls #查看网络列表
docker network rm #移除网络
docker network disconnect #断开完了
docker network inspect #查看网络详细信息
默认网络
docker安装完成会默认创建3个网络,可以docker network ls (版本在1.9及以上)命令查看。
[root@ip-10-249-100-205 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
121db6b94fa6 bridge bridge local
10c702892120 host host local
4a683652e4af none null local
bridge 是默认的容器网络在系统只为docker0(可以通过ifconfig 或ip addr 查看),默认启动容器连接到docker0上,你可以再启动容器是通过–net参数docker run --net=<NETWORK>指定容器连接网络。
none 表示容器没有网络功能,当你连接到容器(例:docker exec -it container_name /bin/bash)时通过ifconfig或ip addr是查看不到其他网络适配器,只有本地环回网络。
host 当使用host网络时,container将使用主机的网络栈。
查看网络详细信息docker network inspect bridge,可以通过inspect 查看 ls 列出的所有网络详细信息。
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.17.0.1/16",
"Gateway": "172.17.0.1"
}
]
},
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "9001"
}
}
]
这里不详细介绍所有参数,基本一看就可以了解其中`container`参数内容为属于这个网络的容器信息。
自定义网络
创建自定网络很简单docker network create --driver bridge mnet,创建一个叫mnet 的bridge网络,
$ docker network inspect mnet
[
{
"Name": "mnet",
"Id": "50650309e0813bdad175b6c486168a3cdbcdc171adde3b21428c262943f5221b",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1/16"
}
]
},
"Internal": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
注意 自定义网络不支持link。
多主机网络
docker 多主机网络依赖分布式存储系统和docker 的libkv 库。后面不齐
默认情况:
[root@ip-10-249-100-205 ~]# docker run --rm=true --name=mysqlserver -e MYSQL_ROOT_PASSWORD=123456 mysql
[root@ip-10-249-100-205 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7ef8ad390e5 mysql "docker-entrypoint.sh" 16 seconds ago Up 14 seconds 3306/tcp mysqlserver
3484b2072d5d java "/bin/bash" 6 minutes ago Up 6 minutes sick_davinci
ac910ed2aff3 myjava "/bin/bash" 8 days ago Up 8 days awesome_hugle
[root@ip-10-249-100-205 ~]# docker run --rm=true java curl 172.17.0.1:3306
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0curl: (7) Failed to connect to 172.17.0.1 port 3306: Connection refused
容器默认情况下是直接互联的。
上面命令创建了一个新的容器mysqlserver。
2、link方式:
docker默认是允许container互通,通过--icc=false关闭互通,一旦关闭互通,只能通过-link name:alias命令连接指定的container。
--link redis:db别名,会在/etc/hosts中生成对应的ip映射
docker提供了一种机制,可以让一个容器和另一个容器很方便的连接起来。
这里引入了一个新的标记 --link,其参数部分的myweb表示要连接的容器,web是要连接的容器的别名。
--link=mysqlserver:myjava
myjava给一个主机名(dns名称)用来代替ip地址访问
mysqlserver目标容器(需要连接的容器)
[root@ip-10-249-100-205 ~]# docker run --rm=true --name=mysqlserver -it java /bin/bash
root@a3ee464a059a:/#
root@a3ee464a059a:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
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
74: eth0@if75: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
[root@ip-10-249-100-205 ~]# docker run --rm=true --link=mysqlserver:myjava3 -it java /bin/bash
root@3484b2072d5d:/# ping myjava3
PING myjava3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.111 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.118 ms
^C--- myjava3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.111/0.114/0.118/0.000 ms
root@3484b2072d5d:/# ping mysqlserver
PING myjava3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.139 ms
^C--- myjava3 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.139/0.139/0.139/0.000 ms
root@3484b2072d5d:/#
[root@ip-10-249-100-205 ~]# docker run --rm=true --link=mysqlserver:java -it java ping java
PING java (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.123 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.066 ms
是一台主机上的互联,不能跨主机互联。
--------------------------------------
网络相关命令docker network create #自定义网络
docker network connect #连接完了
docker network ls #查看网络列表
docker network rm #移除网络
docker network disconnect #断开完了
docker network inspect #查看网络详细信息
默认网络
docker安装完成会默认创建3个网络,可以docker network ls (版本在1.9及以上)命令查看。
[root@ip-10-249-100-205 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
121db6b94fa6 bridge bridge local
10c702892120 host host local
4a683652e4af none null local
bridge 是默认的容器网络在系统只为docker0(可以通过ifconfig 或ip addr 查看),默认启动容器连接到docker0上,你可以再启动容器是通过–net参数docker run --net=<NETWORK>指定容器连接网络。
none 表示容器没有网络功能,当你连接到容器(例:docker exec -it container_name /bin/bash)时通过ifconfig或ip addr是查看不到其他网络适配器,只有本地环回网络。
host 当使用host网络时,container将使用主机的网络栈。
查看网络详细信息docker network inspect bridge,可以通过inspect 查看 ls 列出的所有网络详细信息。
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.17.0.1/16",
"Gateway": "172.17.0.1"
}
]
},
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "9001"
}
}
]
这里不详细介绍所有参数,基本一看就可以了解其中`container`参数内容为属于这个网络的容器信息。
自定义网络
创建自定网络很简单docker network create --driver bridge mnet,创建一个叫mnet 的bridge网络,
$ docker network inspect mnet
[
{
"Name": "mnet",
"Id": "50650309e0813bdad175b6c486168a3cdbcdc171adde3b21428c262943f5221b",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1/16"
}
]
},
"Internal": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
注意 自定义网络不支持link。
多主机网络
docker 多主机网络依赖分布式存储系统和docker 的libkv 库。后面不齐