核心概念:容器、镜像与仓库

  • 镜像 (Image):
    Docker 镜像打包了运行应用程序所需的一切,包括代码、函数库、环境变量和配置文件。

  • 容器 (Container):
    容器是镜像运行中的实例。如果将镜像视为面向对象编程中的“类 (Class)”,容器则是这个类的“对象 (Object)”。我们可以通过一个镜像创建任意数量的容器。每个容器都在一个隔离的环境中运行,拥有自己的文件系统、网络和进程空间,但它们共享主机的操作系统内核。这使得容器非常轻量且启动迅速。

  • 仓库 (Registry):
    镜像仓库是专门用来集中存放和分发 Docker 镜像的地方。最知名的公开仓库是 Docker Hub,它托管了海量的官方和用户分享的镜像。此外,还有许多国内的镜像仓库(或称为“镜像站”),它们可以提供更快的镜像下载速度。


Docker 安装与配置

1. 一键安装

可以参考 Docker 官方的示例:https://get.docker.com。

  • 下载安装脚本
    1
    curl -fsSL https://get.docker.com -o install-docker.sh
  • 执行安装脚本
    1
    sudo sh install-docker.sh
  • 验证安装
    1
    sudo docker --version

2. 配置国内镜像加速

  • 编辑 Docker 配置文件
    1
    sudo vi /etc/docker/daemon.json
  • 添加镜像站地址
    1
    2
    3
    4
    5
    6
    7
    8
    {
    "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1panel.live",
    "https://hub.rat.dev",
    "https://docker.fxxk.dedyn.io"
    ]
    }
  • 重启 Docker 服务
    1
    sudo systemctl restart docker
  • 查看 Docker 服务的状态
    1
    systemctl status docker

镜像与容器基础操作

1. 镜像管理

  • 拉取镜像: sudo docker pull <仓库地址>/<镜像名称>:<标签>
    • 例:从 docker.fxxk.dedyn.io 拉取1.25版本的 nginx 镜像
      1
      sudo docker pull docker.fxxk.dedyn.io/nginx:1.25
    • 若仓库地址为官方 Docker Hub,则<仓库地址>/可省略
    • latest 是一个特殊的标签,通常指向该镜像的最新版本,也可以省略
    • 例如:从官方 Docker Hub 拉取最新版本的 nginx 镜像
      1
      sudo docker pull nginx
  • 查看本地镜像:docker images
    1
    sudo docker images
  • 删除本地镜像: sudo docker rmi <镜像ID 或 镜像名称:标签>
    1
    sudo docker rmi nginx:latest
    如果镜像正在被某个容器使用,需要先删除该容器才能删除镜像,或者使用 -f 参数强制删除。

2. 容器生命周期管理

1. 运行容器 (docker run)

这是最核心的命令,用于从镜像创建并启动一个容器。它有许多实用的参数:

  • -d: 后台运行(Detached mode) :如果不加此参数,容器会直接在前台运行并占据终端。
  • -p <主机端口:容器端口>: 端口绑定:用于将主机的网络端口映射到容器内部的端口。
  • --name <容器名称>: 指定容器名称。
  • -v, --volume: 目录/卷绑定:可以将主机(Host)上的目录或 Docker 管理的卷(Volume)挂载到容器内部。分为 绑定挂载 (Bind Mount)命名卷挂载 (Named Volume) 两种方式。
    • 绑定挂载 (Bind Mount) :直接将主机的目录映射到容器中。语法:-v <宿主机上的绝对路径:容器内的路径>
    • 命名卷挂载 (Named Volume) :Docker 推荐的方式,由 Docker 来管理卷,更便于跨平台和备份。语法:-v <卷的名字:容器内的路径>更详细的命名卷操作见后文
  • -e <KEY=value>, --env: 传递环境变量。
  • -it, (--interactive --tty): 交互模式:,控制台直接进入容器进行交互,通常用于调试或执行临时命令
  • --rm: 自动删除容器:当容器停止运行时,自动将其删除。通常会和 -it 结合使用用于临时调试容器。
  • --restart: 重启策略。
    • always: 只要容器停止了就立即重启。
    • unless-stopped: 除非手动停止(例如使用 docker stop 命令),否则任何情况下都自动重启。

示例: 以后台模式 (-d)启动 一个名为 my-nginx (--name my-nginx)且设置了自动重启策略 (--restart unless-stopped) 的 Nginx 容器 (nginx:latest),并将主机的 8080 端口映射到容器的 80 端口 (-p 8080:80),并使用本地的 ~/my-nginx-content 目录作为网站文件来源 (-v ~/my-nginx-content:/usr/share/nginx/html)。

1
2
3
4
5
6
sudo docker run -d \
--name my-nginx \
-p 8080:80 \
-v ~/my-nginx-content:/usr/share/nginx/html \
--restart unless-stopped \
nginx:latest

随后即可通过浏览器的 http://您的主机IP:8080 来访问这个由主机文件驱动的 Nginx 欢迎页面。即使重启了 Docker 或者服务器,这个容器也会自动重新启动。

2. 创建容器 (docker create)

  • docker create 的用法和 docker run 非常相似,只创建容器但不启动
  • 例:
    1
    docker create -it --name my-stopped-container ubuntu:latest

3. 查看容器 (docker ps)

  • sudo docker ps: 查看当前正在运行的容器。
  • sudo docker ps -a: 查看所有容器,包括已停止的。

4. 启动与停止容器

1
2
sudo docker start <容器ID 或 容器名称>
sudo docker stop <容器ID 或 容器名称>

5. 删除容器 (docker rm)

语法: sudo docker rm <容器ID 或 容器名称>

1
sudo docker rm my-nginx

如果要删除一个正在运行的容器,需要先 stop 它,或者使用 -f 强制删除。

6. 查看容器日志 (docker logs)

对于在后台运行的容器,这个命令非常有用。

1
2
3
sudo docker logs my-nginx
# 使用 -f 参数可以持续追踪日志输出
sudo docker logs -f my-nginx

7. 进入容器执行命令 (docker exec)

在一个已经运行的容器内部执行命令。

1
2
3
# -it 参数让我们可以获得一个交互式的终端
# /bin/sh 是要在容器内执行的命令
sudo docker exec -it my-nginx /bin/sh

进入后,您就处于容器的隔离环境中了,可以像在一个迷你的 Linux 系统中一样操作。

8. Volume 命令

1
2
3
4
5
sudo docker volume create my-vol      # 创建一个 Volume
sudo docker volume ls # 列出所有 Volume
sudo docker volume inspect my-vol # 查看 Volume 的详细信息
sudo docker volume rm my-vol # 删除一个 Volume
sudo docker volume prune # 清理所有未被使用的 Volume

Dockerfile:自定义镜像

当官方镜像无法满足需求时,我们可以通过编写 Dockerfile 来创建自己的镜像。Dockerfile 是一个文本文件,包含了用于构建镜像的所有指令。

Dockerfile 主要指令

1. 基础指令

  • FROM: 指定基础镜像,作为构建的起点
  • WORKDIR: 设置工作目录,后续指令将在此目录下执行
  • COPY/ADD: 将文件或目录从构建上下文复制到镜像中
  • RUN: 在镜像构建过程中执行命令,通常用于安装软件包

2.运行时指令

  • CMD: 指定容器启动时的默认命令(可被覆盖)
  • ENTRYPOINT: 指定容器启动时的入口点(不可被覆盖)
  • EXPOSE: 声明容器运行时监听的端口
  • ENV: 设置环境变量

3.元数据指令

  • LABEL: 添加镜像的元数据信息

示例:

一个完整的 Python Web 应用程序 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Dockerfile
# 1. 基于官方的 Python 3.9 轻量级镜像
FROM python:3.9-slim

# 2. 添加镜像元数据
LABEL maintainer="[email protected]"
LABEL description="Python Flask Web Application"

# 3. 设置环境变量
ENV PYTHONPATH=/app
ENV FLASK_ENV=production

# 4. 设置工作目录
WORKDIR /app

# 5. 复制需求文件到工作目录
COPY requirements.txt .

# 6. 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 7. 复制所有应用程序代码到工作目录
COPY . .

# 8. 暴露应用端口
EXPOSE 5000

# 9. 容器启动时执行的命令
CMD ["python", "app.py"]

构建命令:docker build

1
2
3
# -t 用于指定新镜像的名称和标签
# . 表示 Dockerfile 位于当前目录
sudo docker build -t my-python-app:1.0 .

Docker Compose:编排多容器应用

  • 当应用程序由多个服务(如 Web 服务器、数据库、缓存)组成时,手动管理多个 docker run 命令会变得很繁琐。

  • Docker Compose 允许您使用一个 YAML 文件来将一系列相互关联的docker自动启动并为每个服务创建子网

  • 可以通过ai把一系列docker run命令转成docker compose文件

  • 示例: 一个包含 WordPress 和 MySQL 的 docker-compose.yaml 文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    # docker-compose.yaml
    version: '3.8'

    services:
    db:
    image: mysql:5.7
    volumes:
    - db_data:/var/lib/mysql
    environment:
    MYSQL_ROOT_PASSWORD: example_root_password
    MYSQL_DATABASE: wordpress
    MYSQL_USER: wordpress
    MYSQL_PASSWORD: wordpress_password
    restart: unless-stopped

    wordpress:
    image: wordpress:latest
    ports:
    - "8000:80"
    environment:
    WORDPRESS_DB_HOST: db:3306
    WORDPRESS_DB_USER: wordpress
    WORDPRESS_DB_PASSWORD: wordpress_password
    WORDPRESS_DB_NAME: wordpress
    depends_on:
    - db
    restart: unless-stopped

    volumes:
    db_data:

    在这个文件中,我们定义了 dbwordpress 两个服务,并设置了它们的镜像、卷、环境变量和依赖关系。Docker Compose 会自动为它们创建一个专属的网络,让 wordpress 服务可以通过主机名 db 来访问数据库。

  • 常用命令:

    • 在后台启动所有服务
      1
      sudo docker compose up -d
    • 停止并移除由 compose 创建的容器、网络
      1
      sudo docker compose down
    • 停止服务(不移除)
      1
      sudo docker compose stop
    • 重新启动服务
      1
      sudo docker compose start

参考

https://github.com/tech-shrimp/docker_installer
https://www.bilibili.com/list/watchlater/?bvid=BV1THKyzBER6