1.1 Docker简介

  • 于2013年根据Apache2.0协议开源
  • 使用Go语言进行开发
  • 基于Linux内核对进程封装隔离,属于操作系统层面的虚拟化技术
  • 从1.11版本开始,使用runc和containerd来实现

image.png

  • containerd

    containerd 是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。


1.1.1 Docker与通常的虚拟机的区别

传统虚拟机 容器
原理: 虚拟一套硬件,在其上运行操作系统,再在系统上运行所需应用进程。 容器内的进程直接运行于宿主机的内核上,容器没有自己的内核,也没有进行硬件的虚拟。所以比传统虚拟机更轻便。

image.png
从上图可知:
VM在宿主机host上先是应用程序hypervisor,然后依次建立虚拟机,虚拟化的仓库,然后安装程序。
Docker是在宿主机(host)中的OS上面是Docker Engine,然后直接在Doker Engine上安装应用。

1.2 Docker三大基本概念

image.png
Docker 包括三个基本概念

  • 仓库(Repository)
  • 镜像(Image)
  • 容器(Container)

另外Docker Registry仓库注册服务器: 存放仓库的地方

1.2.0 Docker仓库注册服务器

  • Docker Registry是一项服务,提供镜像集中的存储、分发
  • 一个Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag)或者说版本标签;每个标签对应一个镜像。
  • 包含如Ubuntu仓库、CentOS仓库等

Docker Registry 公开服务

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的Registry公开服务是 Docker Hub,这也是默认的Registry,拥有大量的高质量的 官方镜像;还有红帽的Quay.io;Google 的 Google Container Registry Kubernetes 的镜像使用的就是这个服务;代码托管平台 GitHub (opens new window)推出的 ghcr.io
国内访问这些服务比较慢,国内云服务商提供了针对Docker Hub的镜像服务(Registry Mirror),如阿里云加速器、网易云加速器、腾讯云加速器等。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 网易云镜像服务DaoCloud 镜像市场阿里云镜像库等。

私有 Docker Registry

除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。

1.2.1 Docker仓库

  • 存放不同版本docker镜像的场所
  • 分为公开仓库、私有仓库
  • 每个仓库可以包含多个标签

可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
eg:以Ubuntu仓库为例: keen/ubuntu:16.04
keen/ubuntu:16.04:代表用户keen用户下的16.04版本的ubuntu镜像
keen:为多用户环境下的用户名
ubuntu:仓库的名字
16.04 / 18.04 :版本标签,忽略标签默认为latest,即ubuntu:latest

1.2.2 Docker镜像

  • 一个配置好环境的root文件系统。
  • 该文件系统提供容器运行时所需的程序、库、资源、配置等文件
  • 还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
  • 不包含任何动态数据,内容在构建后也不会被改变

操作系统分为 内核用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。

  • 镜像的分层存储

镜像采用分层存储的架构,其实际体现并非由一个文件组成,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
镜像的复用、定制变得容易,可以用之前构建好的镜像作为基础层,然后进一步添加新的层来定制自己所需的新镜像。

1.2.3 Docker容器

  • 容器是镜像运行起来的实体
  • 容器可以被创建、启动、停止、删除、暂停等
  • 容器本质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间,因此容器拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间
  • 容器内的进程是运行在一个隔离的环境中,使得容器封装的应用比直接在宿主机上的应用更安全


  • 容器的分层存储

每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

  • 注意:

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

1.3 Docker安装

Docker安装
在CentOS7.6上安装过程:
系统要求:
Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并且部分功能可能不太稳定。

1、卸载旧版本

旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本:

  1. sudo yum remove docker \
  2. docker-client \
  3. docker-client-latest \
  4. docker-common \
  5. docker-latest \
  6. docker-latest-logrotate \
  7. docker-logrotate \
  8. docker-selinux \
  9. docker-engine-selinux \
  10. docker-engine

2、使用yum安装

执行以下命令安装依赖包:

  1. $ sudo yum install -y yum-utils

鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
执行下面的命令添加 yum 软件源:

  1. $ sudo yum-config-manager \
  2. --add-repo \
  3. https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  4. $ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
  5. # 官方源
  6. # $ sudo yum-config-manager \
  7. # --add-repo \
  8. # https://download.docker.com/linux/centos/docker-ce.repo

如果需要测试版本的 Docker 请执行以下命令:

  1. $ sudo yum-config-manager --enable docker-ce-test

如果需要测试版本的 Docker 请执行以下命令:

  1. $ sudo yum-config-manager --enable docker-ce-test

3、安装Docker

更新 yum 软件源缓存,并安装 docker-ce

  1. $ sudo yum install docker-ce docker-ce-cli containerd.io

4、启动 Docker

  1. $ sudo systemctl enable docker
  2. $ sudo systemctl start docker

5、建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket (opens new window)与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立 docker 组:

  1. $ sudo groupadd docker

将当前用户加入 docker 组:

  1. $ sudo usermod -aG docker $USER

退出当前终端并重新登录,进行如下测试。

6、测试是否正确安装

  1. $ docker run --rm hello-world
  2. Unable to find image 'hello-world:latest' locally
  3. latest: Pulling from library/hello-world
  4. b8dfde127a29: Pull complete
  5. Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
  6. Status: Downloaded newer image for hello-world:latest
  7. Hello from Docker!
  8. This message shows that your installation appears to be working correctly.
  9. To generate this message, Docker took the following steps:
  10. 1. The Docker client contacted the Docker daemon.
  11. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
  12. (amd64)
  13. 3. The Docker daemon created a new container from that image which runs the
  14. executable that produces the output you are currently reading.
  15. 4. The Docker daemon streamed that output to the Docker client, which sent it
  16. to your terminal.
  17. To try something more ambitious, you can run an Ubuntu container with:
  18. $ docker run -it ubuntu bash
  19. Share images, automate workflows, and more with a free Docker ID:
  20. https://hub.docker.com/
  21. For more examples and ideas, visit:
  22. https://docs.docker.com/get-started/

若能正常输出以上信息,则说明安装成功。

7、镜像加速

Docker镜像加速
阿里云镜像加速
目前主流 Linux 发行版均已使用 systemd (opens new window)进行服务管理,这里介绍如何在使用 systemd 的 Linux 发行版中配置镜像加速器。
请首先执行以下命令,查看是否在 docker.service 文件中配置过镜像地址。

  1. $ systemctl cat docker | grep '\-\-registry\-mirror'

1
如果该命令有输出,那么请执行 $ systemctl cat docker 查看 ExecStart= 出现的位置,修改对应的文件内容去掉 --registry-mirror 参数及其值,并按接下来的步骤进行配置。
如果以上命令没有任何输出,那么就可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

  1. {
  2. "registry-mirrors": [
  3. "https://hub-mirror.c.163.com",
  4. "https://mirror.baidubce.com",
  5. "https://ua908q4c.mirror.aliyuncs.com",
  6. "https://mirror.ccs.tencentyun.com"
  7. ]
  8. }

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。

之后重新启动服务。

  1. $ sudo systemctl daemon-reload
  2. $ sudo systemctl restart docker

1.4 Docker的本地存储

在Linux中,Docker容器默认存储位置在/var/lib/docker 目录下面,可以通过命令查看

  1. docker info | grep "Docker Root Dir"

docker pull下载的镜像存在该目录,当下载的镜像过多,或容器运行过程中产生大量数据导致存储容量不足时,可以修改镜像储存的位置,有以下几种方式修改docker默认储存位置:

  • 使用软链接方式
  • 指定容器启动参数
  • System下创建配置文件

1.4.1 使用软链接方式

  • 首先停止docker 进程
  • 然后进行链接

    1. #stop
    2. $ sudo systemctl stop docker
    3. #move
    4. $ mv /var/lib/docker /data/docker
    5. #ln 构建软链接
    6. $ ln -sf /data/docker /var/lib/docker
  • 然后移动整个 /var/lib/docker 目录到空间比较大的目的路径。这时候启动 Docker 时发现存储目录依旧是 /var/lib/docker 目录,但是实际上是存储在数据盘 /data/docker 上了。

    1.4.2 指定容器启动参数

  • 在配置文件中指定容器启动的参数 —graph=/var/lib/docker 来指定镜像和容器存放路径。Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致。在 Ubuntu 中的位置是 /etc/default/docker 文件,在 CentOS 中的位置是 /etc/sysconfig/docker 文件。

  1. #Cent 7
  2. # 更改储存位置
  3. $ vi /usr/lib/systemd/system/docker.service
  4. ExecStart=/usr/bin/dockerd --graph /new-path/docker
  5. sudo systemctl restart docker
  • 如果 Docker 的版本是 1.12 或以上的,可以修改或新建 daemon.json 文件。修改后会立即生效,不需重启 Docker 服务。
  1. # 修改配置文件
  2. $ vim /etc/docker/daemon.json
  3. {
  4. "registry-mirrors":
  5. ["http://7e61f7f9.m.daocloud.io"],
  6. "graph": "/new-path/docker"
  7. }

1.4.3 System下创建配置文件

  • 在 /etc/systemd/system/docker.service.d 目录下创建一个 Drop-In 文件 docker.conf,默认 docker.service.d 文件夹不存在,必须s先创建它。创建 Drop-In 文件的原因,是我们希望 Docker服务使用 docker.conf 文件中提到的特定参数,将默认服务所使用的位于 /lib/systemd/system/docker.service 文件中的参数进行覆盖。
  1. # 定义新的存储位置
  2. $ sudo vi /etc/systemd/system/docker.service.d/docker.conf
  3. [Service]
  4. ExecStart=/usr/bin/dockerd --graph="/data/docker" --storage-driver=devicemapper
  5. # 重启
  6. $ sudo systemctl start docker
  • /data/docker 就是新的存储位置,而 devicemapper 是当前 Docker 所使用的存储驱动。如果你的存储驱动有所不同,请输入之前第一步查看并记下的值。现在,你可以重新加载服务守护程序,并启动 Docker 服务了,这将改变新的镜像和容器的存储位置。为了确认一切顺利,运行 docker info 命令检查 Docker 的根目录。

1.5 Docker管理可视化

Docker系列之十一:可视化界面Portainer的搭建 byCSDN
Portainer 安装与配置
Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

1.5.1 下载Portainer镜像

  1. # 搜索镜像
  2. docker search portainer/portainer
  3. # 拉取镜像
  4. docker pull portainer/portainer
  5. # 运行镜像
  6. docker run -d -p 9000:9000 -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name dev-portainer portainer/portainer

参数说明:

-d 容器在后台运行 -p 9000:9000 宿主机9000端口映射容器中9000端口 -v /var/run/docker.sock:/var/run/docker.sock 把宿主机的Docker守护进程(docker daemon)默认监听的Unix域套接字挂载到容器中 -v /root/portainer:/data 把宿主机目录 /root/portainer 挂载到容器 /data 目录 —name dev-portainer portainer/portainer 指定运行容器的名称为dev-portainer

注意: 在启动容器时必须挂载本地 /var/run/docker.socker与容器内的/var/run/docker.socker连接。

1.5.2 测试Portainer

通过ip:9000来访问Portainer服务

  • 第一次登录需要修改密码

image.png

  • 选择本地

image.png

  • 进行管理

image.png