深入理解 Docker:安装、配置与使用
Docker 已经成为现代软件开发和部署不可或缺的工具。它通过容器化技术,彻底改变了我们构建、发布和运行应用程序的方式。本文将深入探讨 Docker 的核心概念,并提供详细的安装、配置和使用指南,帮助您从入门到精通。
一、Docker 是什么?为何使用 Docker?
Docker 是一个开源平台,用于自动化应用程序的部署、扩展和管理,它使用容器技术将应用程序及其所有依赖项打包在一个独立的、可移植的单元中。
核心优势:
- 环境一致性:无论开发、测试还是生产环境,Docker 都能保证应用运行环境的一致性,有效避免“在我的机器上可以运行”的问题。
- 快速部署:容器启动速度快,可以在几秒钟内完成应用程序的部署和启动。
- 资源隔离:每个容器都是独立的,拥有自己的文件系统、进程空间、网络接口,相互之间隔离,互不影响。
- 轻量级:与传统虚拟机相比,容器共享宿主机的操作系统内核,因此更加轻量级,占用资源更少。
- 可移植性:容器可以在任何支持 Docker 的环境中运行,无论是本地机器、虚拟机还是云服务器。
- 可扩展性:通过 Docker Compose 或编排工具(如 Kubernetes),可以轻松地对应用程序进行横向扩展。
二、Docker 的核心概念
在深入安装和使用之前,理解 Docker 的几个核心概念至关重要:
- Docker 镜像 (Image):
- 一个只读的模板,包含了创建 Docker 容器所需的所有文件、依赖、配置和元数据。
- 可以理解为一个打包好的操作系统快照和应用程序代码。
- 通过
docker pull命令从 Docker Hub 等仓库获取,或通过Dockerfile构建。
- Docker 容器 (Container):
- 镜像的一个运行实例。
- 容器是轻量级、可执行的,包含应用程序及其所有运行时依赖。
- 每个容器都是独立的,并且可以被启动、停止、删除。
- Dockerfile:
- 一个文本文件,包含了一系列构建 Docker 镜像的指令。
- 通过
Dockerfile,您可以定义镜像的操作系统、安装的软件包、复制的文件、暴露的端口等。
- Docker 客户端 (Client):
- 您与 Docker Daemon 交互的命令行工具 (CLI)。
- 例如
docker run,docker build,docker ps等命令都是通过 Docker 客户端发送给 Docker Daemon 的。
- Docker Daemon (Host):
- 运行在宿主机上的后台进程,负责管理和维护 Docker 对象(镜像、容器、网络、卷等)。
- 它监听 Docker API 请求,并执行相应的操作。
- 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 # 停止并移除所有服务
六、进阶概念与实践
- Docker 网络:
- Bridge (桥接模式):默认模式,容器可以互相通信,并与宿主机通信。
- Host (主机模式):容器直接使用宿主机的网络命名空间,性能最高,但隔离性差。
- None (无网络模式):容器没有网络接口。
- Overlay (覆盖网络):用于跨多宿主机集群的容器通信 (Docker Swarm)。
- 自定义网络:创建自己的桥接网络,提供更好的隔离性和名称解析。
- Docker 卷 (Volumes):
- Bind Mounts (绑定挂载):将宿主机上的文件或目录挂载到容器中,方便开发调试。
- Named Volumes (命名卷):由 Docker 管理的卷,存储在宿主机上的特定位置,是持久化数据和在容器间共享数据的首选方式。
- Docker Swarm / Kubernetes:
- 当需要在大规模生产环境中管理和编排容器时,会用到这些工具。
- Docker Swarm:Docker 官方提供的容器编排工具,简单易用。
- Kubernetes (K8s):行业标准的容器编排平台,功能强大,生态系统丰富。
- CI/CD 集成:Docker 容器非常适合与持续集成/持续部署 (CI/CD) 流程集成,实现自动化构建、测试和部署。
总结
Docker 容器技术通过提供一致、隔离、轻量级的运行环境,极大地简化了应用程序的开发、测试和部署。从基础的镜像和容器操作,到使用 Dockerfile 构建自定义镜像,再到通过 Docker Compose 管理多容器应用,Docker 提供了一整套强大的工具链。深入理解并熟练运用 Docker,无疑将显著提升您的开发效率和应用的可维护性。随着您对 Docker 的不断探索,将能更好地利用其强大的功能,构建更健壮、更可扩展的现代化应用。