跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

Docker

Docker 概念、常用命令与容器管理

容器相关的东西都在这:概念、常用命令,还有把服务搬进 Docker 的过程。

1 - Docker 学习笔记

说明

Docker 核心概念

容器化技术

  • Docker 是目前最成熟高效的软件部署技术
  • Docker 就是用容器化技术给应用程序封装独立的运行环境
  • 每个运行环境就是一个==容器==
  • 运行容器的计算机被称为==宿主机==

容器与虚拟机的需求

  • 容器:多个容器共用同一个系统内核
  • 虚拟机:每个虚拟机都包含操作系统的完整内核
  • 优势:Docker 容器比虚拟机更轻、更小,启动速度更快

镜像与容器的关系

  • 镜像:镜像是容器的模板,可类比为软件安装包
  • 容器:由“软件安装包”安装出来的软件
  • 类比:
    • 类比于用模具做糕点,镜像是模具,容器是做出来的糕点
    • 可以使用一个模具(镜像)做出很多个糕点(容器)
    • 也可以将模具(镜像)分享给其他人使用

Docker 仓库

  • Docker 仓库是用来存放和分享镜像的地方
  • 用户可以将镜像上传到仓库后,供其他人下载
  • Docker Hub 是 Docker 的官方仓库,可以搜索大量镜像

Docker 安装方式

暂略~ 我日常使用 ==1Panel==、==cnb.cool==、==群晖 Nas== 这些方式管理 Docker 容器 他们都已经配置好了 Docker 环境 暂时不需要去了解 Docker 的安装

Docker 镜像管理

镜像地址

一个完整的镜像地址包含以下四部分:

docker.io/library/nginx:latest
<仓库地址>/<命名空间>/<镜像名称>:<版本标签>
  • 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

官方仓库的镜像往往无法直接下载,需要寻找相应的镜像站或使用代理。

//TODO

2 - Docker 常用命令速查

日常使用频率最高的 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。

情况noalwayson-failureunless-stopped
容器正常退出 (0 状态)不重启重启不重启重启
容器非正常退出 (非 0 状态)不重启重启重启重启
手动停止 (docker stop)不重启不重启不重启不重启
Docker 服务重启 (如系统重启)不重启重启不重启不重启

下面通过一个 demo 来演示它们的区别。

准备测试环境

创建一个名为 test.sh 的脚本,5 秒后自动退出:

#!/bin/bash
sleep 5
exit 1

创建 Dockerfile 将其打包进镜像:

FROM ubuntu
ADD test.sh /
CMD /bin/bash /test.sh

构建镜像:

docker build -t test-restart .

no

docker run -d --name=test-restart-no test-restart

容器 5 秒后退出,docker daemon 不做任何处理。

结论:容器退出后不重启。

always

docker run -d --restart=always --name=test-restart-always test-restart

容器退出后 docker daemon 自动重启。虽然每次生命周期只有 5 秒,但不断重启,表面上像一直在运行。

如果手动 docker stop 停止,不会自动重启。但重启 Docker daemon 后,容器会再次启动。

结论:除非手动停止,否则总是重启。重启 Docker daemon 也会触发。

on-failure

docker run -d --restart=on-failure:3 --name=test-restart-on-failure test-restart

容器退出后触发重启。容器退出后触发重启。当重启达到 3 次上限后不再重启。

注意:Docker 认为容器成功启动至少需运行 10 秒。脚本 5 秒就退出,触发重启的次数会持续累加直到上限(参考Docker 官方文档)。

结论:仅在容器非正常退出时重启,可设置最大重试次数。

unless-stopped

docker run -d --restart=unless-stopped --name=test-restart-unless-stopped test-restart

表现和 always 一样——容器退出后自动重启。区别在于:手动 docker stop 停止后,重启 Docker daemon 时容器不会自动启动,而 always 会。

结论:与 always 类似,但手动停止后重启 Docker 不会再次启动。

如何选择

  • no:一次性任务、调试环境,不需要自动重启
  • always:Web 服务、数据库等需要持续运行的服务
  • on-failure:脚本任务、批处理作业,只在出错时重试
  • unless-stopped:和 always 类似,但希望手动停止后不再被 Docker 重启时使用

参考资料

4 - Docker 远程管理 Portainer

通过 Portainer 的 Web 界面远程管理多台主机的 Docker 容器。
2024-10-08 update 安全提醒

直接暴露 Docker API 端口(2375)到公网没有任何加密和认证。配置完成后务必限制防火墙来源 IP,或配置 TLS 加密。否则可能被加密劫持蠕虫盯上。

配置好远程管理后不久,我收到了云服务器恶意文件通知,并在远程主机中发现了一个莫名的容器 boorish_agelast,运行着 ubuntu:18.04。经确认是针对 Docker 守护进程的加密劫持蠕虫 Cetus。如果你的 Docker 环境不需要频繁集中管理,建议先配置好 TLS 加密再开放远程端口:

本文内容基于 6053537/portainer-ce - Docker Image | Docker Hub 的汉化版。

远程主机设置

  1. 确保远程主机已安装 Docker

  2. 进入主机终端,输入命令:

nano /usr/lib/systemd/system/docker.service
  1. 然后做以下修改:
# 将这一行
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

# 改为这样
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
  1. 最后再重启 Docker 即可
systemctl daemon-reload
systemctl restart docker
  1. 记得在服务器的防火墙放开 2375 端口

Portainer 设置

  1. 环境 - 添加环境 - 独立的 Docker
  2. 选择 API 连接模式
  3. Docker API URL 处填写被远程连接的主机 IP+ 端口,如 6.6.6.6:2375
  4. 点击链接,完成。

参考资料