docker

docker

docker镜像站​[1] 维护性非常好,点赞!

docker安装

1
2
sudo usermod -aG sudo $USER # 添加用户到sudo权限
newgrp docker # 运行命令使更改生效

tar -zxvf 文件名.tar.gz 解压文件

docker info爆错

ERROR: permission denied while trying to connect to the Docker daemon socket at

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

刷新用户组(部分系统有效): newgrp docker

Docker search超时

Docker 的三个核心抽象层级详解

1. Images(镜像) - 构建层

定义:只读的模板,包含创建容器所需的全部文件和配置,类似面向对象编程中的”类”概念

关键特性

  • Dockerfile 构建而成
  • 内容不可变(immutable)

常用命令

1
2
3
4
5
6
docker build -t imageName .  # 构建镜像
-t imageName:给镜像打标签(命名)
.:表示使用当前目录下的 Dockerfile
docker rmi my-nginx # 删除镜像
docker pull nginx # 拉取镜像
docker images # 列出本地镜像

最简单的 Dockerfile 构建与容器化流程

1
2
3
4
5
6
7
8
# 使用官方Nginx镜像作为基础
FROM nginx:alpine

# 暴露80端口
EXPOSE 80

# 容器启动时运行nginx
CMD ["nginx", "-g", "daemon off;"]

在文件目录执行docker build -t imageName . 构建镜像

2. Containers(容器) - 运行层

定义

  • 镜像的可运行实例
  • 类似面向对象编程中的”对象”实例

关键特性

  • 基于镜像创建,但包含可写层
  • 具有独立的运行环境
  • 生命周期可管理(启动/停止/删除)
  • 资源隔离(进程、网络、文件系统等)

示例操作

1
2
3
4
5
6
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
docker run -d --name containerName nginx # 创建并运行容器
docker ps -a # 查看所有容器
docker exec -it containerName bash # 进入运行中的容器
docker stop containerName # 停止容器
docker rm containerName # 删除容器

3. 第三抽象层级的两种理解视角

视角一:Volumes(卷) - 持久化层

定义

  • 用于数据持久化的存储机制
  • 独立于容器的生命周期

关键特性

  • 解决容器内数据易失性问题
  • 支持主机目录挂载或命名卷
  • 可在容器间共享

示例操作

1
2
3
docker volume create my-vol              # 创建卷
docker run -v my-vol:/data nginx # 使用卷
docker volume inspect my-vol # 检查卷详情

视角二:Networks(网络) - 连接层

定义

  • 容器间的通信基础设施
  • 提供网络隔离和连接策略

关键特性

  • 多种驱动类型(bridge、host、overlay等)
  • 支持自定义网络配置
  • 控制容器间的可见性和连接方式

示例操作

1
2
3
docker network create my-net            # 创建网络
docker run --network=my-net nginx # 容器加入网络
docker network inspect my-net # 检查网络详情

三层级关系图解

1
2
3
[Images] ← (基于) → [Containers] ↔ (使用) ↔ [Volumes/Networks]
↓ ↓ ↓
构建模板 运行实例 持久化存储/通信连接

case:悬空镜像

    悬空镜像是Docker中一个重要的概念,理解它有助于更好地管理Docker存储空间。下面我将全面解释悬空镜像的定义、成因及管理方法。

悬空镜像是指:

  • 没有标签(untagged)的镜像
  • 不被任何容器引用的中间层镜像
  • docker images​列表中显示为<none>:<none>​的镜像

产生原因:

  1. 重新构建镜像时:当您构建新版本的镜像并使用相同标签时,旧镜像会变成悬空镜像,
    例如:重复执行docker build -t my-app .
  2. 删除标签时:使用docker rmi​删除镜像标签但不删除所有引用时
  3. 多阶段构建时:构建过程中产生的中间层镜像

docker命令

compose

使用compose.yml文件进行编译

1
2
3
4
5
6
Usage:  docker compose [OPTIONS] COMMAND
Define and run multi-container applications with Docker
Commands:
up Create and start containers
watch Watch build context for service and rebuild/refresh containers when files are updated
down Stop and remove containers, networks

docker常用基础镜像

traefik​[2]

“traefik.enable=true”

作用:显式启用 Traefik 对该服务的路由功能

在 proxy 服务中设置了 –providers.docker.exposedbydefault=false,这意味着 Traefik 默认不会路由任何服务

“traefik.http.routers.backend.rule=PathPrefix(/api)”

作用:定义路由规则,指定哪些请求应该被路由到这个服务

backend​是这个路由器的自定义名称,可以改为其他有意义的名字。

backend 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
backend:
build:
context: ./
target: backend-dev
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
develop:
watch:
- path: ./backend/src
action: sync
target: /usr/local/app/src
- path: ./backend/package.json
action: rebuild
# 使用 Compose Watch 功能实现代码热重载:
# 同步 ./backend/src 目录到容器
# 当 package.json 变化时重建容器

labels:
- "traefik.enable=true"
- "traefik.http.routers.backend.rule=PathPrefix(`/api`)"
- "traefik.http.services.backend.loadbalancer.server.port=3000"

资源链接-docker

[1] Docker/DockerHub 国内镜像源/加速列表 3月28日更新-长期维护

[2] Traefik v3.0 Docker 全面使用指南:基础篇-腾讯云开发者社区-腾讯云


docker
http://example.com/post/docker-zeg79c.html
作者
lovedreamms
发布于
2024年5月15日
许可协议