docker 容器连接

容器–网络

先前在**容器使用–启动容器** 中就讲了,docker run 后跟 -p和-P参数可以做到端口映射 和 端口随机映射

首先说明为什么要做端口映射:

容器构建了一个隔离于宿主机的环境,而外部网络只能访问到宿主机

要在宿主机外的网络仍能够访问到容器,就必须把容器内运行服务的端口映射到宿主机上

即,访问宿主机的这些端口等同于访问相应容器的端口

也就是为了容器能够被宿主机外的网络访问到,所以做了端口映射

比如运行nginx,mysql之类的服务的容器

接下来看看具体的指令该怎么用,就拿一个nginx容器做例子吧

# 端口映射
docker run -d -p 8080:80 --name test_p1 nginx

这个指令就是将容器的 80 端口映射给了宿主机的 8080 端口
这样访问宿主机的 8080 端口就可以访问到nginx服务


# 端口随机映射
docker run -d -P --name test_p2 nginx

Docker会自动选择宿主机的一个空闲端口(默认是32768到61000)来进行映射
该指令不需要指定端口,它会根据容器中暴露的端口对宿主机进行随机映射

那么问题来了,我怎么知道哪些端口可用哪些不能呢

# 可以查看存活的容器
docker ps
使用该指令查看存活容器的 PORT项,那些是它正在占用的端口
当然,你也可以给它加上个 -a 和 --format参数,列出所有容器

# 查看单个容器的端口映射
docker port [container_id/name]
回显与该容器相关的所有端口映射

# 查看容器详细信息
docker inspect [container_id/name]
在输出的JSON结果中,可以找到 NetworkSettings 部分,它包含了端口映射的详细信息

容器–容器

docker除了容器和镜像,还在本地提供了容器连接的桥梁

docker 桥接网络

当Docker安装完成后,它会自动创建一个名为 docker0 的Linux网桥。这个网桥允许容器与宿主机以及容器之间进行通信。Docker容器默认连接到这个桥接网络

通过它可以完成宿主机与容器间的通信

查看docker桥接网络

使用指令 ifconfig docker0 或者 brctl show

回显docker0网桥的详细信息,包括ip地址、子网掩码等

自定义docker桥接网络

# docker network create -d bridge test-bet
使用该指令创建一个名为 test-net 的桥接网络,类型是 bridge
参数 -d 指定docker网络类型,有bridge、overlay

# docker run -itd --name test1 --network test-net ubunut /bin/bash
# docker run -itd --name test2 --network test-net ubuntu /bin/bash
运行两个名为test1和test2的容器,并加入到名为test-net的docker网络中

# docker exec -it test1 /bin/bash
进入容器test1
# apt-get update
# apt install iputils-ping
更新下载ping
# ping test2
可以发现可以ping的通
这说明test1和test2在同一个容器网络中

配置DNS

自动配置

我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

设置后,启动容器的DNS会自动配置为114.114.114.114和8.8.8.8 配置完需要重启docker才能生效

systemctl restart docker

手动指定

如果只想在指定的容器设置DNS,可以使用如下指令:

docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:
--rm:容器退出时自动清理容器内部的文件系统
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts
--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名
--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com

如果在容器启动时没有指定 –dns 和 –dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS