一、网络知识
1、桥接模式:用于链接两个不同网络段的设备,是共享通信的一种方式
2、桥接设备:工作在OSI模型的第二层(数据链路层)。根据MAC地址转发数据帧,类似于交换机,只能转发同一网段,通过泛洪广播找到目标地址的MAC地址,学习,然后保存在MAC地址表中
二、docker网络
1、实现方式
docker网络是基于桥接模式实现的
2、工作模式
(1)建立虚拟网络桥:安装开启docker后,docker进程就会自动创建一个虚拟网络桥(docker0)
作用:是一个虚拟的网络设备,类似于物理网络设备的交换机
(2)分配唯一的IP地址:每次运行一个容器,docker进程都会分配唯一的且未被其他容器占用的IP地址给容器,这个IP地址在桥接模式网络的子网中
(3)容器和主机通信:通过桥接模式,容器可以与主机直接通信,容器可以访问主机上的运行服务,主机也可以通过桥接网络docker0来访问容器内部的进程(实际上这个过程是在主机上做了iptables的nat地址转换)
问题:docker的网桥是宿主机虚拟出来的,并不是一个真正存在的网络设备,外部网络无法寻址找到(外部网络无法直接访问docker0分配给容器的IP地址)
解决:可以给容器做端口映射
①随机分配端口和宿主机映射-P
docker run -itd --name test1 -P nginx:1.22.0 /bin/bash
-P:在创建容器时,在宿主机和容器之间做一个端口映射,-P随机分配一个端口给宿主机,容器的端口是不变的。随机分配的端口号从32768开始。进入容器开启一下服务。实际上,docker是在宿主机和容器之间做了一个iptables的nat地址转换,用宿主机的32768端口映射80端口
问题:浏览器无法访问映射的端口
原因:没有打开转发功能
解决:打开转发功能
sysctl net.ipv4.ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward
②指定端口号和宿主机映射-p
-p:指定端口,人为设置固定的端口映射
③指定端口号和宿主机一一映射
4、docker的网络模式【面试题】
创建容器时指定网络模式
--network host
(1)bridge模式(桥接模式):默认模式,在创建docker时不需要指定网络类型
(2)host模式(共用模式):容器不会虚拟出自己的网卡,也没有自己的IP地址,全部使用宿主机的IP地址和端口。如果是单个容器运行,可以使用host模式(宿主机和容器共用一个IP地址和端口)
(3)container模式:容器和容器之间共用一个IP和端口(两个端口不能同时起来)
(4)none模式:docker容器有自己的network-space,但是容器没有任何网络设置,这个容器没有网卡,没有IP地址,没有路由,只有lo回环网络,在none模式下容器不可以联网(一般用于容器功能测试)
(5)自定义网络:给docker创建一个自己定义的网段(基于bridge模式创建自定义网络)
NETWORK ID | docker网络唯一的网络ID |
NAME | docker网络的名称 |
DRIVER | docker网络的驱动程序 |
SCOPE | docker网络的作用范围 |
创建容器时无法指定IP地址
在使用默认docker:0的网桥时,创建容器时不能指定IP地址的,只能由docker网桥自动分配,除非用户自定义的网络才能给容器分配IP地址
创建自定义IP地址
①创建网段
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地址
4、查看容器日志
docker logs 容器名称/ID(不是实时查看,查看所有)
docker logs -f (从尾部看)
docker logs --tail=10 test1(固定看10行)
★docker logs --tail=10 -f test1(动态看最近的10行)
三、数据卷
容器如何与宿主机之间进行数据共享?
1、定义
数据卷是一个供容器使用的特殊的目录,在容器中,和宿主机的目录进行映射,主机和宿主机之间都可以对目录中的文件进行修改,双方同步生效,对镜像也没有影响,可以实现宿主机到容器之间的数据迁移
2、数据共享(映射关系)
(1)宿主机和容器之间实现数据共享
①创建容器的挂载卷(自动创建目录)
/opt/yyy在宿主机中;/opt/sss在容器中
结论:创建挂在卷,宿主机和容器中的数据可互相同步更新
②创建容器中的目录为只读模式
ro:read only
结论:创建容器时设置为只读模式后,容器内部只能读,不能写,能同步到来自宿主机的数据文件
(2)容器和容器之间实现数据共享(数据卷容器)
数据卷容器:只提供挂载点,让另一方收集数据
test1、test2可以有一个或多个映射目录,实现数据互传,数据同步
在test1容器中的挂载目录下分别创建
挂载目录 | 文件 | 内容 |
sss | sss.txt | sss1 |
yyy | yyy.txt | yyy1 |
结论:容器之间实现数据共享
3、容器互联:两个容器之间实现网络通信
新版本方法:基于自定义网络实现网段互联
创建网段172.20.0.0/16
结论:在同一网段中,互相可以ping通
4、部署mysql镜像,创建一个mysql容器,用navicat可以直接访问容器的mysql 33066:3306;创建一个数据卷,宿主机可以看到容器内的mysql的日志文件
拉取mysql5.7
创建容器mysql
进入容器并登录mysql,给root用户赋权
查看mysql日志状态
编辑配置文件开启binlog,设置log文件
导出mysql 的配置文件
编辑mysqld.cnf文件
导入mysql 的配置文件
chmod 777 /var/log/mysql
查看mysql 日志