【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
相关推荐
2403_875736878 分钟前
道品科技智慧农业中的自动气象检测站
网络·人工智能·智慧城市
荒Huang10 分钟前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
海阔天空_201321 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
桥田智能23 分钟前
气爪在自动化装配线中是如何应用的?
运维·自动化
MonkeyKing_sunyuhua26 分钟前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
追风林1 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
Tassel_YUE2 小时前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
€☞扫地僧☜€2 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘2 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
其乐无涯2 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器