docker网络

桥接模式:用于连接两个不同网络段的设备,共享通信的一种方式。

桥接设备:工作在Osi模型的第二层,数据链路层,根据mac地址转发数据帧

类似于交换机,智能转发同一网段,通过泛洪广播来找目标设备的mac地址

创建完docker之后会自动生成一个docker网络。这是一个虚拟网卡

docker网络_第1张图片

docker网络是基于桥接模式实现的:

1、 虚拟网络桥:安装开启docker之后,docker进程会自动创建一个虚拟网络桥(docker0)是一个虚拟网络设备,类似于物理网络的设备的交换机

2、 分配唯一的IP地址,每次运行一个容器,docker进程都会分配唯一的且未被其他容器占用的IP地址给容器。这个IP地址是在桥接模式网络的子网中。

3、 容器和主机通信:通过桥接模式,容器可以与主机直接通信,容器可以访问主机上的运行服务。主机也可以通过桥接网络docker:0 来访问容器内部的进程(iptables的nat地址转换。在主机上做了地址转换)

问题:docker的网桥是宿主机虚拟出来的,并不是一个真正存在的网络设备,外部网络无法寻址找到。外部网络无法直接访问docker:0分配给容器的IP地址。

可以给容器做一个端口映射来实现外部访问

容器创建完毕后不能再原基础上做端口映射

docker run -itd --name test1 -P nginx:1.22.0 /bin/bash
#-P:在创建容器时,在宿主机和容器之间做一个端口映射。
#-P后面如果什么都不跟着会随机分配一个端口给宿主机。容器的端口是不会变的。
#-P会从32768开始。

需要进入容器开启服务

实际上docker是在宿主机和容器之间做了IPtables的NAT地址转换

docker网络_第2张图片

docker run -itd --name test2 -p 4300:80 nginx:1.22.0 /bin/bash
#-p:指定端口,人为设置固定的端口映射
docker exect -it test2 bash
cd /usr/bin nginx启动nginx

也可以使用本机的80端口映射容器的80端口

docker run -itd --name test3 -p 80:80 nginx:1.22.0 /bin/bash

在宿主机上查看容器产生的日志

docker logs test3

docker的网络模式

1、 bridge:在创建docker时不需要指定网络类型。默认就是bridge

2、 host模式:容器将不会虚拟出自己的网卡,也没有自己的ip地址,全部使用宿主机的ip地址和端口

创建容器的时候可以指定网络模式:--network host

docker run -itd --name test1 --network host nginx /bin/bash

公用模式,如果是单个容器运行,可以使用host模式

3、 container模式:容器和容器之间公用一个ip和端口

docker run -itd --name test2 --network=container:test1 nginx:latest /bin/bash

如果两个端口冲突了关闭一个nginx端口即可

test1使用的是宿主机的20.0.0.41端口80(宿主机的80端口)

docker网络_第3张图片

4、 none模式:在none模式当中docker容器有自己的network-space,但是这个容器没有任何网络设置、没有IP、没有路由,只有lo回环网络,在none模式下,容器不可用联网。(主要用于测试)

docker run -itd --name test2 --network=none nginx /bin/bash

5、 自定义网络:可以给docker创建一个自定义网段。

docker network ls
#查看docker容器网络信息

docker网络_第4张图片

NETWORK ID :这是docker网络唯一的网络id

NAME:docker网络的名称

DRIVER:docker网络的驱动程序

SCOPE:表示网络的作用范围

docker run -itd --name nginx1 --network bridge --ip 172.17.0.10 nginx:latest /bin/bash
#在使用默认docker:0这个网桥时,创建容器时不能指定ip地址的,只能由docker网桥自动分配。
#除非用户自定义的网络才可以给容器自定义ip地址

自定义docker虚拟网卡
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
#docker network create创建一个docker虚拟网卡
#--subnet=172.18.0.0/16:自定义一个网段和声明子网掩码
#--opt "com.docker.network.bridge.name"="docker1":可以不加,但是网卡名称比较难以识别。
#mynetwork:自定义网络的名称

docker网络_第5张图片

docker run -itd --name nginx1 --network mynetwork --ip 172.18.0.10 nginx:latest /bin/bash
#给nginx容器一个指定的ip地址
docker exec -it nginx1 bash
nignx
cd /usr/share/nginx/html
echo "zyg" > index.html
curl 172.18.0.10

数据卷

容器如何与宿主机之间进行数据共享?

数据卷是一个供容器使用的特殊目录,在容器中和宿主机的目录进行映射。容器和宿主机之间都可以对目录中的文件进行修改。双方同步生效。对镜像也没有影响。宿主机到容器实现数据迁移

宿主机目录和容器中目录进行挂载

docker run -itd --name test1 -v /opt/test1:/opt/test centos:7 /bin/bash
#-v:表示进行挂载
cd test1
touch 123.txt
echo "123" > 123.txt

在容器中创建
touch 456.txt
echo "456" > 456.txt

docker网络_第6张图片

docker run -itd --name test2 -v /opt/test2:/opt/test:ro centos:7 /bin/bash
#ro:只需要在容器内部的目录名称加上or实现只读模式

docker网络_第7张图片

容器和容器之间实现数据共享

test1 test2 可以有一个或者多个映射目录,实现数据互传,数据同步。 数据卷容器: 只提供挂载点,让另一方收集交互.

docker run -itd --name test11 -v /opt/data1 -v /opt/data2 centos:7 /bin/bash
#-v:此时创建的是容器内部的目录
docker run -itd --volumes-from test11 --name test12 centos:7 /bin/bash

容器1

docker网络_第8张图片

容器2

docker网络_第9张图片

容器互联

两个容器之间实现网络通信

老版本方法:

docker run -itd -P --name test111 centos:7 /bin/bash
docker run -itd -P --name test222 --link test111:test222 centos:7 /bin/bash
进入容器1
docker exec -it test111 bash
yum -y install net-tools
#在容器中安装net-tools服务
ifconfig
cat /etc/hosts
ping test222
进入容器2
docker exec -it test222 bash
yum -y install net-tools
cat /etc/hosts

容器1:

docker网络_第10张图片

容器2:

docker网络_第11张图片

新版本的方法:

docker run -itd -P --name test112 --network=mynetwork centos:7 /bin/bash
docker run -itd -P --name test113 --network=mynetwork centos:7 /bin/bash
进入容器1
docker exec -it test112 bash
yum -y install net-tools
进入容器2
docker exec -it test113 bash
yum -y install net-tools
指定两个容器在在同一网段中不需要做映射

容器1

docker网络_第12张图片

容器2

docker网络_第13张图片

 建议使用新版net模式

总结

docker的网络模式:

1、 bridge模式,桥接模式,docker的默认模式,创建时无需指定

2、 host模式:容器不会有自己的网络设备,但是可以和宿主机共享IP和端口

3、 container模式:容器和容器之间共享IP和端口

4、 none模式:也没有自己的网络设备,也没有网卡、IP。只有本地回环地址:127.0.0.1不能够联网(相当于飞行模式)一般用于测试容器功能

5、 自定义网络:创建容器时,默认使用docker0网桥是无法给容器定义IP地址的。智能自动分配。自定义网络在创建容器时,可以给容器指定IP地址。

docker如何在创建容器时指定端口映射:

-P:随机指定

-p:自定义指定

前面是宿主机端口,后面是容器端口

你可能感兴趣的:(Docker从入门到精通,网络)