一、Docker 简介

Docker 是基于 Go 语言开发的一款开源的应用程序与 PaaS 服务,是一种轻量化的 虚拟机 。Docker 三大理念为 build(构建) 、ship(运输)、run(运行)。并且使用 Namespace 与 Cgroup 来提供容器的资源隔离与安全保障等。如Docker 的 logo 一样,蓝鲸为宿主机,而集装箱则为互相隔离且有自己应用的容器。
Docker 简介-LMLPHP
以下是 Docker 与 虚拟机的区别

1、Docker 特点

  • 轻量级:单机可以轻松支持上百 Container ,快速启动。
  • 高性能:不需要进行硬件虚拟以及运行完整的操作系统。
  • CI/CD:持续集成、持续交付与持续部署。
  • 迁移与扩容:可在物理机、云,虚拟机进行迁移,且可弹性伸缩、快速扩容。
  • 隔离性:进程、资源等进行隔离,但没有虚拟机彻底。

2、Docker 架构

引擎
Docker 简介-LMLPHP

Docker 引擎是一个C/S 架构的应用程序。常驻后台进程 Dockerd ,由 REST API 与 Dockerd 进行交互,最后由 docker CLI 与 REST API 进行交互,执行 docker 命令。

组成
Docker 简介-LMLPHP

  • Host:一个物理机或虚拟机,用来运行 Docker服务进程与容器。
  • Client:客户端使用 docker 命令或其他工具调用 Docker API 进行通信。
  • Deamon:Dockerd 架构中后台系统进程,用来监听Docker API的请求和管理Docker对象,比如镜像、容器、网络和Volume。
  • Registry:保存镜像的仓库,类似 Git 版本控制系统等。
  • Images:Docker 镜像,可以理解为创建容器需要的模板。
  • Containers:一组或一个拥有自己进行及网络等,提供外部访问的容器。

3、Docker 核心

  • 镜像(Image)
    Docker image 是一个只读模板,包含了文件系统。用来创建 Docker 容器,镜像来自于基于另外基础镜像构建并加上需要的额外自定义功能。
  • 容器(Container)
    Docker Container 一个镜像运行的实例,拥有自己封装的的进程、权限、存储、网络等,消耗资源极少。跟集装箱一样利用 Linux 内核技术进行资源隔离达到相互隔离,且使用 CLI 对容器进行操作。
  • 仓库(Registry)
    Dokcer Registry 类似于代码仓库,是 Docker 集中存放镜像文件的仓库。分为公开仓库(Public)和私有仓库(Private)两种形式。达到共享其他服务器,只需要用 pull(拉取) 于 push(上传) 对镜像仓库操作即可。

二、Linux kernel

kernel 是用来完成软件与硬件这个控制工作的软件被称为操作系统。在 Linux 的术语中被称为“内核”,也可以称为“核心”。Linux 内核的主要模块分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

1、Namespace

在我们运行的服务中,为防止资源抢占,运用 PID Namespace 来进行进程隔离。在宿主机上可获取一组 PID、PPID ,PID 号是容器在宿主机上的进程,PPID是容器内进程在宿主机上的父进程 PID 。在容器内也有一组 PID、PPID,其中 PID 是容器服务的进程,PPID 是容器外部的进程,如果为0则表示父进程是容器外部的进程。

2、Cgroups

全称 Control Groups 对于容器的物理资源进行隔离,如 CPU、内存、磁盘IO 等,达到共享宿主机资源,但却互不影响。另外,还可以对进程进行优先级测试,以及任务执行挂起、恢复等操作。

3、UnionFS

全称 Union File System ,是一种 Linux 的操作系统中的设计。用来把其他文件系统联合挂载到一个挂载点的文件系统服务。在 Docker 镜像中,用户每次制作镜像操作等于在镜像中增加一个目录(Docker 中 layer 为层)。达到在 Docker 中对文件权限以及目录有效的隔离。

三、Docker 使用

1、Docker 安装

Docker 下载安装

[root@localhost ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz
[root@localhost ~]# tar zxvf docker-20.10.9.tgz
[root@localhost ~]# cp docker/* /usr/bin
[root@localhost ~]# cat << EOF >> /etc/systemd/system/docker.service
> [Unit]
> Description=Docker Application Container Engine
> Documentation=https://docs.docker.com
> After=network-online.target firewalld.service
> Wants=network-online.target
>
> [Service]
> Type=notify
> ExecStart=/usr/bin/dockerd
> ExecReload=/bin/kill -s HUP \$MAINPID
> LimitNOFILE=infinity
> LimitNPROC=infinity
> TimeoutStartSec=0
> Delegate=yes
> KillMode=process
> Restart=on-failure
> StartLimitBurst=3
> StartLimitInterval=60s
>
> [Install]
> WantedBy=multi-user.target
> EOF
[root@localhost ~]# chmod +x /etc/systemd/system/docker.service
[root@localhost ~]# systemctl daemon-reload && systemctl enable docker.service && systemctl start docker && systemctl status docker

Docker 版本查看

[root@localhost ~]# docker version												#查看 docker 版本
[root@localhost ~]# docker info													#查看 docker 系统信息

Docker 简介-LMLPHP

2、Docker 镜像管理

1.查看镜像详情

查看本地镜像

[root@localhost ~]# docker images												#默认等于-a,显示全部本地镜像
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   6 months ago   141MB

参数详解

  • REPOSITORY:镜像名称
  • TAG:镜像的标签信息(默认latest),区分同 ID 不同标签,区分同镜像库不同镜像
  • IMAGE ID:镜像的唯一标识号,ID号
  • CREATED:镜像创建时间
  • SIZE:镜像占用空间
docker inspect [IMAGE:TAG]/[IMAGEID]											#查看本地镜像详情
docker history [IMAGE:TAG]/[IMAGEID]											#查看镜像创建历史

2.镜像导入导出

网络方式

docker search [镜像关键字]														#搜索镜像
docker pull [IMAGE:TAG]															#下载镜像
docker push [IMAGE:TAG]															#上传镜像

本地方式

docker load <(同-i) [本地镜像包]													#导入本地镜像
docker save [IMAGE:TAG] >(同-o) [镜像包]											#导出本地镜像
鉴于普通方式打包较大,内网传输较慢,使用此方式:
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       7         c16a5dec2126   2 days ago     1.86GB
[root@localhost ~]# docker save centos:7 | gzip > centos7-test.tar.gz
[root@localhost ~]# docker save  centos:7 >  centos7-test-01.tar.gz
[root@localhost ~]# ll
总用量 2496724
-rw-r--r-- 1 root root 1878647296 7月   6 14:30 centos7-test-01.tar.gz			#与镜像同大
-rw-r--r-- 1 root root  677993258 7月   6 14:28 centos7-test.tar.gz				#缩小近三分之一

3.更改镜像信息

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   6 months ago   141MB
[root@localhost ~]# docker tag nginx nginx1215:1.21.5							#更换名称与TAG
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx1215    1.21.5    605c77e624dd   6 months ago   141MB						#ID不变
nginx        latest    605c77e624dd   6 months ago   141MB

4.删除本地镜像

根据镜像名称与标签删除

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx1215    1.21.5    605c77e624dd   6 months ago   141MB
nginx        latest    605c77e624dd   6 months ago   141MB
[root@localhost ~]# docker rmi nginx:latest										#删除指定 TAG 镜像
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31

根据镜像 ID 删除

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx1215    1.21.5    605c77e624dd   6 months ago   141MB
nginx        latest    605c77e624dd   6 months ago   141MB
[root@localhost ~]# docker images -q | xargs docker rmi -f						#删除本地所有镜像
Untagged: nginx1215:1.21.5
Untagged: nginx:latest
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85

3、Docker 容器操作

1.创建容器

先创后启方式

docker create -it --name [CONTAINER-NAME] [IMAGE-NAME]:[TAG] [COMMAND]
[root@localhost ~]# docker create -it --name C7 centos:7.4.1708 bash
[root@localhost ~]# docker start C7
  • create:创建容器
  • -i:容器始终保持输入状态
  • -t:为容器分配一个伪终端
  • -it:交互运行

直接运行方式

docker run -it --name [CONTAINER-NAME] [IMAGE-NAME]:[TAG] [COMMAND]
[root@localhost ~]# docker run -it --name C7 centos:7.4.1708 bash
  • run:运行容器
  • --name:容器命名
  • bash:进入容器的命名解析器,sh或bash

2.查看容器

查看容器

语法:docker ps [OPTIONS]
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE             COMMAND   CREATED       STATUS       PORTS     NAMES
581d27672404   centos:7.4.1708   "bash"    3 hours ago   Up 3 hours             test
  • -q:只显示镜像 ID
  • -a:显示全部容器
  • -s:显示 SIZE

查看容器映射端口

语法:docker port [CONTAINER]
[root@localhost ~]# docker port nginx6
80/tcp -> 0.0.0.0:80
80/tcp -> :::80

进入容器

语法:docker exec [OPTIONS] [CONTAINER] [COMMAND]
[root@localhost ~]# docker exec -it test bash -c ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

查看容器日志

语法:docker logs [OPTIONS] [CONTAINER]
[root@localhost ~]# docker logs nginx7
  • 默认打印全部
  • -f:实时打印日志
  • --timestamps:精确时间

3.删除容器

停止容器

语法:docker pause [CONTAINER]												#暂停运行
[root@localhost ~]# docker pause nginx7
[root@localhost ~]# docker ps												#STATUS状态为Pause暂停
CONTAINER ID   IMAGE             COMMAND                  CREATED        STATUS                 PORTS                               NAMES
12fd2b515bd5   nginx:latest      "/docker-entrypoint.…"   23 hours ago   Up 23 hours (Paused)   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx7
语法:docker unpause [CONTAINER]												#继续运行
[root@localhost ~]# docker unpause nginx7
语法:docker stop [CONTAINER]												#停止容器
[root@localhost ~]# docker stop nginx7
语法:docker kill [CONTAINER]												#强制关闭容器
[root@localhost ~]# docker kill nginx7

删除容器

语法:docker rm  [CONTAINER]													#删除容器
[root@localhost ~]# docker rm nginx7

4、容器资源限制

对于主机上 Docker 运行若干容器,每个容器都需要CPU、内存和 IO 资源,对于容器,也可以进行资源限制,以防止占用太多,影响其他甚至是整个主机上的性能。

1.内存限制

[root@localhost ~]# docker run -it -d -m 200M --memory-swap 300M centos:7.4.1708
[root@localhost ~]# docker ps
[root@localhost ~]# cat /sys/fs/cgroup/memory/docker/[写容器 ID]/memory.limit_in_bytes
  • -m:允许分配的内存大小
  • --memory-swap:允许分配的内存和swap的总大小

2.CPU 限制

[root@localhost ~]# docker run -it -d -c 1024 centos:7.4.1708
  • -c:CPU 的权重

3.IO 限制

[root@localhost ~]# docker run -it --device-write-bps /dev/sda:3MB centos:7.4.1708
  • --device-read-bps:限制读某个设备的 bps
  • --device-write-bps:限制写某个设备的 bps(bps 是 byte per second,每秒读写的数据量)
  • --device-read-iops:限制读某个设备的 iops
  • --device-write-iops:限制写某个设备的 iops(iops 是io per second,每秒 io 的次数)
07-20 08:49