Docker 相关

一、Docker 安装

1. Ubuntu & Debian

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

2. CentOS

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

二、配置镜像源或网络代理

1. 配置镜像源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim /etc/docker/daemon.json

# 内容如下:
{
"registry-mirrors": ["https://docker.aspark.cc"]
}

# 退出并保存
:wq

# 使配置生效
systemctl daemon-reload

# 重启Docker
systemctl restart docker

2. Docker Pull 代理

执行 docker pull 时,操作实际上由 Docker 守护进程 (dockerd) 完成。因此,代理设置需要应用到 dockerd 的运行环境中,而 dockerd 的运行环境是由 systemd 管控的,所以需要在 systemd 中进行配置。

1
2
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

在这个proxy.conf文件(可以是任意***.conf**的形式)中,添加以下内容:

1
2
3
4
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:10809/"
Environment="HTTPS_PROXY=http://proxy.example.com:10809/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

配置完成后,使用以下命令重启

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

3. Container 代理

在容器运行阶段,如果需要代理上网,则需要配置 ~/.docker/config.json。以下配置,只在 Docker17.07 及以上版本生效。

1
2
3
4
5
6
7
8
9
10
11
{
"proxies":
{
"default":
{
"httpProxy": "http://proxy.example.com:10809",
"httpsProxy": "http://proxy.example.com:10809",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}

配置完成后,使用以下命令重启

1
sudo systemctl restart docker

以上是用户级的配置,除了 proxiesdocker login 等相关信息也会在其中,而且还可以配置信息展示的格式、插件参数等。

此外,容器的网络代理,也可以直接在其运行时通过 -e 注入 http_proxy 等环境变量,如下:

1
2
3
4
docker run \
-e http_proxy=http://proxy.example.com:8080 \
-e https_proxy=http://proxy.example.com:8080 \
my-container

4. Docker Build 代理

虽然 docker build 的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。在构建时,需要注入 http_proxy 等参数。

1
2
3
4
5
docker build . \
--build-arg "HTTP_PROXY=http://proxy.example.com:10809/" \
--build-arg "HTTPS_PROXY=http://proxy.example.com:10809/" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
-t your/image:tag

注意:无论是 docker run 还是 docker build,默认是网络隔绝的。如果代理使用的是 localhost:10809 这类,则会无效。这类仅限本地的代理,必须加上 –network host 才能正常使用。而一般则需要配置代理的外部IP,而且代理本身要开启 Gateway 模式。

三、Docker 常用命令

① docker run 命令

docker run 用于创建并启动容器,以下是常用参数说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker run -d \
--name container-name # 指定容器名称
--network network-name # 指定网络
--restart policy # 容器重启策略
--cpus 1.5 # 限制 CPU 使用量
--memory 512m # 限制内存使用量
--memory-swap 1g # 限制内存交换区大小
--privileged # 赋予容器特权
--device /dev/sda:/dev/sda # 映射设备
--dns 8.8.8.8 # 指定 DNS 服务器
-p host-port:container-port # 端口映射
-v ./host/path:/container/path # 挂载主机目录
-v volume-name:/container/path # 挂载数据卷
-e VARIABLE=value # 设置环境变量
image-name[:tag] # 指定镜像及版本

其中 –restart 有以下策略:

策略说明
no默认策略,容器退出时不重启
unless-stopped总是重启容器,但如果容器之前被手动停止,则在 Docker 服务重启时不会启动容器
always总是重启容器,即使容器被手动停止,在 Docker 服务重启时也会启动容器
on-failure[:max-retries]仅在容器以非零状态码退出时重启,可以指定最大重试次数

unless-stoppedalways 的区别是在手动停止(docker stop container-name/container-id) 后,always 会在 docker 守护进程或主机重启时,自动重启容器,而 unless-stopped 不会;在非手动重启时,两者效果一样。

② 容器生命周期管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 启动容器
docker start container-name

# 停止容器
docker stop container-name

# 重启容器
docker restart container-name

# 暂停容器
docker pause container-name

# 恢复容器
docker unpause container-name

# 删除容器(需要先停止)
docker rm container-name

# 强制删除容器
docker rm -f container-name

③ 容器状态查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止)
docker ps -a

# 查看容器日志
docker logs container-name
docker logs -f container-name # 实时查看
docker logs -n 100 container-name # 查看最后100行
docker logs --since 2024-01-01 container-name # 查看指定时间后的日志

# 查看容器详细信息
docker inspect container-name

# 查看容器资源使用情况
docker stats

# 查看容器中运行的进程
docker top container-name

④ 镜像管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 搜索镜像
docker search image-name

# 拉取镜像
docker pull image-name[:tag]

# 查看本地镜像
docker images

# 删除镜像
docker rmi image-name[:tag]

# 构建镜像
docker build -t image-name[:tag] .

# 推送镜像到仓库
docker push image-name[:tag]

# 保存镜像为tar文件
docker save -o filename.tar image-name[:tag]

# 加载tar文件为镜像
docker load -i filename.tar

⑤ 网络管理

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

# 查看网络列表
docker network ls

# 查看网络详细信息
docker network inspect network-name

# 将容器连接到网络
docker network connect network-name container-name

# 断开容器与网络的连接
docker network disconnect network-name container-name

# 删除网络
docker network rm network-name

⑥ 数据卷管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建数据卷
docker volume create volume-name

# 查看数据卷列表
docker volume ls

# 查看数据卷详细信息
docker volume inspect volume-name

# 删除数据卷
docker volume rm volume-name

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

⑦ 系统维护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看 Docker 系统信息
docker info

# 查看 Docker 版本
docker version

# 显示 Docker 磁盘使用情况
docker system df

# 清理不再使用的 Docker 对象
docker system prune # 清理停止的容器、未使用的网络和悬空镜像
docker system prune -a # 同时清理未使用的镜像

# 实时事件流
docker events

# 登录到 Docker 仓库
docker login [registry-url]

# 从 Docker 仓库登出
docker logout [registry-url]

四、Docker Compose

1. 常用命令

① 启动服务

1
2
3
4
5
6
7
8
9
10
11
# 启动所有服务
docker compose up

# 以守护进程模式在后台启动
docker compose up -d

# 启动特定服务
docker compose up <service_name>

# 服务扩展
docker compose up --scale <service_name>=<service_num>

② 停止服务

1
2
3
4
5
6
7
8
# 停止并移除所有容器
docker compose down

# 停止所有容器但不移除
docker compose stop

# 停止特定服务
docker compose stop <service_name>

③ 构建服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 构建或重新构建服务
docker compose build

# 构建特定服务
docker compose build <service_name>

# 不使用缓存构建
docker compose build --no-cache # 构建或重新构建服务
docker compose build

# 构建特定服务
docker compose build <service_name>

# 不使用缓存构建
docker compose build --no-cache

④ 查看状态

1
2
3
4
5
6
7
8
9
10
11
# 查看运行中的容器
docker compose ps

# 查看服务日志
docker compose logs

# 实时跟踪日志
docker compose logs -f

# 查看特定服务的日志
docker compose logs <service_name>

⑤ 管理容器

1
2
3
4
5
6
7
8
9
10
11
# 重启服务
docker compose restart

# 重启特定服务
docker compose restart <service_name>

# 暂停服务
docker compose pause

# 恢复服务
docker compose unpause

⑥ 执行命令

1
2
3
4
5
# 在运行的容器中执行命令
docker compose exec <service_name> <command>

# 在新容器中运行一次性命令
docker compose run <service_name> <command>

⑦ 配置相关

1
2
3
4
5
# 验证 docker-compose.yml 文件格式是否正确
docker compose config

# 列出所有服务
docker compose ps --services

⑧ 一些实用的组合命令

1
2
3
4
5
6
7
8
# 完全重建并启动所有服务
docker compose down && docker compose build --no-cache && docker compose up -d

# 查看所有容器的资源使用情况
docker compose top

# 强制重新创建所有容器
docker compose up -d --force-recreate

2. docker-compose.yml 模板

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# 指定 docker-compose 文件版本
version: '3.8'

# 定义服务
services:
# Web 应用服务
webapp:
# 构建配置
build:
context: ./path/to/build/context # 构建上下文路径
dockerfile: Dockerfile # Dockerfile 位置
args: # 构建参数
BUILD_ENV: production
# 或直接使用镜像
image: nginx:latest
container_name: my-webapp # 容器名称
hostname: webapp-host # 主机名
restart: unless-stopped # 重启策略:no, always, on-failure, unless-stopped

# 环境变量配置
environment:
- NODE_ENV=production
- API_KEY=xxx
# 或使用环境变量文件
env_file:
- .env

# 端口映射
ports:
- "80:80" # HOST:CONTAINER
- "443:443"
- "3000-3010:3000-3010" # 端口范围映射

# 卷挂载
volumes:
- ./app:/usr/src/app # 绑定挂载
- data-volume:/data # 命名卷
- /tmp:/tmp:ro # 只读挂载

# 依赖关系
depends_on:
- redis
- postgres

# 健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s

# 资源限制
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M

# 网络配置
networks:
- frontend
- backend

# 日志配置
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"

# Redis 服务
redis:
image: redis:alpine
command: redis-server --appendonly yes # 自定义命令
volumes:
- redis-data:/data

# PostgreSQL 服务
postgres:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres-data:/var/lib/postgresql/data
# 覆盖默认的 entrypoint
entrypoint: docker-entrypoint.sh postgres
# 用户设置
user: postgres

# 定义卷
volumes:
data-volume: # 命名卷
driver: local
redis-data:
driver: local
postgres-data:
driver: local
driver_opts: # 驱动选项
type: none
device: /path/on/host
o: bind

# 定义网络
networks:
frontend:
driver: bridge
ipam: # IP 地址管理
driver: default
config:
- subnet: 172.16.238.0/24
backend:
driver: bridge
# 启用 IPv6
enable_ipv6: true
# 外部网络
external: true
name: existing-network

# 配置默认值
configs:
http_config:
file: ./httpd.conf

# 密钥管理
secrets:
server_certificate:
file: ./server.cert

# 设备映射
#devices:
# - "/dev/ttyUSB0:/dev/ttyUSB0"

# DNS 设置
#dns:
# - 8.8.8.8
# - 8.8.4.4

# 扩展字段
x-custom:
foo: bar