2021-04-19

Chapter 5 Docker 网络
目录
Docker 基础网络介绍

外部访问容器
容器互联
配置DNS
Docker的网络模式

Bridge 模式
Host 模式
None 模式
Container 模式
Docker高级网络配置

快速配置指南
容器访问控制
端口映射实现
配置docker0网桥
自定义网桥
工具和示例
编辑网络配置文件
实例:创建一个点到点连接
Docker 基础网络介绍
外部访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射。

当使用-P标记时,Docker会随机映射一个端口到内部容器开放的网络端口。 使用docker container ls可以看到,本地主机的 32768 被映射到了容器的 80 端口。此时访问本机的 32768 端口即可访问容器内 NGINX 默认页面。

$ docker run -d -P nginx:alpine

$ docker container ls -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fae320d08268 nginx:alpine “/docker-entrypoint.…” 24 seconds ago Up 20 seconds 0.0.0.0:32768->80/tcp bold_mcnulty
同样的,可以通过docker logs命令来查看访问记录。

$ docker logs fa
172.17.0.1 - - [25/Aug/2020:08:34:04 +0000] “GET / HTTP/1.1” 200 612 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0” “-”
-p则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort.

映射所有接口地址
使用hostPort:containerPort格式本地的 80 端口映射到容器的 80 端口,可以执行

$ docker run -d -p 80:80 nginx:alpine
此时默认会绑定本地所有接口上的所有地址。

映射到指定地址的指定端口
可以使用ip:hostPort:containerPort格式指定映射使用一个特定地址,比如localhost地址127.0.0.1

$ docker run -d -p 127.0.0.1:80:80 nginx:alpine
映射到指定地址的任意端口
使用ip::containerPort绑定localhost的任意端口到容器的80端口,本地主机会自动分配一个端口。

$ docker run -d -p 127.0.0.1::80 nginx:alpine
还可以使用udp标记来指定udp端口

$ docker run -d -p 127.0.0.1:80:80/udp nginx:alpine
查看映射端口配置
使用docker port来查看当前映射的端口配置,也可以查看到绑定的地址

$ docker port fa 80
0.0.0.0:32768
注意: 容器有自己的内部网络和 ip 地址(使用docker inspect查看,Docker还可以有一个可变的网络配置。) -p标记可以多次使用来绑定多个端口

例如

$ docker run -d
-p 80:80
-p 443:443
nginx:alpine
容器互联
如果之前有 Docker使用经验,可能已经习惯了使用–link参数来使容器互联。 随着 Docker 网络的完善,强烈建议大家将容器加入自定义的Docker网络来连接多个容器,而不是使用 --link参数。

新建网络
下面先创建一个新的 Docker网络。

$ docker network create -d bridge my-net
-d参数指定Docker网络类型,有bridge overlay,其中overlay网络类型用于Swarm mode,在本小节中你可以忽略它。

连接容器
运行一个容器并连接到新建的my-net网络

$ docker run -it --rm --name busybox1 --network my-net busybox sh
打开新的终端,再运行一个容器并加入到 my-net网络

$ docker run -it --rm --name busybox2 --network my-net busybox sh
再打开一个新的终端查看容器信息

$ docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b47060aca56b busybox “sh” 11 minutes ago Up 11 minutes busybox2
8720575823ec busybox “sh” 16 minutes ago Up 16 minutes busybox1
下面通过 ping来证明busybox1容器和busybox2容器建立了互联关系。 在busybox1容器输入以下命令

/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
用ping来测试连接busybox2容器,它会解析成 172.19.0.3。 同理在busybox2容器执行ping busybox1,也会成功连接到。

/ # ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms
这样,busybox1 容器和 busybox2 容器建立了互联关系。

Docker Compose 如果你有多个容器之间需要互相连接,推荐使用DockerCompose。

配置DNS
如何自定义配置容器的主机名和 DNS 呢?秘诀就是Docker利用虚拟文件来挂载容器的 3个相关配置文件。

在容器中使用 mount命令可以看到挂载信息:

$ mount
/dev/disk/by-uuid/1fec…ebdf on /etc/hostname type ext4 …
/dev/disk/by-uuid/1fec…ebdf on /etc/hosts type ext4 …
tmpfs on /etc/resolv.conf type tmpfs …
这种机制可以让宿主主机 DNS 信息发生更新后,所有Docker容器的 DNS 配置通过 /etc/resolv.conf文件立刻得到更新。

配置全部容器的 DNS ,也可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。

{
“dns” : [
“114.114.114.114”,
“8.8.8.8”
]
}
这样每次启动的容器 DNS 自动配置为 114.114.114.114 和8.8.8.8。使用以下命令来证明其已经生效。

$ docker run -it --rm ubuntu:18.04 cat etc/resolv.conf

nameserver 114.114.114.114
nameserver 8.8.8.8
如果用户想要手动指定容器的配置,可以在使用docker run命令启动容器时加入如下参数: -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会默认用主机上的/etc/resolv.conf来配置容器。

Docker的网络模式
可以通过docker network ls查看网络,默认创建三种网络。

[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
688d1970f72e bridge bridge local
885da101da7d host host local
f4f1b3cf1b7f none null local
常见网络的含义:

网络模式 简介
Bridge 为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,默认为该模式。
Host 容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
None 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等。
Container 新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值