Appearance
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 所在目录,不要添加存放用于挂载的目录
参考
- Docker 从入门到实践
- 使用 Docker 实现前端应用的标准化构建、部署和运行
- 耗子面板
- Composerize,将
docker run
命令转换为compose.yaml
- traefik/traefik,反向代理容器服务,带面板
- louislam/dockge,
compose.yaml
管理 - 探索一种新的项目组织形式,项目模板,有利于虚拟化的开发、构建部署和日志查看
- docker 容器日志持久化(kimi)
- 查看后台容器的日志(kimi)