Docker中网络功能相关
Docker是允许通过外部访问容器或者容器互联的方式来提供网络服务。
外部访问容器:
通过-P或者-p参数指定端口映射,-P是随机;-p是指定。
-P : Docker会随机映射一个端口到内部容器开放的网络端口。
用docker run -d -P training/webapp python app.py 创建启动一个容器。
然后再用docker container ls -l (或者docker ps)看下
容器内5000被映随机射到了本地的32768。(看下下面的测试)
刷新几次上面的网址,然后看下log (docker logs 1db63003b6b1)
我本地windows电脑的ip是103,虚拟机(宿主机器)ip 104,容器是172.17.0.2 。
-p: 则可以指定要映射的端口,并且,在一个端口上只可以绑定一个容器。支持的格式:
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
端口一对一映射(所有ip)
docker run -d -p 5000:5000 training/webapp python app.py
端口一对一映射,指定ip
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口(我的docker是19.03.5版本,下面的这个命令失效,会随机映射一个端口出来)
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
默认是tcp端口,可以指定udp端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
-p标记可以多次使用来绑定多个端口docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
可以通过docker port xxxx来查看端口映射情况
然后是第二个姿势容器互联
之前docker很多都是用--link进行互联,很多人已经建议不要这么用了,推荐是把容器加入自定义的Docker网络来进行互联操作。
新建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
docker run -it --rm --name busybox2 --network my-net busybox sh
docker container ls
讲道理现在正在跑着的两个容易应该是可以互联的(在一个局域网下),分别在两个启动容器的终端里通过ping来确认彼此互联
也能看到他们两个的ip,一个是172.18.0.3,另一个是172.18.0.2,有一点要清楚,他们现在都是在上面我们手动创建的那个my-net网络里。此时在宿主机上也是能ping通那两个ip的,但是记得是直接ping ip不是上面两台容器的那个操作方式。
可以ifconfig看下此时宿主机的一些信息。
如果是多个容器之间进行互联,推荐是直接Docker Compose,之后会整理这个相关的笔记。
看到那个docker0了吗,到这我突然记得,貌似是不创建网络,直接默认大家是连接到docker0上的。我自己本地测试了一下,也是开启三个终端,然后分别执行上面那些命令,但是不指定network,然后发现确实是三个终端都彼此可以ping通的。(直接ping ip不是容器名字)
配置DNS
如果想要配置全部容器的DNS,直接在宿主机上 /etc/docker/daemon.json 文件中增加dns这个值
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
就行了。这样每次启动容器自动配置为这两个。
如果想要手动指定:
--dns=IP_ADDRESS添加 DNS 服务器到容器的 /etc/resolv.conf 中。
如果是改主机名可以用下面这个
-h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts
设定容器的搜索域
--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索host.example.com
还有一种改容器DNS的方式就是直接用之前说的 文件挂载的方式直接挂载容器的/etc/resolv.conf文件出来。这个不做演示了(这个是我自己想的,感觉应该可行,就算可行,也不建议直接把容器的DNS文件和本地的DNS文件绑定在一起,这样就会导致容器有修改宿主主机的DNS的权限了)。