Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

目录

  1. Docker 简介
  2. 安装 Docker
  3. Docker 核心概念
  4. 基本 Docker 命令
  5. Dockerfile 编写
  6. Docker Compose
  7. 常用实践技巧
  8. 故障排除

1. Docker 简介

Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统上。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 的优势:

  • 更快的交付和部署
  • 更高效的资源利用
  • 更轻松的迁移和扩展
  • 更简单的管理

2. 安装 Docker

在 Ubuntu 上安装 Docker:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 更新 apt 包索引
sudo apt-get update

# 安装必要的软件包
sudo apt-get install \
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=$(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

# 再次更新 apt 包索引
sudo apt-get update

# 安装 Docker Engine
sudo apt-get install docker-ce docker-ce-cli containerd.io

在 macOS 上安装 Docker:

下载并安装 Docker Desktop for Mac

在 Windows 上安装 Docker:

下载并安装 Docker Desktop for Windows


3. Docker 核心概念

镜像(Image)

镜像是一个只读模板,包含了运行应用程序所需的所有内容,包括代码、运行时库、环境变量和配置文件等。

容器(Container)

容器是镜像的一个运行实例。可以将其看作是一个简易的 Linux 系统环境。

仓库(Repository)

仓库是集中存放镜像的地方。一个仓库通常包含多个标签(tag)的镜像。


4. 基本 Docker 命令

查看 Docker 版本

1
docker --version

查看 Docker 系统信息

1
docker info

搜索镜像

1
2
# 搜索官方 nginx 镜像
docker search nginx

拉取镜像

1
2
3
4
5
# 拉取最新版 nginx 镜像
docker pull nginx

# 拉取指定版本的 nginx 镜像
docker pull nginx:1.21

查看本地镜像

1
docker images

运行容器

1
2
3
4
5
6
7
# 运行 nginx 容器,命名为 mynginx,映射端口 8080 到 80
docker run --name mynginx -p 8080:80 -d nginx

# 参数说明:
# --name: 给容器命名
# -p: 端口映射,格式为主机端口:容器端口
# -d: 后台运行容器

查看正在运行的容器

1
docker ps

查看所有容器(包括已停止的)

1
docker ps -a

停止容器

1
docker stop mynginx

启动已停止的容器

1
docker start mynginx

重启容器

1
docker restart mynginx

删除容器

1
2
3
4
5
# 删除单个容器
docker rm mynginx

# 删除所有已停止的容器
docker container prune

删除镜像

1
2
3
4
5
# 删除单个镜像
docker rmi nginx

# 删除所有未使用的镜像
docker image prune -a

进入容器内部

1
2
# 执行命令进入容器 bash
docker exec -it mynginx /bin/bash

查看容器日志

1
2
3
4
5
# 查看容器全部日志
docker logs mynginx

# 实时查看容器日志
docker logs -f mynginx

5. Dockerfile 编写

Dockerfile 是一个文本文件,其中包含了一系列指令,用于定义如何构建 Docker 镜像。

基本语法示例

创建一个简单的 Node.js 应用的 Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 使用官方 Node.js 运行时作为基础镜像
FROM node:16

# 设置工作目录
WORKDIR /usr/src/app

# 复制 package.json 和 package-lock.json(如果存在)
COPY package*.json ./

# 安装应用依赖
RUN npm install

# 如果是生产环境构建,可以使用以下命令代替上面的命令
# RUN npm ci --only=production

# 复制应用源码
COPY . .

# 暴露端口
EXPOSE 3000

# 定义环境变量
ENV NODE_ENV=production

# 启动应用
CMD [ "node", "server.js" ]

构建镜像

1
2
3
4
5
# 在 Dockerfile 所在目录执行
docker build -t my-node-app .

# -t: 给镜像打标签
# .: 指定构建上下文路径

多阶段构建示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# 运行阶段
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]

最佳实践

  1. 将变化频率低的指令放在前面,充分利用镜像缓存
  2. 合理合并 RUN 指令减少镜像层数
  3. 及时清理不必要的文件和缓存
  4. 使用 .dockerignore 忽略不需要的文件

6. Docker Compose

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。

安装 Docker Compose

1
2
3
4
5
6
7
8
# 下载 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

docker-compose.yml 示例

创建一个简单的 Web 应用和数据库组合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.8'

services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
DB_HOST: db
DB_USER: myuser
DB_PASSWORD: mypassword
DB_NAME: mydb

db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"

volumes:
db_data:

常用 Docker Compose 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 启动所有服务
docker-compose up

# 后台启动所有服务
docker-compose up -d

# 查看运行的服务
docker-compose ps

# 停止服务
docker-compose stop

# 启动已停止的服务
docker-compose start

# 重启服务
docker-compose restart

# 停止并删除容器、网络等
docker-compose down

# 查看日志
docker-compose logs

# 构建或重新构建服务
docker-compose build

7. 常用实践技巧

优化镜像大小

1
2
3
4
5
# 使用更小的基础镜像
FROM alpine:latest

# 或者使用特定语言的 slim 版本
FROM python:3.9-slim

使用 .dockerignore 文件

创建 .dockerignore 文件来忽略不需要添加到镜像中的文件:

1
2
3
4
5
6
7
8
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
coverage
.nyc_output

容器健康检查

1
2
3
# 添加健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1

数据持久化

1
2
3
4
5
6
# 使用数据卷保存数据
docker run -v /host/path:/container/path my-image

# 使用命名卷
docker volume create my-volume
docker run -v my-volume:/container/path my-image

网络管理

1
2
3
4
5
6
# 创建自定义网络
docker network create my-network

# 在自定义网络中运行容器
docker run --network my-network --name web nginx
docker run --network my-network --name db mysql

8. 故障排除

权限问题

如果遇到权限问题,请将当前用户添加到 docker 组:

1
sudo usermod -aG docker $USER

然后注销并重新登录。

容器无法访问外部网络

检查防火墙设置和 DNS 配置:

1
2
3
# 在容器内测试网络连接
docker run --rm -it alpine sh
ping google.com

镜像拉取失败

使用国内镜像加速器,在 /etc/docker/daemon.json 中添加:

1
2
3
4
5
6
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}

然后重启 Docker 服务:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

查看详细错误信息

1
2
3
4
5
# 查看容器详细信息
docker inspect container_name

# 查看容器日志
docker logs container_name

通过这篇教程,你应该能够掌握 Docker 的基本使用方法。随着实践经验的积累,你会更加熟练地运用 Docker 来简化开发和部署流程。记住,最好的学习方式是在实际项目中不断练习和探索!

评论