Daily-It

개발, AI, 인프라, 자동화와 일상 IT 제품 후기를 직접 써보며 정리하는 기술 블로그입니다.

Docker 概念和安装方法:从容器基础知识到 Ubuntu 安装

摘要

Docker 是一个应用程序和执行环境 容器 它是一个打包和运行单元的平台。它广泛应用于开发、DevOps 和 CI/CD环境,因为它可以减少开发环境和操作环境之间的差异,并使部署过程保持一致。

在本文中,我们总结了 Docker 的基本概念、虚拟机 (VM) 和容器的区别、核心组件、如何在 Ubuntu 上安装 Docker Engine、如何在 Windows/macOS 上使用 Docker Desktop、Dockerfile 和 Docker Compose 示例以及实践中的常见错误。

基于:Docker 官方文档、Docker Engine/Desktop 发行说明、Ubuntu 软件包信息、Docker Compose 文档、Podman 官方站点,并一起检查了搜索结果。 Docker的安装命令、包名、支持策略可能会根据版本的不同而变化,所以建议实际安装前查看官方文档。

目录

背景

开发人员面临的常见问题之一是:

“它在我的电脑上运行良好,但在服务器上出现错误。”

这个问题通常是由操作系统、运行时、库、环境变量、网络设置、文件路径等方面的差异引起的。Docker 通过将运行应用程序所需的元素捆绑到映像中并将其作为容器执行来减少环境差异。

使用 Docker 的优点包括:

  • 可以减少开发环境和运行环境的差异。
  • 标准化应用程序的运行方式。
  • 配置测试、部署和 CI/CD 管道变得更加容易。
  • 多个服务可以与 Docker Compose 一起运行。

检查最新信息的标准

本文并不是根据现有经验进行简单总结,而是根据以下资料进行了强化。

验证数据 反映了什么
Docker 官方概念文档 镜像、容器、注册表、Dockerfile、Compose 概念
Docker Engine Ubuntu 安装文档 注册官方APT存储库, docker-ce 系列包安装方法
Docker 引擎发行说明 确认 Docker Engine 29 系列可作为最新版本
Docker 桌面版发行说明 Docker Desktop 更新逐步发布,旧版本可能有下载限制。
Docker Compose 安装文档 最新环境下 docker compose 确认使用CLI插件的形式
Ubuntu 软件包信息 Ubuntu发行包 docker.io确认单独存在
Podman 官方网站和搜索结果 检查提到 Podman 作为 Docker 替代方案的流程。

本文的目的是帮助 Docker 初学者了解安装和基本使用流程。因此,我们并没有深入涵盖特定版本中的所有更改,而是关注影响安装和操作决策的最新趋势。

详情

什么是 Docker?

Docker 是一个基于容器的应用程序执行平台。容器在隔离的环境中运行应用程序进程,但不会像虚拟机那样启动整个操作系统。

Docker 中经常出现的关键概念包括:

概念 描述
Image 包含运行应用程序所需的文件、库和设置的只读模板。
Container 执行镜像的实际进程单元的执行环境
Docker Engine 创建和运行容器的核心运行时
Docker CLI docker run, docker build, docker ps 输入相同命令的工具
Registry 存储和分发图像的存储库。一个代表性的例子是 Docker Hub。
Docker Compose 将多个容器服务定义为 YAML 文件并一起运行的工具

Docker 和虚拟机的区别

Docker容器和虚拟机都提供隔离的执行环境,但结构不同。

分配 虚拟机VM Docker容器
隔离方法 在虚拟机管理程序之上运行来宾操作系统 通过共享主机操作系统内核进行进程隔离
开机速度 相对较慢
资源使用 大号 相对较小
代表性用途 OS单元隔离,强隔离环境 应用程序打包、分发和开发环境的统一
例子 VMware, VirtualBox, Hyper-V Docker, Podman

然而,这并不意味着容器总是比虚拟机更安全。容器共享主机内核,因此在安全关键环境中,必须审查权限、网络、卷挂载和映像可靠性。

在 Ubuntu 上安装 Docker 引擎

在Ubuntu中,建议注册Docker的官方APT存储库,然后安装Docker Engine。在您的发行版的默认存储库中。 docker.io 软件包是可用的,但如果您想使用最新的 Docker 引擎和 Compose 插件,官方存储库通常更合适。

建议您在安装前了解以下差异:

分配 描述 适用案例
docker-ce Docker 官方仓库提供的 Docker 社区版包 如果您想根据官方文档安装最新的 Docker Engine、Buildx 和 Compose 插件
docker.io Ubuntu 发行版存储库提供的 Docker 软件包。 遵循您的发行版的软件包政策,或者如果您的组织标准是 Ubuntu 存储库软件包。

Docker官方文档参考已有安装 docker.io, docker-compose, docker-compose-v2, podman-docker, containerd, runc 等可能与官方 Docker Engine 软件包冲突,我们提供了在安装前删除冲突软件包的步骤。如果您正在使用现有服务器,则应在完全删除当前容器和包依赖项之前检查它们。

下面的例子是基于Docker官方文档的安装流程。

# 1. 기존 패키지 정보 갱신 및 필수 패키지 설치
sudo apt update
sudo apt install -y ca-certificates curl

# 2. Docker 공식 GPG 키 저장 경로 생성
sudo install -m 0755 -d /etc/apt/keyrings

# 3. Docker 공식 GPG 키 추가
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 4. Docker 공식 APT 저장소 등록
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

# 5. 패키지 정보 갱신
sudo apt update

# 6. Docker Engine 및 관련 플러그인 설치
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后,可以使用以下命令检查Docker 是否正常运行。

sudo docker run hello-world

如果安装正确,Docker 将下载测试镜像并 Hello from Docker! 打印一条消息。

不使用 sudo 运行 Docker

Linux 上的每次 Docker 命令 sudo 在没有当前用户的情况下运行 docker 您可以将它们添加到组中。

sudo usermod -aG docker $USER

然后,您可以注销并重新登录,或使用以下命令将组更改应用到当前会话。

newgrp docker

然后使用以下命令检查:

docker run hello-world

注意事项 docker 问题是组权限可以有效地导致主机系统上的权限提升。在生产服务器上,必须仔细定义用户权限策略。

在 Windows 和 macOS 上安装 Docker

在 Windows 和 macOS 上,通常 Docker Desktop安装。 Docker Desktop 附带 Docker Engine、Docker CLI、Docker Compose 和 GUI 管理工具。

Docker Desktop 的安装体验与服务器的 Docker Engine 不同。为了在 Windows/macOS 上运行 Linux 容器,我们在内部使用虚拟化层或基于 WSL 2 的环境。此外,根据 Docker Desktop 发行说明,更新可能会逐步推出,并且最新版本可能不会立即对所有用户可见。

安装流程如下:

  1. 从 Docker 官方网站下载 Docker Desktop。
  2. 运行适合您的操作系统的安装文件。
  3. 对于 Windows,通常使用基于 WSL 2 的执行环境。
  4. 安装后,在终端中运行以下命令:
docker version
docker run hello-world

由于 Windows 和 macOS 与 Linux 的内部结构不同,因此 Docker Desktop 通过虚拟化层或 WSL 2 提供 Linux 容器执行环境。

Docker 基本命令

安装Docker后常用命令如下:

# Ubuntu 컨테이너를 대화형 터미널로 실행
docker run -it ubuntu bash

# 실행 중인 컨테이너 목록 확인
docker ps

# 전체 컨테이너 목록 확인
docker ps -a

# 이미지 목록 확인
docker images

# 컨테이너 중지
docker stop <container_id>

# 컨테이너 삭제
docker rm <container_id>

# 이미지 삭제
docker rmi <image_id>

<container_id><image_id>必须更改以适应实际环境。

Docker镜像和容器执行流程

第一次使用Docker最困惑的地方就是镜像和容器的关系。镜像是可执行的模板,容器是实际运行镜像的实例。

一般流程如下:

Dockerfile 작성
  ↓
docker build로 이미지 생성
  ↓
docker run으로 컨테이너 실행
  ↓
docker logs / docker exec로 상태 확인
  ↓
docker stop / docker rm으로 정리

例如,运行 Nginx 映像将如下所示:

docker run -d --name sample-nginx -p 8080:80 nginx:stable

在你的浏览器中 http://localhost:8080当您连接到 时,容器内的 Nginx 会做出响应。对于清理,请使用以下命令:

docker stop sample-nginx
docker rm sample-nginx

简单的 Dockerfile 示例

Dockerfile 是用于创建应用程序映像的构建定义文件。下面是使用 Nginx 提供静态 HTML 文件的最简单示例。

FROM nginx:stable
COPY ./index.html /usr/share/nginx/html/index.html

在同一目录下 index.html创建 .

<!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>Docker Test</title>
</head>
<body>
  <h1>Hello Docker</h1>
</body>
</html>

构建并运行图像。

docker build -t sample-nginx-page .
docker run -d --name sample-page -p 8080:80 sample-nginx-page

可以使用以下命令进行确认:

curl http://localhost:8080

测试完毕后,清理容器。

docker stop sample-page
docker rm sample-page

这是一个简单的示例,可以使用 Docker 重现。您的生产环境需要额外考虑图像标记、安全扫描、部署方法、日志收集和反向代理配置。

Docker 撰写示例

Docker Compose 允许您在单个 YAML 文件中定义多个容器。在最新的Docker环境中,旧的 docker-compose 以 Docker CLI 插件而不是命令的形式 docker compose 使用命令的流程很常见。

例如,以下是运行 PostgreSQL 容器的基本示例:

services:
  postgres:
    image: postgres:16
    container_name: sample-postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: sampledb
      POSTGRES_USER: sampleuser
      POSTGRES_PASSWORD: "****"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

即使在示例中,密码、令牌和 API 密钥等敏感信息也不会公开实际值。 ****应该写成 .在真实的运行环境中 .env 我们建议使用文件、Secret Manager、CI/CD Secret 功能等。

执行命令为:

docker compose up -d

要停止,请使用以下命令:

docker compose down

如果您还想删除卷,可以使用以下命令,但要小心,因为它会删除数据。

docker compose down -v

最佳实践

使用官方且可信的图像

Docker Hub 拥有多种镜像,但并非所有镜像都是安全的或最新的。只要有可能,您应该使用官方镜像或来自可信供应商的镜像。

明确指定标签

在运行环境中 latest 我们建议避免单独使用标签。

image: postgres:16

像这样指定版本可以减少由于意外的版本更改而导致的失败。

单独的环境变量和配置文件

在映像中修复特定于环境的设置使得很难分离开发、测试和生产环境。 Docker Compose 中存储的值取决于环境,例如数据库地址、端口和执行模式。 environment, .env 我们建议使用文件和分发系统的配置管理功能。

在文档示例中,如果需要敏感值,则不会写入实际值,而是屏蔽如下:

environment:
  POSTGRES_PASSWORD: "****"

在运行环境中,简单 .env 仅有文件可能还不够;您应该查看适合您组织部署的 Secret Manager 或 CI/CD Secret 功能。

清晰地管理卷和网络

存储状态的服务(例如数据库)应该使用卷来确保即使容器被删除,数据仍然存在。

volumes:
  postgres_data:

此外,当多个服务一起工作时,最好了解 Docker Compose 网络配置以及它们如何使用服务名称进行通信。

检查操作环境中的安全设置

必须在您的生产环境中检查以下项目:

  • 容器权限
  • 是否以root用户运行
  • 主机目录挂载范围
  • Docker套接字是否暴露?
  • 镜像漏洞扫描
  • 网口公共范围
  • 日志和监控设置

一起考虑 Docker 和 Podman 等替代方案。

尽管 Docker 是容器生态系统中最广为人知的工具,但它并不是适用于所有环境的唯一解决方案。在最近的容器操作环境中,也正在考虑 Podman 等替代方案。

分配 Docker Podman
可用性 Docker Desktop、Docker Engine 和 Docker Compose 的广泛生态系统 提供与 Docker CLI 类似的体验
守护进程结构 以 Docker 守护进程为中心的架构 具有无守护程序结构
适用案例 开发环境标准化、基于Compose的本地开发、利用Docker Hub生态 无根容器、以 Linux 服务器为中心的操作、特定安全策略非常重要的环境

对于初学者或一般开发环境来说,Docker 上手很容易。但是,可以根据运行环境的安全策略、无根要求和 Kubernetes 连接方式来比较 Podman 等替代方案。

常见错误

混淆 docker.io 和 docker-ce

在Ubuntu上 apt install docker.io也可以安装,但是根据Docker的官方文档,注册官方仓库后, docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, docker-compose-plugin我们将指导您完成安装方法。

根据您的组织或服务器策略,可能会提供分发包,因此您的选择应基于您的安装目的和维护策略。

无条件授予使用 Docker 的权限,无需 sudo

docker 将用户添加到组很方便,但可以具有与授予强权限类似的安全效果。个人开发环境和生产服务器的权限策略必须采用不同的方法。

使用虚拟机等容器

持续访问容器内部并手动更改设置的重复性很差。如果可能的话,建议使用 Dockerfile、Compose 文件和环境变量来管理代码等执行环境。

仅将数据存储在容器内

容器可以被删除。需要持久保存的数据(例如数据库或上传的文件)必须存储在卷或外部存储上。

FAQ

Ubuntu安装Docker后出现权限错误怎么办?

permission denied while trying to connect to the Docker daemon socket 如果出现错误,则说明当前用户没有访问Docker daemon socket的权限。在开发环境中,用户 docker 添加到群组并重新登录 newgrp docker您可以通过运行来解决这个问题。

sudo usermod -aG docker $USER
newgrp docker

步, docker 由于组可以拥有高权限,因此您应该首先查看生产服务器上的用户权限策略。

如果 docker compose 命令不起作用,我应该检查什么?

在最新的Docker安装方式中,Compose是独立的 docker-compose 它们通常作为 Docker CLI 插件而不是二进制文件提供。使用以下命令验证 Compose 插件是否已安装:

docker compose version

如果您使用官方存储库方法从 Ubuntu 安装 docker-compose-plugin 检查包裹是否包含在内。

sudo apt install docker-compose-plugin

我可以在没有 Docker Desktop 的 Linux 服务器上使用 Docker 吗?

这是可能的。在Linux服务器上,一般安装和使用Docker Engine,而不是Docker Desktop。 Docker Desktop更多的是在Windows/macOS开发环境中方便使用Docker的工具,而在Linux服务器操作环境中,通常只安装Docker Engine和Compose插件。

使用什么命令来检查 Docker 安装?

安装完成后,您可以使用以下命令检查 Docker CLI 和 Docker Engine 状态:

docker version
docker run hello-world

docker run hello-world最基本的验证方法是下载测试镜像,检查容器是否可以运行。

结论

Docker 是将应用程序执行环境标准化为容器的工具,使开发、测试和部署过程保持一致。特别是减少了因开发环境差异带来的问题,在CI/CD和微服务环境中提供了巨大的优势。

在 Ubuntu 中,通常是注册官方 Docker 存储库,然后安装 Docker Engine 和 Compose 插件,而在 Windows 和 macOS 中,最简单的方法是使用 Docker Desktop。

然而,Docker不仅仅是一个简单的执行工具,而是一个需要考虑权限、网络、卷、镜像安全的平台。在您的开发环境中快速入门,但请务必检查生产环境中的安全和维护策略。

参考资料

  • Docker Docs: What is Docker? — https://docs.docker.com/get-started/docker-overview/
  • Docker Docs: Install Docker Engine on Ubuntu — https://docs.docker.com/engine/install/ubuntu/
  • Docker Docs: Linux post-installation steps for Docker Engine — https://docs.docker.com/engine/install/linux-postinstall/
  • Docker Docs: Docker Desktop — https://docs.docker.com/desktop/
  • Docker Docs: Docker Compose installation — https://docs.docker.com/compose/install/
  • Docker Docs: Dockerfile reference — https://docs.docker.com/reference/dockerfile/
  • Docker Docs: Docker Engine release notes — https://docs.docker.com/engine/release-notes/
  • Docker Docs: Docker Desktop release notes — https://docs.docker.com/desktop/release-notes/
  • Ubuntu Packages: docker.io — https://packages.ubuntu.com/search?keywords=docker.io
  • Podman Official Site — https://podman.io/