host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口范围,如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的NetworkNamespce,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,文件系统、进程列表等还是和宿主机隔离的
**使用host模式的容器可以直接使用宿主机的IP地址与外界通信,**容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能较好,但是dockerhost上已经使用的端口就不能再用了,网络的隔离性不好
解决了ip地址不固定的情况
IP共用,端口不同;两个容器之间通过localhost交互
此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主之间的关联
默认网络模式:网桥
该模式关闭了容器的网络功能
使用none模式,Docker容器拥有自己的Network Namespace,并不为Docker容器进行任何网络配置,也就是说,这个docker容器没有网卡、IP、路由等信息,需要我们为Docker容器添加网卡、配置IP等
这种网络模式下容器只有lo回环网络,没有其他网卡,none模式可以在容器创建时通过—network=none来指定,这种类型的网络没有办法联网,封闭的网络性能很好的保证容器的安全性
可以安全的存储数据,不会被攻击,可以用来当作本地仓库
docker network ls
docker inspect 容器ID
docker run -itd --name test --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#以上会报错,因为用户使用的ip地址不被规则所允许,docker0定义的就是按照顺序来,所有需要创建一个
docker ps -a
自定义网络
docker network create --subnet=172.18.0.0/16 bbs
docker network ls
可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/16 bbs
docker run -itd --name zxcc --net bbs --ip 172.18.0.7 centos:7 /bin/bash
docker inspect zxcc | grep IPAddress
当两个容器如果端口一致时,暴露出去会产生地址冲突,所以需要再docker0上做一个端口映射,通过ens33暴露出去端口不同就不会出现冲突
-p:自定义端口(宿主机端口:容器内端口)
-P:随机端口(-P 49153起始至65535)
#自定义端口
docker run -itd -p 8081:80 nginx:latest /bin/bash
进入容器开启nginx/或直接-c开启nginx
docker exec -it 5609d1ca30ef /bin/bash -c nginx
在网页中进行测试
http://192.168.50.128:8081/
随机端口
自定义端口
docker run -itd --name cenos_v1 --privileged=true centos:7 /sbin/init
docker exec -it cenos_v1 /bin/bash
在真实的生产环境中,不会进行这种操作,因为docke与系统共享内核的原因,这样操作会涉及到系统安全
Host :与宿主机共享网络名称空间/网络协议栈
Container:多个容器之间共享一个network namespaces
None :自闭空间
bridge:默认模式通过Veth对连接容器与docker0网桥,网桥分配给容器IP,同时docker 0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯
overlay2:使用联合挂载技术将容器层和镜像层的所有文件统一挂载到容器中,使容器中能看到完整的系统文件。
#使用cp命令复制进去容器
docker cp start.sh cenos_v1:/opt
#使用cp命令从容器复制出来
docker cp cenos_v1:/opt/123.sh ./
使用cp命令把容器内的文件复制到宿主机上
docker中,假设运行一个业务容器,但是业务容器需要暴露三个站点端口,启动后发现少添加了一个端口,如何动态添加端口(如何对已经运行的容器添加或修改端口)?
解决方式:
①、修改/var/lib/docker/containers/containers_id中两个文件
②、hostconfig.json中的 portbinding:{}修改端口或添加端口
③、修改config.v2.json文件,修改对应的Ports{}来添加/修改端口
重启守护进程即可
管理Docker容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Containers)
将容器内部的配置文件目录,挂载到宿主机指定的目录下
①、修改配置文件例如,nginx. conf /usr/local/nginx/ conf/nginx.conf —> /container_ nginx/ conf/nginx. conf
②、容器内部产生的日志,如何收集将容器内部存方日志文件的目录挂载到宿主机指定目录下/container_ nginx/ log/access_ 1og/access_ log
③、传入变量挂载到宿主机在宿主机上添加变量内容,将变量放入共享目录,在容器中/etc/profile 直接加载就可以 export xxdir=/data/data1/xx.
#注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
#-v选项可以在容器内创建数据卷,是volume的缩写
docker run -it --name abab -v /var/www:/data1 centos:7 bash
echo "this is wang" > /data1/abab.txt 容器中创建文件
返回宿主机查看是否有内容
cat /var/www/abab.txt
**目的:**让两个容器之间实现数据共享
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器,数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用
需求:创建数据共享卷
#创建一个容器作为数据容器卷
docker run -it --name bos -v /data1 -v /data2 centos:7 bash 创建并进入容器
echo "this is ceshi1" > /data1/text.txt 容器内创建测试1
echo "this is ceshi2" > /data2/text.txt 容器内创建测试2
使用--volumes-from来挂载boss容器中的数据卷到新的容器
docker run -it --name boss --volumes-from bos centos:7 bash
cat data1/text.txt
cat data2/text.txt
使用-volumes-from 来挂载bos容器中的数据卷到新的容器
在生成容器的同时,加上-v选项,指定把当前服务器的目录映射到容器中
如何实现docker持久化
在生成容器的同时,加上-v选项,指定把当前服务器的目录映射到容器中