1、持久化存储
docker容器中一般不保存数据,只封装系统和环境,这样就存在一个问题,一个docker容器的数据内容不能持久化,且不能共享出来,在生产中,不能很好地提供服务。为了解决这个问题,就要涉及到docker的持久化存储和共享存储的技术了。
所谓持久化,就是将真实机目录挂载到容器中,让容器运行时所产生的数据都写入到真实机的目录中,以此来提供持久存储。

mkdir /var/webroot
docker run -d -p 80:80 -v /var/webroot:/var/www/html 192.168.1.194:5000/wang:sh2
——>-d 后台进程
—>-p 映射端口 物理机端口:容器端口
——>-v 物理机文件夹:容器的目录(容器中目录如果不存在,会自动创建,如果存在,会覆盖掉)
—>192.168.1.194:5000  远程镜像

2、共享存储
现实生存环境中,一般会有专门的文件服务器或者是分布式文件服务器集群来提供文件的存储,此次通过共享文件夹的方式来实现共享存储。
(1)文件服务器提供一个nfs共享存储==>192.168.1.254

yum -y install nfs-utils
vim /etc/exports
/webroot 192.168.1.0/24(rw,sync)
:wq
systemctl restart nfs

(2)docker主机
————mount挂载共享
mount 192.168.1.254/webroot /mnt/
——用-v选项映射磁盘到容器中。
docker run -d -p 80:80 -v /mnt:/var/www/html 192.168.1.194:5000/wang:sh2
这样不管是在容器中写html网页,还是在/mnt/目录下书写html网页,或者是在文件服务器的/webroot下面书写html网页,都可以在网页上被访问到。
这样可以提供负载均衡或者是工作上的同步而不互相干扰,比如一位web编写人员写a网页,另一位web编写人员写b网页,不会出现相互干扰,且书写的东西都被存储在真实的文件服务器中。
3、Docker网络架构
docker网络架构中引用的是linux网桥及虚拟交换机架构,这里的虚拟交换机默认为docker0,也可以手工配置虚拟交换机,不过一般是让docker服务自动配置。
(1)安装一个网桥管理服务
[root@b2 ~]# yum -y install bridge-utils.x86_64
(2)查看虚拟交换机

[root@b2 ~]# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.0242ae16e82c   no      
(虚拟交换机)                                    (网卡)//如果启动了容器,则每一个容器会对应一张虚拟网卡

(3)断开断开网卡与交换机的连接,相当于拔网线
brctl delif docker0(虚拟交换机) 网卡名
(4)查看默认docker创建的网络模型

docker network list 
[root@b2 ~]# docker network inspect c088b2c8b1e7(网桥的id)  //查看网桥的底层信息。
docker network 回车,可以看到它的帮助

(5)手动创建一个网络虚拟交换机

docker network create [--help]
docker network create --subnet 192.168.100.0/24(子网) -d bridge(指定是网桥) -o(参数)  \
com.docker.network.bridge.name=docker1  docker1(名字)
//这样用ifconfig看到的名字依然为docker1
docker network ls
ifconfig

(6)启动容器时指定用哪张网桥,不指定时用docker0
docker run -it --network=docker1 192.168.1.194:5000/wang:sh2

(7)docker会自动搭建路由器
创建的docker1用的网段是192.168.100.0网段的,docker0是172.17.0.0网段的,两个网段之间可以相互ping通。
4、容器端口与物理主机端口绑定的原理:
底层原理是启动了linux内核的firewalld(iptables)的端口转发功能。
手动为已经起来的容器绑定端口
(1)查看iptables的规则

iptables-save
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.3:80
按照相同的书写写一条规则:
iptables -t nat -A DOCKER ! -i docker0(指定网卡) -p tcp -m tcp --dport 2022(物理端口) -j DNAT --to-destination 172.17.0.3:22