一、docker的架构
docker包括三个基本概念:
- 镜像(image):是一个文件,里面包含了一个微型操作系统+核心代码程序+依赖库环境。镜像文件越小越好
- 容器(container):运行镜像的地方,容器本质上是一个进程,需要消耗cpu、内存、磁盘、网络等资源
- 仓库(repository):分为公共镜像仓库和私人镜像仓库,用来保存镜像的
二、docker容器的使用
容器状态
1、up(运行状态)
2、create(新建状态)
3、exited(退出状态,就是容器没有启动,exited(1)是故障导致退出,exitrd(0)是正常退出)
容器相关命令
启动容器
docker run -d -p 宿主机端口:容器端口 --name "容器名称" "镜像"
参数说明
-d:后台允许
-p:宿主机和容器的端口之间的一个映射; 前面的是宿主机的端口,必须唯一
后面的是容器的端口,可以一样
查看所有容器
不接-a参数就查看正在运行的容器,接-a查看包括不在运行的容器
docker ps -a
启动、停止、重启或删除容器
启动容器:docker start
关闭容器:docker stop
重启容器:docker restart
删除容器:docker rm
查看容器进程
docker top "容器名"
查看容器的配置和相关信息
docker inspect
实时查看容器的资源使用统计信息
docker stats
进入容器
这里我们以MySQL为例子,加入我们创建了一个mysql的容器,我们想进入这个容器,就可以进行以下操作
docker exec -it mysql容器名称 bash
容器的网络类型
在 Docker 中,你可以使用以下命令创建一个用户自定义网络类型:
sudo docker network create -d bridge --subnet=192.168.100.0/24 my-bridge
上述命令中:
- docker network create:用于创建 Docker 网络的命令。
- -d bridge:指定网络驱动类型为bridge,这是一种常见的网络类型,类似于 Docker 默认的桥接网络。
- –subnet=192.168.100.0/24:定义网络的子网范围,这里表示子网地址为192.168.100.0,子网掩码为255.255.255.0。
- my-bridge:为创建的网络指定一个名称,你可以根据需要自定义这个名称。
创建好网络后,你可以使用以下命令将容器连接到该网络:
sudo docker run -d --name my-service --network=my-bridge nginx
这样,名为my-service的容器就会连接到my-bridge网络中,并使用该网络的配置进行通信。
1、bridge模式(默认模式)
2、host模式:使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好
3、none模式:使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性
4、container模式:这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
5、overlay:overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密(实现跨主机的docker容器之间的通信)
三、镜像使用
列出镜像列表
docker images
各选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
拉取或推送镜像
拉取镜像:docker pull
推送镜像:docker push
将源码包制作成镜像
docker load -i
将镜像的源码包保存到linux系统
docker save -o
设置镜像标签
docker tag
删除镜像
docker rmi
四、docker底层技术
每个容器里都有一个微型的操作系统,但是操作系统里的内核是使用宿主机的内核
namespace(命名空间)
Namespace 是 Linux 内核提供的一种资源隔离机制。它使得在同一操作系统内核上运行的不同进程,能够拥有各自独立的资源视图,仿佛运行在不同的操作系统环境中。
1、Network Namespace(网络相关):隔离网络资源,包括网络设备、IP 地址、路由表、端口等。
2、PID Namespace(进程相关):提供独立的进程 ID(PID)空间,使得在不同的 PID Namespace 中,进程的 PID 编号可以重复。
3、IPC Namespace(进程间的通信):隔离进程间通信(Inter-Process Communication,IPC)资源,如信号量、消息队列和共享内存等。
4、Mount Namespace(文件系统相关):隔离文件系统的挂载点,使得不同的 Mount Namespace 可以有不同的文件系统挂载视图。
5、UTS Namespace(时间相关):用于隔离系统的主机名和域名。
6、User Namespace:隔离用户和用户组 ID 空间,使得容器内的进程可以有不同于宿主机的用户和用户组 ID 映射。
cgroup
Cgroup(Control Groups,控制组)是 Linux 内核提供的一种可以限制、记录和隔离进程组所使用的物理资源(如 CPU、内存、磁盘 I/O、网络带宽等)的机制。
Cgroup目前有两个版本,V1和V2。两个版本在功能、性能、使用方式、设计、内核兼容性等方面都存在一定的差异,以下是它们的对比:
- 功能:cgroup V1的功能相对零散,cgroup V2改进了cgroup的层次结构,引入了统一的配置文件系统,简化了配置流程,提高了可用性和可维护性。
- 性能:cgroup V2在性能方面有一定的提升,特别是在进程组的创建和销毁、资源分配和回收等方面。
- 使用方式:cgroup V1和cgroup V2的使用方式有一些差异。cgroup V1使用文件系统接口来操作cgroup,而cgroup V2使用了新的API和工具。
- 设计:cgroup V2在设计上进行了一些改进,使其更加灵活和可扩展。例如,cgroup V2支持层次化的cgroup结构,可以更好地管理大型系统中的资源。
- 内核兼容性:cgroup V2需要较新的Linux内核版本支持,而cgroup V1则在较旧的内核版本中也可以使用。