初始docker与安装
# 初识docker与安装
# docker的诞生
在传统的软件开发和部署流程中,因为不同的开发人员之间以及开发环境与生产环境之间的配置常常难以保持一致,常会导致“在我机器上运行得好好的,在你机器上就不行”的问题。
不同服务器操作系统不一致、不同项目中所用库版本以及各种依赖关系的差异,使得程序从一台服务器迁移到另一台服务器时,常常需要重新配置和安装各种依赖,为了能更快的部署程序,我们能否把程序所需的环境一起给复制呢。
最初我们可以使用虚拟机来解决,虚拟机允许在同一台物理计算机上运行多个独立的操作系统实例,从而实现硬件资源(CPU、内存、磁盘和网络)的安全隔离和有效共享,这样一来我们就能实现程序跟环境一起复制。
但随着发展,我们发现传统的虚拟机技术虽然可以隔离运行环境,但开销大,启动慢,硬件资源利用率不高。于是docker诞生了,Docker利用并整合了Linux内核提供的Cgroups、Namespaces、Union FS(如AUFS、OverlayFS等)等技术,创造出轻量级的容器化解决方案。 不同于传统的虚拟机,docker虚拟化的空间只是某个程序所需要的全部资源,也只是能让该程序运行起来,并不是一个完整的操作系统。
# 优势
docker是一种容器化的虚拟技术,它比起传统虚拟机的启动更加快速,资源利用效率更高,实现了程序跟程序之间的隔离,解决了程序可移植性差的问题。
# 不足之处
【额外的资源消耗】使用docker,虚拟化容器技术,会导致额外的性能开销。在一些大型项目中,往往需要保持高效的运行、保持高IO性能。如果使用docker,则需要的容器实例更多,因此导致的资源浪费和性能瓶颈也更大,这是我们不愿看到的。
【管理复杂】大型项目往往涉及多个服务组件的互相调用。使用Docker后,容器数量剧增,容器编排、网络配置、存储管理、服务发现、负载均衡等都会变得更加复杂。
【安全隔离性不足】Docker容器共享宿主机的内核,这意味着如果某个容器存在安全漏洞,攻击者有可能借此影响到其他容器甚至宿主机。对于安全要求极高的大项目,这种级别的隔离可能不够充分
此外还有数据持久化问题、日志管理问题等,每个新技术都会解决一些问题,同时会面临一些新问题,因此我们在程序发布时,需要结合具体情况来进行选择,使用docker或者不使用,或者docker跟虚拟机结合。
# 安装
# 系统要求
Docker 的使用确实对 Linux 内核有特定的要求,主要是因为它依赖于 Linux 内核的一些功能,尤其是 cgroups(Control Groups)和 namespaces 技术,这些功能用于实现资源限制、隔离和进程管理。以下是关于 Docker 对 Linux 内核版本要求的一些关键点:
- 最低内核版本要求:Docker 要求最低的内核版本通常是 3.10 或更高。低于这个版本的内核可能缺失运行 Docker 容器所需的一些功能,并可能导致数据丢失或遇到其他稳定性问题。(针对centos7来说)
- 推荐内核版本:尽管最低要求可能是 3.10,但为了获得最佳的稳定性和功能支持,建议使用更高版本的内核。例如,对于 Ubuntu 16.04,建议使用 4.4 或更高版本;对于 CentOS 7,建议使用 3.10 或更高版本。
- 发行版支持:不同的 Linux 发行版可能会有不同的 Docker 安装和配置指南,以及推荐的内核版本。安装 Docker 之前,确认你的发行版版本和内核版本是否得到官方支持。
官网说明-对CentOS的要求 (opens new window)
查看系统内核指令:
uname -r
首次安装 Docker 之前,需要添加 Docker 安装源。添加之后,我们就可以从已经配置好的源,安装和更新 Docker。添加 Docker 安装源的命令如下:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
当然更新yum也是必不可少的,
sudo yum update
sudo yum install -y yum-utils
2
第二部指令,下文会有解释
# 安装指令
正常情况下,直接安装最新版本的 Docker 即可,因为最新版本的 Docker 有着更好的稳定性和安全性。你可以使用以下命令安装最新版本的 Docker。
$ sudo yum install docker-ce docker-ce-cli containerd.io
如果你想要安装指定版本的 Docker,可以使用以下命令:
$ sudo yum list docker-ce --showduplicates | sort -r
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
2
3
4
5
6
7
8
然后选取想要的版本执行以下命令:
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
安装完成后,使用以下命令启动 Docker。
$ sudo systemctl start docker
这里有一个国际惯例,安装完成后,我们需要使用以下命令启动一个 hello world 的容器。
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:7f0a9f93b4aa3022c3a4c147a449bf11e0941a1fd0bf4a8e6c9408b2600777c5
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
2
3
4
5
6
7
运行上述命令,Docker 首先会检查本地是否有hello-world
这个镜像,如果发现本地没有这个镜像,Docker 就会去 Docker Hub 官方仓库下载此镜像,然后运行它。最后我们看到该镜像输出 “Hello from Docker!” 并退出。
# 验证安装
验证 Docker 是否安装成功并查看其版本:
docker --version
如果一切顺利,你应该能看到 Docker 的版本信息输出。
在执行
sudo yum install -y yum-utils
命令时,有几个关键点解释了为何需要这一步骤:
- yum-utils:
yum-utils
是一组扩展了yum
包管理器功能的工具集合。这些工具提供了额外的实用功能,使得管理软件包、仓库和其他与yum
相关的任务更加方便高效。其中包括但不限于yum-config-manager
、reposync
、yumdownloader
等。这些工具对于配置新的软件仓库、管理仓库设置、下载 RPM 包及其依赖等任务非常有用。- -y: 这个选项告诉
yum
自动回答“yes”(即同意)所有提示问题,无需用户交互。在自动化脚本或者当你确定要安装列出的所有软件包及其依赖时不希望被提示确认的情况下,这个选项非常有用。它避免了安装过程中的手动确认步骤,使得整个安装流程更加流畅。- sudo: 使用
sudo
是因为安装软件包通常需要管理员权限。yum
命令会修改系统级别的软件包数据库和文件,这些操作影响整个系统,而非仅限于当前用户。因此,普通用户直接运行yum
安装命令会被拒绝权限,使用sudo
可以临时提升权限以执行这一操作。综上所述,
sudo yum install -y yum-utils
这条命令的作用是安装一组增强yum
功能的工具,并通过-y
参数自动接受安装过程中的一切默认选项,使用sudo
则是为了确保拥有足够的权限执行系统级别的更改。这对于准备系统以安装像 Docker 这样的软件,特别是在需要添加或管理额外软件仓库时是必要的一步。
# 验证是否运行
你可以使用以下命令来查看 Docker 是否正在运行:
sudo systemctl is-active docker
这个命令会检查 Docker 服务的状态,并返回以下三种结果之一:
active
:表示 Docker 正在运行。inactive
:表示 Docker 未运行。unknown
:表示无法确定 Docker 的状态,这可能是因为 Docker 未安装或有其他系统问题。
或者,看更详细的信息
sudo systemctl status docker
或者,通过ps
ps -ef|grep docker
# 停止运行
sudo systemctl stop docker
在一些较旧的 Linux 发行版中,还可以使用
sudo service docker stop
# 卸载
在Linux中卸载Docker的过程通常涉及以下几个步骤,对于使用YUM或DNF的系统(如RHEL, CentOS, Fedora):
- 停止docker服务
sudo systemctl stop docker
当你尝试停止Docker服务并收到警告“Warning: Stopping docker.service, but it can still be activated by: docker.socket”时,这意味着即使你停止了docker.service
,只要有人尝试通过Docker套接字与Docker通信,systemd将会自动重新启动Docker服务。这是因为docker.socket
单元独立于docker.service
存在,用于监听Docker套接字上的连接请求。
要彻底停止Docker服务并防止它因套接字激活而自动重启,你应该同时停止docker.socket
服务。可以通过运行以下命令来实现:
sudo systemctl stop docker.socket
sudo systemctl stop docker
2
- 卸载Docker CE及相关的依赖包:
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 remove docker-ce docker-ce-cli containerd.io
注意:卸载 Docker 时,/var/lib/docker/
,/var/lib/containerd
,存储的图像、容器、卷和网络不会被自动删除。
若有需要:
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
2