03.Docker 入门

1. 安装 Docker

Linux 安装(Ubuntu/Debian)

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

# 安装依赖
sudo apt-get install ca-certificates curl gnupg

# 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 添加仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") 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 docker-buildx-plugin docker-compose-plugin

# 将当前用户加入 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER

Linux 安装(CentOS/RHEL)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 安装依赖
sudo yum install -y yum-utils

# 添加仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户加入 docker 组
sudo usermod -aG docker $USER

Windows 安装

  1. 确保已启用 WSL 2
  2. 下载并安装 Docker Desktop for Windows
  3. 在设置中启用 WSL 2 集成

验证安装

1
2
3
4
5
6
7
8
9
# 查看版本
docker --version
# Docker version 24.0.7, build afdd53b

# 查看详细信息
docker info

# 运行测试容器
docker run hello-world

2. 第一个容器

让我们运行第一个容器:

1
docker run hello-world

发生了什么?

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
┌─────────────────────────────────────────────────────────────┐
│ docker run hello-world 执行流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. Docker 客户端发送命令给 Docker Daemon │
│ │ │
│ ▼ │
│ 2. Docker Daemon 检查本地是否有 hello-world 镜像 │
│ │ │
│ ┌───────┴───────┐ │
│ │ 本地有镜像? │ │
│ └───────┬───────┘ │
│ No │ Yes │
│ │ └────────────────┐ │
│ ▼ │ │
│ 3. 从 Docker Hub 拉取镜像 │ │
│ │ │ │
│ └────────────────────────┤ │
│ ▼ │
│ 4. 基于镜像创建容器 │
│ │ │
│ ▼ │
│ 5. 运行容器,输出 Hello from Docker! │
│ │ │
│ ▼ │
│ 6. 容器执行完毕,自动停止 │
│ │
└─────────────────────────────────────────────────────────────┘

3. 镜像操作

常用命令速查表

命令 说明 示例
docker images 列出本地镜像 docker images
docker pull 拉取镜像 docker pull nginx:latest
docker search 搜索镜像 docker search mysql
docker rmi 删除镜像 docker rmi nginx:latest
docker tag 给镜像打标签 docker tag nginx:latest myrepo/nginx:v1
docker build 构建镜像 docker build -t myapp:v1 .
docker push 推送镜像 docker push myrepo/myapp:v1

[!NOTE]
删除全部镜像:docker rmi $(docker images -q)

实战示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 搜索 nginx 镜像
docker search nginx

# 拉取官方 nginx 镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 查看镜像详情
docker inspect nginx:latest

# 查看镜像历史(各层信息)
docker history nginx:latest

# 删除镜像
docker rmi nginx:latest

4. 容器操作

常用命令速查表

命令 说明 示例
docker run 创建并启动容器 docker run -d nginx
docker ps 列出运行中的容器 docker ps
docker ps -a 列出所有容器 docker ps -a
docker start 启动已停止的容器 docker start container_id
docker stop 停止容器 docker stop container_id
docker restart 重启容器 docker restart container_id
docker rm 删除容器 docker rm container_id
docker exec 在容器中执行命令 docker exec -it container_id bash
docker logs 查看容器日志 docker logs -f container_id

实战示例

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
31
32
# 运行一个 nginx 容器
# -d: 后台运行
# -p: 端口映射 (宿主机端口:容器端口)
# --name: 容器名称
docker run -d -p 8080:80 --name my-nginx nginx

# 查看运行中的容器
docker ps

# 查看容器日志
docker logs my-nginx

# 实时查看日志
docker logs -f my-nginx

# 进入容器内部
docker exec -it my-nginx bash

# 在容器中执行命令
docker exec my-nginx cat /etc/nginx/nginx.conf

# 停止容器
docker stop my-nginx

# 启动容器
docker start my-nginx

# 删除容器(需要先停止)
docker stop my-nginx && docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

docker run 常用参数

1
2
3
4
5
6
7
8
9
10
11
12
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 常用 OPTIONS
-d, --detach # 后台运行
-p, --publish # 端口映射,格式:宿主机端口:容器端口
-v, --volume # 挂载数据卷,格式:宿主机路径:容器路径
-e, --env # 设置环境变量
--name # 容器名称
--restart # 重启策略:no, on-failure, always, unless-stopped
--network # 指定网络
-it # 交互式终端(-i 保持 STDIN 打开,-t 分配伪终端)
--rm # 容器停止后自动删除

5. 数据持久化

容器默认是无状态的,容器删除后数据就丢失了。Docker 提供两种数据持久化方式:

数据卷(Volume)

由 Docker 管理的持久化存储,推荐使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建数据卷
docker volume create my-data

# 查看数据卷
docker volume ls

# 使用数据卷
docker run -d \
--name mysql-db \
-v my-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0

# 查看数据卷详情
docker volume inspect my-data

# 删除数据卷
docker volume rm my-data

# 删除未使用的数据卷
docker volume prune

挂载目录(Bind Mount)

将宿主机目录挂载到容器中。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 挂载当前目录到容器
docker run -d \
--name nginx-web \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx

# 只读挂载(容器无法修改)
docker run -d \
--name nginx-web \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html:ro \
nginx

数据卷 vs 挂载目录

特性 数据卷 (Volume) 挂载目录 (Bind Mount)
管理方式 Docker 管理 用户管理
存储位置 Docker 目录下 任意宿主机目录
可移植性 依赖宿主机路径
适用场景 数据持久化 配置文件、代码共享

6. 网络配置

Docker 提供多种网络模式:

网络模式

模式 说明
bridge 默认模式,容器通过虚拟网桥连接
host 容器直接使用宿主机网络
none 禁用网络
container 与其他容器共享网络

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看网络列表
docker network ls

# 创建自定义网络
docker network create my-network

# 运行容器时指定网络
docker run -d --name app --network my-network nginx

# 将容器连接到网络
docker network connect my-network container_name

# 查看网络详情
docker network inspect my-network

# 删除网络
docker network rm my-network

容器间通信

在同一网络中的容器可以通过容器名互相访问:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建网络
docker network create app-network

# 启动 MySQL
docker run -d \
--name mysql \
--network app-network \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0

# 启动应用,可以通过 "mysql" 这个名字访问数据库
docker run -d \
--name app \
--network app-network \
-e DATABASE_HOST=mysql \
my-app