Appearance
Docker 完全指南
什么是 Docker?
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。
Docker 核心概念
1. 镜像 (Image)
Docker 镜像是一个轻量级、独立、可执行的软件包,包含运行某个软件所需的所有内容:代码、运行时环境、库、环境变量和配置文件。
2. 容器 (Container)
容器是镜像的运行实例。可以启动、停止、移动和删除。每个容器都是相互隔离的、保证安全的平台。
3. 仓库 (Repository)
仓库是集中存放镜像文件的场所。Docker Hub 是官方的公共仓库,也可以搭建私有仓库。
Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,Docker 客户端与 Docker 服务器进行通信,Docker 服务器负责构建、运行和分发 Docker 镜像。
主要组件:
- Docker Client: 用户与 Docker 交互的接口
- Docker Daemon: 在服务器上运行,负责构建、运行和分发 Docker 容器
- Docker Images: 镜像,容器的基础
- Docker Registry: 存储和分发镜像的服务
安装 Docker
在不同操作系统上安装 Docker
Windows
- 下载 Docker Desktop for Windows
- 运行安装程序
- 重启计算机
- 启动 Docker Desktop
macOS
- 下载 Docker Desktop for Mac
- 拖拽到 Applications 文件夹
- 启动 Docker Desktop
Linux (Ubuntu)
bash
# 更新包索引
sudo apt-get update
# 安装必要的包
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=amd64 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
# 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
基本命令
镜像管理
bash
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx
# 构建镜像
docker build -t my-app .
容器管理
bash
# 运行容器
docker run -d -p 80:80 nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop container_id
# 启动容器
docker start container_id
# 删除容器
docker rm container_id
# 进入运行中的容器
docker exec -it container_id bash
Dockerfile 详解
Dockerfile 是一个文本文件,包含一系列指令,用于构建 Docker 镜像。
基本指令:
- FROM: 指定基础镜像
- RUN: 执行命令
- COPY: 复制文件到镜像
- ADD: 复制文件到镜像(支持远程 URL)
- WORKDIR: 设置工作目录
- EXPOSE: 暴露端口
- CMD: 容器启动时执行的命令
- ENTRYPOINT: 容器启动时执行的命令(不可被覆盖)
示例 Dockerfile:
docker
# 使用官方 Node.js 运行时作为基础镜像
FROM node:16-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 定义容器启动时执行的命令
CMD ["npm", "start"]
Docker Compose
Docker Compose 是 Docker 的编排工具,用于定义和运行多容器的 Docker 应用。
docker-compose.yml 示例:
yaml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
redis:
image: redis:alpine
ports:
- "6379:6379"
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
最佳实践
1. 镜像优化
- 使用官方基础镜像
- 多阶段构建减少镜像大小
- 合并 RUN 指令减少层数
- 使用 .dockerignore 文件
2. 安全性
- 不在镜像中存储敏感信息
- 使用非 root 用户运行容器
- 定期更新基础镜像
- 扫描镜像漏洞
3. 性能优化
- 使用多阶段构建
- 优化层缓存
- 选择合适的基础镜像
实际应用场景
1. 开发环境
Docker 可以确保开发、测试、生产环境的一致性。
2. 微服务架构
每个微服务可以打包成独立的容器,便于管理和部署。
3. CI/CD 集成
Docker 容器可以作为 CI/CD 流水线中的标准单元。
Docker 生态系统
相关工具:
- Docker Swarm: Docker 原生的集群和调度工具
- Kubernetes: 容器编排平台
- Docker Compose: 多容器应用定义和运行工具
- Docker Machine: Docker 主机管理工具
总结
Docker 通过容器化技术,极大地简化了应用的部署、扩展和管理。它提供了一种轻量级、可移植的虚拟化方案,已经成为现代软件开发和部署的标准工具之一。