
docker 是什么?
docker 采用 google 公司开发的 go 语言编写而成,对进程进行封装隔离,基于操作系统层面的虚拟化技术。由于隔离的进出独立于宿主机和其他隔离的进程,因此也被称之为容器。
容器(Container)
那么什么是容器?j简单说,容器就是应用程序每个组件的独立进程,每个组件(数据库,python程序等)都在独立的容器中运行,它与计算机中的其他组件完全隔离。
容器的特定主要有:
- 自包括,每个容器都具有其运行所需的一切,并且不依赖与主机上任何预安装的依赖项。
- 隔离。每个容器都是独立的,因此单个容器中发送的任何事情都不会影响到主机或者其他运行的容器,这大大提高了应用程序的安全性。
- 独立。每个容器都是独立管理的,删除一个容器也不会影响到其他容器。
- 可移植性。容器可以在任何地方运行。在任何地方都相同的方式运行。
容器的与虚拟机的区别
- 虚拟机: 虚拟机是一个完整的操作系统,拥有自己的内核,硬件驱动程序和软件程序。运行一个虚拟机会让主机花费大量性能。
- 容器: 容器只隔离一个独立进程,其中包括运行所需的所有文件。当有多个容器运行时,它们会共享同一个系统内核,这样就可以在花费少量的性能来运行多个应用程序。
现在为了最大化的利用硬件性能,虚拟机和容器通常是结合在一起使用的。例如我们购买的云服务器,上面运行的操作系统其实就是云服务提供商通过虚拟机在一台服务器上虚拟出来的。这样一台服务器可以运行多个操作系统,减少资源浪费降低成本。同时,我们有时候也会在云服务器上运行一些容器化的应用程序。减少开发成本和服务器压力。从而可以让服务器运行更多程序或者留出性能以更好的运行程序。
镜像(Image)
容器是一个独立运行的进程,那么它运行时需要的资源从何而来?那就就是镜像的作用。
举一个简单的例子,我们计算机中都运行着软件,这些软件能够运行的前提是因为有可以承载这个软件的操作系统。而镜像可以简单的理解为软件运行时所需要的基础文件。
例如一个 pyhton web 应用,它的镜像就是 python 运行环境(用于运行 Python 程序),Python 代码(软件的运行代码),依赖库(Python pip包,第三方库等),数据库等(检索,存储数据)。
镜像有两个重要的原则:
- ==镜像一旦被创建就不可变,无法更改,只能在其上添加新的功能。==
- ==容器的镜像由层组成,每一层都基于前一层构建,后层修改不会影响前一层的内容。==
分层存储
如上面所说,镜像由层组成,镜像构建时,会一层层构建,前一层时后一层基础。每一层构建完后不会更改。后一层上的任何变化都只会作用于自己在的一层。例如删除前一层文件的操作,实际上不是正真的删除前一层的文件,只是对文件做了删除的标记。最终容器运行时,虽然看不到这个文件,但是这个文件会一直跟随着镜像。因此在构建镜像时,每一层尽量只包括该层需要添加的东西,任何额外的东西需要在该层构建结束前清除。
分层存储的特征:
- 镜像复用: 例如两个个容器都使用的是 Python 3.12 这个版本的 python.,那么这两个容器可以共同使用同一个版本的 Pythion,不需要重复存储同样的内容。
- 定制化: 当某个容器镜像的某些功能不嫩满足需求时,可以在此基础上构建一个新层来添加功能。最后构建为一个新的镜像来使用。
仓库(Repository)
镜像构建完毕后,可以很轻松的在本地运行,但是,如果其他服务器要使用这个镜像,就需要从一个集中管理镜像的地方上分发镜像。这个集中管理镜像的地方就是仓库。Docker Registry 就提供这种服务。
==一个 Docker Registry 中包含多个仓库(Repository) ,每个仓库可以包含多个标签(Tag),每个标签就对应一个镜像。==
仓库中会包含一个软件的多个扳本,而标签就用于对应该软件的各个扳本。我们可以通过<仓库名>:<标签> 的格式来指定该软件的具体扳本。如果不指定标签,那么默认以 latest 作为默认标签。
例如,Ubuntu 镜像,我现在需要 16.04,这个版本的,那么我在下载镜像时要这样写:Ubunutu:16.04。
仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
Docker Registry 公开服务
公开服务就是可以提供给任何用户使用,允许用户管理镜像的 Registry 服务,这类公开服务允许用户免费上传,下载公开镜像,并可提供收费服务公用户管理私有镜像。
最常用的 docker 公开服务器就是官方的 docker hub,这也是 docker 默认的 Registry 地址,拥有大量高质量官方镜像。其他的公开服务有 Red hat 的 Quay.io,Google 的 Google Container Registry,代码托管管理平台 Github 的 ghcr.io。
由于不可抗因素,国内无法直接访问 Docker hub,这个时候就需要使用镜像加速器。常见的加速服务有 阿里镜像加速(阿里云服务器内部使用) 、1ms 毫米镜像加速(每个IP每天2G流量额度) 等。使用镜像加速可以直接从国内下载 docker hub 镜像,加快镜像拉取速度。
私有 Docker Registry
私有镜像可以用于在不能连接外网的场景,在本地局域网部署私有 Docker Registry。可以增加安全性和限制拉取外部镜像。
docker 官方提供 Docker Registry 的镜像,可以直接使用变为私有 Registry。
docker 安装
需要注意的是 docker 的核心功能其实是基于 linux 的底层功能开发的。windows 安装 docker 时需要开启 wsl 2(适用于 windwos 的 linux 子系统)。 由于各个系统安装的方式都不太相同,所以请按照自己所使用系统和版本进行安装。
镜像加速器
由于一些原因,国内无法直接访问 docker hub 拉取镜像,为了能够在国内能够顺利拉取镜像,可以配置 docker 镜像加速使用国内镜像节点来拉取镜像。
国内的镜像节点目前基本是都已经关闭,仅存的几个可用的镜像站不并不是特别稳定,因此建议同时配置多个加速地址,以防镜像服务器宕机导致无法拉取和上传镜像。
Linux 镜像加速设置。
==此方法仅适用于基于 systemd 进行服务器管理的 Linux 发行版。==
首先执行以下命令,查看是否在 docker-service 文件中配置过镜像地址。
shibo@DESKTOP-SBUFLRT:~$ systemctl cat docker | grep '\-\-registry\-mirror'
注: 查看上面命令是否有输出,如果有输出,那么执行 systemctl cat docker 查看 ExecStart= 出现的位置,修改对应的文件内容去除 、--registry-mirror 参数。并按按照下面的步骤进行配置。
如果没有输出,那么进入 /etc/docker/daemon.json (如果没有该文件,请自行创建) 文件对其进行编辑,这里以 1ms 镜像为例:
{
"registry-mirrors": ["https://docker.1ms.run"]
}
然后重新启动服务:
shibo@DESKTOP-SBUFLRT:~$ sudo systemctl daemon-reload
shibo@DESKTOP-SBUFLRT:~$ sudo systemctl restart docker
开启实验特性
一些 docker 命令为实验命令,需要开启实验特性功能才能使用,请按照以下的方法进行设置。
docker CLI 实验特性
从 v20.10 版本开始,Docker CLI 所有的实验特性的命令均默认开启,无需再次配置或则设置系统环境变量。
开启 dockerd 实验特性。
编辑 /etc/docker/daemon.json ,新增如下条目:
{
"experimental":true
}