Skip to content

Docker

why

开发环境一致。以前端开发为例,再开发之前,必需配置好 node 环境,确保环境变量能正常使用。这个过程可以通过拉取并运行 Docker 镜像一步代替。在不同机器上也用同样的操作快速生成自己想要的环境。

构建环境一致。一致的环境,步骤化编排、执行构建流程,获得目标产物。

运行时一致。在一致的环境中运行,减少环境对应用能力的影响。

相较于类似用途的虚拟机,Docker 有以下区别:

  • 运行在宿主的独立进程中,使用宿主内核,无需硬件模拟,更为轻量
  • 能访问、修改宿主数据

本文的目的:了解 Docker 的组成,安装、拉取、运行 Docker,能创建自己的镜像并本地运行,能解决常见运行问题,了解常用优化手段。

how

○ Docker 相关概念

  • Docker Desktop:提供管理 Docker 容器和镜像的 GUI,主要用于 Windows/macOS 中,Linux 中可无需安装。
  • Docker Engine:Docker 核心组件,负责容器的创建、运行和管理。提供 Daemon 负责管理容器生命周期与系统资源的交互,提供 CLI 便于与 Daemon 交互,提供 REST API 便于其他程序和 Docker Daemon 交互。
  • Docker Compose:定义和运行多个相关联的 Docker 容器应用。服务对应运行的容器实例,项目对应容器组成的完整业务单元。
  • Docker Swarm:Docker 官方容器编排工具
  • 容器编排:自动化部署(CI/CD,多主机、多容器实例、扩容缩减),负载均衡(容器实例的流量调度),服务发现与下线(识别服务,微服务通信,故障容器实例下线),监控和日志管理。管理同一个物理节点(Node)中的所有容器(容器组 Pod)

○ 安装 Docker

sh
paru -S docker
sudo systemctl enable --now docker.service

sudo usermod -aG docker $USER
newgrp docker

# 运行测试容器验证,会自动拉取镜像
sudo docker run hello-world

○ 拉取

格式:

  • 远端拉取:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
  • 远端拉取后,可保存到本地:docker save -o [output-file.tar] [image-name]

○ 运行

示例:

  • 运行拉取的镜像,可终端交互,关闭后删除:docker run -it --rm ubuntu:18:04 bash
  • 运行拉取的镜像,后台运行:docker run -d --rm ubuntu:18:04
  • 运行保存的镜像:docker load -i /home/docker-images/gitlab-ce-17.0.1.tar

添加容器名称 --name [container-name]

○ 状态

  • 镜像列表:docker images
  • 运行中的容器:docker ps -s
  • 关闭容器:docker stop --timeout=0 [container-id],默认需要等 10s
  • 关闭后重新启动:docker start [container-id]
  • 进入容器的交互模式:docker attach [container-id],或 docker exec -it [container-id] bash

○ 构建

  • 构建并打 tag:docker build -t [image-name] .,镜像名形如:aubur/node-lts-alpine

○ 删除

sh
# 查看所有已停止的容器
docker ps -a

# 虚悬镜像清理:删除所有停止的容器
docker rm $(docker ps -a -q)
docker image prune

# 删除镜像
docker image rm $imageId
# 删除容器
docker rm $containerId

○ 数据卷

sh
# 创建
docker volume create [vol-name]
# 查看
docker volume ls
# 检查数据卷信息
docker volume inspect [vol-name]
# 删除指定数据卷
docker volume rm [vol-name]
# 删除所有未使用的数据卷
docker volume prune -f

# 复制宿主机数据到容器挂载的数据卷中
docker cp [host-file] [container-name]:[container-path]
docker cp ./index.html mynginx:/usr/share/nginx/html/

TIP

挂载“可用的宿主机路径”到容器中时,会自动通过 bind 的形式挂载,否则会自动创建对应数据卷

○ 最佳实践

  • 容器无状态,只提供一个环境壳子
  • 容器只运行一个进程
  • 运行进程所需动态数据只读写外部,如:实时更新安装的依赖
  • 容器一直运行,需满足 CMD 执行的命令不结束。
  • 不要挂载容器 home 目录,会有权限问题,导致 ssh 无法正常无密码连接
  • 运行:始终添加 --rm 参数,自动删除容器
  • 构建:Dockerfile 所在目录,不要添加存放用于挂载的目录

参考

访问量 PV:Blocked用户数 UV:Blocked