Docker 安装
# 20.Docker 安装
讲解下在 Centos7 下安装 Docker
# 官网
Docker 官网:https://www.docker.com (opens new window)
Docker Hub 官网: https://hub.docker.com (opens new window) (有很多 Docker 镜像的仓库,可能得魔法上网)
对于 Docker 初学者,可以从官网上看文档来学习(后续我们也会经常去官网看文档):
例如有如何安装的文档:
Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境(之前也说过,Docker 是基于 Linux 的虚拟化技术的)。
Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。因此,Docker 如果其他系统想部署 Docker,就必须安装一个虚拟的 Linux 环境
在 Windows 上部署 Docker 的方法,通常都是先安装一个虚拟机,并在安装 Linux 系统的虚拟机中运行 Docker
# 准备 Linux
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 (64-bit)上,要求系统为 64 位、Linux 系统内核版本为 3.8 以上,这里选用 Centos7.x。
读者可以使用虚拟机或者云服务器来准备 Linux。
Linux 下,可使用 uname 命令打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等):
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
# uname -r
3.10.0-957.el7.x86_64
2
3
4
5
# Docker 的基本组成
安装之前,先说下 Docker 的基本组成,也是非常重要的 3 个概念。
# 镜像(Image)
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
它也相当于是一个 root 文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
镜像相当于容器的“源代码”,Docker 镜像文件类似 Java 的类模板,Docker 容器实例类似于 Java 中 new 出来的实例对象。
# 容器(Container)
从面向对象角度来看:Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是 Java 中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
从镜像容器角度来看:可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
# 仓库(Repository)
仓库(Repository)是集中存放镜像文件的场所。
类似于其他技术中的:
- Maven 仓库,存放各种 Jar 包的地方;
- GitHub 仓库,存放各种 Git 项目的地方;
- Python 仓库,存放 Python 依赖的地方;
- Node 仓库,存放 NodeJS 依赖的地方
- .....
Docker 公司提供的官方 repository 被称为 Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub (opens new window),存放了数量庞大的镜像供用户下载:
访问国外的网站可能打不开,或者网速慢,可以使用国内的公开仓库阿里云 、网易云等。
# 小结
需要正确的理解仓库/镜像/容器这几个概念:
Docker 本身是一个容器运行载体,也可称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是 image 镜像文件。只有通过这个镜像文件才能生成 Docker 容器实例(类似 Java 中 new 出来一个对象)。
image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
镜像文件:image 文件生成的容器实例,本身也是一个文件,称为镜像文件
容器实例:一个容器运行一种服务,当我们需要的时候,就可以通过 Docker 创建一个对应的运行实例,也就是我们的容器
仓库:就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了
# Docker 平台架构图解(入门篇)
为了能简单了解 Docker 的内部原理,我们讲解下 Docker 内部的架构,为以后深入学习做准备。
先简单看个图:
从左到右依次是:客户端,Docker 服务端,镜像仓库。
Docker 是一个 Client-Server 结构的系统,Docker 守护进程运行在主机上, 然后通过 Socket 连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。(可以看到 Docker 服务端中有个 daemon 的单词,就是指守护进程)
可以类比 MySQL,启动 MySQL 后,后台会有一个 MySQL 的进程;然后可以通过 Navicat 等客户端工具连接 MySQL 并操作。
在 Docker 服务端中,还能看到 Containers 和 Images 两个组成,也就是在创建容器的时候,首先会判断本地有无该镜像,没有则去仓库中获取(docker pull);然后再创建容器。
# Docker 平台架构图解(架构版)
这里讲解下更深层次的架构图解,有个印象即可,为之后的大厂篇做准备。
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。Docker 运行的基本流程为:
- 用户使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
- Docker Daemon 作为 Docker 架构中的主体部分,提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
- Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph driver 将下载镜像以 Graph 的形式存储。
- 当要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成。
- Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作。
示意图:
# Centos7 上安装
安装文档:https://docs.docker.com/engine/install/centos/ (opens new window)
授人以鱼不如授人以渔,要怎么找到这个安装文档呢?首先一般这些开源框架的官网上,都会有 Docs:
然后就能看到有 install 的分类:
然后在左侧菜单能看到有相关的文档:
其实看文档并不复杂(可能对英语有一点点要求)。接下来我们按步骤来:
- 确定 CentOS 版本
- 卸载旧版本
- yum 安装 gcc 相关
- 安装需要的软件包
- 设置 stable 镜像仓库
- 更新 yum 软件包索引
- 安装 DOCKER CE
- 启动 docker
# 确定 CentOS 版本
官网说明:
To install Docker Engine, you need a maintained version of one of the following CentOS versions:
- CentOS 7
- CentOS 8 (stream)
- CentOS 9 (stream)
The
centos-extras
repository must be enabled. This repository is enabled by default, but if you have disabled it, you need to re-enable itopen_in_new (opens new window).
也就是要求 Centos7 及以上版本。我们执行该命令查看版本:
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
2
# 卸载旧版本
官网文档:
Uninstall old versions (opens new window)
Older versions of Docker went by the names of
docker
ordocker-engine
. Uninstall any such older versions before attempting to install a new version, along with associated dependencies.$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
1
2
3
4
5
6
7
8
yum
might report that you have none of these packages installed.Images, containers, volumes, and networks stored in
/var/lib/docker/
aren't automatically removed when you uninstall Docker.
有时候 Centos 会默认安装一些软件,然而这些软件一般是过时了的,因此得卸载。执行:
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2
3
4
5
6
7
8
# yum 安装 gcc 相关
gcc 这些可以说是基本的安装包了,执行:
yum -y install gcc gcc-c++
# 安装需要的软件包,设置 stable 镜像仓库
官网文档:
Installation methods (opens new window)
You can install Docker Engine in different ways, depending on your needs:
- You can set up Docker's repositories (opens new window) and install from them, for ease of installation and upgrade tasks. This is the recommended approach.
- You can download the RPM package and install it manually (opens new window) and manage upgrades completely manually. This is useful in situations such as installing Docker on air-gapped systems with no access to the internet.
- In testing and development environments, you can use automated convenience scripts (opens new window) to install Docker.
大意:你可以用不同方式安装 Docker 引擎,这取决于你的需求:
- 可以设置并安装 Docker repository(推荐使用)
- 使用 rpm 方式安装(相当于下载离线安装包)
- 使用脚本安装
这里我们用第一种,设置并安装 Docker repository。文档说明:
# Install using the rpm repository (opens new window)
Before you install Docker Engine for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
1
2
但是!该 repository 是国外的,由于某些不可描述的原因,使用该地址,后续安装经常会因为网络问题导致安装失败:
[Errno 14] curl#35 - TCP connection reset by peer
[Errno 12] curl#35 - Timeout
2
因此我们得修改下地址为国内阿里云的:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2
# 更新 yum 软件包索引
该步骤官网没有,这是 Centos 的基础知识,建议执行下
yum makecache fast
# 安装 DOCKER CE
终于开始安装 Docker 引擎了,官网文档:
# Install Docker Engine (opens new window)
install Docker Engine, containerd, and Docker Compose:
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1
安装完后,可以看看版本信息:
$ sudo docker version
Client: Docker Engine - Community
Version: 24.0.5
API version: 1.43
Go version: go1.20.6
Git commit: ced0996
Built: Fri Jul 21 20:39:02 2023
OS/Arch: linux/amd64
............
2
3
4
5
6
7
8
9
# 启动 Docker
执行:
sudo systemctl start docker
然后我们可以执行 systemctl status docker
来查看 Docker 状态:running 说明正常启动了
也可以查看下 Docker 的进程:
ps -ef | grep docker
# 测试
官网文档:
Verify that the Docker Engine installation is successful by running the
hello-world
image.$ sudo docker run hello-world
1
我们执行上述命令,Docker 就会帮我们启动一个 hello-world
实例。运行结果:
[root@10 peterjxl]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:dcba6daec718f547568c562956fa47e1b03673dd010fe6ee58ca806767031d1c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
..........
2
3
4
5
6
7
8
9
10
可以看到一开始首先提示本地没有镜像 'hello-world:latest'
,然后就会从仓库中拉取(pulling)
等输出完提示后,HelloWorld 就会停止运行,并且自动终止。那么 Docker run 干了什么?示意图:
# Docker 的卸载
这里仅仅是说明怎么卸载,由于后续学习还要用到 Docker,这里就先不卸载。参考文档 (opens new window):
Uninstall Docker Engine (opens new window)
Uninstall the Docker Engine, CLI, containerd, and Docker Compose packages:
$ sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
1Images, containers, volumes, or custom configuration files on your host aren't automatically removed. To delete all images, containers, and volumes:
$ sudo rm -rf /var/lib/docker $ sudo rm -rf /var/lib/containerd
1
2You have to delete any edited configuration files manually.
(完)