Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >docker 网络介绍

docker 网络介绍

作者头像
dogfei
发布于 2020-07-31 03:54:07
发布于 2020-07-31 03:54:07
4540
举报
文章被收录于专栏:devops探索devops探索

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上,也可以验证容器在启动时会自动分配一个同一网段的地址。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
docker网络
容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。
超蛋lhy
2018/10/09
9990
docker网络
Docker学习——数据管理、使用网络(三)
这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:
wuweixiang
2018/12/06
6110
【实践】11.DOCKER之使用网络
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
辉哥
2021/06/08
7180
【实践】11.DOCKER之使用网络
2.Docker学习之基础使用
Data Management,在使用Docker时候必然会在容器内产生数据,或者需要将容器内的数据进行备份,甚至多个容器之间进行数据共享,这时数据管理变得尤为重要;
全栈工程师修炼指南
2022/09/28
2.4K0
2.Docker学习之基础使用
2.Docker学习之基础使用
学习参考:https://yeasy.gitbooks.io/docker_practice/repository/registry.html
全栈工程师修炼指南
2020/10/23
2.6K0
2.Docker学习之基础使用
006.Docker网络管理
Docker使用Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
木二
2019/07/26
1.2K0
5 年工作经验,Docker 的几种网络模式都说不清,你敢信?
Docker 在安装后自动提供 3 种网络,可以使用 docker network ls 命令查看
民工哥
2022/10/27
1.2K0
5 年工作经验,Docker 的几种网络模式都说不清,你敢信?
容器DNS介绍
DNS服务是域名系统的缩写, 英文全称:Domain Name System,将域名和IP地址相互映射。在容器环境中,DNS至关重要,例如在Kubernetes集群中,通常一组Pod由一个Service负载,但是Service的IP地址有可能需要变动,那么就可以让Pod通过域名的方式去访问Service,Pod无需理会IP地址的变化。
Se7en258
2021/05/18
4K0
容器DNS介绍
Docker 容器连接
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射。
子润先生
2021/06/30
9810
docker单主机网络
当你安装Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络:
yuezhimi
2020/09/30
9590
docker 数据管理
docker镜像被存储在一系列的只读层,当我们开启一个容器,docker读取只读镜像并添加一个读写层在顶部,如果正在运行的容器修改了现有的文件,该文件将被拷贝出底层的只读层到最顶层的读写层,在读写层中的旧版本文件隐藏于该文件之下,但并没有被破坏,它仍然存在于镜像一下,当docker的容器被删除时,然后重新启动镜像时,将开启一个没有任何更改的新的容器,这些更改会丢失,为了能够保存数据以及共享容器间的数据,docker提出了volumes的概念,volumes可以是目录或者文件,它们是外部默认的联合文件系统或者是存在与宿主文件系统正常的目录和文件。
dogfei
2020/07/31
9710
不背锅运维:解读docker容器网络
查看web01容器的详情,它的输出是json,为了方便查看,可复制出来对json串进行解析
不背锅运维
2022/11/18
4250
不背锅运维:解读docker容器网络
详解Docker——你需要知道的Docker进阶知识四
在我们安装 Docker 后,会自动创建三个网络。我们可以使用下面的命令来查看这些网络:
云原生
2021/05/31
8040
性能监控之JMX监控docker中的java应用
容器使用默认的网络模型,就是bridge模式。在这种模式下是docker run时做的DNAT规则,实现数据转发的能力。所以我们看到的网络信息是这样的:
高楼Zee
2019/07/17
3.9K1
性能监控之JMX监控docker中的java应用
Docker网络管理机制实例解析+创建自己Docker网络
王小雷
2018/01/02
8240
Docker网络管理机制实例解析+创建自己Docker网络
docker 镜像和容器
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
acc8226
2022/05/17
1K0
docker网络的配置
可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装。
全栈程序员站长
2022/07/05
1.1K0
docker网络的配置
Docker 网络
Docker 服务启动时会首先在主机上自动创建一个 docker0 的虚拟网桥,网桥可以理解为一个软件交换机,负责挂载其上的接口之间进行包转发。
张哥编程
2024/12/07
1570
Docker实践之07-使用网络
默认情况下,如果在启动容器时不进行端口映射,外部是无法访问到容器内部的应用的,如:
编程随笔
2022/09/08
5620
Docker实践之07-使用网络
Docker入门与实践:Docker中的网络功能简介
在docker容器中可以运行一些网络应用,外部想要访问docker容器内的应用,可以通过-p或-P选项来指定端口映射,两个选项的区别如下所示:
用户1143655
2022/06/23
9680
Docker入门与实践:Docker中的网络功能简介
相关推荐
docker网络
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档