docker的本质

镜像(Image)= 模板
容器(Container)= 运行中的进程
数据卷(Volume)= 持久化数据
网络(Network)= 容器互通
Compose = 多容器编排

镜像 -> 类似系统安装包
容器 -> 类似启动后的程序

docker 基础命令

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
# 查看运行中的容器
docker ps

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

#查看日志
docker logs 容器名

# 实时查看
docker logs -f 容器名

# 最近100行
docker logs -tail 100 容器名

# 带时间
docker logs -f -t 容器名

#进入容器
docker exec -it 容器名 bash
docker exec -it 容器名 sh

exec 在运行中的容器执行命令
-i 保持输入
-t 分配终端


# 停止、启动
docker stop 容器名
docker start 容器名
docker restart 容器名

# 删除
docker rm 容器名
#强制删除
docker rm -f 容器名

# 查看详细信息
docker inspect 容器名
# 查看容器 ip
docker inspect 容器名 | grep IPAddress



ports的区别

10443/tcp
容器内部暴露了 10443 端口,但没有映射到宿主机
宿主机不能访问
浏览器不能直接访问
VPS公网不能访问
同 network 的其它容器可以访问
https://container:10443

0.0.0.0:80->80/tcp
公网可访问

镜像

1
2
3
4
5
6
7
8
9
10
11
12
# 查看镜像
docker images

# 拉镜像
docker pull nginx

# 拉指定版本
docker pull nginx:1.27

# 删除镜像
docker rmi nginx

Volume 数据持久化

1
2
# 查看挂载 看Mounts
docker inspect mysql

网络

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看网络
docker network ls

# 查看网络详情
docker network inspect bridge

# 创建网络
docker network create app-net





容器互通原理

同一个 network:容器名 = DNS
例如
proxy_pass http://s-ui:8080;
Docker 自动解析:
s-ui -> 容器IP

Compose 多项目互通

compose 会自动加项目名前缀
例如app_app-net

排障

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
# 查看资源占用
docker stats

#查看容器进程
docker top nginx

# 检查 nginx 配置
docker compose exec nginx nginx -t

# 平滑重载 nginx(compose 服务名)
docker compose exec nginx nginx -s reload

# 平滑重载 nginx(容器名)
docker exec my-nginx nginx -s reload

# 重启 nginx 服务
docker compose restart nginx

# 查看端口映射
docker port nginx

# 查看容器文件变化
docker diff nginx

A Added,新文件/目录
C Changed,被修改
D Deleted,被删除

# 清理构建缓存
docker builder prune

# 更彻底清理构建缓存
docker builder prune -a

# 安全清理未使用资源(不加 --volumes)
docker system prune

# 更彻底清理未使用资源,会删除所有未被容器使用的镜像
docker system prune -a

# 查看事件流
docker events
# 只看某个容器
docker events --filter container=nginx
# 只看某个镜像
docker events --filter image=nginx
# 只看启动
docker events --filter event=start
# 只看停止
docker events --filter event=die
# 配合grep
docker events | grep nginx
docker events | grep restart
# grep 全局正则搜索并打印
global regular expression print

# 查看容器实时信息
watch docker ps
# 可能需要先装
apt install watch

prune 加 -a 的区别

docker system prune:
清理已停止的容器、未使用的网络、构建缓存、悬空镜像(none 镜像)。

docker system prune -a:
额外删除所有当前没有被容器使用的镜像,包括 nginx:latest、node:20 这种有 tag 的镜像。

docker builder prune:
清理构建缓存。

docker builder prune -a:
更彻底清理所有未使用的构建缓存。

默认都不会删除 volume,除非加 –volumes。

nginx reload 和 restart 的区别

nginx -s reload:
Nginx 重新读取配置,通常不中断已有连接。改 nginx.conf、站点配置、证书后优先用它,执行前先 nginx -t。

docker compose restart nginx:
停止并重新启动 nginx 容器,会有短暂中断。它不会重新创建容器;如果改了 docker-compose.yml、镜像或挂载配置,通常要用 docker compose up -d。

dockerfile

1
2
3
4
5
6
7
8
9
10
FROM node:20

WORKDIR /app

COPY . .

RUN npm install

CMD ["npm", "start"]

  • FROM(基础镜像)
  • COPY(复制文件)
  • WORKDIR(工作目录)
  • CMD(容器启动命令)
  • EXPOSE(声明端口)
  • ENV(环境变量)
  • ENTRYPOINT(高级)

构建

1
2

docker build -t myapp .

运行

1
2
3

docker run myapp

生产

1
2
restart: unless-stopped

日志限制

1
2
3
4
5
logging:
options:
max-size: "10m"
max-file: "3"