1 容器基本概念

1.1 docker理念

docker是基于go语言实现的云开源项目。

docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。

一、docker简介和安装配置_docker

Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作

解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

1.2 容器虚拟化技术

由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

比较了 Docker 和传统虚拟化方式的不同之处:

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
  • 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
  • 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

1.3 容器间如何隔离

容器在同⼀台宿主机上创建多个独⽴、隔离的运⾏环境,让不同的应⽤程序能 够互不⼲扰的运⾏。然⽽,这些容器共享同⼀个宿主机内核,因此我们需要在 某些层次上对这些应⽤程序实现隔离。那么问题在于,究竟需要在哪些层次 上,对容器A和容器B进⾏隔离,有需要隔离哪些内容。

1.3.1 主机名(UTS)

每个容器都应该有属于⾃⼰的主机名称,但在没有隔离的情况下,所有容器是共享相同的主机名,这可能导致容器以下问题:

  • ⽇志记录和审计:当所有容器共享相同的主机名时,⽇志记录和审计变得困难。在解析⽇志时,很难区分不同容器产⽣的⽇志,问题难以追踪和解决。
  • 应⽤程序配置:部分应⽤程序可能依赖主机名来实现特定功能或者⽤于配置。当多个容器共享相同的主机名时,这可能导致应⽤程序配置出现问题,从⽽影响应⽤程序的正常运⾏。 
  • 内部通信:在某些情况下,容器可能需要根据主机名进⾏通信。如果所有容器共享相同的主机名,这可能导致通信出现混乱,从⽽影响容器间的协作。

因此需要确保每个容器都拥有属于⾃⼰的主机名,从⽽避免了上述问题的产⽣,所以需要对主机名(UTS)进⾏隔离

1.3.2 根⽂件系统(Mount)

每个容器都应该有属于⾃⼰的根⽂件系统,在没有⽂件系统隔离的情况下,容器可能会访问到其他容器的⽂件,这可能导致以下问题:

  • 数据安全:若容器之间没有独⽴的⽂件系统,它们可能访问彼此的⽂件,从⽽导致数据泄露或被篡改。
  • 应⽤程序独⽴性:每个容器拥有⾃⼰的
  • 容器迁移:由于每个容器都具备⾃⼰的根⽂件系统,迁移容器时只需将⽂件系统和应⽤程序⼀同打包。这简化了迁移过程,并提⾼了容器的灵活性和可移植性。

因此每个容器都拥有⾃⼰的⽂件系统,确保数据的安全,所以需要对⽂件系统进⾏隔离(Mount)

1.3.3 进程间通信IPC

每个⽤户空间都应该有⾃⼰的独⽴IPC,也就是容器内的进程可以⾃由通信,使⽤Socket、管道等IPC机制。这是正常的,不影响安全。但两个隔离环境中的容器如果可以直接使⽤同⼀IPC通信,那就违背了容器隔离的初衷。

但两个容器之间应该是可以通过IP地址,或HTTP等⽅式通信,因为两个容器都会有独⽴的IP,每个容器认为⾃⼰是⼀个独⽴的服务器实例;

1.3.4 进程PID

在容器中运⾏的进程,认为当前所在的⽤户空间是唯⼀的。为确保进程能被正常管理,每个容器都需要具备⾃⼰的 init 进程(PID=1)。但实际上init进程只有⼀个。因此,我们必须为每个容器伪装⼀个init(PID=1)的进程,让容器认为它们有独⽴的进程树。这意味着对于容器内的进程,它们的进程树以PID=1 的init 进程为根,认为这就是真正的init。

实际上,在宿主机上,容器的 init 进程并⾮真正的 init(PID=1),⽽只是⼀个普通进程。容器内其他进程都是该容器 init 进程的⼦进程。通过这种⽅式,实现了容器内进程的隔离和管理。

一、docker简介和安装配置_加载_02

systemd --> Containerd --> container_shim -->容器 (NginxMaster -NginxWorker) --> docker --> dockerProxy --> kernel --> Iptables规则

1.3.5 进程运⾏身份USER

在容器内运⾏的进程需要以某个特定的⽤户身份运⾏。假设每个容器的身份都为 root且UID都为0,但实际系统中真正的 root 只有⼀个。因此,我们需要为每个容器伪装⼀个root⽤户,让他可以在容器中可以执⾏任何操作。但如果回到宿主机上,这些伪装的⽤户其实就是⼀个普通⽤户身份,(有点类似chown)。  

这种设计实现了⽤户身份隔离,避免容器内进程以真正的 root 身份运⾏。同时,容器内伪装的⽤户仍具有执⾏容器内所有操作的能⼒,满⾜容器运⾏和管理的需求。

1.3.6 ⽹络Net

在容器技术中,每个容器都像⼀个独⽴的服务器,它们各⾃有⾃⼰的的 IP 地址、⽹络接⼝和 TCP/IP 协议栈。虽然在内核级别,TCP/IP 协议栈只有⼀个,但容器技术通过⽹络隔离确保了每个容器都能独⽴⼯作,互不⼲扰。

  • 独⽴的IP 地址:每个容器都有⾃⼰的 IP 地址,就像⼀个独⽴的服务器。它们可以使⽤这个 IP 地址与外部⽹络通信,同时与其他容器保持隔离。
  • 专⽤虚拟⽹络接⼝:为每个容器创建⼀个虚拟⽹络接⼝,容器内的进程可通过该接⼝与外界通信。尽管在宿主机上,这些虚拟⽹络接⼝都是通过物理⽹络接⼝实现的,但在容器内部,每个容器都认为⾃⼰拥有独⽴的⽹络接⼝。
  • 独⽴的TCP/IP 协议栈:每个容器拥有⾃⼰的⽹络命名空间,它们各⾃的 TCP/IP 协议栈独⽴运⾏。例如所有容器都可以监听在TCP/80端⼝上,并且互不影响。 

为实现上述功能,容器⽹络采⽤了以下技术:

  • 虚拟⽹络接⼝:为每个容器创建⼀个虚拟⽹络接⼝,例如eth0,使其看起来像独⽴的⽹络接⼝。
  • ⽹络命名空间:为每个容器提供独⽴的⽹络命名空间,实现各⾃的TCP/IP 协议栈隔离。
  • 虚拟交换机和⽹络桥接:通过虚拟交换机将容器内的虚拟接⼝连接到宿主机的物理接⼝上,实现容器与外部⽹络的互联。⽹络桥接技术实现容器间的通信。

因此,容器的⽹络通过独⽴的IP 地址、专⽤虚拟⽹络接⼝、独⽴的 TCP/IP协议栈以及虚拟交换机和⽹络桥接技术,实现了⽹络隔离和容器间通信的需求。这使得每个容器都能像⼀个独⽴的服务器⼀样⼯作,同时保持与其他容器的隔离。  

1.3.7 总结 

为了⽀持容器隔离机制的实现,Linux内核在内核级别通过NameSpaces的名称空间机制对这六种资源进⾏原⽣⽀持,并通过⼀些系统调⽤( clone(创建⼀个新进程) 和 setns(将当前进程移动⾄⼀个NameSpace中) )将这些资源隔离功能提供给⽤户空间,让容器技术能够利⽤这些隔离机制。

一、docker简介和安装配置_加载_03

1.4 容器的资源限制

主机虚拟化在创建虚拟机时,可以为每个虚拟机指定特定的 CPU 核⼼数、内存⼤⼩等资源限制。因为每个虚拟机都有⾃⼰的独⽴内核,所以资源隔离和限制的⾮常好。假设⼀个虚拟机设定内存总⽤量为4G,如果该虚拟机出现了内存泄露,它也不会影响到其他虚拟机,因此它的内存最多使⽤到4G,如果还需要更多内存则⽆法申请。  

⽽容器技术与主机虚拟化不同,多个容器运⾏在同⼀个操作系统内核上,如果我们不对容器使⽤的资源加以限制,那么当⼀个容器出现内存泄露,⼤量吞噬内存,则会造成其他容器⽆法正常申请内存,从⽽造成OOM。

为了实现容器间的资源限制,Linux 内核提供了⼀个功能叫 Cgroups(Control Groups)控制组。⽤来限制、控制⼀个进程能够使⽤的资源。因此,我们可以借助Cgroups资源限制来对容器的 CPU 使⽤率、内存⽤量、设备的访问权限等进⾏限制。这样我们就可以避免⼀个容器因内存泄露⽽吞噬掉所有系统可⽤内存,造成其他容器异常的情况。

实践:容器实现的资源限制其实底层就是调⽤Cgroup来实现的,所以我们了解Cgroup如何实现控制,就能清楚Docker的资源限制是如何实现控制的。


1.4.1 案例

# 1、安装cgroup⽤户空间命令

yum install libcgroup-tools

# 2、创建⼀个cgroup控制组

cgcreate -g cpu:qingchen_group

一、docker简介和安装配置_linux_04

# 3、运⾏⼀个使⽤CPU到100%的⽤户进程

while :; do :; done&

[1] 3245 

top -p 3245

一、docker简介和安装配置_centos_05

# 4、将资源占⽤较⾼的加⼊到oldxu_group控制组中

cgclassify -g cpu:qingchen_group 3245

# 5、配置限制规则;30000表示30%

echo 30000 > /sys/fs/cgroup/cpu/qingchen_group/cpu.cfs_quota_us

# 6、再次检查进⾏cpu占⽤,验证是否已经被限制

top -p 3245

一、docker简介和安装配置_linux_06

#7、如果在添加⼀个进程⾄该控制组,意味着这两个进程加起来CPU总资源不能超过30%

Docker其实就是运⾏在宿主机中的⼀个隔离进程,通过namespace进⾏隔离,通过cgroup进 ⾏资源限制;

2 docker基本概述

2.1 docker结构模型

Docker Daemon:dockerd 是 Docker 的守护进程,负责监听 Docker API的请求和管理 Docker 对象,如镜像、容器和⽹络。它在后台运⾏,处理客户端发来的命令和请求。

Docker Client:Docker Client 是⽤户与 Docker 进⾏交互的⼯具。 Client将客户端需要执⾏的docker run 等命令发送给 Docker Daemon 进⾏处理。

Docker Registry:Docker Registry 是⽤于存储和分发 Docker 镜像的仓库。Docker 默认提供的是Docker Hub。当然⽤户也可以⾃⼰搭建企业内部私有仓库。

Docker Images:Docker Images 是将软件环境打包成⼀个镜像模板。它们⽤于创建容器,并可以在多个容器间共享。镜像包含了运⾏应⽤所需的所有依赖和配置。

Containers:容器是 Docker 镜像的运⾏实例。

一、docker简介和安装配置_docker_07

2.2 docker基本组成

2.2.1 镜像(image)

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

2.2.2 容器(container)

Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。

它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

2.2.3 仓库(repository)

仓库(Repository)是集中存放镜像文件的场所。

仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub(https://hub.docker.com/),

存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

2.2.4 小总结

需要正确的理解仓储/镜像/容器这几个概念:

Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

  • image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
  • 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器。
  • 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。

2.3 docker底层原理

Docker是怎么工作的

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。

一、docker简介和安装配置_linux_08

为什么Docker比较比VM快

(1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

(2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

一、docker简介和安装配置_加载_09

一、docker简介和安装配置_加载_10

3 docker存储引擎

3.1 镜像构建

Docker镜像构建底层其实是通过分层构建加联合挂载来实现的;例如:在底层先创建⼀个基础的CentOS镜像,然后在该基础镜像之上安装 Nginx,从⽽形成⼀个新的 Nginx 镜像,但是这个 Nginx 镜像它仅包含 Nginx 本身,不包含 CentOS 镜像。需要将这两个镜像叠加在⼀起,才能得到⼀个运⾏在CentOS 系统上的 Nginx镜像,这种就叫分层构建;  

联合挂载是指在 Docker 容器启动时,将各个镜像层叠加在⼀起,形成⼀个统⼀的⽂件系统视图的过程。  

当运⾏⼀个基于 CentOS 的 Nginx 容器时,底层通过联合挂载将 Nginx 镜像和 CentOS 镜像叠加在⼀起,使得在容器内部,看起来就像是⼀个完整的CentOS 上运⾏了⼀个 Nginx 应⽤。  

Docker镜像分层构建和联合挂载的设计带来了诸多好处,其中最显著的就是镜像分发变得更加容易了。这种⽅式在需要运⾏多个容器的场景下尤为明显。  

例如,在⼀个系统上需要运⾏ Nginx、Tomcat 和 PHP 这三个容器,它们的底层都是基于 CentOS 进⾏构建。此时,主机上只需要准备⼀个 CentOS 基础镜像和三个不同的应⽤层(Nginx、Tomcat、PHP),⽽不是为每个组合准备单独的⼀个完整镜像。在运⾏各个容器时,Docker 会将相应的应⽤层叠加

在基础层之上:  

1、当运⾏ Nginx 容器时,底层是 CentOS,上层是 Nginx。  

2、当运⾏ Tomcat 容器时,底层是 CentOS,上层是 Tomcat。  

3、当运⾏ PHP 容器时,底层是 CentOS,上层是 PHP。

3.2 容器与镜像

Docker 使⽤镜像作为容器的基础。镜像是只读的,包含了容器运⾏所需的所有⽂件和依赖。每个容器都基于⼀个镜像,并在其上添加⼀个可写层。这个可写层⽤于存储容器运⾏时产⽣的临时数据。  

由于镜像是只读的,多个容器可以同时共享对同⼀个底层镜像的访问,⽽不会相互影响。每个容器都有⾃⼰独⽴的可写层,这意味着所有对容器的更改(如添加、删除或修改⽂件)都仅限于该容器的可写层,⽽不会影响到其他容器。  

通过这种⽅式,Docker 实现了镜像和容器之间的分层结构,使得容器能够⾼效地共享底层镜像资源,同时保证了各个容器之间的隔离。

3.3 存储引擎

Docker 存储引擎负责在底层实现镜像分层构建和联合挂载的功能。Docker⽬前⽀持的主要存储引擎是 Overlay2。在早期,Docker 使⽤的是 aufs 存储引擎,但现在已经被废弃。  

Overlay2 存储引擎采⽤了⼀种称为“叠加⽂件系统”的技术,它允许将多个独⽴的⽂件系统层叠加在⼀起,形成⼀个统⼀的视图。这种⽅式既节省了存储空间,⼜便于镜像分发和管理

# 节省空间 
CentOS:200MB------------> 
# 1、如果没有进⾏分层构建,意味着3个容器如果都是完整的镜像,则需要⾄少600M 
# 2、有了分层构建,仅需要200MB的CentOS镜像,然后三份应⽤层的⼤⼩,约200MB 

# 加速镜像分发: 
# 1、如果Nginx镜像是由CentOS层+Nginx层组成; 
# 2、此时主机需要使⽤该镜像,那么如果在主机本地已经存储了CentOS层,仅需要拉取没有的Nginx层即可;

Docker 的默认存储驱动是 overlay2,它使⽤ overlay ⽂件系统来组合多个层。对于每个容器,overlay2 驱动会将只读的镜像层(LowerDir)与容器的可写层(UpperDir)组合在⼀起,通过⼀个合并⽬录(MergedDir)呈现为⼀个统⼀的⽂件系统。

4 docker安装

4.1 配置yum源

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.2 基础配置

配置主机名
hostnamectl set-hostname docker|bash

配置防火墙
关闭防火墙  
systemctl stop firewalld && systemctl disable firewalld  
关闭 iptables 防火墙  
yum install iptables-services -y  
禁用 iptables  
service iptables stop && systemctl disable iptables
清空防火墙规则  
iptables -F

关闭selinux
setenforce 0  
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'  
注意:修改 selinux 配置文件之后,重启机器,selinux 才能永久生效  
getenforce  
显示 Disabled 表示 selinux 关闭成功

4.3 安装docker

yum install docker-ce -y

4.4 修改docker工作路径

4.4.1 直接修改路径

docker工作目录加上后续镜像启动,会占用很大空间,docker默认都存在/var/lib/docker目录下

可以通过docker info查看工作目录

一、docker简介和安装配置_守护进程_11

systemctl stop docker
备份docker目录
cp -r /var/lib/docker  /data/docker
mv /var/lib/docker /var/lib/docker.bak
ln -s /data/docker /var/lib/docker
systemctl start docker

一、docker简介和安装配置_docker_12

4.4.2 修改配置文件

cat /etc/docker/daemon.json
{
  "graph": "/data/docker" ##docker工作目录
}

如果docker 19.xx以上版本会不识别graph
“/etc/docker/daemon.json: the following directives don't match any configuration option: graph”
在docker 19.xx 版本以后使用data-root来代替graph
{
  "data-root": "/data/docker" ##docker工作目录
}

4.5 修改默认网桥ip

Docker 服务启动后默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。

可以用编辑/etc/docker/daemon.json文件,添加内容 "bip": "ip/netmask" [ 切勿与宿主机同网段 ]

cat /etc/docker/daemon.json
{
  "bip": "10.10.10.1/24"
}

一、docker简介和安装配置_centos_13

4.6 配置网卡转发

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。

要让Linux系统具有路由转发功能,需要配置一个Linux的内核参数net.ipv4.ip_forward。这个参数指定了Linux系统当前对路由转发功能的支持情况; 其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。

使用过docker的小伙伴都知道,单机docker的网络架构实质上是在宿主机上安装了一个docker0的网桥,从外部访问容器内部时只需要访问宿主机的地址和对应的容器映射的地址,访问的数据包到宿主机上后经过ip包解析后通过目的port和iptables的规则会将数据包由eth0网卡转发至docker0网桥上进行下一步路由。

所以如果容器的宿主机上的ip_forward未打开,那么该宿主机上的容器则不能被其他宿主机访问

配置网卡转发
cat <<EOF >  /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF

sysctl -p /etc/sysctl.d/docker.conf

# 如果出现如下报错: 
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory 
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory 
# 解决,先执行命令:
modprobe br_netfilter ##系统重启失效
##br_netfilte -->启用此内核模块,以便遍历桥接流量的数据包由iptables进行处理以进行过滤和端口转发
# 然后再次执行如下命令即可 
sysctl -p /etc/sysctl.d/docker.conf

但是br_netfilter在系统重启后会失效
br_netfilter开机自启动
在/etc/新建rc.sysinit 文件
cat /etc/rc.sysinit
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done

在/etc/sysconfig/modules/目录下新建文件如下
cat /etc/sysconfig/modules/br_netfilter.modules
modprobe br_netfilter

增加权限
chmod 755 br_netfilter.modules
重启后 模块自动加载

一、docker简介和安装配置_centos_14

4.7 配置镜像加速

当前时间是2024年8月10日

国内原docker镜像加速源基本都已经失效,阿里云的也已经没法使用

如果多次尝试一般会报错

Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

一、docker简介和安装配置_centos_15

4.7.1 配置代理镜像源

vi /etc/docker/daemon.json
{
    "registry-mirrors": ["https://hub.gog.email"]
} 

sudo systemctl daemon-reload && sudo systemctl restart docker
假如拉取原始镜像命令如下
 docker pull whyour/qinglong:latest 复制代码
仅需在原命令前缀加入加速镜像地址 例如:
 docker pull hub.gog.email/whyour/qinglong:latest

4.7.2 配置国内可信镜像仓库

vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://hub.atomgit.com/"],
  "data-root": "/data/docker",
  "bip": "10.10.10.1/24"
}

sudo systemctl daemon-reload && sudo systemctl restart docker

镜像不算新,做实验勉强够用,查询的时候显示镜像是当天的,实际是去年12月上传

5 docker基础命令

5.1 查看docker引擎

docker info 用来展示docker信息

docker version

5.2 docker帮助命令

docker --help

5.3 hello-world运行

docker run hello-world


一、docker简介和安装配置_centos_16


run干了什么

一、docker简介和安装配置_docker_17

6 附录daemon.json

配置文件 daemon.json 详解

Linux上配置文件的默认位置是 /etc/docker/daemon.json。该--config-file标志可用于指定非默认位置

{
"api-cors-header":"", # 在引擎API中设置CORS标头
"authorization-plugins":[], # 要加载的授权插件
"bridge":"", # 将容器附加到网桥
"cgroup-parent":"", # 为所有容器设置父cgroup
"cluster-store":"", # 分布式存储后端的URL
"cluster-store-opts":{}, # 设置集群存储选项(默认map [])
"cluster-advertise":"", # 要通告的地址或接口名称
"debug": true, # 启用调试模式,启用后,可以看到很多的启动信息。默认false
"default-gateway":"", # 容器默认网关IPv4地址
"default-gateway-v6":"", # 容器默认网关IPv6地址
"default-runtime":"runc", # 容器的默认OCI运行时(默认为" runc")
"default-ulimits":{}, # 容器的默认ulimit(默认[])
"dns": ["192.168.1.1"], # 设定容器DNS的地址,在容器的 /etc/resolv.conf文件中可查看。
"dns-opts": [], # 容器 /etc/resolv.conf 文件,其他设置
"dns-search": [], # 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的 主机时,DNS不仅搜索host,还会搜索host.example.com 。 注意:如果不设置, Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。
"exec-opts": [], # 运行时执行选项
"exec-root":"", # 执行状态文件的根目录(默认为’/var/run/docker‘)
"fixed-cidr":"", # 固定IP的IPv4子网
"fixed-cidr-v6":"", # 固定IP的IPv6子网
"data-root":"/var/lib/docker", # Docker运行时使用的根路径,默认/var/lib/docker
"group": "", # UNIX套接字的组(默认为"docker")
"hosts": [], # 设置容器hosts
"icc": false, # 启用容器间通信(默认为true)
"ip":"0.0.0.0", # 绑定容器端口时的默认IP(默认0.0.0.0)
"iptables": false, # 启用iptables规则添加(默认为true)
"ipv6": false, # 启用IPv6网络
"ip-forward": false, # 默认true, 启用 net.ipv4.ip_forward ,进入容器后使用 sysctl -a |     grepnet.ipv4.ip_forward 查看
"ip-masq":false, # 启用IP伪装(默认为true)
"labels":["nodeName=node-121"], # docker主机的标签,很实用的功能,例如定义:–label nodeName=host-121
"live-restore": true, # 在容器仍在运行时启用docker的实时还原
"log-driver":"", # 容器日志的默认驱动程序(默认为" json-file")
"log-level":"", # 设置日志记录级别("调试","信息","警告","错误","致命")(默认为"信息")
"max-concurrent-downloads":3, # 设置每个请求的最大并发下载量(默认为3)
"max-concurrent-uploads":5, # 设置每次推送的最大同时上传数(默认为5)
"mtu": 0, # 设置容器网络MTU
"oom-score-adjust":-500, # 设置守护程序的oom_score_adj(默认值为-500)
"pidfile": "", # Docker守护进程的PID文件
"raw-logs": false, # 全时间戳机制
"selinux-enabled": false, # 默认 false,启用selinux支持
"storage-driver":"", # 要使用的存储驱动程序
"swarm-default-advertise-addr":"", # 设置默认地址或群集广告地址的接口
"tls": true, # 默认 false, 启动TLS认证开关
"tlscacert": "", # 默认 ~/.docker/ca.pem,通过CA认证过的的certificate文件路径
"tlscert": "", # 默认 ~/.docker/cert.pem ,TLS的certificate文件路径
"tlskey": "", # 默认~/.docker/key.pem,TLS的key文件路径
"tlsverify": true, # 默认false,使用TLS并做后台进程与客户端通讯的验证
"userland-proxy":false, # 使用userland代理进行环回流量(默认为true)
"userns-remap":"", # 用户名称空间的用户/组设置
"bip":"192.168.88.0/22", # 指定网桥IP
"registry-mirrors": ["https://192.498.89.232:89"], # 设置镜像加速
"insecure-registries": ["120.123.122.123:12312"], # 设置私有仓库地址可以设为http
"storage-opts": [
"overlay2.override_kernel_check=true",
"overlay2.size=15G"
], # 存储驱动程序选项
"log-opts": {
"max-file": "3",
"max-size": "10m",
}, # 容器默认日志驱动程序选项
"iptables": false # 启用iptables规则添加(默认为true)
}