深入理解 Docker:安装、配置与使用 – wiki大全

深入理解 Docker:安装、配置与使用

Docker 已经成为现代软件开发和部署不可或缺的工具。它通过容器化技术,彻底改变了我们构建、发布和运行应用程序的方式。本文将深入探讨 Docker 的核心概念,并提供详细的安装、配置和使用指南,帮助您从入门到精通。

一、Docker 是什么?为何使用 Docker?

Docker 是一个开源平台,用于自动化应用程序的部署、扩展和管理,它使用容器技术将应用程序及其所有依赖项打包在一个独立的、可移植的单元中。

核心优势:

  1. 环境一致性:无论开发、测试还是生产环境,Docker 都能保证应用运行环境的一致性,有效避免“在我的机器上可以运行”的问题。
  2. 快速部署:容器启动速度快,可以在几秒钟内完成应用程序的部署和启动。
  3. 资源隔离:每个容器都是独立的,拥有自己的文件系统、进程空间、网络接口,相互之间隔离,互不影响。
  4. 轻量级:与传统虚拟机相比,容器共享宿主机的操作系统内核,因此更加轻量级,占用资源更少。
  5. 可移植性:容器可以在任何支持 Docker 的环境中运行,无论是本地机器、虚拟机还是云服务器。
  6. 可扩展性:通过 Docker Compose 或编排工具(如 Kubernetes),可以轻松地对应用程序进行横向扩展。

二、Docker 的核心概念

在深入安装和使用之前,理解 Docker 的几个核心概念至关重要:

  1. Docker 镜像 (Image)
    • 一个只读的模板,包含了创建 Docker 容器所需的所有文件、依赖、配置和元数据。
    • 可以理解为一个打包好的操作系统快照和应用程序代码。
    • 通过 docker pull 命令从 Docker Hub 等仓库获取,或通过 Dockerfile 构建。
  2. Docker 容器 (Container)
    • 镜像的一个运行实例。
    • 容器是轻量级、可执行的,包含应用程序及其所有运行时依赖。
    • 每个容器都是独立的,并且可以被启动、停止、删除。
  3. Dockerfile
    • 一个文本文件,包含了一系列构建 Docker 镜像的指令。
    • 通过 Dockerfile,您可以定义镜像的操作系统、安装的软件包、复制的文件、暴露的端口等。
  4. Docker 客户端 (Client)
    • 您与 Docker Daemon 交互的命令行工具 (CLI)。
    • 例如 docker run, docker build, docker ps 等命令都是通过 Docker 客户端发送给 Docker Daemon 的。
  5. Docker Daemon (Host)
    • 运行在宿主机上的后台进程,负责管理和维护 Docker 对象(镜像、容器、网络、卷等)。
    • 它监听 Docker API 请求,并执行相应的操作。
  6. Docker 注册中心 (Registry)
    • 用于存储和分发 Docker 镜像的服务。
    • 最常用的是 Docker Hub,它提供了大量的公共镜像,您也可以创建自己的私有注册中心。

三、Docker 的安装

Docker 提供了针对不同操作系统的安装包。以下是主流操作系统的安装概览,建议始终查阅 Docker 官方文档获取最新和最详细的安装步骤。

1. Linux 系统

对于大多数 Linux 发行版,推荐使用 Docker 官方提供的安装脚本或包管理器进行安装。

Ubuntu/Debian (示例)

“`bash

1. 更新包索引并安装必要的依赖

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common

2. 添加 Docker 官方 GPG 密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

3. 添加 Docker 稳定版仓库

echo “deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4. 再次更新包索引

sudo apt update

5. 安装 Docker Engine、CLI 和 Containerd

sudo apt install docker-ce docker-ce-cli containerd.io

6. 验证 Docker 是否安装成功

sudo docker run hello-world

7. (可选) 将当前用户添加到 docker 用户组,以便无需 sudo 运行 docker 命令

sudo usermod -aG docker $USER
newgrp docker # 重新登录或运行此命令使更改生效
“`

2. Windows 系统

Windows 用户推荐安装 Docker Desktop for Windows。它包含了 Docker Engine、Docker CLI、Docker Compose、Kubernetes 以及图形用户界面 (GUI)。

先决条件
* Windows 10 64-bit: Pro, Enterprise, or Education (Build 19041 or higher)
* 启用 WSL 2 (推荐):Docker Desktop 默认使用 WSL 2 后端,性能更佳。请确保您的系统已安装并配置 WSL 2。
* 硬件虚拟化必须在 BIOS 中启用。

安装步骤
1. 访问 Docker 官方网站 (docs.docker.com/desktop/install/windows-install/) 下载 Docker Desktop for Windows 安装包。
2. 运行安装程序,并按照向导提示完成安装。
3. 安装完成后,Docker Desktop 会自动启动,您可以在系统托盘中找到 Docker 图标。
4. 打开 PowerShell 或命令提示符,运行 docker run hello-world 验证安装。

3. macOS 系统

macOS 用户同样推荐安装 Docker Desktop for Mac

先决条件
* macOS Catalina 10.15 或更高版本。
* 硬件虚拟化支持。

安装步骤
1. 访问 Docker 官方网站 (docs.docker.com/desktop/install/mac-install/) 下载 Docker Desktop for Mac 安装包 (.dmg 文件)。
2. 打开 .dmg 文件,将 Docker.app 拖拽到 Applications 文件夹。
3. 在 Applications 文件夹中启动 Docker。
4. Docker 会在菜单栏显示一个鲸鱼图标,表示正在运行。
5. 打开终端,运行 docker run hello-world 验证安装。

四、Docker 的基本配置

Docker 的配置主要通过 Docker Desktop 的 GUI 界面(Windows/macOS)或修改配置文件(Linux)进行。

1. Docker Desktop 配置 (Windows/macOS)

Docker Desktop 提供了友好的 GUI 界面,您可以通过它进行常见的配置:

  • Resources (资源):调整分配给 Docker Engine 的 CPU、内存、磁盘空间和 SWAP 空间,尤其在运行多个容器或资源密集型应用时非常有用。
  • WSL Integration (Windows):管理哪些 WSL 2 发行版可以集成 Docker。
  • Docker Engine (Linux):可以编辑 daemon.json 文件来配置 Docker Daemon 的高级设置。
  • Kubernetes:启用和禁用内置的 Kubernetes 集群。
  • Proxies (代理):配置 Docker 使用 HTTP/HTTPS 代理。
  • Docker Hub (注册中心):登录到 Docker Hub,方便拉取私有镜像或推送自己的镜像。

2. Docker Daemon 配置 (Linux/daemon.json)

在 Linux 系统中,Docker Daemon 的配置通常通过修改 /etc/docker/daemon.json 文件进行。如果没有此文件,您可以创建它。

常用配置项

  • registry-mirrors:配置镜像加速器,对于国内用户,使用镜像加速器可以显著提高镜像拉取速度。
    json
    {
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com"]
    }
  • data-root:指定 Docker 存储数据(镜像、容器、卷)的根目录。默认是 /var/lib/docker
    json
    {
    "data-root": "/mnt/docker-data"
    }
  • log-opts:配置容器日志驱动和日志选项。
    json
    {
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    }
    }
  • insecure-registries:允许 Docker 客户端与不使用 HTTPS 的私有仓库通信。
    json
    {
    "insecure-registries": ["myregistry.example.com:5000"]
    }

修改后重启 Docker Daemon

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

五、Docker 的常见使用

1. 镜像操作

  • 搜索镜像
    bash
    docker search ubuntu
  • 拉取镜像:从 Docker Hub 下载镜像。
    bash
    docker pull ubuntu:latest # 拉取最新版 Ubuntu
    docker pull nginx:1.21.0 # 拉取指定版本 Nginx
  • 查看本地镜像
    bash
    docker images
  • 删除镜像
    bash
    docker rmi ubuntu:latest # 按名称删除
    docker rmi <IMAGE_ID> # 按 ID 删除
    docker rmi $(docker images -aq) # 删除所有镜像 (慎用!)

2. 容器操作

  • 运行容器

    • -it:交互式终端。
    • --name:指定容器名称。
    • -p:端口映射 (宿主机端口:容器端口)。
    • -d:后台运行。
    • -v:卷挂载 (宿主机路径:容器路径)。
      “`bash

    交互式运行一个 Ubuntu 容器

    docker run -it –name my_ubuntu ubuntu:latest /bin/bash

    后台运行一个 Nginx 容器,并将宿主机的 80 端口映射到容器的 80 端口

    docker run -d –name my_nginx -p 80:80 nginx:latest

    运行一个 Nginx 容器,并将本地的 html 目录挂载到容器的 /usr/share/nginx/html 目录

    docker run -d –name my_nginx_with_volume -p 8080:80 -v /path/to/local/html:/usr/share/nginx/html nginx:latest
    * **查看运行中的容器**:bash
    docker ps
    docker ps -a # 查看所有容器 (包括已停止的)
    * **停止容器**:bash
    docker stop my_nginx # 按名称停止
    docker stop # 按 ID 停止
    * **启动容器**:bash
    docker start my_nginx
    * **重启容器**:bash
    docker restart my_nginx
    * **删除容器**:bash
    docker rm my_ubuntu # 删除一个已停止的容器
    docker rm -f my_nginx # 强制删除一个正在运行的容器
    docker rm $(docker ps -aq) # 删除所有容器 (慎用!)
    * **进入运行中的容器**:bash
    docker exec -it my_ubuntu /bin/bash
    * **查看容器日志**:bash
    docker logs my_nginx
    docker logs -f my_nginx # 实时查看日志
    “`

3. Dockerfile 构建镜像

创建一个 Dockerfile 文件:

“`dockerfile

使用官方的 OpenJDK 11 作为基础镜像

FROM openjdk:11-jdk-slim

设置工作目录

WORKDIR /app

将本地的 JAR 包复制到容器的 /app 目录下

COPY target/my-app.jar /app/my-app.jar

暴露容器的 8080 端口

EXPOSE 8080

定义容器启动时执行的命令

CMD [“java”, “-jar”, “my-app.jar”]
“`

Dockerfile 所在的目录下执行构建命令:

“`bash

-t 指定镜像的名称和标签

. 表示 Dockerfile 位于当前目录

docker build -t my-java-app:1.0 .
“`

4. Docker Compose (多容器应用管理)

Docker Compose 允许您使用 YAML 文件来定义和运行多容器 Docker 应用程序。

创建一个 docker-compose.yml 文件:

yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx-html:/usr/share/nginx/html
db:
image: postgres:13
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:

docker-compose.yml 文件所在的目录下执行命令:

  • 启动应用
    bash
    docker-compose up -d # 后台启动所有服务
  • 停止应用
    bash
    docker-compose down # 停止并移除所有服务

六、进阶概念与实践

  1. Docker 网络
    • Bridge (桥接模式):默认模式,容器可以互相通信,并与宿主机通信。
    • Host (主机模式):容器直接使用宿主机的网络命名空间,性能最高,但隔离性差。
    • None (无网络模式):容器没有网络接口。
    • Overlay (覆盖网络):用于跨多宿主机集群的容器通信 (Docker Swarm)。
    • 自定义网络:创建自己的桥接网络,提供更好的隔离性和名称解析。
  2. Docker 卷 (Volumes)
    • Bind Mounts (绑定挂载):将宿主机上的文件或目录挂载到容器中,方便开发调试。
    • Named Volumes (命名卷):由 Docker 管理的卷,存储在宿主机上的特定位置,是持久化数据和在容器间共享数据的首选方式。
  3. Docker Swarm / Kubernetes
    • 当需要在大规模生产环境中管理和编排容器时,会用到这些工具。
    • Docker Swarm:Docker 官方提供的容器编排工具,简单易用。
    • Kubernetes (K8s):行业标准的容器编排平台,功能强大,生态系统丰富。
  4. CI/CD 集成:Docker 容器非常适合与持续集成/持续部署 (CI/CD) 流程集成,实现自动化构建、测试和部署。

总结

Docker 容器技术通过提供一致、隔离、轻量级的运行环境,极大地简化了应用程序的开发、测试和部署。从基础的镜像和容器操作,到使用 Dockerfile 构建自定义镜像,再到通过 Docker Compose 管理多容器应用,Docker 提供了一整套强大的工具链。深入理解并熟练运用 Docker,无疑将显著提升您的开发效率和应用的可维护性。随着您对 Docker 的不断探索,将能更好地利用其强大的功能,构建更健壮、更可扩展的现代化应用。

滚动至顶部