目录
一、docker网络模式:
1、概述
2、docker网络实现原理:
3、docker的网络模式:
3.1、bridge模式:
3.2、host模式:
3.3、container模式:
3.4、none模式:
3.5、自定义网络模式:
4、docker网络总结:
二、docker的数据管理:
1、数据卷
1.1、容器和宿主机之间进行数据共享:
1.2、容器和容器之间实现数据共享:
三、docker网络通信
1、容器互联:
四、docker网络练习:
一、docker网络模式:
1、概述
docker的网络就是基于桥接模式实现的
桥接模式:用于连接两个不同网络段的设备,共享通信的一种方式
桥接设备:工作在OSI模型的二层,数据链路层,转发数据帧,基于Mac地址转发
类似于交换机,只能转发同一网段,通过泛洪广播来找目标设备mac地址。学习模式
2、docker网络实现原理:
桥接模式是一种网络模式,它在Docker中的工作方式可以分为以下几个步骤:
1、虚拟网络创建:当您启动Docker守护进程时,Docker创建一个虚拟网络桥(通常称为Docker0)是一个虚拟的网络设备,类似于物理网络设备的交换机
2、分配唯一的ip地址:每次您运行一个容器时,Docker分配一个唯一的IP地址给该容器
这个IP地址是在桥接模式网络的子网中
3、连接容器到桥接网络:当容器启动时,Docker将容器的虚拟网络接口连接到虚拟网络桥上。其中一个端点位于容器,而另一个端点位于主机上
4、容器之间的通信:如果有多个容器在相同的桥接网络上运行,他们可以通过各自的ip地址直接通信。Docker会自动在桥接网络上设置路由,使得容器可以与外部网络通信,而外部网络看到的是主机的IP地址
5、NAT(网络地址转换):默认情况下,Docker使用NAT技术,将容器的私有IP地址映射到主机上的公共IP地址。这样,容器可以与外部通信,而外部网络看到的是主机的IP地址
问题:docker的网桥是宿主机虚拟出来的,并不是一个真正存在的网络设备,外部网络无法寻址找到。外部网络无法直接访问docker:0这个虚拟网桥分配给容器的IP地址
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,也就是无法直接访问容器ip访问容器
如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主机(端口映射)
即Docker run创建容器时用-p/-P启用,访问到的时候就通过宿主ip+容器端口来访问容器
给容器做端口映射:
-P:创建容器的时候,在宿主机和容器之间做一个端口映射。后不接数字代表随机分配一个端口给宿主机,容器的端口是不变的
-P32768开始
-P(大写):随机制定
-p 80:80(小写):指定端口
进入容器开启一下服务
实际上,docker是在宿主机和容器之间做了一个iptables的nat地址转换。
docker run -itd --name test1 -P nginx:1.22.0 /bin/bash
-p 80:80
前面80是宿主机的端口,后面是容器的端口80
docker run -itd --name test3 -p 80:80 nginx:1.22.0 /bin/bash
做端口映射时,宿主机的端口一定是未被占用
宿主机直接查看容器产生的日志:
docker run -itd --name test11 -p 456:80 nginx
必须是在run的时候不加/bin/bash
docker logs 容器名/容器id 查看全部日志
docker logs -f 容器名/容器id 尾部查看全部,动态查看
docker logs --tail=10 -f 容器名/容器id 尾部10条,动态查看
/bin/bash就是为了让容器后台有一个运行程序,保证容器不会退出
-d后台守护运行,但是时间一长容器自动退出
加/bin/bash就是容器的标准输出,docker logs日志捕获的是cmd和entrypoint标准输出。/bin/bash和捕获日志会冲突
3、docker的网络模式:
3.1、bridge模式:
在创建docker时不需要指定网络类型,默认就是bridge
docker run -itd --name test1 -p 4300:80 nginx:1.22.0
4300是宿主机的端口
80是nginx容器的端口
访问宿主机的ip+端口就等于访问nginx容器
使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。
可以使用iptables -t nat -vnL 查看。
3.2、host模式:
容器将不会虚拟出自己的网卡,也没有自己的IP地址。全部使用宿主机的IP地址和端口
创建容器的时候指定网络模式:--network host
docker run -itd --name test1 --network host nginx:latest bin/bash
公用模式:如果是单个容器运行,可以使用host模式。容器的端口和宿主机端口公用一个,但是有多个容器,访问不了
3.3、container模式:
要想容器都起来必须后接/bin/bash
docker run -itd --name test1 --network host nginx:1.22.0 /bin/bash
创建一个test2和test1使用同一个ip和端口
docker run -itd --name test2 --network=container:test1 nginx:1.22.0 /bin/bash
容器中怎么启动服务:
cd /usr/bin
nginx 启动
nginx -s stop 停止
容器共用端口,但是不能同时启动。想要启动一个,其他容器必须关闭。
也就是说共用端口,只能使用一个
启动test1的nginx:
停止test1的nginx
nginx -s stop
3.4、none模式:
docker容器有自己的network-space,但是这个容器没有任何网络设置。
这个容器没有网卡,没有ip没有路由,只有lo回环网络。在none模式下,容器不可以联网(在工作中是用于容器功能测试用)
不能联网不能访问
封闭的网络能很好的保证容器的安全性。
docker run -itd --name test3 --network none nginx:1.22.0 /bin/bash
3.5、自定义网络模式:
我们可以给docker创建一个自己定义的网段
docker network ls
NETWORK ID:这个是docker网络唯一网络id
NAME:docker网络的名称
DRIVER:网络的驱动程序
SCOPE:
docker run -itd --name test6 --network bridge --ip 172.17.0.10 nginx:latest /bin/bash
在使用默认docker:0网桥时,创建容器是不能指定IP地址的,只能由docker网桥自动分配
除非用户自定义的网络才可以给容器自定义IP地址
创建自定义网络:
可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
--opt "com.docker.network.bridge.name"="docker1":这里可以不加,但是网卡名称难以识别,系统会给你命名复杂名称
mynetwork:自定义网络的名称
有自定义网段之后,创建容器的时候就可以自定义IP地址了
docker run -itd --name nginx1 --network mynetwork --ip 172.18.0.10 nginx:latest /bin/bash
给容器自定义IP地址为 172.18.0.10
自定义IP地址,一定要先自定义网桥
4、docker网络总结:
docker的网络模式:
- bridge桥接模式:也是docker的默认模式,在创建时无需指定
- host模式:容器不会有自己的网络设备,但是可以和宿主机共享ip和端口
- container模式:容器和容器之间共享ip和端口
- none模式:也没有自己的网络设备,也没有网卡、ip。只有一个本地的回环地址。127.0.0.1。不能够联网的。相当于一个飞行模式,只能自己访问自己。一般用于测试容器的功能
- 自定义网络模式:创建容器时,默认使用docker0网桥是无法给容器定义IP地址的,自能自动分配,自定义网络在创建容器时,可以给容器指定IP地址
docker如何在创建容器时指定端口映射:
docker没有二次配置的机制,只能在创建的时候指定
-P(大写):随机指定端口
-p(小写):自定义指定端口
-p 32768:80 32768是宿主机的端口,后面80是容器的端口
docker容器外部查看日志
docker run -itd --name test11 -p 456:80 nginx
必须是在run的时候不加/bin/bash
docker logs 容器名/容器id 查看全部日志
docker logs -f 容器名/容器id 尾部查看全部,动态查看
docker logs --tail=10 -f 容器名/容器id 尾部10条,动态查看
/bin/bash就是为了让容器后台有一个运行程序,保证容器不会退出
-d后台守护运行,但是时间一长容器自动退出
加/bin/bash就是容器的标准输出,docker logs日志捕获的是cmd和entrypoint标准输出。/bin/bash和捕获日志会冲突
二、docker的数据管理:
1、数据卷
1.1、容器和宿主机之间进行数据共享:
数据卷:是一个供容器使用的特殊的目录,在容器中,和宿主机的目录进行映射,主机和宿主机之间都可以对目录中的文件进行修改,而且双方是同步生效。对镜像也没有影响。宿主机和容器之间实现数据迁移
MySQL 33066:3306
宿主机的目录和容器中的目录进行挂载(映射关系)
docker run -itd --name test1 -v /opt/test1:/opt/test centos:7 /bin/bash
test1是宿主机目录
test是容器目录
docker run -itd --name test2 -v /opt/test2:/opt/test:ro centos:7 /bin/bash
创建只读模式,容器里面只能读
容器里面的目录的文件只能看
1.2、容器和容器之间实现数据共享:
test1 test2 可以有一个或者多个映射目录,实现数据互传,数据同步
数据卷容器:只提供挂载点,让另一方来收集数据
docker run -itd --name test11 -v /opt/data1 -v /opt/data2 centos:7 /bin/bash
docker run -itd --volumes-from test11 --name test12 centos:7 /bin/bash
test11和test12 实现容器间数据共享
三、docker网络通信
1、容器互联:
实现两个容器之间网络通信
老版本方法:
第一个容器创建:
docker run -itd -P --name test111 centos:7 /bin/bash
第二个容器
docker run -itd -P --name test222 --link test111:test222 centos:7 /bin/bash
在centos容器中下载net-tools工具可以用Linux命令
yum -y install net-tools
要互ping要做映射
新版本都用network指定:
自定义网络实现网段互ping
docker run -itd -P --name test112 --network=mynetwork centos:7 /bin/bash
docker run -itd -P --name test113 --network=mynetwork centos:7 /bin/bash
同一网段中不用做映射就可以实现互ping
新版本建议使用
四、docker网络练习:
1、部署一个MySQL镜像,创建一个MySQL容器,用navicat实现可以直接访问容器的MySQL,MySQL宿主机:33066
MySQL容器:3306
2、创建一个数据卷。在宿主机可以看到容器内MySQL的日志文件
创建运行mysql容器,并建立数据卷:
docker run -itd --name mysql1 -v /opt/demo1:/opt/test -p 33066:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.20
本机MySQL远程登录测试:
navicat:
my.cnf配置文件拖出来修改
docker cp mysql1:/etc/mysql/my.cnf /opt
重启docker容器
docker restart mysql1