一、Docker

1.1 Docker简介


1.1.1 Docker 是什么


首先 Docker是一个在 2013 年开源的应用程序并且是一个基于go 语言编写是一个开源的 PAAS 服务(Platform as a Service,平台即服务),go 语言是由 google 开发,docker 公司最早叫dotCloud 后由于 Docker 开源后大受欢迎就将公司改名为Docker Inc,总部位于美国加州的旧金山,Docker 是基于linux 内核实现,Docker 最早采用 LXC 技术(LinuX Container的简写,LXC 是 Linux 原生支持的容器技术,可以提供轻量级的虚拟化,可以说 docker 就是基于 LXC 发展起来的, 而虚拟化技术KVM(Kernel-based Virtual Machine) 基于模块实现,Docker 后改为自己研发并开源的 runc 技术运行容器。

Docker now relies on containerd and runc to spawn containers

Docker 现在依赖于 containerd 和 runc 来生成容器

Docker 相比虚拟机的交付速度更快,资源消耗更低,Docker 采用客户端/服务端架构,使用远程 API 来管理和创建Docker 容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker 的三大理念是 build(构建)、ship(运输)、run(运行),Docker 遵从 apache 2.0 协议,并通过(namespace 及 cgroup 等)来提供容器的资源隔离与安全保障等,所以 Docke 容器在运行时不需要类似虚拟机(空运行的虚拟机占用物理机的一定性能开销)的额外资源开销,因此可以大幅提高资源利用率, 总而言之 Docker 是一种用了新颖方式实现的轻量级虚拟机。类似于 VM 但是在原理和应用上和 VM 的差别还是很大的,并且 docker 的专业叫法是应用容器(Application Container)。

1.1.2 Docker 的组成


https://docs.docker.com/get-started/overview/

Docker 主机(Host):一个物理机或虚拟机,用于运行 Docker服务进程和容器。

Docker 服务端(Server):Docker 守护进程,运行 docker 容器。

Docker 客户端(Client):客户端使用 docker 命令或其他工具调用 docker API。

Docker 仓库(Registry): 保存镜像的仓库,类似于 git 或 svn 这样的版本控制系统。

Docker 镜像(Images):镜像可以理解为创建实例使用的模板。

Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务。

官方仓库: https://hub.docker.com/




docker mac 编写c 语言 docker使用什么语言编写_Powered by 金山文档


Docker 架构:


docker mac 编写c 语言 docker使用什么语言编写_docker_02


1.1.3 Docker 对比虚拟机


资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机。

开销更小:不需要启动单独的虚拟机占用硬件资源。

启动速度更快:可以在数秒内完成启动。


docker mac 编写c 语言 docker使用什么语言编写_Docker_03


使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操作系统的虚拟机,但是通常一个虚拟机只运行一个服务,很明显资源利用率比较低且造成不必要的性能损耗,我们创建虚拟机的目的是为了运行应用程序,比如 Nginx、PHP、Tomcat 等 web 程序,使用虚拟机无疑带来了一些不必要的资源开销,但是容器技术则基于减少中间运行环节,带来较大的性能提升。


docker mac 编写c 语言 docker使用什么语言编写_Docker_04


但是,如上图一个宿主机运行了 N 个容器,多个容器带来的以下问题怎么解决:

1. 怎么样保证每个容器都有不同的文件系统并且能互不影响?

2. 一个 docker 主进程内的各个容器都是其子进程,那么实现同一个主进程下不同类型的子进程?

3. 各个进程间通信能相互访问(内存数据)吗?

4. 每个容器怎么解决 IP 及端口分配的问题?

5. 多个容器的主机名能一样吗?

6. 每个容器都要不要有 root 用户?怎么解决账户重名问题?

以上问题怎么解决?

1.1.4 Linux Namespace 技术


namespace 是 Linux 系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个 docker 容器运行在同一个 docker 主进程并且共用同一个宿主机系统内核,各docker 容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,可以保护宿主机内核

不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:


隔离类型

功能

系统调用的参数

内核版本

MNT Namespace(mount)

提供磁盘挂载点和文件系统的隔离能力

CLONE_NEWNS

Linux2.4.19

IPC Namespace(Inter-process Communication)

提供进程间通信的隔离能力

CLONE_NEWIPC

Linux2.6.19

UTS Namespace(UNIX Timesharing System)

提供主机名隔离能力

CLONE_NEWUTS

Linux2.6.19

PID Namespace(Process Identification)

提供进程隔离能力

CLONE_NEWPID

Linux2.6.24

Net Namespace(network)

提供网络隔离能力

CLONE_NEWNET

Linux2.6.29

User Namespace(user)

提供用户隔离能力

CLONE_NEWUSER

Linux3.8


[root@localhost ~]# ll /proc/$$/ns    #$$表示当前shell进程的id
总用量 0
lrwxrwxrwx 1 root root 0 11月 25 10:20 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 11月 25 10:20 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 11月 25 10:20 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 11月 25 10:20 net -> 'net:[4026531992]'
lrwxrwxrwx 1 root root 0 11月 25 10:20 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 11月 25 10:20 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 11月 25 10:20 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 11月 25 10:20 uts -> 'uts:[4026531838]'

1.1.5 Linux control groups


在一个容器,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码 bug 程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如 CPU、内存等,Linux Cgroups 的全称是 Linux Control Groups,它最主要的作用就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。

1.1.5.1 验证系统 cgroups


Cgroups 在内核层默认已经开启, 版本比较新的内核,支持的功能更多,比如内存回收机制等

kylinos sp2 cgrouops

[root@localhost ~]# uname -r
4.19.90-24.4.v2101.ky10.x86_64

[root@localhost ~]# cat /boot/config-4.19.90-24.4.v2101.ky10.x86_64 | grep CGROUP
CONFIG_CGROUPS=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SOCK_CGROUP_DATA=y
# CONFIG_CGROUP_FILES is not set
# CONFIG_BLK_CGROUP_IOLATENCY is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y

1.1.5.2 查看系统 cgroups


[root@localhost ~]# ll /sys/fs/cgroup/
总用量 0
dr-xr-xr-x 2 root root  0 10月 26 00:46 blkio
lrwxrwxrwx 1 root root 11 10月 26 00:46 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 10月 26 00:46 cpuacct -> cpu,cpuacct
dr-xr-xr-x 2 root root  0 10月 26 00:46 cpu,cpuacct
dr-xr-xr-x 2 root root  0 10月 26 00:46 cpuset
dr-xr-xr-x 5 root root  0 10月 26 00:46 devices
dr-xr-xr-x 2 root root  0 10月 26 00:46 freezer
dr-xr-xr-x 2 root root  0 10月 26 00:46 hugetlb
dr-xr-xr-x 5 root root  0 10月 26 00:46 memory
lrwxrwxrwx 1 root root 16 10月 26 00:46 net_cls -> net_cls,net_prio
dr-xr-xr-x 2 root root  0 10月 26 00:46 net_cls,net_prio
lrwxrwxrwx 1 root root 16 10月 26 00:46 net_prio -> net_cls,net_prio
dr-xr-xr-x 2 root root  0 10月 26 00:46 perf_event
dr-xr-xr-x 5 root root  0 10月 26 00:46 pids
dr-xr-xr-x 2 root root  0 10月 26 00:46 rdma
dr-xr-xr-x 5 root root  0 10月 26 00:46 systemd

有了以上的 chroot、namespace、cgroups 就具备了基础的容器运行环境,但是还需要有相应的容器创建与删除的管理工具、以及怎么样把容器运行起来、容器数据怎么处理、怎么进行启动与关闭等问题需要解决,于是容器管理技术出现了。

1.1.6 容器管理工具


目前主要是使用 docker,早期有使用 lxc。

1.1.6.1 docker


Docker 启动一个容器也需要一个外部模板但是较多为镜像,docke 的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。

Docker 的镜像是分层的,镜像底层为库文件且只读层即不能写入也不能删除数据,从镜像加载启动为一个容器后会生成一个可写层,其写入的数据会复制到容器目录,但是容器内的数据在删除容器后也会被随之删除。


docker mac 编写c 语言 docker使用什么语言编写_Docker_05


1.1.7 Docker 的优势


快速部署:短时间内可以部署成百上千个应用,更快速交付到线上。

高效虚拟化:不需要额外的 hypervisor 支持,直接基于 linux实现应用虚拟化,相比虚拟机大幅提高性能和效率。

节省开支:提高服务器利用率,降低 IT 支出。

简化配置:将运行环境打包保存至容器,使用时直接启动即可。

快速迁移和扩展:可跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从 A 宿主机迁移到 B宿主机,甚至是 A 平台迁移到 B 平台。

1.1.8 Docker 的缺点


隔离性:各应用之间的隔离不如虚拟机彻底。

1.1.9 docker(容器)的核心技术

1.1.9.1 容器规范


容器技术除了的 docker 之外,还有 coreOS 的 rkt,还有阿里自研的 Pouch,为了保证容器生态的标准性和健康可持续发展,包括 Linux 基金会、Docker、微软、 红帽、谷歌和 IBM等公司在 2015 年 6 月共同成立了一个叫 open container(OCI)的组织,其目的就是制定开放标准的容器规范,目前 OCI 一共发布了两个规范,分别是 runtime spec 和 image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。

1.1.9.1.1 容器 runtime (runtime spec)

runtime 是真正运行容器的地方,因此为了运行不同的容器,runtime 需要和操作系统内核紧密合作相互支持,以便为容器提供相应的运行环境。

目前主流的三种 runtime:

1. Lxc:linux 上早期的 runtime,Docker 早期就是采用 lxc 作为 runtime。

2. runc:目前 Docker 默认的 runtime,runc 遵守 OCI 规范,因此可以兼容 lxc。

3. rkt:是 CoreOS 开发的容器 runtime,也符合 OCI 规范,所以使用 rkt runtime 也可以运行 Docker 容器

runtime 主要定义了以下规范 ,并以 json 格式保存在/run/docker/runtime-runc/moby/容器ID/state.json 文件,此文件会根据容器的状态实时更新内容:

版本信息:存放 OCI 标准的具体版本号。

容器 ID:通常是一个哈希值,可以在所有 state.json文件中提取出容器 ID 对容器进行批量操作(关闭、删除等),此文件在容器关闭后会被删除,容器启动后会自动生成。

PID:在容器中运行的首个进程在宿主机上的进程号,即将宿主机的那个进程设置为容器的守护进程。

容器文件目录:存放容器 rootfs 及相应配置的目录,外部程序只需读取 state.json 就可以定位到宿主机上的容器文件目录。

容器创建:创建包括文件系统、namespaces、cgroups、用户权限在内的各项内容。

容器进程的启动:运行容器启动进程,该文件在/run/containerd/io.containerd.runtime.v1.linux/moby/容器 ID/config.json。

容器生命周期:容器进程可以被外部程序关停,runtime规范定义了对容器操作信号的捕获,并做相应资源回收的处理,避免僵尸进程的出现。

1.1.9.1.2 容器镜像(image format spec)

OCI 容器镜像主要包含以下内容:

文件系统:定义以 layer 保存的文件系统,在镜像里面是layer.tar, 每个 layer 保存了和上层之间变化的部分,image format spec 定义了 layer 应该保存哪些文件, 怎么表示增加、修改和删除的文件等操作。

manifest 文件:描述有哪些 layer,tag 标签及config 文件名称。

config文件:是一个以 hash 命名的 json 文件,保存了镜像平台,容器运行时需要的一些信息,比如环境变量、工作目录、命令参数等。

index 文件:可选的文件,指向不同平台的 manifest 文件,这个文件能保证一个镜像可以跨平台使用,每个平台拥有不同的 manifest 文件使用 index 作为索引

父镜像:大多数层的元信息结构都包含一个 parent 字段,指向该镜像的父镜像

参数:

ID:镜像 ID,每一层都有 ID

tag 标签:标签用于将用户指定的、具有描述性的名称对应到镜像ID

仓库:Repository 镜像仓库

os:定义类型

architecture :定义 CPU 架构

author:作者信息

create:镜像创建日期

1.1.9.2 容器管理工具


管理工具连接 runtime 与用户,对用户提供图形或命令方式操作,然后管理工具将用户操作传递给 runtime 执行。

1. lxd 是 lxc 的管理工具。

2. Runc 的管理工具是 docker engine,docker engine 包含后台deamon 和 cli 两部分,大家经常提到的 Docker 就是指的docker engine。

3. Rkt 的管理工具是 rkt cli

1.1.9.3 容器定义工具


容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建。

Docker image:是 docker 容器的模板,runtime 依据 docker image 创建容器。

Dockerfile:包含 N 个命令的文本文件,通过 dockerfile 创建出 docker image。

ACI (App container image):与 docker image 类似,是 CoreOS开发的 rkt 容器的镜像格式。

1.1.9.4 Registry


统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库。

  • Image registry:docker 官方提供的私有仓库部署工具。
  • Docker hub:docker 官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用。
  • Harbor:vmware 提供的自带 web 界面自带认证功能的镜像仓库,目前有很多公司使用。

1.1.9.5 编排工具


当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容易出错,而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎。

容器编排通常包括容器管理、调度、集群定义和服务发现等功能。

  • Docker swarm :docker 开发的容器编排引擎。
  • Kubernetes :google 领导开发的容器编排引擎,内部项目为 Borg,且其同时支持 docker 和 CoreOS。
  • Mesos+Marathon :通用的集群组员调度平台,mesos(资源分配)与 marathon(容器编排平台)一起提供容器编排引擎功能。

1.1.10 docker(容器)的依赖技术


容器网络

docker 自带的网络 docker network 仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico、flannel 等。

服务发现

容器的动态扩容特性决定了容器 IP 也会随之变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernetes 自带服务发现功能,需要结合 kube-dns 服务解析内部域名。 console

容器监控

可以通过原生命令 docker ps/top/stats 查看容器运行状态,另外也可以使 heapster/ Prometheus 等第三方监控工具监控容器的运行状态

数据管理

容器的动态迁移会导致其在不同的 Host 之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/存储挂载等方式解决。

日志收集

docker 原生的日志查看工具 docker logs,但是容器内部的日志需要通过 ELK 等专门的日志收集分析和展示工具进行处理。

1.2 Docker 安装及基础命令介绍


官方网址:https://www.docker.com/

系统版本选择

Docker 目前已经支持多种操作系统的安装运行,比如kylinos、Ubuntu、CentOS、 Redhat、Debian、Fedora,甚至是还支持了 Mac 和 Windows,在 linux 系统上需要内核版本在 3.10 或以上,docker 版本号之前一直是 0.X 版本或 1.X 版本,但是从 2017 年 3 月 1 号开始改为每个季度发布一次稳定版,其版本号规则也统一变更为 YY.MM,例如 17.09 表示是 2017 年 9月份发布的。

Docker 版本选择

Docker 之前没有区分版本,但是 2017 年初推出(将 docker 更名为)新的项目 Moby,github 地址:https://github.com/moby/moby,Moby 项目属于 Docker 项目的全新上游,Docker 将是一个隶属于的 Moby 的子产品,而且之后的版本之后开始区分为 CE 版本(社区版本)和 EE(企业收费版),CE 社区版本和 EE 企业版本都是每个季度发布一个新版本,但是 EE版本提供后期安全维护 1 年,而 CE 版本是 4 个月。

1.2.1 下载 rpm 包安装


官方 rpm 包下载地址

https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

二进制下载地址

https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/

阿里镜像下载地址

https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

1.2.2 通过修改 yum 源安装


在麒麟操作系统可以直接进行docker的安装

[root@localhost ~]# yum -y install docker-engine.x86_64

[root@localhost ~]# yum info docker-engine.x86_64 
上次元数据过期检查:0:22:29 前,执行于 2022年11月25日 星期五 14时11分50秒。
已安装的软件包
Name         : docker-engine
Version      : 18.09.0
发布         : 202.p02.ky10
Architecture : x86_64
Size         : 216 M
源           : docker-engine-18.09.0-202.p02.ky10.src.rpm
Repository   : @System
来自仓库     : ks10-adv-updates
Summary      : The open-source application container engine
URL          : https://mobyproject.org
协议         : ASL 2.0
Description  : Docker is an open source project to build, ship and run any application as a
             : lightweight container.
             : 
             : Docker containers are both hardware-agnostic and platform-agnostic. This means
             : they can run anywhere, from your laptop to the largest EC2 compute instance and
             : everything in between - and they don't require you to use a particular
             : language, framework or packaging system. That makes them great building blocks
             : for deploying and scaling web apps, databases, and backend services without
             : depending on a particular stack or provider.

安装特定版本的docker-ce

如果需要安装docker-ce-19.03.15版本可以使用离线包进行安装,k8s最高支持的版本是docker-ce-19.03.15

链接:https://pan.baidu.com/s/1zRm-nbf1XNJu18yW8s-Ewg

提取码:1111

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
kylin_x86_64.repo
[root@localhost yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@localhost yum.repos.d]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@localhost yum.repos.d]# ls
CentOS-Base.repo  docker-ce.repo  kylin_x86_64.repo


$releasever的值,当前系统的发行版本
$basearch的值,系统硬件架构(CPU指令集)
更改Centos.repo源,$releasever识别不到当前系统的版本,进行以下修改
将Centos-base.rep的$releasever替换为7

使用sed进行全局替换:
[root@localhost yum.repos.d]# sed -i "s/$releasever/7/g" /etc/yum.repos.d/Centos-Base.repo

使用vim编辑可以进行全局替换
:%s/$releasever/7/g  

查看可安装的版本:
[root@localhost yum.repos.d]# yum list docker-ce --showduplicates | sort -r
Last metadata expiration check: 0:00:35 ago on 2023年01月04日 星期三 16时22分55秒.
docker-ce.x86_64            3:20.10.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.22-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.21-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.20-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.19-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.18-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.17-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.16-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.15-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.14-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.13-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.12-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.11-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.10-3.el7                    docker-ce-stable
docker-ce.x86_64            3:20.10.0-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.15-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.14-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.13-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.12-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.11-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.10-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.0-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.2.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.3.ce-1.el7                    docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable
Available Packages


安装docker-ce-19.03.15版本
[root@localhost yum.repos.d]# yum -y install docker-ce-19.03.15
...
Installed:
  docker-ce-3:19.03.15-3.el7.x86_64                    container-selinux-2:2.119.2-1.911c772.el7_8.noarch     containerd.io-1.6.14-3.1.el7.x86_64     docker-ce-cli-1:20.10.22-3.el7.x86_64        docker-scan-plugin-0.23.0-3.el7.x86_64       
  python2-IPy-0.81-26.ky10.noarch                      python2-audit-3.0-5.se.06.ky10.x86_64                  python2-enum34-1.1.6-8.ky10.noarch      python2-libselinux-2.9-se.05.ky10.x86_64     python2-libsemanage-2.9-se.01.ky10.x86_64    
  python2-policycoreutils-2.8-14.2.p01.ky10.noarch     python2-setools-4.1.1-17.ky10.x86_64                  

Complete!

[root@localhost ~]# yum info docker-ce
CentOS-7 - Base - mirrors.aliyun.com                                                                                                                                                                               17 kB/s | 3.6 kB     00:00    
CentOS-7 - Updates - mirrors.aliyun.com                                                                                                                                                                            24 kB/s | 2.9 kB     00:00    
CentOS-7 - Extras - mirrors.aliyun.com                                                                                                                                                                             30 kB/s | 2.9 kB     00:00    
Installed Packages
Name         : docker-ce
Epoch        : 3
Version      : 19.03.15
Release      : 3.el7
Architecture : x86_64
Size         : 105 M
Source       : docker-ce-19.03.15-3.el7.src.rpm
Repository   : @System
From repo    : docker-ce-stable
Summary      : The open-source application container engine
URL          : https://www.docker.com
License      : ASL 2.0
Description  : Docker is a product for you to build, ship and run any application as a
             : lightweight container.
             : 
             : Docker containers are both hardware-agnostic and platform-agnostic. This means
             : they can run anywhere, from your laptop to the largest cloud compute instance and
             : everything in between - and they don't require you to use a particular
             : language, framework or packaging system. That makes them great building blocks
             : for deploying and scaling web apps, databases, and backend services without
             : depending on a particular stack or provider.

Available Packages
Name         : docker-ce
Epoch        : 3
Version      : 20.10.22
Release      : 3.el7
Architecture : x86_64
Size         : 22 M
Source       : docker-ce-20.10.22-3.el7.src.rpm
Repository   : docker-ce-stable
Summary      : The open-source application container engine
URL          : https://www.docker.com
License      : ASL 2.0
Description  : Docker is a product for you to build, ship and run any application as a
             : lightweight container.
             : 
             : Docker containers are both hardware-agnostic and platform-agnostic. This means
             : they can run anywhere, from your laptop to the largest cloud compute instance
             : and everything in between - and they don't require you to use a particular
             : language, framework or packaging system. That makes them great building blocks
             : for deploying and scaling web apps, databases, and backend services without
             : depending on a particular stack or provider.

[root@localhost ~]# systemctl start docker.service 
[root@localhost ~]# systemctl status docker.service 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-01-04 17:27:03 CST; 2s ago
     Docs: https://docs.docker.com
 Main PID: 18073 (dockerd)
    Tasks: 8


[root@localhost ~]# docker version 
Client: Docker Engine - Community
 Version:           20.10.22
 API version:       1.40
 Go version:        go1.18.9
 Git commit:        3a2c30b
 Built:             Thu Dec 15 22:30:24 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          19.03.15
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       99e3ed8919
  Built:            Sat Jan 30 03:16:33 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.14
  GitCommit:        9ba4b250366a5ddde94bb7c9d1def331423aa323
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

1.2.3 验证 docker 版本


[root@localhost ~]# systemctl status docker

[root@localhost ~]# docker version
Client:
 Version:           18.09.0
 EulerVersion:      18.09.0.202
 API version:       1.39
 Go version:        go1.13.15
 Git commit:        ff5c04c
 Built:             Mon Oct 17 02:50:16 2022
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.0
  EulerVersion:     18.09.0.202
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       ff5c04c
  Built:            Mon Oct 17 02:47:31 2022
  OS/Arch:          linux/amd64
  Experimental:     false

1.2.4 验证 docker0 网卡


在 docker 安装启动之后,默认会生成一个名称为 docker0 的网卡并且默认 IP 地址为 172.17.0.1 的网卡

[root@localhost ~]# ip a s docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:69:8a:c4:16 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

1.2.5 验证 docker


[root@localhost ~]# docker info
Containers: 0     #当前主机运行的容器总数
 Running: 0    #有几个容器是正在运行的
 Paused: 0     #有几个容器是暂停的
 Stopped: 0     #有几个容器是停止的
Images: 0       #当前服务器的镜像数
Server Version: 18.09.0
Storage Driver: overlay2     #正在使用的存储引擎
 Backing Filesystem: xfs     #后端文件系统,即服务器的磁盘文件系统
 Supports d_type: true       #是否支持 d_type
 Native Overlay Diff: true     #是否支持差异数据存储
Logging Driver: json-file       #日志类型
Cgroup Driver: cgroupfs       #Cgroups类型
Hugetlb Pagesize: 2MB, 1GB (default is 2MB)
Plugins:      #插件
 Volume: local     #卷 
 Network: bridge host macvlan null overlay        #overlay跨主机通信
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog       #日志类型
Swarm: inactive      #是否已开启支持 swarm
Runtimes: runc       
Default Runtime: runc      #已安装的容器运行时
Init Binary: docker-init
containerd version: commit:dbdd3d7a6f03706423ad902c28ed14f0cec9d42d.m
runc version: fabf83fd21f205c801571df4074024179eb03b44
init version: N/A (expected: )
Security Options:      #安全选项
 seccomp
  Profile: default       #默认的配置文件
Kernel Version: 4.19.90-24.4.v2101.ky10.x86_64
Operating System: Kylin Linux Advanced Server V10 (Sword)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 2.821GiB
Name: localhost.localdomain
ID: RRQX:VWWX:JKKD:Z2EU:SWHT:5UU4:S6DF:ZSHD:T7HX:VTXR:OXXD:7VFO
Docker Root Dir: /var/lib/docker     #宿主机数据保存目录
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/      #镜像仓库
Labels:            #其他标签
Experimental: false       #是否测试版
Insecure Registries:       #非安全的镜像仓库
 127.0.0.0/8
Live Restore Enabled: true    #是否开启活动重启(重启 docker-daemon 不关闭容器)

1.2.6 docker 存储引擎


目前 docker 的默认存储引擎为 overlay2,不同的存储引擎需要相应的系统支持,如需要磁盘分区的时候传递 d-type 文件分层功能,即需要传递内核参数开启格式化磁盘的时候的指定功能。

官方文档关于存储引擎的选择文档: https://docs.docker.com/storage/storagedriver/select-storage-driver/

存储驱动类型:

AUFS(Another Union FS)是一种 Union FS,是文件级的存储驱动。所谓 UnionFS就是把不同物理位置的目录合并 mount 到同一个目录中。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS 创建该文件的一个副本,使用 CoW 将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker 中,底下的只读层就是 image,可写层就是Container,是 Docker 18.06 及更早版本的首选存储驱动程序,在内核 3.13 上运行 Ubuntu 14.04 时不支持overlay2。

Overlay:一种 Union FS 文件系统,Linux 内核3.18 后支持。

#overlay2: Overlay 的升级版,到目前为止,所有Linux 发行版推荐使用的存储类型。

devicemapper:是 CentOS 和 RHEL 的推荐存储驱动程序,因为之前的内核版本不支持 overlay2,但是当前较新版本的 CentOS 和 RHEL 现在已经支持overlay2,因此推荐使用 overlay2。

ZFS(Sun-2005)/btrfs(Oracle-2007):目前没有广泛使用。

vfs:用于测试环境,适用于无法使用 copy-on-write用于生产。文件系统的情况。 此存储驱动程序的性能很差,通常不建议

Docker 官方推荐首选存储引擎为 overlay2,devicemapper 存在使用空间方面的一些限制,虽然可以通过后期配置解决,但是官方依然推荐使用 overlay2

[root@localhost ~]# xfs_info  /
meta-data=/dev/mapper/klas-root  isize=512    agcount=4, agsize=2424064 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=9696256, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1         ###ftype 需要是1
log      =internal log           bsize=4096   blocks=4734, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

如果 docker 数据目录是一块单独的磁盘分区而且是 xfs 格式的,那么需要在格式化的时候加上参数 -n ftype=1 ,否则后期在启动容器的时候会报错不支持 d-type。

1.2.7 docker 服务进程


通过查看 docker 进程,了解 docker 的运行及工作方式

1.2.7.1 查看宿主机进程树


[root@localhost ~]# docker run -d --rm -p 80:80 -v /data:/www busybox:latest httpd -f -h /www    #httpd选项-f是在前台运行,-h指定家目录 
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
405fecb6a2fa: Pull complete 
Digest: sha256:fcd85228d7a25feb59f101ac3a955d27c80df4ad824d65f5757a954831450185
Status: Downloaded newer image for busybox:latest
a6ced2358ad3eee29a227f768d9a1a800d84b9c968b895519539434bf4c51fbd
[root@localhost ~]# pstree -p 1     #查进程为1的进程树
systemd(1)─┬─ModemManager(952)─┬─{ModemManager}(972)
           │                   └─{ModemManager}(984)
           ├─NetworkManager(10815)─┬─{NetworkManager}(10817)
           │                       ├─{NetworkManager}(10818)
           │                       └─{NetworkManager}(33782)
           ├─VGAuthService(9611)
           ├─accounts-daemon(1108)─┬─{accounts-daemon}(1116)
           │                       └─{accounts-daemon}(1118)
           ├─atd(1447)
           ├─auditd(33688)
           ├─chronyd(962)
           ├─crond(1448)
           ├─dbus-daemon(954)
           ├─dockerd(32926)─┬─containerd(32933)─┬─containerd-shim(33745)─┬─httpd(33762)
           │                │                   │                        ├─{containerd-shim}(33746)
           │                │                   │                        ├─{containerd-shim}(33747)
           │                │                   │                        ├─{containerd-shim}(33748)
           │                │                   │                        ├─{containerd-shim}(33749)
           │                │                   │                        ├─{containerd-shim}(33750)
           │                │                   │                        ├─{containerd-shim}(33752)
           │                │                   │                        ├─{containerd-shim}(33753)
           │                │                   │                        ├─{containerd-shim}(33784)
           │                │                   │                        └─{containerd-shim}(33786)
           │                │                   ├─{containerd}(32935)
           │                │                   ├─{containerd}(32936)
           │                │                   ├─{containerd}(32937)
           │                │                   ├─{containerd}(32938)
           │                │                   ├─{containerd}(32939)
           │                │                   ├─{containerd}(32940)
           │                │                   ├─{containerd}(32942)
           │                │                   ├─{containerd}(32943)
           │                │                   ├─{containerd}(32944)
           │                │                   └─{containerd}(32945)
           │                ├─docker-proxy(33738)─┬─{docker-proxy}(33739)
           │                │                     ├─{docker-proxy}(33740)
           │                │                     ├─{docker-proxy}(33741)
           │                │                     ├─{docker-proxy}(33742)
           │                │                     ├─{docker-proxy}(33743)
           │                │                     └─{docker-proxy}(33744)
           │                ├─{dockerd}(32927)
           │                ├─{dockerd}(32928)
           │                ├─{dockerd}(32929)
           │                ├─{dockerd}(32930)
           │                ├─{dockerd}(32931)
           │                ├─{dockerd}(32932)
           │                ├─{dockerd}(32934)
           │                ├─{dockerd}(32946)
           │                ├─{dockerd}(32947)
           │                ├─{dockerd}(32948)
           │                ├─{dockerd}(32956)
           │                └─{dockerd}(33776)
           ├─firewalld(1057)───{firewalld}(1374)
           ├─gnome-keyring-d(8334)─┬─{gnome-keyring-d}(8335)
           │                       ├─{gnome-keyring-d}(8336)
           │                       └─{gnome-keyring-d}(8337)
           ├─gssproxy(1414)─┬─{gssproxy}(1421)
           │                ├─{gssproxy}(1422)
           │                ├─{gssproxy}(1423)
           │                ├─{gssproxy}(1424)
           │                └─{gssproxy}(1425)
           ├─irqbalance(970)───{irqbalance}(983)
           ├─kylin-security-(1420)───{kylin-security-}(1449)
           ├─lightdm(8031)─┬─Xorg(8037)───{Xorg}(8042)
           │               ├─lightdm(8066)─┬─mate-session(8103)─┬─agent(8366)─┬─{agent}(8374)
           │               │               │                    │             └─{agent}(8378)
           │               │               │                    ├─caja(8347)─┬─{caja}(8473)
           │               │               │                    │            ├─{caja}(8474)
           │               │               │                    │            └─{caja}(8479)
           │               │               │                    ├─marco(8346)─┬─{marco}(8353)
           │               │               │                    │             ├─{marco}(8354)
           │               │               │                    │             ├─{marco}(8357)
           │               │               │                    │             └─{marco}(9005)
           │               │               │                    ├─mate-panel(8471)─┬─{mate-panel}(8487)
           │               │               │                    │                  ├─{mate-panel}(8488)
           │               │               │                    │                  └─{mate-panel}(8491)
           │               │               │                    ├─mate-power-mana(8356)─┬─{mate-power-mana}(8756)
           │               │               │                    │                       ├─{mate-power-mana}(8759)
           │               │               │                    │                       └─{mate-power-mana}(8764)
           │               │               │                    ├─mate-settings-d(8338)─┬─{mate-settings-d}(8343)
           │               │               │                    │                       ├─{mate-settings-d}(8344)
           │               │               │                    │                       ├─{mate-settings-d}(8345)
           │               │               │                    │                       ├─{mate-settings-d}(8367)
           │               │               │                    │                       └─{mate-settings-d}(8395)
           │               │               │                    ├─mate-volume-con(8348)─┬─{mate-volume-con}(8498)
           │               │               │                    │                       ├─{mate-volume-con}(8499)
           │               │               │                    │                       └─{mate-volume-con}(8505)
           │               │               │                    ├─nm-applet(8355)─┬─{nm-applet}(8817)
           │               │               │                    │                 ├─{nm-applet}(8818)
           │               │               │                    │                 └─{nm-applet}(8834)
           │               │               │                    ├─polkit-mate-aut(8352)─┬─{polkit-mate-aut}(8763)
           │               │               │                    │                       └─{polkit-mate-aut}(8765)
           │               │               │                    ├─reset_applet_po(8350)─┬─{reset_applet_po}(8776)
           │               │               │                    │                       └─{reset_applet_po}(8777)
           │               │               │                    ├─ssh-agent(8279)
           │               │               │                    ├─ukui-screensave(8362)─┬─ukui-screensave(11089)─┬─{ukui-screensave}(11090)
           │               │               │                    │                       │                        ├─{ukui-screensave}(11091)
           │               │               │                    │                       │                        ├─{ukui-screensave}(11092)
           │               │               │                    │                       │                        ├─{ukui-screensave}(11093)
           │               │               │                    │                       │                        ├─{ukui-screensave}(11094)
           │               │               │                    │                       │                        └─{ukui-screensave}(11095)
           │               │               │                    │                       └─{ukui-screensave}(8372)
           │               │               │                    ├─{mate-session}(8326)
           │               │               │                    ├─{mate-session}(8327)
           │               │               │                    └─{mate-session}(8328)
           │               │               ├─{lightdm}(8086)
           │               │               └─{lightdm}(8087)
           │               ├─{lightdm}(8032)
           │               └─{lightdm}(8034)
           ├─lsmd(963)
           ├─mcelog(968)
           ├─mdadm(908)
           ├─polkitd(969)─┬─{polkitd}(1044)
           │              ├─{polkitd}(1045)
           │              ├─{polkitd}(1046)
           │              ├─{polkitd}(1047)
           │              └─{polkitd}(1055)
           ├─pulseaudio(8389)─┬─gconf-helper(8440)
           │                  ├─gsettings-helpe(8410)─┬─{gsettings-helpe}(8435)
           │                  │                       ├─{gsettings-helpe}(8436)
           │                  │                       └─{gsettings-helpe}(8441)
           │                  ├─{pulseaudio}(8396)
           │                  └─{pulseaudio}(8397)
           ├─rasdaemon(974)
           ├─rngd(977)───{rngd}(1019)
           ├─rpcbind(906)
           ├─rsyslogd(1430)─┬─{rsyslogd}(1436)
           │                └─{rsyslogd}(1437)
           ├─rtkit-daemon(987)─┬─{rtkit-daemon}(992)
           │                   └─{rtkit-daemon}(993)
           ├─smartd(988)
           ├─sshd(3725)───sshd(11003)───sshd(11005)───bash(11006)───pstree(33806)
           ├─sssd(1002)─┬─sssd_be(1054)
           │            ├─sssd_nss(1058)
           │            └─sssd_pam(1059)
           ├─systemd(8095)─┬─(sd-pam)(8096)
           │               ├─at-spi-bus-laun(8320)─┬─dbus-daemon(8325)
           │               │                       ├─{at-spi-bus-laun}(8321)
           │               │                       ├─{at-spi-bus-laun}(8322)
           │               │                       └─{at-spi-bus-laun}(8324)
           │               ├─at-spi2-registr(8340)─┬─{at-spi2-registr}(8341)
           │               │                       └─{at-spi2-registr}(8342)
           │               ├─bamfdaemon(8982)─┬─{bamfdaemon}(8983)
           │               │                  └─{bamfdaemon}(8985)
           │               ├─dbus-daemon(8116)
           │               ├─dbus-daemon(8789)
           │               ├─dconf-service(8330)─┬─{dconf-service}(8331)
           │               │                     └─{dconf-service}(8332)
           │               ├─fcitx-dbus-watc(8796)
           │               ├─gconfd-2(8450)
           │               ├─goa-daemon(8814)─┬─{goa-daemon}(8831)
           │               │                  ├─{goa-daemon}(8836)
           │               │                  └─{goa-daemon}(8837)
           │               ├─goa-identity-se(8839)─┬─{goa-identity-se}(8847)
           │               │                       ├─{goa-identity-se}(8848)
           │               │                       └─{goa-identity-se}(8849)
           │               ├─gvfs-goa-volume(8806)─┬─{gvfs-goa-volume}(8809)
           │               │                       └─{gvfs-goa-volume}(8811)
           │               ├─gvfs-udisks2-vo(8788)─┬─{gvfs-udisks2-vo}(8792)
           │               │                       └─{gvfs-udisks2-vo}(8794)
           │               ├─gvfsd(8128)─┬─gvfsd-trash(8841)─┬─{gvfsd-trash}(8843)
           │               │             │                   └─{gvfsd-trash}(8844)
           │               │             ├─{gvfsd}(8129)
           │               │             └─{gvfsd}(8130)
           │               ├─gvfsd-fuse(8133)─┬─{gvfsd-fuse}(8150)
           │               │                  ├─{gvfsd-fuse}(8151)
           │               │                  ├─{gvfsd-fuse}(8153)
           │               │                  ├─{gvfsd-fuse}(8155)
           │               │                  └─{gvfsd-fuse}(8162)
           │               ├─imsettings-daem(8125)─┬─fcitx(8783)
           │               │                       ├─{imsettings-daem}(8126)
           │               │                       ├─{imsettings-daem}(8127)
           │               │                       └─{imsettings-daem}(8204)
           │               ├─mate-indicators(8863)─┬─pxgsettings(8880)─┬─{pxgsettings}(8881)
           │               │                       │                   ├─{pxgsettings}(8882)
           │               │                       │                   └─{pxgsettings}(8883)
           │               │                       ├─{mate-indicators}(8871)
           │               │                       ├─{mate-indicators}(8873)
           │               │                       ├─{mate-indicators}(8875)
           │               │                       ├─{mate-indicators}(8876)
           │               │                       ├─{mate-indicators}(8877)
           │               │                       ├─{mate-indicators}(8878)
           │               │                       ├─{mate-indicators}(8879)
           │               │                       └─{mate-indicators}(8889)
           │               ├─python2(8855)─┬─{python2}(8859)
           │               │               ├─{python2}(8867)
           │               │               ├─{python2}(8868)
           │               │               ├─{python2}(8869)
           │               │               └─{python2}(8900)
           │               └─wnck-applet(8861)─┬─{wnck-applet}(8864)
           │                                   ├─{wnck-applet}(8866)
           │                                   └─{wnck-applet}(8870)
           ├─systemd-journal(759)
           ├─systemd-logind(1137)
           ├─systemd-network(1172)
           ├─systemd-udevd(789)
           ├─tuned(1433)─┬─{tuned}(1968)
           │             ├─{tuned}(1978)
           │             └─{tuned}(2005)
           ├─udisksd(1008)─┬─{udisksd}(1020)
           │               ├─{udisksd}(1032)
           │               ├─{udisksd}(1063)
           │               └─{udisksd}(1119)
           ├─upowerd(8770)─┬─{upowerd}(8793)
           │               └─{upowerd}(8797)
           ├─vmtoolsd(9586)───{vmtoolsd}(9677)
           └─vmware-vmblock-(9563)─┬─{vmware-vmblock-}(9564)
                                   └─{vmware-vmblock-}(9565)

1.2.7.2 查看 containerd 进程关系


有四个进程:

dockerd:被 client 直接访问,其父进程为宿主机的 systemd守护进程。

docker-proxy:实现容器通信,其父进程为 dockerd (只有需要网络通信的运行中容器存在时,才有此进程)

containerd:被 dockerd 进程调用以实现与 runc 交互。

containerd-shim:真正运行容器的载体,其父进程为containerd。

[root@localhost ~]# ps -ef | grep containerd
root       32933   32926  0 14:08 ?        00:00:19 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
root       33745   32933  0 15:06 ?        00:00:00 containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/a6ced2358ad3eee29a227f768d9a1a800d84b9c968b895519539434bf4c51fbd -address /var/run/docker/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root       34104   11006  0 15:35 pts/0    00:00:00 grep containerd
[root@localhost ~]# ps -ef | grep docker-proxy
root       33738   32926  0 15:06 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
root       34106   11006  0 15:35 pts/0    00:00:00 grep docker-proxy

1.2.7.3 容器的创建与管理过程


通信流程: erd -H fd:// --containerd=/run/containerd/containerd.sock

3. 若是创建容器,containerd 拉起一个 containershim 容器进程 , 并进行相应的创建操作。

4. containerd-shim 被拉起后,start/exec/create拉起 runC 进程,通过 exit、control文件和containerd 通信,通过父子进程关系和 SIGCHLD(信号)监控容器中进程状态。

5. 在整个容器生命周期中,containerd 通过 epoll 监控容器文件,监控容器事件。


docker mac 编写c 语言 docker使用什么语言编写_docker_06


1.2.7.4 grpc 简介

gRPC 是 Google 开发的一款高性能、开源和通用的 RPC 框架,支持众多语言客户端。

官网:https://www.grpc.io/


docker mac 编写c 语言 docker使用什么语言编写_Powered by 金山文档_07


1.3 docker 镜像加速


国内下载国外的镜像有时候会很慢,因此可以更改 docker 配置文件添加一个加速器,可以通过加速器达到加速下载镜像的目的。

1.3.1 获取加速地址


浏览器打开 http://cr.console.aliyun.com,注册或登录阿里云账号,点击左侧的镜像加速器,将会得到一个专属的加速地址,而且下面有使用配置说明:


docker mac 编写c 语言 docker使用什么语言编写_docker mac 编写c 语言_08


sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://yydlt76u.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

其他加速地址:

{
   "registry-mirrors": ["https://registry.docker-cn.com",     #Docker中国区官方镜像
   "http://hub-mirror.c.163.com",       #网易
   "https://docker.mirrors.ustc.edu.cn",    #中国科技大学
   "https://reg-mirror.qiniu.com"]         #七牛云
}
#注意逗号的位置

[root@localhost ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://yydlt76u.mirror.aliyuncs.com"],
  "insecure-registries": ["http://server.kylin.com"]
}

[root@localhost ~]# docker info 
...
...
Insecure Registries:
 server.kylin.com
 127.0.0.0/8
Registry Mirrors:
 https://yydlt76u.mirror.aliyuncs.com/
Live Restore Enabled: true

1.4 Docker 镜像管理


Docker 镜像含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于创建并启动 docker 容器。

Docker 镜像含里面是一层层文件系统,叫做 Union File System(Union FS 联合文件系统),2004 年由纽约州立大学石溪分校开发,联合文件系统可以将多个目录挂载到一起从而形成一整个虚拟文件系统,该虚拟文件系统的目录结构就像普通linux 的目录结构一样,docker 通过这些文件再加上宿主机的内核提供了一个 linux 的虚拟环境, 每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的, 构建镜像的时候, 从一个最基本的操作系统开始, 每个构建的操作都相当于做一层的修改, 增加了一层文件系统, 一层层往上叠加, 上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样, 当使用镜像的时候,我们只会看到一个完全的整体,不知道里面有几层也不需要知道里面有几层,结构如下:


docker mac 编写c 语言 docker使用什么语言编写_Docker_09


一个典型的 Linux 文件系统由 bootfs 和 rootfs 两部分组成,bootfs(boot file system) 主要包含 bootloader 和 kernel,bootloader 主要用于引导加载 kernel,当 kernel 被加载到内存中后 bootfs 会被 umount 掉,rootfs (root file system) 包含的就是典型 Linux 系统的 /dev,/proc,/bin,/etc 等标准目录和文件,下图就是 docker image 中最基础的两层结构,不同的linux 发行版(如 ubuntu 和 CentOS ) 在 rootfs 这一层会有所区别。

但是对于 docker 镜像通常都比较小,官方提供的 centos 基础镜像在 200MB 左右,一些其他版本的镜像甚至只有几 MB,docker 镜像直接调用宿主机的内核,镜像中只提供 rootfs,也就是只需要包括最基本的命令、工具和程序库就可以了,比如 alpine 镜像,在 5M 左右。

下图就是有两个不同的镜像在一个宿主机内核上实现不同的rootfs。


docker mac 编写c 语言 docker使用什么语言编写_linux_10


容器、镜像父镜像


docker mac 编写c 语言 docker使用什么语言编写_Powered by 金山文档_11


docker 命令是最常使用的 docker 客户端命令,其后面可以加不同的参数以实现相应的功能,常用的命令如下:

1.4.1 搜索镜像


在官方的 docker 仓库中搜索指定名称的 docker 镜像,也会有很多镜

[root@localhost ~]# docker search nginx      #不带版本默认是latest
NAME                                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                                             Official build of Nginx.                        17733               [OK]                

[root@localhost ~]# docker search nginx:latest     #也可以制定版本进行搜素
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nangualin/nginx                   for nginx:latest                                2

1.4.2 下载镜像


从 docker 仓库将镜像下载到本地,命令格式如下:

#docker pull 仓库服务器:端口/项目名称/镜像名称:tag(版本)号
#不写仓库表示去默认仓库查找,不写tag表示默认latest

[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest

1.4.3 查看本地镜像


下载完成的镜像比下载的大,因为下载完成后会解压

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              9d5226e6ce3f        7 days ago          1.24MB
nginx               latest              605c77e624dd        11 months ago       141MB

REPOSITORY #镜像所属的仓库名称
TAG        #镜像版本号(标识符),默认为 latest
IMAGE ID   #镜像唯一 ID 标示
CREATED    #镜像创建时间
SIZE #镜像的大小

1.4.4 镜像导出


可以将镜像从本地导出为一个压缩文件,然后复制到其他服务器进行导入使用。

[root@localhost ~]# docker save nginx -o nginx1.tar    #导出方法1
[root@localhost ~]# docker save busybox > bbox1.tar    #导出方法2
[root@localhost ~]# docker save nginx | gzip > nginx2.tar.gz     #导出并压缩
[root@localhost ~]# ll nginx* bbox1.tar 
-rw-r--r-- 1 root root   1468416 11月 25 16:45 bbox1.tar
-rw------- 1 root root 145905152 11月 25 16:43 nginx1.tar
-rw-r--r-- 1 root root  54825889 11月 25 16:46 nginx2.tar.gz

#查看导出的镜像内容
[root@localhost ~]# mkdir nginx
[root@localhost ~]# mv nginx2.tar.gz nginx && cd nginx/
[root@localhost nginx]# tar xf nginx2.tar.gz 
[root@localhost nginx]# ls
605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85.json  9bbc5b7ba84b25b1da51d892ab20477e80c6a2146c0034d01784500c116e4219  ea39dea0c460239ef30042b465c6a6c9aedae405b064c7b3c9338bd5db4ea17c  repositories
62b0e5771d99df8d8b1691e56197ae6d8a7d52671cd8f54c9a4f38302cced23d       b35607c71bdbb3eaca468bfd9c49d682f41a40f8f8b0c836532f37bc582a9430  manifest.json
653978619b092762db02b0793e4ba9b68b25f673d0e8388df6046a79041d2b60       b39c53b2f82ddc3aecc3d99fec4e352cf07a3c385c2803d1dc669c7ca46c310f  nginx2.tar.gz
[root@localhost nginx]# cat manifest.json    #包含了镜像的相关配置,配置文件,分层
[{"Config":"605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85.json","RepoTags":["nginx:latest"],"Layers":["ea39dea0c460239ef30042b465c6a6c9aedae405b064c7b3c9338bd5db4ea17c/layer.tar","b35607c71bdbb3eaca468bfd9c49d682f41a40f8f8b0c836532f37bc582a9430/layer.tar","653978619b092762db02b0793e4ba9b68b25f673d0e8388df6046a79041d2b60/layer.tar","b39c53b2f82ddc3aecc3d99fec4e352cf07a3c385c2803d1dc669c7ca46c310f/layer.tar","62b0e5771d99df8d8b1691e56197ae6d8a7d52671cd8f54c9a4f38302cced23d/layer.tar","9bbc5b7ba84b25b1da51d892ab20477e80c6a2146c0034d01784500c116e4219/layer.tar"]}]

#分层为了方便文件的共用,即相同的文件可以共用
[{"Config":" 配置文件.json",
"RepoTags":["docker.io/nginx:latest"],
"Layers":[" 分层1/layer.tar","分层 2 /layer.tar","分层 3/layer.tar"]}]

1.4.5 镜像导入


[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

[root@localhost ~]# docker load < bbox1.tar 
40cf597a9181: Loading layer [==================================================>]  1.459MB/1.459MB
Loaded image: busybox:latest
[root@localhost ~]# docker load -i nginx/nginx2.tar.gz 
2edcec3590a4: Loading layer [==================================================>]  83.86MB/83.86MB
e379e8aedd4d: Loading layer [==================================================>]     62MB/62MB
b8d6e692a25e: Loading layer [==================================================>]  3.072kB/3.072kB
f1db227348d0: Loading layer [==================================================>]  4.096kB/4.096kB
32ce5f6a5106: Loading layer [==================================================>]  3.584kB/3.584kB
d874fd2bc83b: Loading layer [==================================================>]  7.168kB/7.168kB
Loaded image: nginx:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              9d5226e6ce3f        7 days ago          1.24MB
nginx               latest              605c77e624dd        11 months ago       141MB

1.4.6 删除镜像


[root@localhost ~]# docker rmi nginx:latest 
Untagged: nginx:latest
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f

[root@localhost ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              9d5226e6ce3f        7 days ago          1.24MB
nginx               latest              605c77e624dd        11 months ago       141MB
[root@localhost ~]# docker images -q
9d5226e6ce3f
605c77e624dd
[root@localhost ~]# docker rmi $(docker images -q)      #同时删除多个镜像
[root@localhost ~]# docker rmi `docker images -q`        #同上
Untagged: busybox:latest
Deleted: sha256:9d5226e6ce3fb6aee2822206a5ef85f38c303d2b37bfc894b419fca2c0501269
Deleted: sha256:40cf597a9181e86497f4121c604f9f0ab208950a98ca21db883f26b0a548a2eb
Untagged: nginx:latest
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f
[root@localhost ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

1.4.7镜像标签


[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              9d5226e6ce3f        9 days ago          1.24MB
nginx               latest              605c77e624dd        11 months ago       141MB
httpd               latest              dabbfbe0c57b        11 months ago       144MB
centos              7                   eeb6ee3f44bd        14 months ago       204MB
centos              8                   5d0da3dc9764        14 months ago       231MB
centos              latest              5d0da3dc9764        14 months ago       231MB
[root@localhost ~]# docker tag busybox:latest bbox:v1
[root@localhost ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bbox                v1                  9d5226e6ce3f        9 days ago          1.24MB
busybox             latest              9d5226e6ce3f        9 days ago          1.24MB
nginx               latest              605c77e624dd        11 months ago       141MB
httpd               latest              dabbfbe0c57b        11 months ago       144MB
centos              7                   eeb6ee3f44bd        14 months ago       204MB
centos              8                   5d0da3dc9764        14 months ago       231MB
centos              latest              5d0da3dc9764        14 months ago       231MB

1.5 容器操作基础命令


#命令格式:
docker run [选项] [镜像名] [shell 命令] [参数]
docker run [参数选项] [镜像名称,必须在所有选项的后面] [/bin/echo 'hellowold']    #单次执行,没有自定义容器名称
docker run busybox /bin/echo 'hello wold'    #启动的容器在执行完 shell 命令就退出了
docker ps -a

1.5.1 从镜像启动一个容器


#会直接进入到容器,并随机生成容器 ID 和名称
docker run -it busybox sh
/ #  
#退出容器不注销
ctrl + p + q

1.5.2 显示正在运行的容器


[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3b5931980343        busybox             "sh"                45 seconds ago      Up 44 seconds                           xenodochial_agnesi

1.5.3 显示所有容器


#包括当前正在运行以及已经关闭的所有容器
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3b5931980343        busybox             "sh"                2 minutes ago       Up 2 minutes                            xenodochial_agnesi

1.5.4 删除运行中的容器


[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3b5931980343        busybox             "sh"                5 minutes ago       Up 5 minutes                            xenodochial_agnesi
[root@localhost ~]# docker rm -f xenodochial_agnesi 
xenodochial_agnesi
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1.5.5 随机映射端口


[root@localhost ~]# docker run -d -P nginx
dae7e582dd50dd2b3fbe965f4210719e87e8655296b211a1e565845f3334b22d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
dae7e582dd50        nginx               "/docker-entrypoint.…"   6 seconds ago       Up 5 seconds        0.0.0.0:32769->80/tcp   dreamy_liskov
[root@localhost ~]# ss -tnl
State                        Recv-Q                       Send-Q                                             Local Address:Port                                              Peer Address:Port                      Process                       
LISTEN                       0                            128                                                      0.0.0.0:111                                                    0.0.0.0:*                                                       
LISTEN                       0                            128                                                      0.0.0.0:22                                                     0.0.0.0:*                                                       
LISTEN                       0                            128                                                         [::]:111                                                       [::]:*                                                       
LISTEN                       0                            128                                                         [::]:22                                                        [::]:*                                                       
LISTEN                       0                            512                                                            *:32769                                                        *:*                                                       
LISTEN                       0                            128                                                            *:9090                                                         *:*                                                       
[root@localhost ~]# curl 192.168.11.108:32769 -I
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 25 Nov 2022 09:44:04 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 15:28:38 GMT
Connection: keep-alive
ETag: "61cb2d26-267"
Accept-Ranges: bytes

[root@localhost ~]# curl 192.168.11.108:32769 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

1.5.6 指定端口映射


#1.将本地的80端口映射到容器的80端口
[root@localhost ~]# docker run -d -p 80:80 --name nginx1 nginx      
960851ebc366fae6bdc096e5ce3d3d80c0c8512ec0db9deb1fcf27ff21d1da32
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
960851ebc366        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp      nginx1
dae7e582dd50        nginx               "/docker-entrypoint.…"   2 minutes ago       Up 2 minutes        0.0.0.0:32769->80/tcp   dreamy_liskov
[root@localhost ~]# curl 127.0.0.1:80 -I
HTTP/1.1 200 OK



#2.本地IP:本地端口:容器端口
[root@localhost ~]# docker run -d -p 192.168.11.108:81:80 --name nginx2 nginx
adfd1ef63112ee50791d6ed814a95201efd63e7f1d446d57bd4220700bd76004
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                       NAMES
adfd1ef63112        nginx               "/docker-entrypoint.…"   3 seconds ago        Up 2 seconds        192.168.11.108:81->80/tcp   nginx2
960851ebc366        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp          nginx1
dae7e582dd50        nginx               "/docker-entrypoint.…"   4 minutes ago        Up 4 minutes        0.0.0.0:32769->80/tcp       dreamy_liskov
[root@localhost ~]# curl 192.168.11.108:81 -I
HTTP/1.1 200 OK



#3.本地IP:本地随机端口:容器端口
[root@localhost ~]# docker run -d -p 192.168.11.108::80 --name nginx3 nginx
55c9dc5b19420968ba8f5f5758df7c76ec77bb85309e8743ee3349cd9bc2ce46
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
55c9dc5b1942        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 3 seconds        192.168.11.108:32768->80/tcp   nginx3
adfd1ef63112        nginx               "/docker-entrypoint.…"   46 seconds ago      Up 45 seconds       192.168.11.108:81->80/tcp      nginx2
960851ebc366        nginx               "/docker-entrypoint.…"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp             nginx1
dae7e582dd50        nginx               "/docker-entrypoint.…"   5 minutes ago       Up 5 minutes        0.0.0.0:32769->80/tcp          dreamy_liskov
[root@localhost ~]# curl 192.168.11.108:32768 -I
HTTP/1.1 200 OK




#4.本机ip:本地端口:容器端口/协议,默认为tcp协议
[root@localhost ~]# docker run -d -p 192.168.11.108:83:80/tcp --name nginx5 nginx
093d6699206d119f1de9f4a50e071d40d269ec752d812d1e760b344554a3dd46
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                               NAMES
093d6699206d        nginx               "/docker-entrypoint.…"   4 seconds ago        Up 3 seconds        192.168.11.108:83->80/tcp           nginx5
55c9dc5b1942        nginx               "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes        192.168.11.108:32768->80/tcp        nginx3
adfd1ef63112        nginx               "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes        192.168.11.108:81->80/tcp           nginx2
960851ebc366        nginx               "/docker-entrypoint.…"   4 minutes ago        Up 4 minutes        0.0.0.0:80->80/tcp                  nginx1
dae7e582dd50        nginx               "/docker-entrypoint.…"   7 minutes ago        Up 7 minutes        0.0.0.0:32769->80/tcp               dreamy_liskov
[root@localhost ~]# curl 192.168.11.108:83 -I
HTTP/1.1 200 OK



#5.一次性映射多个端口+协议
[root@localhost ~]# docker run -d -p 192.168.11.108:84:80/tcp -p 443:443/tcp -p 56:56/udp --name nginx6 nginx
406d5f4f8be33ee50f459c6c75589a13ed125de1ad88245f83f9918f93c0aa6f
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                                                 NAMES
406d5f4f8be3        nginx               "/docker-entrypoint.…"   3 seconds ago        Up 2 seconds        0.0.0.0:56->56/udp, 0.0.0.0:443->443/tcp, 192.168.11.108:84->80/tcp   nginx6
093d6699206d        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute   192.168.11.108:83->80/tcp                                             nginx5
cb656c1dd4f3        nginx               "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes        80/tcp, 192.168.11.108:82->80/udp                                     nginx4
55c9dc5b1942        nginx               "/docker-entrypoint.…"   3 minutes ago        Up 3 minutes        192.168.11.108:32768->80/tcp                                          nginx3
adfd1ef63112        nginx               "/docker-entrypoint.…"   3 minutes ago        Up 3 minutes        192.168.11.108:81->80/tcp                                             nginx2
960851ebc366        nginx               "/docker-entrypoint.…"   5 minutes ago        Up 5 minutes        0.0.0.0:80->80/tcp                                                    nginx1
dae7e582dd50        nginx               "/docker-entrypoint.…"   8 minutes ago        Up 8 minutes        0.0.0.0:32769->80/tcp                                                 dreamy_liskov
[root@localhost ~]# ss -tunl
Netid                   State                     Recv-Q                    Send-Q                                        Local Address:Port                                        Peer Address:Port                   Process                   
udp                     UNCONN                    0                         0                                            192.168.11.108:82                                               0.0.0.0:*                                                
udp                     UNCONN                    0                         0                                                   0.0.0.0:111                                              0.0.0.0:*                                                
udp                     UNCONN                    0                         0                                                 127.0.0.1:323                                              0.0.0.0:*                                                
udp                     UNCONN                    0                         0                                                         *:56                                                     *:*                                                
udp                     UNCONN                    0                         0                                                      [::]:111                                                 [::]:*                                                
udp                     UNCONN                    0                         0                                                     [::1]:323                                                 [::]:*                                                
tcp                     LISTEN                    0                         128                                                 0.0.0.0:111                                              0.0.0.0:*                                                
tcp                     LISTEN                    0                         512                                          192.168.11.108:81                                               0.0.0.0:*                                                
tcp                     LISTEN                    0                         512                                          192.168.11.108:83                                               0.0.0.0:*                                                
tcp                     LISTEN                    0                         512                                          192.168.11.108:84                                               0.0.0.0:*                                                
tcp                     LISTEN                    0                         128                                                 0.0.0.0:22                                               0.0.0.0:*                                                
tcp                     LISTEN                    0                         512                                          192.168.11.108:32768                                            0.0.0.0:*                                                
tcp                     LISTEN                    0                         128                                                    [::]:111                                                 [::]:*                                                
tcp                     LISTEN                    0                         512                                                       *:80                                                     *:*                                                
tcp                     LISTEN                    0                         128                                                    [::]:22                                                  [::]:*                                                
tcp                     LISTEN                    0                         512                                                       *:443                                                    *:*                                                
tcp                     LISTEN                    0                         512                                                       *:32769                                                  *:*                                                
tcp                     LISTEN                    0                         128                                                       *:9090                                                   *:*

1.5.7 查看容器已经映射的端口


[root@localhost ~]# docker port nginx6
443/tcp -> 0.0.0.0:443
56/udp -> 0.0.0.0:56
80/tcp -> 192.168.11.108:84

1.5.8 自定义容器名称


[root@localhost ~]# docker run -it --name nginx7 nginx

1.5.9 后台启动容器


[root@localhost ~]# docker run -d --name nginx8 nginx

1.5.10 创建并进入容器


[root@localhost ~]# docker run -it --name bbox1 busybox:latest sh
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    9 root      0:00 ps

1.5.11 单次运行


容器退出后自动删除:
[root@localhost ~]# docker run -it --rm --name bbox2 busybox:latest 
/ # exit
[root@localhost ~]# docker ps -a | grep bbox2

1.5.12 传递运行命令


容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一 种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令。

[root@localhost ~]# docker run -d  --name bbox4 busybox tail -f '/etc/hosts'
9a0bea3c9dfb805667a6a4a23b21d88c6574d001761354204963428df582a46e
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                 NAMES
9a0bea3c9dfb        busybox             "tail -f /etc/hosts"     3 seconds ago       Up 2 seconds                                                                              bbox4

1.5.13 容器的启动和关闭


可以用容器名或者容器ID
[root@localhost ~]# docker stop bbox4 
[root@localhost ~]# docker start 9a0bea3

1.5.14 进入到正在运行的容器(使用 exec 命令)


执行单次命令与进入容器
[root@localhost ~]# docker exec -it nginx8 bash
root@b27dc9d41fb0:/# ls  
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@b27dc9d41fb0:/# exit
exit
[root@localhost ~]#

1.5.15 查看容器内部的 hosts 文件


[root@localhost ~]# docker run -it --name centos1 centos bash
[root@af433fa982cb /]# cat /etc/hosts 
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	af433fa982cb      #默认会将实例的 ID 添加到自己的 hosts 文件


#ping容器ID
[root@af433fa982cb /]# ping af433fa982cb
PING af433fa982cb (172.17.0.2) 56(84) bytes of data.
64 bytes from af433fa982cb (172.17.0.2): icmp_seq=1 ttl=64 time=0.292 ms

1.5.16 批量关闭正在运行的容器


[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
deebe1170372        nginx:latest        "/docker-entrypoint.…"   50 seconds ago       Up 49 seconds       80/tcp              nginx2
eb0569450ccc        nginx:latest        "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp              nginx1
[root@localhost ~]# docker ps -q
deebe1170372
eb0569450ccc
[root@localhost ~]# docker stop `docker ps -q`
[root@localhost ~]# docker stop $(docker ps -q)
deebe1170372
eb0569450ccc
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1.5.17 批量强制关闭正在运行的容器


[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
bf13d117e619        nginx:latest        "/docker-entrypoint.…"   4 seconds ago       Up 2 seconds        80/tcp              nginx4
bcbc3d9ca647        nginx:latest        "/docker-entrypoint.…"   11 seconds ago      Up 9 seconds        80/tcp              nginx3
[root@localhost ~]# docker kill `docker ps -q`
bf13d117e619
bcbc3d9ca647
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# docker ps -a

1.5.18 批量删除已退出容器


[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                            PORTS               NAMES
bf13d117e619        nginx:latest        "/docker-entrypoint.…"   About a minute ago   Exited (137) About a minute ago                       nginx4
bcbc3d9ca647        nginx:latest        "/docker-entrypoint.…"   About a minute ago   Exited (137) About a minute ago                       nginx3
deebe1170372        nginx:latest        "/docker-entrypoint.…"   7 minutes ago        Exited (137) 5 minutes ago                            nginx2
eb0569450ccc        nginx:latest        "/docker-entrypoint.…"   7 minutes ago        Exited (0) 5 minutes ago                              nginx1
af433fa982cb        centos              "bash"                   11 minutes ago       Exited (127) 8 minutes ago                            centos1
[root@localhost ~]# docker ps -aq
bf13d117e619
bcbc3d9ca647
deebe1170372
eb0569450ccc
af433fa982cb

[root@localhost ~]# docker ps -qa -fstatus=exited
bf13d117e619
bcbc3d9ca647
deebe1170372
eb0569450ccc
af433fa982cb
[root@localhost ~]# docker rm -f `docker ps -qa -fstatus=exited`
bf13d117e619
bcbc3d9ca647
deebe1170372
eb0569450ccc
af433fa982cb
[root@localhost ~]#

1.5.19 批量删除所有容器


[root@localhost ~]# docker rm -f $(docker ps -aq)

1.5.20 指定容器 DNS


[root@localhost ~]# docker run -d --dns=8.8.8.8 --dns=144.114.114.114 --name nginx4 nginx:latest 
a72a628e4ca159dded1e586e3633e582fc974e5b6d423c15428af27b48aa142a
[root@localhost ~]# docker exec -it nginx4 bash
root@a72a628e4ca1:/# cat /etc/resolv.conf 
nameserver 8.8.8.8
nameserver 144.114.114.114

1.5.21 拷贝容器中文件到宿主机


#把本地文件拷贝到容器里面
[root@localhost ~]# docker cp  anaconda-ks.cfg nginx4:/opt    
[root@localhost ~]# docker exec -it nginx4 bash
root@a72a628e4ca1:/# ls /opt/
anaconda-ks.cfg

root@a72a628e4ca1:/# touch 666666666
root@a72a628e4ca1:/# ls 666666666 
666666666
root@a72a628e4ca1:/# exit
exit



#把容器里面的文件拷贝到本地
[root@localhost ~]# docker cp nginx4:/666666666 ./
[root@localhost ~]# ls
666666666  公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg  centos7.tar.gz  centos8.tar.gz  centos.tar.gz  httpd.tar.gz  initial-setup-ks.cfg  nginx.tar.gz
[root@localhost ~]# ls 666666666 
666666666

1.5.22 给容器传递环境变量


[root@localhost ~]# docker run -d --env "aaa=666" --name nginx2 nginx
7634321e369cad45650e78fb282ea3a6f797041d27d8ed20f5802a098b4c1fca
[root@localhost ~]# docker exec -it nginx2 bash
root@7634321e369c:/# echo $aaa 
666

1.5.23 映射宿主机目录到容器


[root@localhost ~]# ls /data
ls: 无法访问 '/data': 没有那个文件或目录
[root@localhost ~]# docker run -d --name=bbox1 -p80:80 -v /data:/www busybox:latest httpd -f -h /www
aca4167fc536c4653b5ef7577c1ca03b654aa062acacbe58ca6461ba78bde267
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                NAMES
aca4167fc536        busybox:latest      "httpd -f -h /www"   5 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp   bbox1
[root@localhost ~]# echo 6666 > /data/6666.txt
[root@localhost ~]# echo 777 > /data/index.html
[root@localhost ~]# docker exec -it bbox1 sh
/ # cd www/
/www # ls
6666.txt
/www # cat 6666.txt 
6666
/www # exit
[root@localhost ~]# curl 192.168.11.11:80 -I
HTTP/1.1 200 OK
....

[root@localhost ~]# curl 192.168.11.11
777




[root@localhost ~]# docker cp nginx1:/etc/nginx ./
[root@localhost ~]# ll nginx
总用量 24
drwxr-xr-x 2 root root   26 11月 28 16:11 conf.d
-rw-r--r-- 1 root root 1007 12月 28  2021 fastcgi_params
-rw-r--r-- 1 root root 5349 12月 28  2021 mime.types
lrwxrwxrwx 1 root root   22 12月 28  2021 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root  648 12月 28  2021 nginx.conf
-rw-r--r-- 1 root root  636 12月 28  2021 scgi_params
-rw-r--r-- 1 root root  664 12月 28  2021 uwsgi_param
[root@localhost ~]# docker run -d -P --name nginx2 -v /data:/usr/share/nginx/html -v /root/nginx:/etc/nginx:ro nginx:latest
08d14c76dc4f2ab81c4dd98f8f1d4a5e4b9176a3d8c69ec2729edca55e0cf0ca
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
08d14c76dc4f        nginx:latest        "/docker-entrypoint.…"   5 seconds ago       Up 4 seconds        0.0.0.0:32768->80/tcp   nginx2
90337270226f        nginx:latest        "/docker-entrypoint.…"   5 minutes ago       Up 5 minutes        80/tcp                  nginx1
[root@localhost ~]# curl 192.168.11.11:32768
666



#修改容器的时间与宿主机同步
[root@localhost ~]# date
2022年 11月 28日 星期一 15:55:59 CST
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# docker run -it --name nginx3 -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime busybox:latest 
/ # date
Mon Nov 28 15:56:10 CST 2022


docker mac 编写c 语言 docker使用什么语言编写_docker_12


1.5.24 查看容器的日志


[root@localhost ~]# docker logs -f nginx 
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
...
...
...



[root@localhost ~]# docker logs -f nginx --tail=1
192.168.11.1 - - [26/Nov/2022:14:21:32 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" "-"



192.168.11.1 - - [26/Nov/2022:15:05:11 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" "-"
192.168.11.1 - - [26/Nov/2022:15:05:11 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" "-"