首先 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)。
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 架构:
资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机。
开销更小:不需要启动单独的虚拟机占用硬件资源。
启动速度更快:可以在数秒内完成启动。
使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操作系统的虚拟机,但是通常一个虚拟机只运行一个服务,很明显资源利用率比较低且造成不必要的性能损耗,我们创建虚拟机的目的是为了运行应用程序,比如 Nginx、PHP、Tomcat 等 web 程序,使用虚拟机无疑带来了一些不必要的资源开销,但是容器技术则基于减少中间运行环节,带来较大的性能提升。
但是,如上图一个宿主机运行了 N 个容器,多个容器带来的以下问题怎么解决:
1. 怎么样保证每个容器都有不同的文件系统并且能互不影响?
2. 一个 docker 主进程内的各个容器都是其子进程,那么实现同一个主进程下不同类型的子进程?
3. 各个进程间通信能相互访问(内存数据)吗?
4. 每个容器怎么解决 IP 及端口分配的问题?
5. 多个容器的主机名能一样吗?
6. 每个容器都要不要有 root 用户?怎么解决账户重名问题?
以上问题怎么解决?
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]'
在一个容器,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码 bug 程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如 CPU、内存等,Linux Cgroups 的全称是 Linux Control Groups,它最主要的作用就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。
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
[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 就具备了基础的容器运行环境,但是还需要有相应的容器创建与删除的管理工具、以及怎么样把容器运行起来、容器数据怎么处理、怎么进行启动与关闭等问题需要解决,于是容器管理技术出现了。
目前主要是使用 docker,早期有使用 lxc。
Docker 启动一个容器也需要一个外部模板但是较多为镜像,docke 的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。
Docker 的镜像是分层的,镜像底层为库文件且只读层即不能写入也不能删除数据,从镜像加载启动为一个容器后会生成一个可写层,其写入的数据会复制到容器目录,但是容器内的数据在删除容器后也会被随之删除。
快速部署:短时间内可以部署成百上千个应用,更快速交付到线上。
高效虚拟化:不需要额外的 hypervisor 支持,直接基于 linux实现应用虚拟化,相比虚拟机大幅提高性能和效率。
节省开支:提高服务器利用率,降低 IT 支出。
简化配置:将运行环境打包保存至容器,使用时直接启动即可。
快速迁移和扩展:可跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从 A 宿主机迁移到 B宿主机,甚至是 A 平台迁移到 B 平台。
隔离性:各应用之间的隔离不如虚拟机彻底。
容器技术除了的 docker 之外,还有 coreOS 的 rkt,还有阿里自研的 Pouch,为了保证容器生态的标准性和健康可持续发展,包括 Linux 基金会、Docker、微软、 红帽、谷歌和 IBM等公司在 2015 年 6 月共同成立了一个叫 open container(OCI)的组织,其目的就是制定开放标准的容器规范,目前 OCI 一共发布了两个规范,分别是 runtime spec 和 image format 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规范定义了对容器操作信号的捕获,并做相应资源回收的处理,避免僵尸进程的出现。
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:镜像创建日期
管理工具连接 runtime 与用户,对用户提供图形或命令方式操作,然后管理工具将用户操作传递给 runtime 执行。
1. lxd 是 lxc 的管理工具。
2. Runc 的管理工具是 docker engine,docker engine 包含后台deamon 和 cli 两部分,大家经常提到的 Docker 就是指的docker engine。
3. Rkt 的管理工具是 rkt cli
容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建。
Docker image:是 docker 容器的模板,runtime 依据 docker image 创建容器。
Dockerfile:包含 N 个命令的文本文件,通过 dockerfile 创建出 docker image。
ACI (App container image):与 docker image 类似,是 CoreOS开发的 rkt 容器的镜像格式。
统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库。
Image registry:docker 官方提供的私有仓库部署工具。
Docker hub:docker 官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用。
Harbor:vmware 提供的自带 web 界面自带认证功能的镜像仓库,目前有很多公司使用。
当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容易出错,而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎。
容器编排通常包括容器管理、调度、集群定义和服务发现等功能。
Docker swarm :docker 开发的容器编排引擎。
Kubernetes :google 领导开发的容器编排引擎,内部项目为 Borg,且其同时支持 docker 和 CoreOS。
Mesos+Marathon :通用的集群组员调度平台,mesos(资源分配)与 marathon(容器编排平台)一起提供容器编排引擎功能。
容器网络
docker 自带的网络 docker network 仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico、flannel 等。
服务发现
容器的动态扩容特性决定了容器 IP 也会随之变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernetes 自带服务发现功能,需要结合 kube-dns 服务解析内部域名。 console
容器监控
可以通过原生命令 docker ps/top/stats 查看容器运行状态,另外也可以使 heapster/ Prometheus 等第三方监控工具监控容器的运行状态
数据管理
容器的动态迁移会导致其在不同的 Host 之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/存储挂载等方式解决。
日志收集
docker 原生的日志查看工具 docker logs,但是容器内部的日志需要通过 ELK 等专门的日志收集分析和展示工具进行处理。
官方网址: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 个月。
官方 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/
在麒麟操作系统可以直接进行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
[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
在 docker 安装启动之后,默认会生成一个名称为 docker0 的网卡并且默认 IP 地址为 172.17.0.1 的网卡
[root@localhost ~]# ip a s docker0
3: docker0: 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
[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 不关闭容器)
目前 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。
通过查看 docker 进程,了解 docker 的运行及工作方式
[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)
有四个进程:
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
通信流程: 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 监控容器文件,监控容器事件。
gRPC 是 Google 开发的一款高性能、开源和通用的 RPC 框架,支持众多语言客户端。
官网:https://www.grpc.io/
国内下载国外的镜像有时候会很慢,因此可以更改 docker 配置文件添加一个加速器,可以通过加速器达到加速下载镜像的目的。
浏览器打开 http://cr.console.aliyun.com,注册或登录阿里云账号,点击左侧的镜像加速器,将会得到一个专属的加速地址,而且下面有使用配置说明:
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
Docker 镜像含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于创建并启动 docker 容器。
Docker 镜像含里面是一层层文件系统,叫做 Union File System(Union FS 联合文件系统),2004 年由纽约州立大学石溪分校开发,联合文件系统可以将多个目录挂载到一起从而形成一整个虚拟文件系统,该虚拟文件系统的目录结构就像普通linux 的目录结构一样,docker 通过这些文件再加上宿主机的内核提供了一个 linux 的虚拟环境, 每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的, 构建镜像的时候, 从一个最基本的操作系统开始, 每个构建的操作都相当于做一层的修改, 增加了一层文件系统, 一层层往上叠加, 上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样, 当使用镜像的时候,我们只会看到一个完全的整体,不知道里面有几层也不需要知道里面有几层,结构如下:
一个典型的 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 命令是最常使用的 docker 客户端命令,其后面可以加不同的参数以实现相应的功能,常用的命令如下:
在官方的 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
从 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
下载完成的镜像比下载的大,因为下载完成后会解压
[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 #镜像的大小
可以将镜像从本地导出为一个压缩文件,然后复制到其他服务器进行导入使用。
[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"]}]
[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
[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
[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
#命令格式:
docker run [选项] [镜像名] [shell 命令] [参数]
docker run [参数选项] [镜像名称,必须在所有选项的后面] [/bin/echo 'hellowold'] #单次执行,没有自定义容器名称
docker run busybox /bin/echo 'hello wold' #启动的容器在执行完 shell 命令就退出了
docker ps -a
#会直接进入到容器,并随机生成容器 ID 和名称
docker run -it busybox sh
/ #
#退出容器不注销
ctrl + p + q
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b5931980343 busybox "sh" 45 seconds ago Up 44 seconds xenodochial_agnesi
#包括当前正在运行以及已经关闭的所有容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b5931980343 busybox "sh" 2 minutes ago Up 2 minutes xenodochial_agnesi
[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
[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
Welcome to nginx!
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
#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 *:*
[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
[root@localhost ~]# docker run -it --name nginx7 nginx
[root@localhost ~]# docker run -d --name nginx8 nginx
[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
容器退出后自动删除:
[root@localhost ~]# docker run -it --rm --name bbox2 busybox:latest
/ # exit
[root@localhost ~]# docker ps -a | grep bbox2
容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一 种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令。
[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
可以用容器名或者容器ID
[root@localhost ~]# docker stop bbox4
[root@localhost ~]# docker start 9a0bea3
执行单次命令与进入容器
[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 ~]#
[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
[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
[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
[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 ~]#
[root@localhost ~]# docker rm -f $(docker ps -aq)
[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
#把本地文件拷贝到容器里面
[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
[root@localhost ~]# docker run -d --env "aaa=666" --name nginx2 nginx
7634321e369cad45650e78fb282ea3a6f797041d27d8ed20f5802a098b4c1fca
[root@localhost ~]# docker exec -it nginx2 bash
root@7634321e369c:/# echo $aaa
666
[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
[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" "-"