每个docker都是独立的隔离环境, 如想访问, 可以使用
端口映射或网络互联
1. 端口映射
即把容器的端口映射到宿主机的端口, 再访问宿主端口即可访问容器
具体用法, 参考 三、docker 容器使用 run 命令 -p / -P 参数
2. Docker 网络互联
docker 允许建立局域网络,并将容器添加进入,实现容器互联
主要分两步:建立网络;连接容器
如果有多个容器需要互联,则推荐使用docker compose
2.1. 创建网络
docker network create -d bridge my-net# 容器添加到这网络中互联
-d参数: Docker 网络类型,有bridge、overlay
可以使用docker network inspect networkName查看网络信息, 也会包含连接的容器
[root@localhost docker]# docker network create -d bridge my-net
5af98ee6770557279ade2c64d39de88a83df7fae2f474c082849f5e7e63c9c8e
[root@localhost docker]# docker network inspect my-net
[
{
"Name": "my-net",
"Id": "5af98ee6770557279ade2c64d39de88a83df7fae2f474c082849f5e7e63c9c8e",
"Created": "2020-05-19T09:08:30.012329184+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
2.2. 连接容器
运行容器,并以
--network netName指定容器连接的网络即可
如下面命令,运行两个连接网络my-net的容器
docker run -it --rm --name u1 --network my-net ubuntu bash
docker run -it --rm --name u2 --network my-net ubuntu bash
然后再使用docker network inspect my-net命令可查看到容器连接到网络中的信息, 如下
[root@localhost docker]# docker run -itd --name u1 --network my-net ubuntu bash
6c0fac5056f11f31f6599898275084e4f56c028508ae43b2591dde224d08b08c
[root@localhost docker]# docker run -itd --name u2 --network my-net ubuntu bash
8931977504dbb96abcc997f2f2d80c4dcfe82f1817196ab4d75ef66c5611df01
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8931977504db ubuntu "bash" 4 seconds ago Up 3 seconds u2
6c0fac5056f1 ubuntu "bash" 8 seconds ago Up 7 seconds u1
[root@localhost docker]# docker network inspect my-net
[
{
"Name": "my-net",
"Id": "5af98ee6770557279ade2c64d39de88a83df7fae2f474c082849f5e7e63c9c8e",
"Created": "2020-05-19T09:08:30.012329184+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
`下面信息可以看到该网络中包含两个容器,分别是u1和u2`
"Containers": {
"6c0fac5056f11f31f6599898275084e4f56c028508ae43b2591dde224d08b08c": {
"Name": "u1",
"EndpointID": "d5569dfbc04863c907320929b86ee92c84dcf9222e2c7a0831507ba961985fa9",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
},
"8931977504dbb96abcc997f2f2d80c4dcfe82f1817196ab4d75ef66c5611df01": {
"Name": "u2",
"EndpointID": "d777dc967c366f2b59ff783e0781ef90c757bc24d2de2e3a6eb951bfce0819ce",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
`此时可以进入容器,互相ping通; ubuntu镜像无ping命令,执行下面命令安装`
1. apt-get update
2. apt-get install iputils-ping
3. ping containerName 或 containerIP
2.3. docker compose
如果是多个容器组成的系统,网络互联,推荐使用 docker compose
3. 配置DNS
3.1. 容器默认使用宿主机的DNS配置
可以进入容器后,使用 mount 命令查看
...
/dev/mapper/centos-root on /etc/resolv.conf type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos-root on /etc/hostname type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos-root on /etc/hosts type xfs (rw,relatime,attr2,inode64,noquota)
...
3.2. 指定容器默认DNS
在文件 /etc/docker/daemon.json 中添加DNS配置,并重启docker,之后运行的容器以此配置DNS
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
3.3. 运行容器时参数指定DNS
-h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname和 /etc/hosts。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其他的容器的 /etc/hosts 看到。
--dns=IP_ADDRESS 添加 DNS 到容器的 /etc/resolv.conf, 让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索host.example.com。
本文介绍Docker容器间通过端口映射和网络互联实现通信的方法,包括创建自定义网络、连接容器以及使用Docker Compose简化多容器网络配置。同时,探讨了容器的DNS配置方式,包括默认使用宿主机DNS、指定容器DNS及运行时参数设置。
1318

被折叠的 条评论
为什么被折叠?



