Docker 之一 Docker 介绍与安装

Docker 相关站点

Docker 相关技术

  • Golang
  • CI/CD
  • Mesos
  • Swarm
  • Machine
  • Compose
  • Kubernetes

Docker 的目标

Build and Ship any Application Anywhere,即通过对应组件的封装、分发、部署、运行等生命周期的管理,使用户的应用及其运行环境能够做到 “一次构建,到处运行”,官方图解如下:

docker-description

什么是容器?

  • 一种虚拟化方案
  • 操作系统级别的虚拟化
  • 只能运行相同或相似内核的操作系统
  • 依赖于 Linux 内核特性:Namespace 和 Cgroups(Control Group),前者用于资源隔离,后者用于资源限制
  • 容器只能使用宿主机的 kernel,并且不能修改;即所有容器都共用宿主机的 kernel,在容器中无法对 kernel 进行升级。

Docker 与虚拟机的区别

参考文章:Docker 容器与虚拟机有什么区别,VM vs Docker 的图解如下:

vm-vs-docker

Docker 的三要素介绍

  • 三要素:仓库、镜像、容器
  • Docker 本身是一个容器运行载体或称之为管理引擎,基于 C/S 模式,即客户端 / 守护进程
  • Docker 镜像是层叠的只读文件系统,镜像用作创建 Docker 容器,一个镜像可以创建多个容器
  • 容器是用镜像创建的运行实例,这里的镜像相当于 Java 中的类,容器相当于通过该类创建的对象实例
  • 仓库是集中存放镜像文件的场所,仓库(Repository)和仓库注册服务器(Registry)是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(Tag)
  • 仓库分为公开仓库(Public)和私有仓库(Private)两种形式,最大的公开仓库是 Docker Hub,国内的公开仓库有阿里云、网易云等
  • Docker 架构图
    docker-architecture

为什么要在开发中使用 Docker

  • 一致的开发环境,Docker 可以保证整个研发团队使用一致的开发环境
  • 在开发时只需 Docker,无需在自己的开发主机上搭建各种编程语言环境
  • 简化了编译和构建的复杂性,对于一些动辄数小时的编译和构建工作,可以用 Docker 来简化
  • 部署很简单,应用程序在容器中运行,开发环境与最终的生产环境保持一致,这减少了部署出错的可能性
  • 可以使用同一编程语言(如 go, python, ruby, java, node 等)的多个版本,无需解决多版本冲突的问题
  • Docker 拥有几大特性:持续集成、版本控制、可移植性、隔离性和安全性
  • Docker 属于解决运行环境和配置问题,方便做持续集成,并有助于整体发布的容器虚拟化技术
  • Docker 提供更快速的应用交付和部署,更便捷的升级和扩缩容,更简单的系统运维,更高效的计算资源利用

Docker 各版本对 Centos 的兼容

  • docker-io(旧版本)
    • Centos7(64-bit),Linux 内核版本为 3.10 以上
    • Centos6.5(64-bit)或更高版本,Linux 内核版本为 2.6.32-431 或更高
  • docker-ce(新版本)
    • Centos7(64-bit),Linux 内核版本为 3.10 以上
  • docker 新旧版本名称的区别
    • 旧版本的名称是 docker、docker-io、docker-engine
    • 新版本的名称是 docker-ce(社区版)、docker-ee(企业版)

Centos7 安装 Docker-CE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 查看Centos系统版本
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# 查看Linux内核版本
# uname -a
Linux centos7 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

# 卸载旧版本的Docker,将保留/var/lib/docker/的内容,包括镜像、容器、存储卷和网络
# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

# 如需删除旧版本的所有镜像、容器和存储卷,请运行下列命令
# rm -rf /var/lib/docker

# 安装所需的软件包
# yum install yum-utils device-mapper-persistent-data lvm2

# 添加Docker的阿里云yum镜像仓库(默认使用stable镜像仓库)
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum软件包索引
# yum makecache fast

# 查询可安装的Docker版本
# yum list docker-ce.x86_64 --showduplicates | sort -r
docker-ce.x86_64 3:18.09.0-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

# 安装最新版的Docker-CE
# yum install docker-ce

# 或者安装指定版本的Docker-CE
# yum install docker-ce-18.06.1.ce-3.el7

# 启动Docker
# systemctl start docker

# 设置Dockerr开机自启动(非必需)
# systemctl enable docker

# 查看已安装的Docker版本
# docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:48:22 2018
OS/Arch: linux/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:19:08 2018
OS/Arch: linux/amd64
Experimental: false

# 验证是否正确安装了docker-ce
# 以下命令将下载一个测试镜像并在容器中运行它,容器运行时将输出一条参考消息并退出
# docker run hello-world

Centos7 配置 Docker-CE 的镜像加速

1
2
3
4
5
6
7
8
9
10
11
12
# 创建Docker的配置文件目录
# mkdir -p /etc/docker

# 创建Docker的配置文件,并指定Docker的镜像源地址,其中注册阿里云或者网易云帐号后可以从镜像服务中获取xxxxxx序列号,建议使用阿里云的镜像服务
# vim /etc/docker/daemon.json
{"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]}

# 加载新的配置
# systemctl daemon-reload

# 重新启动Docker
# systemctl restart docker

Centos7 卸载 Docker-CE

1
2
3
4
5
6
7
# 卸载Docker-CE安装包,主机上的镜像、容器、存储卷、或定制配置文件不会自动删除
# yum remove docker-ce

# 如需删除所有镜像、容器和存储卷,请运行下列命令
# rm -rf /var/lib/docker

# 手动删除任何已编辑的Docker配置文件

更改 Docker 默认安装路径

值得一提的是,如果已经存在大量 Docker 容器,更改 Docker 的默认安装路径存在数据丢失的风险,请提前备份重要的数据!建议使用下面介绍的第二种方法进行操作,因为第一种方法存在升级问题,那就是当 Docker 的版本升级后,docker.service 配置文件的内容会被覆盖掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 方法一(通过Docker系统服务的配置文件指定安装目录路径)

# 停止Docker
# systemctl stop docker

# 将原安装目录移动到新安装目录,例如移动至/home/docker
# 注意,这里即使不移动原安装目录也是可以的(Docker会在新目录下自动创建相关文件),只是不移动的话以前的镜像、容器数据就会丢失
# mv /var/lib/docker /home

# 修改docker.service文件,在启动Docker的时候,通过--graph参数指定新安装目录的路径
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:// --graph /home/docker

# 使配置文件生效
# systemctl daemon-reload

# 启动Docker
# systemctl start docker

# 查看Docker默认安装目录是否更改了
# docker info
Docker Root Dir: /home/docker
1
2
3
4
5
6
7
8
9
10
11
12
13
# 方法二(通过建立软链接,将旧的安装目录/var/lib/docker重定向到新的安装目录/home/docker,这样就可以避免修改docker.service文件)

# 停止Docker
# systemctl stop docker

# 移动目录
# mv /var/lib/docker /home

# 创建软链接
# ln -s /home/docker /var/lib/docker

# 启动Docker
# systemctl start docker
1
2
3
4
5
6
7
8
# 验证Docker的默认安装路径更改后,是否可以正常工作

# 查看后台进程
# ps -aux|grep docker

# 测试是否迁移成功
# docker pull centos
# docker run -it centos

Docker 相关文件介绍

1
2
3
Docker默认安装目录:/var/lib/docker
Docker配置文件: /etc/docker/daemon.json
Docker系统服务的配置文件: /usr/lib/systemd/system/docker.service

其他 Linux 发行版安装 Docker-CE