专栏首页dogfeidocker 网络介绍

docker 网络介绍

docker允许通过外部访问容器或容器互联的方式来提供网络服务。

外部访问容器

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P-p参数来指定端口映射。

当使用-P参数时

1 2 3 4 5

docker run -d -P training/webapp python app.py 查看 [root@xs_test01 wwwlogs]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6068ede204d training/webapp "python app.py" 21 seconds ago Up 19 seconds 0.0.0.0:32768->5000/tcp festive_agnesi

通过docker logs -f NAMES来查看

1 2

[root@xs_test01 wwwlogs]# docker logs -f festive_agnesi * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

使用-p时,需要单独指定地址,且在一个端口上只能绑定一个容器,否则会报错

1 2 3 4 5 6 7 8

docker run -d -p 1111:11 training/webapp python app.py #这个是将本地的1111端口映射到容器的11端口 docker run -d -p 127.0.0.1:1112:12 training/webapp python app.py #映射到指定地址的指定端口 docker run -d -p 127.0.0.1::5000 training/webapp python app.py #映射到指定地址的任意端口 docker run -d -p 127.0.0.1::5000/udp training/webapp python app.py #使用udp来标记udp端口 docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py #绑定多个端口 [root@xs_test01 wwwlogs]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51c9ba211f9c training/webapp "python app.py" 9 seconds ago Up 8 seconds 0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp musing_albattani

查看端口映射

使用ddocker port NAMES PORT来查看

1 2

[root@xs_test01 wwwlogs]# docker port compassionate_ptolemy 5000 127.0.0.1:32769

容器互联

新建网络

1 2

[root@xs_test01 wwwlogs]# docker network create -d bridge my-net a1822b830e76d490f27fcdf5ac0b93595c9de4726a801b703d6ed06db5b78c59

新建容器并连接刚创建的网络

1 2 3 4 5 6

[root@xs_test01 wwwlogs]# docker run -it --rm --name busybox1 --network my-net busybox sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox d070b8ef96fc: Pull complete Digest: sha256:2107a35b58593c58ec5f4e8f2c4a70d195321078aebfadfbfb223a2ff4a4ed21 Status: Downloaded newer image for busybox:latest

打开另一个终端再新建一个容器并加入到刚创建的网络

1 2

[root@xs_test01 ~]# docker run -it --rm --name busybox2 --network my-net busybox sh / #

在第一个终端中测试连通性

1 2 3 4

/ # ping busybox2 PING busybox2 (172.18.0.3): 56 data bytes 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.441 ms 64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.202 ms

同样在第二个终端中测试

1 2 3 4

/ # ping busybox1 PING busybox1 (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.338 ms 64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.188 ms

如果有多个容器要互联,可以使用docker compose

配置DNS

如何自定义配置容器的主机名和DNS?

在容器中使用mount来查看挂载信息:

1 2 3 4

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)

如果退出容器可以使用docker exec来进入

1

docker exec -it busybox1 sh

修改/etc/docker/daemon.json

1 2 3 4

[root@xs_test01 docker]# cat daemon.json { "dns": ["114.114.114.114","8.8.8.8"] }

修改完成后一定后重启docker

1

systemctl restart docker

启动一个容器查看dns是否生效

1 2 3

[root@xs_test01 docker]# docker run -it --rm ubuntu:17.10 cat etc/resolv.conf nameserver 114.114.114.114 nameserver 8.8.8.8

这种修改方式,所有的容器都会生效,当然也可以手动对单个容器做修改。

1 2 3

[root@xs_test01 docker]# docker run -it --rm --name web_server -h webserver --dns=8.8.8.8 centos /bin/bash [root@webserver /]# cat /etc/resolv.conf nameserver 8.8.8.8

-h HOSTNAME--hostname=HOSTNAME设定容器的主机名,会被写到容器的/etc/hostname和/etc/hosts

--dns=IP添加dns服务器到容器的/etc/resolv.conf

高级网络配置

当docker启动时,会自动在主机上创建一个docker0虚拟网桥,实际上是linux的一个bridge,可以理解为一个软件交换机,它会在挂载到它的网口之间进行转发,同时docker随机分配一个本地未占用的私有网段中的一个地址给docker0接口,然后我们在启动容器的时候也会自动分配一个同一网段的地址。

当我们创建了一个容器的时候,同时也会创建一个veth pair接口,当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包,这两个接口一个是在容器中被绑定,名字为eth0,另一个在被挂载到docker0网桥上,以veth开头,这就是容器和主机之间进行通讯的原理。

手动起一个容器看下主机网卡变化:

1 2

# docker start musing_albattani musing_albattani

ifconfig查看

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# ifconfig veth637e217: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::b827:18ff:fe04:b918 prefixlen 64 scopeid 0x20<link> ether ba:27:18:04:b9:18 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:66ff:fec3:a078 prefixlen 64 scopeid 0x20<link> ether 02:42:66:c3:a0:78 txqueuelen 0 (Ethernet) RX packets 3511 bytes 199800 (195.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4628 bytes 73413939 (70.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

看到docker0网桥和在启动容器后起的网卡名是以veth开头的网卡被挂载到了docker0上,也可以验证容器在启动时会自动分配一个同一网段的地址。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • docker 容器

    容器是独立运行的一个或一组应用,以及他们的运行环境,对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

    dogfei
  • K8S问题记录

    在使用habor作为镜像仓库时,默认拉取镜像是走的https,如果在安装harbor时没有设置证书,则会报错,timeout,deny之类的错误,如果没有证书的...

    dogfei
  • docker compose

    docker compose是官方编排项目,负责快速在集群中部署分布式应用,负责实现对docker容器集群的快速编排

    dogfei
  • Docker容器学习梳理--日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Com...

    洗尽了浮华
  • 006.Docker网络管理

    Docker使用Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Netwo...

    木二
  • docker上部署MySQL实例

    容器云的概念现在很火,现在很多公司都把MySQL部署在容器上,开始今天内容之前,我们先来看看容器云的概念吧。

    AsiaYe
  • Docker命令详解

    版权声明:欢迎交流,菲宇运维! https://blog.csdn.net/bbwangj/art...

    菲宇
  • 附002.Docker常见命令

    A self-sufficient runtime for containers.

    木二
  • docker容器与物理机之间拷贝文件的方法

    一般情况下,我们在启动容器的时候可以使用-v参数映射宿主机的文件或者目录到容器里,这样的话,在宿主机相关目录下的文件修改会自动在容器里生效。

    二狗不要跑
  • Docker的数据管理及网络通信

    一、docker的数据管理 在docker中,为了方便查看容器内产生的数据或者将多个容器之间的数据实现共享,会涉及到容器的数据管理操作,管理docker容器中的...

    小手冰凉

扫码关注云+社区

领取腾讯云代金券