docker详解(一):基础知识、镜像、容器、仓库

2024-04-13 15:58:01

浏览:78

评论:0

前言:在传统的学习与实践中,对于微服务架构、数据集群等相关技术的理解与实践,往往依赖于在单台物理服务器上创建并管理多个虚拟机(Virtual Machines, VMs)。这种方法有助于模拟多节点环境,每个虚拟机可以运行独立的服务实例或作为集群中的一个节点,从而为学习者提供一个相对封闭且资源可控制的实验平台。然而,随着技术的发展,尤其是容器化技术的兴起,Docker 成为了更为高效、便捷的工具,革新了服务部署与管理的方式。

docker和虚拟机的对比

架构图对比

Docker的优点

  • Docker 容器共享宿主机的操作系统内核,避免了运行完整Guest OS的开销,启动速度快(秒级),资源消耗少(内存、存储、CPU),能够在单台服务器上运行更多服务实例,提高资源利用率。
  • 容器启动和停止的速度远超虚拟机(通常为秒级),有利于快速迭代开发、频繁部署和按需伸缩。
  • Docker 镜像包含了应用及其所有依赖,确保服务在任何支持 Docker 的环境中都能以一致的方式运行,简化了部署流程,实现了“一次构建,到处运行”。
  • 容器非常适合微服务架构,每个服务可以封装为一个独立的容器,易于扩展、替换和维护。容器编排工具(如 Docker Compose、Kubernetes)进一步简化了多容器应用的部署和管理。
  • Docker 通过容器提供了标准化的环境和一致的工作流程,简化了开发、测试、生产环境的配置管理,促进了 DevOps 实践。

Docker的缺点

  • 容器基于操作系统级别的虚拟化,隔离性不如虚拟机(硬件级别虚拟化)强。尽管可以通过命名空间、cgroups 等技术实现进程、网络、文件系统的隔离,但存在潜在的安全风险,不适合对隔离性要求极高的场景。
  • Docker 容器必须运行在支持其所需内核特性的宿主机上,这意味着容器的可移植性受到宿主机内核版本和功能的限制,特别是对于非 Linux 平台或旧版内核可能存在兼容性问题。
  • 对于需要特定硬件支持(如 GPU 加速)、特定操作系统功能(如 Windows 特定服务)或严格合规要求(如金融行业的强隔离)的应用,虚拟机可能仍然是更好的选择。
  • 如果容器逃逸(container escape),攻击者可能获得宿主机的权限,因为容器和宿主机共享内核。虽然这种情况相对罕见且可以通过良好的安全实践和工具减轻风险,但相比于虚拟机,其安全边界更薄。

安装docker

liunx系统安装

首先确保系统软件包是最新的


# unbuntu
sudo apt-get update
sudo apt-get upgrade

# centos
sudo yum update -y

安装docker

# unbuntu
sudo apt-get install docker-ce

# centos
sudo yum install docker-ce

查看版本

docker -v

启动docker

# sudo systemctl status docker 命令基于 systemd,提供了更详细的 Docker 服务状态信息和更丰富的交互功能,是推荐的查看 Docker 服务状态的方法。
# sudo service docker status 命令基于较老的系统服务管理框架,信息相对有限,但在某些系统中仍可用作兼容性选择。在支持 systemd 的系统中,建议优先使用 systemctl 命令进行服务管理。

sudo systemctl status docker # 查看服务状态
sudo systemctl start docker # 启动服务
sudo systemctl stop docker # 停止服务
sudo systemctl restart docker # 重启服务
sudo systemctl reload docker # 重新加载配置文件
sudo systemctl enable docker # 设置服务开机自启动
sudo systemctl disable docker # 停止开机自启动

# sudo service docker status # 查看服务状态

(配置docker镜像加速器)[https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors]

安装docker-compose

# 下载 在github上找到最新版本
curl -L https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-x86_64 -o docker-compose
# 赋予执行权限
sudo chmod +x docker-compose
# 移动到可执行命令目录(可选操作)
sudo mv docker-compose /usr/local/bin
# 查看版本
docker-compose -v

win/mac 系统安装

安装Docker-Desktop管理工具

# 查看版本
docker -v

镜像

Docker 镜像是一个包含应用程序及其所有依赖的、不可变的、分层的、标准化的软件包,它是构建、部署和运行 Docker 容器的基础。通过使用 Docker 镜像,开发者可以实现应用程序环境的隔离、快速部署和版本控制,极大地简化了软件的生命周期管理。

# 安装镜像,镜像一般在Docker Hub、GitHub Container Registry、Google Container Registry 等上查找
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 列如安装nginx镜像,可以指定版本、默认是laster
docker pull nginx

# 查看本地镜像
docker images 
docker images -a / --all # 显示所有镜像,包括中间层镜像(这些镜像通常不会直接用来启动容器)
docker iamges --digests # 显示镜像的摘要(digest)
docker iamges --filter # 根据特定条件过滤显示的镜像,如按仓库名、标签、大小等
docker iamges --format # 自定义输出格式,使用 Go 的 text/template 语法
docker iamges --no-trunc # 显示完整的镜像ID和创建时间,而不进行截断

容器

Docker 容器是 Docker 技术的核心概念之一,它是基于 Docker 镜像运行起来的、轻量级、独立的、可移植的软件执行环境。容器封装了应用程序及其所有依赖(包括代码、运行时、系统工具、库、配置文件等),并提供了与宿主机操作系统隔离的、一致的运行环境。

docker run

docker run 命令可以基于镜像创建容器,可以设置容器名称(--name)、端口号(-p)、环境变量(-e)、目录映射 / 数据卷(-v / --mount)、后台以守护态(detached)运行(-d)、指定要使用的镜像名称 我们使用上述的nginx镜像创建一个容器

# 使用目录映射 将宿主机的 /path/to/nginx 目录挂载到容器内的 /etc/nginx
docker run --name vnginx -p 5380:80 -e NGINX_VAR_NAME=value -v /path/to/nginx:/etc/nginx -d nginx

docker run --name vnginx -p 5380:80 -e NGINX_VAR_NAME=value --mount type=bind,src=/path/to/nginx,dst=/etc/nginx -d nginx

# 使用数据卷  将容器内的 /etc/nginx 目录映射到名为 Vvolume 的数据卷
docker volume create Vvolume # 创建数据卷
docker run --name vnginx -p 5380:80 -e NGINX_VAR_NAME=value --mount source=Vvolume,src=/etc/nginx -d nginx

目录映射和数据卷区别

  • 数据持久性与容器生命周期:
    • 数据卷具有独立于容器的生命周期,即使容器被删除,数据卷中的数据也不会丢失。
    • 目录映射直接依赖于宿主机上的具体目录,如果宿主机目录被删除或移动,映射到容器内的数据也会丢失。
  • 数据共享与容器间同步:
    • 数据卷可以被多个容器同时挂载,实现容器间的数据共享。Docker 会确保所有挂载同一数据卷的容器看到的数据是一致的,非常适合多容器协作或微服务架构。
    • 虽然目录映射也能实现宿主机与单个容器之间的数据共享,但它不支持多个容器同时挂载同一个宿主机目录进行实时同步。如果需要在多个容器间共享数据,可能需要通过其他方式(如网络共享、中间件等)实现。
  • 性能与优化:
    • 数据卷通常会绕过容器的存储层,直接对宿主机文件系统进行读写,减少了一层文件系统开销,可以提供更好的 I/O 性能。
    • 目录映射直接使用宿主机的文件系统,性能取决于宿主机的硬件和文件系统特性。在某些情况下,尤其是针对高性能存储设备或优化过的文件系统,目录映射的性能可能与数据卷相当甚至更好。
  • 宿主机文件系统限制与兼容性:
    • 数据卷由 Docker 管理,不受宿主机文件系统的限制(如SELinux、AppArmor等安全策略),在不同的宿主机环境中具有较好的兼容性。
    • 目录映射直接使用宿主机的文件系统,可能受到宿主机特定的安全策略、权限设置或文件系统类型的限制。在某些严格管控的环境中,可能需要调整宿主机设置才能正常使用目录映射。
  • 管理与备份
    • 数据卷作为独立的资源,可以通过 Docker CLI 或 Docker Compose 等工具进行集中管理,如创建、删除、备份、迁移等。Docker 也提供了专门的命令(如 docker volume)来操作数据卷。
    • 目录映射的管理主要依赖于宿主机的文件系统操作,如备份、迁移等需要直接对宿主机目录进行操作。对于复杂的多容器应用,可能需要额外的脚本或工具来管理多个宿主机目录。
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器,包括已停止的 
docker start、docker stop、docker restart # 命令管理容器的运行状态。
docker rm # 命令删除不再需要的容器
docker exec # 命令在运行中的容器内执行命令或打开一个交互式 Shell,以便进行调试或管理
docker logs # 命令查看容器的输出日志
docker volume # 管理数据卷
docker save # 备份镜像
docker load # 恢复镜像

仓库

  • 当我们构建好镜像之后,很容易在当前的宿主机上运行,但是,如果需要在其他服务器上使用这个镜像,我们就需要一个仓库来存储和分发它们。Docker Registry 就是这样的服务。
  • 一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。
  • 一个仓库包含同一个软件不同版本的镜像,标签就对应着软件的各个版本。我们通过<仓库名>:<标签>的格式来指定具体是那个版本的镜像。
  • 我们以ubuntu镜像为例,ubuntu是仓库的名字,其内包含有不同的版本标签,如:18.04,20.04。我们在编写配置文件的时候,就可以通过ubuntu:18.04、ubuntu:20.04来指定具体所需版本的镜像。如果忽略了标签,将视为ubuntu:latest。

公开服务

  • Docker Registry 公开服务是开放给用户使用,允许用户管理镜像的Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像。

  • 最常使用的公开服务是官方的 Docker Hub,这个也是默认的Registry。拥有大量的官方镜像。除此之外,还有:

  • Red Hat 的 Quay.io

  • Google 的 Google Container Registry

私有部署

  • 当用户制作好一个镜像后,不方便在公开服务上发布时,就需要在内部自己搭建Docker Registry。官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。
  • 开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
  • 除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,提供了用户界面以及一些高级功能。比如:Harbor