【Docker从入门到入土 2】Docker数据管理、网络通信和网络模式 1.0

Part2

  • 一、Docker网络模式(面试高频)
    • [1.1 Docker 网络实现原理](#1.1 Docker 网络实现原理)
    • [1.2 host模式](#1.2 host模式)
    • [1.3 container模式](#1.3 container模式)
    • [1.4 none模式](#1.4 none模式)
    • [1.5 bridge模式](#1.5 bridge模式)
    • [1.6 自定义网络](#1.6 自定义网络)
  • 二、Docker网络通信
    • [2.1 端口映射](#2.1 端口映射)
    • [2.2 容器互联](#2.2 容器互联)
  • 三、Docker资源控制
    • [3.1 Cgroup简介](#3.1 Cgroup简介)
    • [3.2 CPU资源控制](#3.2 CPU资源控制)
      • [3.2.1 设置CPU使用率上限](#3.2.1 设置CPU使用率上限)
      • 3.2.2设置CPU资源占用比
      • [3.2.3 设置容器绑定指定的CPU](#3.2.3 设置容器绑定指定的CPU)
    • [3.3 对内存使用的限制](#3.3 对内存使用的限制)
    • [3.4 对biko(磁盘I/O配额控制)的限制](#3.4 对biko(磁盘I/O配额控制)的限制)
  • 四、Docker的数据管理
    • [4.1 数据卷](#4.1 数据卷)
    • [4.2 数据卷容器](#4.2 数据卷容器)

一、Docker网络模式(面试高频)

1.1 Docker 网络实现原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。

在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。

如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过宿主机IP:容器端口访问容器。

1.2 host模式

容器和宿主机共享网络命名空间,即容器和宿主机使用同一个IP、端口范围(容器与宿主机/同模式的容器不可以相同的端口号)、路由、iptables规则等

bash 复制代码
docker run --network=host

1.3 container模式

和指定且已存在的容器共享网络命名空间,即两个使用同一个IP、端口范围(容器与宿主机/同模式的容器不可以相同的端口号)、路由、iptables规则等

bash 复制代码
docker run --network=container:指定的容器ID|容器名

1.4 none模式

每个容器都有独立的网络命名空间,但是容器没有eth0网卡、IP、端口等,只有lo网卡。

bash 复制代码
docker run --network=none

1.5 bridge模式

docker的默认网络模式。

此模式的每个容器都要独立的网络命名空间,即每个容器都有独立的IP、端口范围(每个容器可以相同的端口号)、路由、iptables规则等。

bash 复制代码
docker run [--network=bridge]

1.6 自定义网络

可以自定义创建一个网段、网桥、网络模式,从而可自定义容器IP来创建容器

bash 复制代码
docker network create --subnet 新网段 --opt "com.docker.network.bridge.name"="新网桥名" 新网络模式名

docker run --network 新网络模式名 --ip 自定义IP

二、Docker网络通信

2.1 端口映射

在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。

端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

bash 复制代码
docker run  -d  -P       #使用从32768开始的随机端口映射容器

docker run -p 宿主机端口:容器端点       #指定宿主机端口映射容器
bash 复制代码
docker run -d --name test1 -P nginx					#随机映射端口(从32768开始)

docker run -d --name test2 -p 43000:80 nginx		#指定映射端口

docker ps -a
bash 复制代码
#浏览器访问
http://192.168.2.106:43000
http://192.168.2.106:49170
bash 复制代码
#查看容器的输出和日志信息
docker logs 容器的ID/名称

2.2 容器互联

容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。

简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

bash 复制代码
#创建并运行源容器取名web1
docker run -itd -P --name web1 centos:7 /bin/bash	
	
#创建并运行接收容器取名web2,使用--link选项指定连接容器以实现容器互联
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash			
#--link 容器名:连接的别名
bash 复制代码
#进web2 容器, ping web1
docker exec -it web2 bash
ping web1

三、Docker资源控制

3.1 Cgroup简介

Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。

Cgroup 是 ControlGroups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等等) 的机制,被 LXC、docker 等很多项目用于实现进程资源控制。

Cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理是通过该功能来实现的。

3.2 CPU资源控制

3.2.1 设置CPU使用率上限

设置单个容器进程能够使用的CPU使用率上限

bash 复制代码
docker run --cpu-period 单个CPU调度周期时间(1000~1000000) 
           --cpu-quota 容器进程能够使用的最大CPU时间(>=1000)

3.2.2设置CPU资源占用比

设置多个容器时才有效。

bash 复制代码
docker run --cpu-shares 容器进程最大占用的份额(值为1024的倍数)

3.2.3 设置容器绑定指定的CPU

bash 复制代码
docker run --cpuset-cpus CPUID1[,CPUID2...]

3.3 对内存使用的限制

bash 复制代码
设置容器能够使用的内存和swap的大小
docker run -m 内存大小 --memory-swap 内存和swap的总大小
                                     设置 -1,代表不限制swap的大小,宿主机有多少容器即可用多少
									 设置 0或者不设置,代表swap为内存的2倍
									 设置 与 -m相同的值,代表不使用swap

3.4 对biko(磁盘I/O配额控制)的限制

bash 复制代码
docker run --device-read-bps   磁盘设备文件路径:速率           限制容器在某个磁盘上读的速率
           --device-write-bps  磁盘设备文件路径:速率           限制容器在某个磁盘上写的速率
		   --device-read-iops  磁盘设备文件路径:次数           限制容器在某个磁盘上读的次数
		   --device-write-iops 磁盘设备文件路径:次数           限制容器在某个磁盘上写的次数

四、Docker的数据管理

管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。

4.1 数据卷

bash 复制代码
docker run -v 挂载目录:数据卷(容器挂载点) 

数据卷是一个供容器使用的特殊目录,位于容器中。

可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。

数据卷的使用类似于 Linux 下对目录进行的 mount 操作。

bash 复制代码
docker pull centos:7

注意:宿主机本地目录的路径必须是使用绝对路径。

如果路径不存在,Docker会自动创建相应的路径。

bash 复制代码
#宿主机目录/var/www 挂载到容器中的/data1。
docker run -v /var/www:/data1 --name web3 -it centos:7 /bin/bash			#-v 选项可以在容器内创建数据卷
ls
echo "this is web1" > /data1/abc.txt
exit
bash 复制代码
#返回宿主机进行查看
cat  /var/www/abc.txt

4.2 数据卷容器

bash 复制代码
docker run -it --volumes-from 数据卷容器

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。

数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。

bash 复制代码
#创建一个容器作为数据卷容器
docker run --name web4 -v /data1 -v /data2 -it centos:7 /bin/bash
echo "this is web4" > /data1/abc.txt
echo "THIS IS WEB4" > /data2/ABC.txt
bash 复制代码
#使用 --volumes-from 来挂载 web4 容器中的数据卷到新的容器
docker run -it --volumes-from web4 --name web5 centos:7 /bin/bash
cat /data1/abc.txt
cat /data2/ABC.txt
相关推荐
@insist1231 小时前
系统集成项目管理工程师-信息和文档管理
网络·数据库·软考·系统集成项目管理工程师·软考中项·软件水平考试
极客互动API1 小时前
企业微信 iPad 协议服务搭建与 AI 回调实战
网络·汇编·人工智能·微信·企业微信·ipad
QH139292318801 小时前
Keysight N5183B N5183B 微波模拟信号发生器
网络·单片机·嵌入式硬件·集成测试·信息与通信
LabVIEW开发2 小时前
基于原始套接字实现LabVIEW网络Ping检测的编程方法
网络·labview·labview知识·labview功能·labview程序
东莞和裕包装2 小时前
如何管控广州定制纸箱生产中的啤切精度与印刷色差质量问题
大数据·运维·网络·人工智能
二宝哥2 小时前
docker安装apisix
docker·容器·apisix
小飞侠在吗3 小时前
Windows 下 Nginx 访问 127.0.0.1 报 50x 错误:根因是路径里 \t 被当成 Tab
运维·windows·nginx
Zguigo3 小时前
lesson19-23计算机网络数据链路层完全指南:从帧封装到滑动窗口协议
网络·计算机网络
明源云4 小时前
穿透式监管如何打破国有资产盘活困局?
大数据·网络·人工智能·架构
王da魔4 小时前
部署Kubernetes
云原生·容器·kubernetes