这是本节的多页打印视图。 .
Docker
容器相关的东西都在这:概念、常用命令,还有把服务搬进 Docker 的过程。
1 - Docker 学习笔记
本文是根据 40分钟的Docker实战攻略,一期视频精通Docker 视频学习记录的笔记。 参考评论1 参考评论2
Docker 核心概念
容器化技术
- Docker 是目前最成熟高效的软件部署技术
- Docker 就是用容器化技术给应用程序封装独立的运行环境
- 每个运行环境就是一个==容器==
- 运行容器的计算机被称为==宿主机==
容器与虚拟机的需求
- 容器:多个容器共用同一个系统内核
- 虚拟机:每个虚拟机都包含操作系统的完整内核
- 优势:Docker 容器比虚拟机更轻、更小,启动速度更快
镜像与容器的关系
- 镜像:镜像是容器的模板,可类比为软件安装包
- 容器:由“软件安装包”安装出来的软件
- 类比:
- 类比于用模具做糕点,镜像是模具,容器是做出来的糕点
- 可以使用一个模具(镜像)做出很多个糕点(容器)
- 也可以将模具(镜像)分享给其他人使用
Docker 仓库
- Docker 仓库是用来存放和分享镜像的地方
- 用户可以将镜像上传到仓库后,供其他人下载
- Docker Hub 是 Docker 的官方仓库,可以搜索大量镜像
Docker 安装方式
暂略~ 我日常使用 ==1Panel==、==cnb.cool==、==群晖 Nas== 这些方式管理 Docker 容器 他们都已经配置好了 Docker 环境 暂时不需要去了解 Docker 的安装
Docker 镜像管理
镜像地址
一个完整的镜像地址包含以下四部分:
docker.io是 Docker Hub 官方仓库的地址,可以省略library是 Docker Hub 官方仓库的命名空间,可以省略nginx是镜像名称latest是版本标签,latest表示最新版本,可以省略- 示例:
- 从官方仓库下载最新版 nginx 镜像:
docker pull nginx - 从官方仓库的 n8n 命名空间下载镜像:
docker pull n8nio/n8n - 从 n8n 私有仓库下载镜像:
docker pull docker.n8n.io/n8nio/n8n
- 从官方仓库下载最新版 nginx 镜像:
官方仓库的镜像往往无法直接下载,需要寻找相应的镜像站或使用代理。
//TODO
2 - Docker 常用命令速查
列出日常使用频率最高的命令。更多可参考 Docker 命令大全 | 菜鸟教程
容器管理
| 命令 | 说明 |
|---|---|
docker ps | 列出运行中的容器 |
docker ps -a | 列出所有容器(含已停止的) |
docker start <容器> | 启动已停止的容器 |
docker stop <容器> | 停止运行中的容器 |
docker restart <容器> | 重启容器 |
docker rm <容器> | 删除已停止的容器 |
docker rm -f <容器> | 强制删除运行中的容器 |
docker rename <容器> <新名称> | 重命名容器 |
镜像管理
| 命令 | 说明 |
|---|---|
docker images | 列出本地镜像 |
docker pull <镜像名> | 从仓库拉取镜像,如 docker pull nginx |
docker rmi <镜像名> | 删除本地镜像 |
docker build -t <标签> . | 构建镜像,-t 指定名称和标签 |
docker tag <镜像> <新标签> | 给镜像打标签 |
docker push <镜像名> | 推送镜像到远程仓库 |
日志与调试
| 命令 | 说明 |
|---|---|
docker logs <容器> | 查看容器日志 |
docker logs -f --tail 100 <容器> | 实时查看最近 100 条日志 |
docker exec -it <容器> bash | 进入容器内部(交互式 Shell) |
docker inspect <容器> | 查看容器的详细信息(JSON) |
docker stats | 实时显示容器资源占用(CPU/内存) |
docker top <容器> | 查看容器内运行的进程 |
Docker Compose
| 命令 | 说明 |
|---|---|
docker compose up -d | 后台启动所有服务 |
docker compose down | 停止并移除所有容器和网络 |
docker compose ps | 列出项目中的容器状态 |
docker compose logs -f | 实时查看所有服务的日志 |
docker compose restart | 重启所有服务 |
docker compose pull | 拉取所有服务的最新镜像 |
系统维护
| 命令 | 说明 |
|---|---|
docker system df | 查看磁盘使用情况 |
docker system prune | 清理未使用的容器、镜像、网络 |
docker system prune -a | 清理所有未使用的资源(含未使用的镜像) |
docker info | 查看 Docker 系统信息 |
3 - Docker 重启策略详解
Docker 容器的重启策略有四种:no、always、on-failure、unless-stopped。
| 情况 | no | always | on-failure | unless-stopped |
|---|---|---|---|---|
| 容器正常退出 (0 状态) | 不重启 | 重启 | 不重启 | 重启 |
| 容器非正常退出 (非 0 状态) | 不重启 | 重启 | 重启 | 重启 |
手动停止 (docker stop) | 不重启 | 不重启 | 不重启 | 不重启 |
| Docker 服务重启 (如系统重启) | 不重启 | 重启 | 不重启 | 不重启 |
下面通过一个 demo 来演示它们的区别。
准备测试环境
创建一个名为 test.sh 的脚本,5 秒后自动退出:
创建 Dockerfile 将其打包进镜像:
构建镜像:
no
容器 5 秒后退出,docker daemon 不做任何处理。
结论:容器退出后不重启。
always
容器退出后 docker daemon 自动重启。虽然每次生命周期只有 5 秒,但不断重启,表面上像一直在运行。
如果手动 docker stop 停止,不会自动重启。但重启 Docker daemon 后,容器会再次启动。
结论:除非手动停止,否则总是重启。重启 Docker daemon 也会触发。
on-failure
容器退出后触发重启。容器退出后触发重启。当重启达到 3 次上限后不再重启。
注意:Docker 认为容器成功启动至少需运行 10 秒。脚本 5 秒就退出,触发重启的次数会持续累加直到上限(参考Docker 官方文档)。
结论:仅在容器非正常退出时重启,可设置最大重试次数。
unless-stopped
表现和 always 一样——容器退出后自动重启。区别在于:手动 docker stop 停止后,重启 Docker daemon 时容器不会自动启动,而 always 会。
结论:与 always 类似,但手动停止后重启 Docker 不会再次启动。
如何选择
no:一次性任务、调试环境,不需要自动重启always:Web 服务、数据库等需要持续运行的服务on-failure:脚本任务、批处理作业,只在出错时重试unless-stopped:和always类似,但希望手动停止后不再被 Docker 重启时使用
参考资料
4 - Docker 远程管理 Portainer
直接暴露 Docker API 端口(2375)到公网没有任何加密和认证。配置完成后务必限制防火墙来源 IP,或配置 TLS 加密。否则可能被加密劫持蠕虫盯上。
配置好远程管理后不久,我收到了云服务器恶意文件通知,并在远程主机中发现了一个莫名的容器 boorish_agelast,运行着 ubuntu:18.04。经确认是针对 Docker 守护进程的加密劫持蠕虫 Cetus。如果你的 Docker 环境不需要频繁集中管理,建议先配置好 TLS 加密再开放远程端口:
本文内容基于 6053537/portainer-ce - Docker Image | Docker Hub 的汉化版。
远程主机设置
确保远程主机已安装 Docker
进入主机终端,输入命令:
- 然后做以下修改:
- 最后再重启 Docker 即可
- 记得在服务器的防火墙放开 2375 端口
Portainer 设置
- 环境 - 添加环境 - 独立的 Docker
- 选择 API 连接模式
- Docker API URL 处填写被远程连接的主机 IP+ 端口,如
6.6.6.6:2375 - 点击链接,完成。