docker桥接模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker桥接模式相关的知识,希望对你有一定的参考价值。
参考技术A ocker安装时会创建一个名为docker0的虚拟网桥。除非我们进行另外的配置,新创建的容器都会自动连接到这个虚拟网桥提供的风格,bridge网络用于同一主机上的docker容器相互通信,连接到同一个网桥的docker容器可以相互通信。bridge 对宿主机来讲相当于一个单独的网卡设备 对于运行在宿主机上的每个容器来说相当于一个交换机,所有容器的虚拟网线的一端都连接到docker0上。
容器通过本地主机进行上网,容器会创建名为veth的虚拟网卡,网卡一端连接到docker0网桥,另一端连接容器,容器就可以通过网桥通过分配的IP地址进行上网。
我们也可以自定义自己的bridge网络,docker文档建议使用自定义bridge网络
导入容器并启动
验证
创建自定义网络
建一个自定义网络, 可以指定子网、IP地址范围、网关等网络配置
查看docker网络,是否创建成功
查看自定义网络的细节
创建容器bb1,连接到自定义网络,并进入容器验证,可以看到该容器的ip地址为172.22.16.2
验证后按Ctrl+P后,再按Ctrl+Q,从bb1容器退回到主机环境而不关闭容器bb1
再创建一个容器bb2,也连接到网络mynet2中
进入容器,访问bb1容器的ip地址,进行验证
会得到如下 类似回复
Docker网络bridge桥接模式,是创建和运行容器时默认模式。这种模式会为每个容器分配一个独立的网卡,桥接到默认或指定的bridge上,同一个Bridge下的容器下可以互相通信的。我们也可以创建自定义bridge以满足个性化的网络需~~~
docker网络compose
docker网络
docker的网络比较简单,其实只要是对vmware workstation的网络有所理解的话都能很好的理解docker的网络模式。
Docker容器的网络模式
bridge模式,让容器跟docker0网卡桥接。上网通过nat上网,这其实就是vmware workstation当中的NAT网络。
host模式,让容器和宿主机共享网络,这其实才是vmware当中的桥接模式。
none,关闭容器网络
先说一下docker当中的bridge模式,这其实是vmware的中NAT模式,容器的网关是物理机的docker0网卡的IP,容器上网时将数据包交给docker0网卡,docker0网卡通过nat让物理机的eth0代理上网,默认就是这种网络模式,默认是172.17网段。
host模式就是容器的网卡和物理机的网卡eth0处于同等地位,与vmware workstation当中的桥接差不多,但是还是有一些不同的,vmware workstation的桥接是和物理机地位同等,但IP不同,而docker是容器的网络配置和物理是一模一样的,IP也是一样的。
//查看网络方式docker network ls,对应三种方式
[root@docker1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
6c8ba509a90d bridge bridge local
2e75dbc4f41d host host local
84af08d64d0b none null local
Docker默认的网络方式观察
docker run -d centos:nginx
docker exec -it fd415027a7bd /bin/bash
yum install bridge-utils -y
brctl show
//表示这三个网卡veth开头的三个网卡都是容器的网卡,都通过docker0网卡上网,bridge模式。
[root@docker1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242443c94c4 no veth9031fe3
vethb716c93
vethbb7ce87
桥接docker0默认外部无法访问进去,得开通映射才能访问进去,下面就讲映射!!这特么和vmware workstation好像呀!!!!!
桥接
桥接docker0加端口映射可以实现跟外界通讯
//一对一的映射,8080指物理机的端口,后面的80指容器的端口,侦听到物理机的所有网卡上0.0.0.0
docker run -d -p 8080:80 centos:nginx
root@docker1 ~]# docker ps
0.0.0.0:8080->80/tcp
//仅侦听到物理机的某一个网卡
docker run -d -p 192.168.237.50:8080:80 centos:nginx
//多个端口同时映射操作
多端口映射docker run -d -p 8080:80 -p 6381:6379 centos:web
host
使用host模式,直接使用宿主机的网络,可直接外界通讯
docker run --net=host -d centos:redis
直接就能外网通讯,运行ifconfig查看网卡信息,与物理网卡的信息一模一样,主机名都一样。
none
使用none模式,关闭容器网络,用得比较少
//进入docker容器查看时,只有127.0.0.1网卡
docker run --net=none -d centos:web
[root@docker1 ~]# docker exec -it 3e2 /bin/bash
[root@3e2502e00d39 /]# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
文件共享
假设我我们在容器里面跑nginx,nginx的日志和根目录当然也是存放在容器里面,我们要想更改的话就要进入到容器里面,进行查看日志和更改站点。我们可以使用文件共享的方式,当宿主的目录映射到容器里面,这样我们对网站进行操作时就不用再进入到容器里面了。
在宿主机上创建目录:
mkdir -pv /zhanghe/logs /zhanghe/apps
//共享网站和日志
docker run -d -v /zhanghe/logs:/usr/local/nginx/logs -v /zhanghe/apps:/usr/local/nginx/html/apps centos:nginx
特权模式
Docker使用特权的方式去启动容器,无特权很多命令无法运行,比如说更改网关。
[root@7ad3d829bb6d /]# route add default gw 192.168.80.5
SIOCADDRT: Operation not permitted
//通过--privileged=true可以启动特权模式,很少用
docker run --privileged=true -d shijiange:nginx
compose
基础
compose说明
原生docker命令操作容器比较麻烦
compose可以把操作容器的命令写入到配置文件中,让我们更方便的操作容器
//compose的安装
yum install python-pip -y;pip install --upgrade pip
yum install python-devel -y
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ docker-compose
docker-compose version
docker-py version: 4.1.0
compose配置文件:/docker/compose/redis/docker-compose.yml
version: '2'
services:
redis: #名称,进入容器的时候会用到
image: centos:redis
compose操作容器
//后台启动容器,这种命令必须在docker-compose.yml所在的文件里面
docker-compose up -d
//进入容器,此处的redis对应上面配置文件的名字,不需要再通过ID进入那么麻烦了
docker-compose exec redis bash
//查看容器,重复启动时会提示已经启动
docker-compose ps
//停止并删除容器
docker-compose down
//重启容器:
docker-compose stop; docker-compose start
常用
//compose管理多个容器docker-compose.yml
version: '2'
services:
redis:
image: centos:redis
nginx:
image: centos:nginx
//compose使用端口映射
version: '2'
services:
redis:
image: centos:redis
ports:
- "192.168.80.61:6379:6379"
nginx:
image: centos:nginx
ports:
- "192.168.80.61:8080:80"
- "192.168.80.61:9090:80"
//compose设置网络模式
version: '2'
services:
redis:
image: centos:redis
nginx:
image: centos:nginx
network_mode: "host"
//compose设置文件共享
version: '2'
services:
nginx:
image: centos:nginx
network_mode: "host"
volumes:
- /shijiange/logs:/usr/local/nginx/logs
- /shijiange/apps:/usr/local/nginx/html/apps
//compose同个镜像启动多个容器
docker-compose up -d --scale redis=3
docker-compose exec --index=2 redis bash
做上面这些实验的的时候遇到一个理解就是当把nginx设置为host模式时无法启动容器,原因是因为宿主机也启动了nginx,占用了80端口。
以上是关于docker桥接模式的主要内容,如果未能解决你的问题,请参考以下文章