四、docker 容器连接

本文介绍Docker容器间通过端口映射和网络互联实现通信的方法,包括创建自定义网络、连接容器以及使用Docker Compose简化多容器网络配置。同时,探讨了容器的DNS配置方式,包括默认使用宿主机DNS、指定容器DNS及运行时参数设置。

每个docker都是独立的隔离环境, 如想访问, 可以使用 端口映射网络互联

1. 端口映射

即把容器的端口映射到宿主机的端口, 再访问宿主端口即可访问容器
具体用法, 参考 三、docker 容器使用 run 命令 -p / -P 参数

2. Docker 网络互联

docker 允许建立局域网络,并将容器添加进入,实现容器互联
主要分两步:建立网络;连接容器
如果有多个容器需要互联,则推荐使用 docker compose

2.1. 创建网络

docker network create -d bridge my-net # 容器添加到这网络中互联
-d 参数: Docker 网络类型,有 bridgeoverlay
可以使用 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值