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干了什么?示意图:
# 阿里云镜像加速
还是因为国外网络的问题,拉取镜像时可能会比较慢,为了方便,我们设置镜像从国内的仓库中下载,这里以阿里云为例(也可以选网易云,华为云)
我们可以打开阿里云官网:开放云原生应用-云原生(Cloud Native) (opens new window),然后登录云开发者平台(可复用淘宝账号),然后点击右上角的控制台:
然后找到镜像服务:
然后找到镜像加速器地址并配置:
可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://******.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2
3
4
5
6
7
8
第二个命令就是在文件的末尾(EOF)追加内容(内容就是下面的镜像地址,注意替换为自己的)
然后重启Docker。
执行完后,可以看看该文件的内容是否正确:
cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://******.aliyuncs.com"]
}
2
3
4
# 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.
(完)