Skip to content

12、Docker基本概念 容器与镜像与安装

1、Docker简介

Docker是一种开源的容器引擎,可以帮助开发人员轻松地构建、部署和运行容器化应用程序。Docker可以将应用程序及其依赖项打包为一个可移植的容器,然后在任何支持Docker的平台上运行,无论是物理机、虚拟机还是云。

2、Docker公司

Docker是一家位于美国旧金山的软件公司,由法裔美籍开发者和企业家Solumon Hykes创立,主要开发和维护Docker容器引擎和相关的开源项目。Docker公司的使命是通过提供一个开放、轻量级的容器平台,帮助开发人员和运维团队更加高效地构建、部署和管理应用程序。

Docker公司的前身是dotCloud公司,以下是dotCloud到Docker的发展历程:

  1. 2008年:dotCloud公司成立,旨在为开发人员提供基于云计算的应用程序平台。
  2. 2011年:dotCloud公司开始开发Docker容器技术,并在2013年发布了Docker的第一个版本。
  3. 2013年:dotCloud公司决定将Docker开源,并建立了Docker社区。
  4. 2014年:dotCloud公司将其重心转向Docker,将公司名称改为Docker Inc.。
  5. 2015年:Docker公司推出了Docker Compose和Docker Swarm等工具,帮助开发人员更加方便地管理容器化应用程序。
  6. 2017年:Docker公司推出了Docker EE(Enterprise Edition),为企业用户提供更加安全、可靠的容器化解决方案。
  7. 2019年:Docker公司宣布将Docker Enterprise业务出售给Mirantis公司,专注于开发和维护Docker开源项目。

Docker引擎主要有两个版本:企业版(EE)和社区版(CE)。

每个季度,企业版和社区版都会发布一个稳定版本:社区版本会提供4个月的支持,而企业版本会提供12个月的支持。

从2017年第一季度开始,Docker版本号遵循YY.MM-xx格式,例如。2018年6月第一次发布的社区版本为18.06.0-ce.

注:2017年第一季度以前,Docker版本号遵循大版本号.小版本号的格式。采用新格式前的最后一个版本是Docker 1.13。

3、使用Docker的好处

  • 可以使用镜像快速构建一套标准的开发环境,快速部署代码
  • 高效的资源利用,可以实现更高的性能,同时对资源的额外需求很低
  • 兼容性高,让用户可以在不同平台间轻松的迁移应用
  • 可以实现自动化且高效的容器管理

4、为什么使用Docker

对于开发和运维人员来说,最希望的效果就是一次创建或者配置后,可以在任意地方、任意时间让应用正常运行,对于算法研究人员来说,可能不同的算法需要不同版本的软件,那么在同一个环境中就会存在冲突,docker 的环境隔离就可以很方便的用于不同环境的配置。具体来说,docker优势主要有以下几个方面:

  • 快速交付和部署

    使用docker,开发人员可以使用镜像快速构建一套标准的开发环境;开发完成后,测试和运维人员可以使用完全相同的环境部署代码,只要是开发测试过的代码就可以确保在生产环境无缝运行。docker可以快速创建和删除容器,实现快速迭代。

  • 高效的资源利用

    运行docker容器不需要额外的虚拟化管理程序的支持,docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。

  • 轻松的迁移和扩展

    docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、服务器等,同时支持主流的操作系统发行版本,这种兼容性让用户可以在不同平台间轻松的迁移应用。

  • 简单的更新管理

    使用Dockerfile生成镜像的方式,只需要小小的配置修改,就可以替代以往大量的更新工作,所有的修改都以增量的方式进行分发和更新,从而实现自动化且高效的容器管理。

5、Docker架构

image-20250729104127328

  • Client: 客户端;操作docker服务器的客户端(命令行或者界面)
  • Docker_Host:Docker主机;安装Docker服务的主机
  • Docker Daemon:后台进程;运行在Docker服务器的后台进程
  • Containers:容器;在Docker服务器中的容器(一个容器一般是一个应用实例,容器间互相隔离)
  • Images:镜像、映像、程序包;Image是只读模板,其中包含创建Docker容器的说明。容器是由Image运行而来,Image固定不变。
  • Registries:仓库;存储Docker Image的地方。官方远程仓库地址: https://hub.docker.com/search

Docker用Go编程语言编写,并利用Linux内核的多种功能来交付其功能。 Docker使用一种称为名称空间的技术来提供容器的隔离工作区。 运行容器时,Docker会为该容器创建一组名称空间。 这些名称空间提供了一层隔离。 容器的每个方面都在单独的名称空间中运行,并且对其的访问仅限于该名称空间。

Docker面向对象
镜像(Image)
容器(Container)对象(实例)

Docker架构可以分为三个主要部分:Docker客户端Docker守护进程Docker镜像仓库

  1. Docker客户端:Docker客户端是用于与Docker守护进程进行交互的命令行工具或图形界面。它可以向Docker守护进程发送命令,例如构建、运行、停止和删除容器等操作。
  2. Docker守护进程:Docker守护进程是运行在主机上的后台进程,负责管理和维护Docker容器和镜像。它接收来自Docker客户端的请求,执行相应的操作,并回传操作结果。Docker守护进程还负责监控容器的运行状态、容器间的网络通信和存储卷的管理等任务。
  3. Docker镜像仓库:Docker镜像仓库是用于存储和管理Docker镜像的中央化存储库。它可以是公共仓库,例如Docker Hub,也可以是私有仓库,例如企业内部的镜像仓库。Docker镜像仓库提供了镜像的上传、下载和分享等功能,方便开发人员和运维人员共享和重复使用镜像。

6、Docker安装与卸载

在Linux上安装Docker是常见的安装场景,并且安装过程非常简单。本章节基于Centos版本Linux,至于Linux操作系统是安装在自己的数据中心,还是第三方公有云,都没有任何区别,只要能访问https://get.docker.com即可

首先需要选择安装的Docker版本。当前有两个版本可以选择:社区版(Community Edition,CE)和企业版(Enterprise Edition,EE)。

Docker CE是免费的,下面的示例也将采用此版本。Docker EE包含Docker CE中的全部功能。

1、Docker卸载

1、停止和删除所有 Docker 容器

使用以下命令停止和删除所有正在运行的 Docker 容器:

sh
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)

2、删除所有 Docker 镜像

使用以下命令删除所有 Docker 镜像:

sh
docker rmi $(docker images -q)

3、卸载 Docker

使用以下命令卸载 Docker:

  • 对于 CentOS 系统:
sh
sudo yum remove docker*

4、删除 Docker 相关文件

使用以下命令删除 Docker 相关的文件和目录:

sh
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

5、删除 Docker 用户组

使用以下命令删除 Docker 用户组:

sh
sudo groupdel docker

完成以上步骤后,Docker 就已经完全从系统中卸载了。需要注意的是,在执行以上命令时,请确保备份重要数据并谨慎操作,以免误删或损坏系统文件

2、wget安装

使用wgethttps://get.docker.com获取并运行Docker安装脚本,然后采用Shell中的管道(pipe)的方式来执行这个脚本。

sh
wget -qO- https://get.docker.com/ | sh
  • wget 是一个用于从 Internet 上下载文件的命令行工具。
  • -q(或 --quiet)选项表示执行命令时不输出任何信息,即 "quiet" 模式。
  • -O-(或 --output-document=-)选项表示将下载的内容输出到标准输出(stdout)中,即 "-" 表示标准输出。
  • wget -qO- 命令的作用是从 Internet 上下载文件并将其内容输出到标准输出中,同时不显示任何下载进度或其他信息。通常,这个命令会被用来将一个远程文件的内容传递给另一个命令或程序进行处理,例如将一个远程脚本下载下来并在本地执行。
sh
# 如果输入以下命令能正常输出信息就说明已经安装成功
$ docker --version
Docker version 23.0.5, build bc4487a

$ docker system info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.10.4
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.17.3
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info

建议:最好通过非root用户来使用Docker。这是需要添加非root用户到本地Docker Unix组当中。

sh
# 创建用户
useradd docker-test-user
# 将用户 docker-test-user 添加到 docker 用户组中,从而使其能够使用 Docker 命令
sudo usermod -aG docker docker-test-user
# 确认操作是否执行成功
cat /etc/group | grep docker

如果使用root用户运行Docker容器,容器中的进程将以root用户身份运行,这意味着容器中的任何进程都可以访问主机上的任何文件和资源,这增加了系统被攻击的风险。另外,如果容器中的进程不小心修改了主机上的文件或系统配置,这可能会导致系统出现问题。

因此,为了最大程度地减少安全风险,建议使用非root用户来安装和运行Docker容器。这样,在容器中运行的进程将被限制在非root用户的权限范围内,从而避免了潜在的安全问题。

3、yum安装

1、设置docker yum源

sh
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2、安装docker engine

最新的

sh
sudo yum install docker-ce docker-ce-cli containerd.io

指定版本

sh
#找到所有可用docker版本列表
yum list docker-ce --showduplicates | sort -r
# 安装指定版本,用上面的版本号替换<VERSION_STRING>
#sudo yum install docker-ce-<VERSION_STRING>.x86_64 docker-ce-cli-<VERSION_STRING>.x86_64 containerd.io
#例如
yum install -y docker-ce-19.03.9  docker-ce-cli-19.03.9 containerd.io

3、离线安装

  1. 下载 Docker 安装包

从 Docker 官方网站下载适用于您操作系统版本的 Docker 安装包,例如 docker-ce-<VERSION>.tgz

可以在具有网络连接的计算机上下载该文件,并将其复制到离线计算机上,或者可以在离线计算机上使用浏览器下载该文件。

  1. 将安装包复制到离线计算机

将下载的 Docker 安装包复制到离线计算机上的目录中,例如 /opt/docker-ce

  1. 解压安装包

使用以下命令解压 Docker 安装包:

sh
tar -xzf docker-ce-<VERSION>.tgz
  1. 运行 Docker 安装脚本

使用以下命令运行 Docker 安装脚本:

sh
cd docker-ce-<VERSION>
sudo sh ./install.sh

该脚本将安装 Docker 并设置 Docker 服务以在系统启动时自动启动。

  1. 添加用户到 Docker 用户组

使用以下命令将用户添加到 Docker 用户组中:

sh
sudo usermod -aG docker <USER>

这将允许用户在不使用 sudo 的情况下运行 Docker 命令。

补充一种方式:

sh
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
rpm -ivh xxx.rpm
https://docs.docker.com/engine/install/binaries/#install-daemon-and-client-binaries-on-linux

4、启动服务

sh
# 启动
systemctl start docker

# 开机自启
systemctl enable docker

# 如果报以下错误
Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed docker.service" followed by "systemctl start docker.service" again.

# 这个错误提示表明 Docker 服务启动尝试次数过多,导致启动失败。可以按照提示执行以下命令以重置 Docker 服务的启动状态,并重新启动 Docker 服务:
systemctl reset-failed docker.service
systemctl start docker.service

5、镜像加速

sh
#/etc/docker/daemon.json 是Docker的核心配置文件。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://0vmzj3q6.mirror.aliyuncs.com",
        "https://docker.m.daocloud.io",
        "https://mirror.baidubce.com",
        "https://dockerproxy.com",
        "https://mirror.iscas.ac.cn",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://noohub.ru",
        "https://vlgh0kqj.mirror.aliyuncs.com"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

6、升级版本

  1. 卸载旧版本的Docker
sh
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  1. 安装Docker存储库
sh
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装最新版本的Docker
sh
sudo yum install docker-ce docker-ce-cli containerd.io
  1. 启动Docker服务
sh
sudo systemctl start docker

7、镜像

Docker镜像是一个轻量级可移植的打包格式,其中包含了用于运行应用程序所需的所有文件、依赖项、配置和元数据。Docker镜像可以视为一个只读的模板,用于创建Docker容器。镜像可以在Docker Hub等公共或私有的Docker Registry上进行存储和共享。

Docker镜像可以通过一个称为Dockerfile的文本文件进行定义。Dockerfile包含了一系列指令,用于定义应用程序的构建过程和运行环境。Docker可以使用Dockerfile自动构建镜像,并将其推送到Docker Registry中。

Docker镜像的优势包括:

  • 可移植性:Docker镜像可以在不同的环境中运行,无需重新配置应用程序。
  • 环境隔离:Docker容器可以隔离应用程序和其依赖项,避免了环境冲突和依赖问题。
  • 可重复性:Docker镜像可以通过Dockerfile进行定义和构建,确保每次构建的结果都是相同的。

查看服务器上的镜像可以用以下命令:

sh
docker image ls
docker images

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE

在Docker主机上获取镜像的操作被称为拉取(pulling)。

sh
docker pull ubuntn:latest

再次运行docker images命令来查看刚刚拉取的镜像

sh
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    605c77e624dd   17 months ago   141MB

8、容器

1、什么是容器

Docker容器是Docker中的另一个重要概念,它是一个可执行的、轻量级的、独立的软件包,其中包含了应用程序、其依赖项和运行环境。容器可以在任何支持Docker运行时的环境中运行,包括Linux、Windows和macOS。

Docker容器是由Docker镜像创建的,每个容器都是基于一个特定的Docker镜像运行。容器可以视为在镜像上创建的一个可写层,其中包含了应用程序的状态和运行时数据。

每个Docker容器都有自己的文件系统、网络接口、进程空间和用户空间。容器之间是相互隔离的,每个容器都有自己的网络命名空间和IP地址。这种隔离性使得容器可以同时运行多个应用程序,而不用担心应用程序之间的冲突和依赖问题。

可以使用docker container run命令从镜像来启动容器。

sh
docker container run -it nginx /bin/bash
root@25e26e929978:/#

docker container(可省略) run -it nginx /bin/bash

  • docker container run: 运行Docker容器的命令。
  • -it: 这个选项表示要启动一个交互式的终端,即在终端中可以输入命令,并且能够看到命令的输出。
  • nginx: 这是要运行的Docker镜像的名称。在这个例子中,我们要运行的是名为nginx的镜像。
  • /bin/bash: 这是要在容器中运行的命令。在这个例子中,我们要运行的是bash shell,它是Linux系统中一个常用的命令行解释器。当然,你也可以运行其他命令,比如lscat等等。

我们可以按Ctrl+C退出容器,但是这种方式容器会停止运行。

Ctrl+PQ组合键,可以在退出容器的同时还保持容器运行。

可以通过docker container ls或者docker ps命令查看系统内全部处于运行状态的容器。

2、连接到运行中的容器

执行docker container exec命令,可以将Shell连接到一个运行中的容器终端。

sh
docker container exec -it nginx /bin/bash
  • docker container exec: 在运行的Docker容器中执行命令的命令。
  • -it: 这个选项表示要启动一个交互式的终端,即在终端中可以输入命令,并且能够看到命令的输出。
  • nginx: 这是要执行命令的Docker容器的名称或ID。在这个例子中,我们要在名为nginx的容器中执行命令。
  • /bin/bash: 这是要在容器中运行的命令。在这个例子中,我们要运行的是bash shell,它是Linux系统中一个常用的命令行解释器。当然,你也可以运行其他命令,比如lscat等等。

9、镜像与容器

🖥️ 用安装 Windows 举例来理解「镜像」与「容器」

🔸 镜像(Image)就像是 Windows 安装光盘 / 系统镜像 ISO 文件

  • Windows 安装镜像(.iso) 里包含了完整的系统文件、驱动、程序和配置模板
  • 它是「静态的」:你不能直接在 ISO 文件里操作 Windows
  • 你可以用它安装很多台电脑

在容器化中,镜像(Docker Image)就是打包好的应用及运行环境的快照模板,不能直接运行,但可以用它来启动容器。

🔸 容器(Container)就像是一台安装完 Windows 的电脑实例

  • 当你用 ISO 文件安装了一台电脑,它才可以运行 Windows
  • 这台电脑有开关、进程、自己的 IP、你可以运行程序、修改设置
  • 每个容器就像每台安装好的系统,运行、停止、销毁都互相独立

在容器化中,你用镜像启动出来的容器才是「真正运行中的系统/应用」。

✅ 类比总结表格

对象Windows 类比Docker/容器化中含义
镜像(Image)Windows ISO 镜像文件应用 + 环境的模板快照
容器(Container)装好系统的电脑 / 虚拟机基于镜像运行的实例(活的)
启动容器安装/启动电脑用镜像启动一个运行中的容器
停止容器关机停止运行容器
删除容器格式化并销毁电脑删除容器运行实例(不影响镜像)
重启容器重启电脑容器重新运行