docker笔记

docker学习笔记

一.docker安装配置(Ubuntu)

1.卸载旧版本

1
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

2.使用apt存储库安装

2.1设置 Docker 的apt存储库。

1
2
3
4
5
6
7
8
9
10
sudo apt-get update

sudo apt-get install -y ca-certificates curl gnupg lsb-release


sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg


1
2
3
4
5
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2.2安装 Docker 包。

安装最新版

1
2
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

验证是否运行

1
sudo systemctl status docker

某些系统可能已禁用此行为并需要手动启动:

1
sudo systemctl start docker

3.通过运行镜像验证安装是否成功hello-world

1
sudo docker run hello-world

此命令下载测试镜像并在容器中运行。容器运行时,它会打印一条确认消息并退出。

这里一般会出错,原因是:Docker 默认从 Docker Hub(registry-1.docker.io 拉取镜像,但国内访问 Docker Hub 常因网络波动、延迟高导致连接超时。

解决方法:

  1. 获取专属镜像加速地址

    登录 阿里云容器镜像服务(需注册阿里云账号),在「镜像加速器」板块复制你的专属地址(类似 https://xxxx.mirror.aliyuncs.com)。

  2. 修改 Docker 配置文件 daemon.json

1
sudo vim /etc/docker/daemon.json

添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"ipv6": false,
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror2.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}

再次运行即可.


一键安装脚本:install-docker.sh

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
31
32
33
34
35
#!/bin/bash
set -e

echo "=== 卸载旧版本 ==="
sudo apt-get remove -y docker docker-engine docker.io containerd runc || true

echo "=== 更新 apt 包索引 ==="
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

echo "=== 添加 Docker 官方 GPG Key ==="
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "=== 添加 Docker 官方仓库 ==="
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

echo "=== 更新 apt 包索引 ==="
sudo apt-get update

echo "=== 安装 Docker 引擎 ==="
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

echo "=== 启动 Docker 并设置开机自启 ==="
sudo systemctl enable docker
sudo systemctl start docker

echo "=== 验证 Docker 安装 ==="
sudo docker --version
sudo docker run --rm hello-world

echo "=== Docker 安装完成 ✅ ==="

使用方法:

  1. 创建脚本文件

    1
    nano install-docker.sh

    粘贴上面的内容,保存退出。

  2. 赋予执行权限

    1
    chmod +x install-docker.sh
  3. 执行安装

    1
    ./install-docker.sh

Debian系统安装Docker

1
2
3
4
5
6
7
# 使用阿里云镜像源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

sudo apt update
sudo apt install -y docker-ce

二.docker常用指令

镜像(Image)相关指令

指令 描述 示例
docker images 列出本地所有镜像 docker images
docker pull <image> 从仓库拉取镜像 docker pull nginx
docker push <image> 推送镜像到仓库 docker push myimage:latest
docker build -t <name:tag> . 从 Dockerfile 构建镜像 docker build -t myapp:1.0 .
docker rmi <image> 删除镜像 docker rmi nginx
docker tag <source> <target> 为镜像添加新标签 docker tag myapp:1.0 myapp:latest
docker search <term> 在 Docker Hub 搜索镜像 docker search mysql

容器(Container)相关指令

指令 描述 示例
docker run <image> 基于镜像运行一个新容器(可添加参数如 -d 后台运行、-p 端口映射) docker run -d -p 80:80 nginx
docker ps 列出运行中的容器 docker ps
docker ps -a 列出所有容器(包括停止的) docker ps -a
docker start <container> 启动已停止的容器 docker start mycontainer
docker stop <container> 停止运行中的容器 docker stop mycontainer
docker restart <container> 重启容器 docker restart mycontainer
docker rm <container> 删除容器(需先停止) docker rm mycontainer
docker exec -it <container> <command> 在运行容器中执行命令(-it 为交互模式) docker exec -it mycontainer /bin/bash
docker logs <container> 查看容器日志 docker logs mycontainer
docker inspect <container> 查看容器或镜像的详细信息 docker inspect mycontainer

网络(Network)相关指令

指令 描述 示例
docker network ls 列出所有网络 docker network ls
docker network create <name> 创建自定义网络 docker network create mynet
docker network rm <name> 删除网络 docker network rm mynet
docker network inspect <name> 查看网络详情 docker network inspect bridge

卷(Volume)相关指令

指令 描述 示例
docker volume create <name> 创建命名卷 docker volume create mydata
docker volume ls 列出所有卷 docker volume ls
docker volume inspect <name> 查看卷详情(如路径) docker volume inspect mydata
docker volume rm <name> 删除卷(容器需停止) docker volume rm mydata
docker volume prune 清理未使用卷 docker volume prune

系统管理相关指令

指令 描述 示例
docker version 显示 Docker 版本信息 docker version
docker info 显示 Docker 系统信息 docker info
docker login 登录 Docker 仓库 docker login
docker logout 登出 Docker 仓库 docker logout
docker system prune 清理未使用的资源(镜像、容器等) docker system prune -a

注:大多数指令支持 –help 参数查看详细用法,例如 docker run --help

三.docker目录挂载

在 Docker 中,目录挂载(也称为卷挂载或数据持久化)是用于将主机上的目录或文件映射到容器内部的机制。这可以确保容器数据持久化,即使容器被删除也不会丢失。Docker 支持两种主要挂载方式:绑定挂载(Bind Mounts) 卷(Volumes)。绑定挂载直接链接主机路径,而卷由 Docker 管理,更推荐用于生产环境。

基本概念

  • 绑定挂载:将主机上的具体路径挂载到容器中。适合开发环境,便于实时修改文件。
  • :Docker 管理的存储卷,不依赖主机路径。支持备份、迁移和多容器共享,更安全和高效。
  • 挂载使用 docker run 命令的 -v --volume 参数(或 --mount 提供更多选项)。
  • 注意权限:主机路径需有读写权限;容器用户(如 root)需匹配。

常用挂载指令示例

以下表格列出常见挂载方式,使用 docker run 指令。假设镜像为 nginx,你可以替换为自己的镜像。

挂载类型 指令示例 说明
绑定挂载(目录) docker run -d -p 80:80 -v /host/dir:/container/dir nginx 将主机 /host/dir 挂载到容器 /container/dir。容器内修改会同步到主机。
绑定挂载(文件) docker run -d -p 80:80 -v /host/file.conf:/container/file.conf nginx 挂载单个文件,如配置文件。
绑定挂载(只读) docker run -d -p 80:80 -v /host/dir:/container/dir:ro nginx 添加 :ro 使容器内路径只读。
命名卷 docker run -d -p 80:80 -v myvolume:/container/dir nginx 如果 myvolume 不存在,Docker 会自动创建。卷数据存储在 Docker 的 /var/lib/docker/volumes/ 下。
匿名卷 docker run -d -p 80:80 -v /container/dir nginx 不指定主机路径,Docker 创建匿名卷(随机名称)。适合临时数据。
使用 –mount 参数 docker run -d -p 80:80 --mount type=bind,source=/host/dir,target=/container/dir nginx 更灵活的语法,支持 type=volumetype=bind

步骤示例:挂载主机目录到 Nginx 容器

  1. 创建主机目录:mkdir -p ~/mywebsite 并在其中添加文件(如 index.html)。

  2. 运行容器并挂载:

    1
    docker run -d --name my-nginx -p 8080:80 -v ~/mywebsite:/usr/share/nginx/html nginx
    • 这将主机 ~/mywebsite 挂载到容器的 Nginx 默认网页目录。
  3. 访问测试:浏览器打开 http://localhost:8080,看到主机文件内容。

  4. 查看挂载:docker inspect my-nginx(在 “Mounts” 部分)。

四.Docker 卷映射

Docker 中的“卷映射”(Volume Mapping)是指使用 Docker (Volumes)来实现主机与容器之间数据的持久化和共享。不同于绑定挂载(Bind Mounts),卷由 Docker 引擎管理,不直接依赖主机文件系统路径。这使得卷更适合生产环境,因为它支持更好的数据隔离、备份和迁移。卷映射的主要目的是确保容器数据在容器生命周期结束后不会丢失。

卷映射的基本概念

  • 卷的类型:
    • 命名卷(Named Volumes):有明确名称的卷,由 Docker 管理。数据存储在主机的 /var/lib/docker/volumes/ 目录下(具体路径取决于系统)。
    • 匿名卷(Anonymous Volumes):没有名称的卷,Docker 自动生成随机 ID。适合临时数据。
  • 优势:
    • 数据持久化:容器删除后,卷数据仍保留。
    • 多容器共享:多个容器可挂载同一卷。
    • 性能更好:卷优化了 I/O 操作,尤其在云环境。
    • 安全性:不暴露主机路径,减少风险。
  • 与绑定挂载的区别:
    • 绑定挂载:直接指定主机路径(如 -v /host/path:/container/path),适合开发调试。
    • 卷映射:使用卷名称或匿名方式(如 -v myvolume:/container/path),更抽象和可移植。

常用卷映射指令

使用 docker run 命令的 -v --volume 参数进行映射。以下是示例表格(假设镜像为 nginx,可替换):

指令类型 示例 说明
创建并映射命名卷 docker run -d -p 80:80 -v myvolume:/usr/share/nginx/html nginx 如果 myvolume 不存在,Docker 自动创建。将卷映射到容器路径。
映射匿名卷 docker run -d -p 80:80 -v /usr/share/nginx/html nginx 不指定卷名,Docker 创建匿名卷。
使用 –mount 参数 docker run -d -p 80:80 --mount type=volume,source=myvolume,target=/app nginx 更精细控制,type=volume 指定为卷类型。
多卷映射 docker run -d -p 80:80 -v vol1:/data1 -v vol2:/data2 nginx 同时映射多个卷。
只读卷 docker run -d -p 80:80 -v myvolume:/app:ro nginx 添加 :ro 使容器内路径只读。

操作步骤示例:使用卷映射持久化数据

  1. 创建卷(可选,先手动创建):

    1
    docker volume create mydata
  2. 运行容器并映射卷:

    1
    docker run -d --name my-container -v mydata:/app ubuntu
    • 这将 mydata 卷映射到容器的 /app 目录。
  3. 在容器中写入数据:

    1
    2
    3
    docker exec -it my-container /bin/bash
    echo "Hello from container" > /app/test.txt
    exit
  4. 删除容器并验证数据持久化:

    1
    2
    3
    4
    docker stop my-container
    docker rm my-container
    docker run -d --name new-container -v mydata:/app ubuntu
    docker exec new-container cat /app/test.txt # 输出: Hello from container
  5. 查看卷信息:

    1
    docker volume inspect mydata

五.Docker 自定义网络

Docker 默认提供桥接(bridge)、主机(host)和无网络(none)等网络模式,但自定义网络允许用户创建更灵活的网络环境,提供更好的容器隔离、DNS 解析(容器间可通过名称通信)和自定义配置。自定义网络特别适合多容器应用,如微服务架构。默认自定义网络类型为桥接(bridge),但也可指定其他驱动如 overlay(用于 Swarm 集群)或 macvlan。

自定义网络的基本概念

  • 优势:
    • 隔离:不同网络的容器无法直接通信,提高安全性。
    • DNS 解析:在同一网络中,容器可使用名称(如 mycontainer)互相访问,而非 IP。
    • 可扩展:支持子网、网关等自定义参数。
    • 驱动类型:
      • bridge:本地桥接网络(默认,最常用)。
      • overlay:跨主机网络(需 Docker Swarm)。
      • macvlan:容器使用主机 MAC 地址,直接连接物理网络。
      • ipvlan:类似 macvlan,但共享 MAC。
      • none 或 host:非自定义,通常不用于创建。
  • 默认网络:docker network ls 可查看,如 bridge(默认桥接)、host 和 none。

常用自定义网络指令

以下表格列出核心指令,使用 docker network 子命令。示例假设创建桥接网络。

指令 描述 示例
docker network create <name> 创建自定义网络(默认 bridge 类型) docker network create mynet
docker network create --driver <driver> <name> 指定驱动创建网络 docker network create --driver bridge mynet
docker network create --subnet <subnet> <name> 指定子网创建 docker network create --subnet 192.168.0.0/16 mynet
docker network ls 列出所有网络 docker network ls
docker network inspect <name> 查看网络详情(如子网、容器列表) docker network inspect mynet
docker network rm <name> 删除网络(需无容器连接) docker network rm mynet
docker network connect <network> <container> 将运行容器连接到网络 docker network connect mynet mycontainer
docker network disconnect <network> <container> 从网络断开容器 docker network disconnect mynet mycontainer
docker network prune 清理未使用网络 docker network prune

操作步骤示例:创建并使用自定义网络

  1. 创建自定义网络:

    1
    docker network create mynet
    • 这创建一个桥接网络,Docker 会自动分配子网(如 172.18.0.0/16)。
  2. 运行容器并指定网络:

    1
    2
    docker run -d --name web1 --network mynet nginx
    docker run -d --name web2 --network mynet nginx
    • 两个容器在 mynet 中,可通过名称互访(如从 web1 ping web2)。
  3. 测试容器间通信:

    • 进入 web1 容器:

      1
      2
      3
      docker exec -it web1 /bin/bash
      ping web2 # 应成功解析并 ping 通
      exit
  4. 连接现有容器到网络:

    • 假设有一个默认网络的容器

      oldcontainer:

      1
      docker network connect mynet oldcontainer
  5. 查看和删除:

    1
    2
    docker network inspect mynet  # 显示连接的容器
    docker network rm mynet # 先断开所有容器

注意事项和最佳实践

  • 多网络连接:一个容器可连接多个网络(如默认 bridge + 自定义 mynet),使用 connect 指令。
  • 端口映射:在自定义网络中,容器间通信无需端口映射;但暴露到主机仍需 -p 参数。
  • Swarm 模式:对于集群,使用 overlay 驱动:docker network create –driver overlay myoverlay。
  • 权限与安全:自定义网络默认隔离;避免在生产环境暴露不必要端口。
  • Docker Compose:在 docker-compose.yml 中定义网络,更方便。 示例 YAML 片段:

六.Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它通过一个 YAML 文件(通常名为 docker-compose.ymlcompose.yml)来描述服务的配置,包括镜像、端口、卷、网络和依赖关系。Compose 简化了多容器应用的启动、管理和扩展,尤其适合开发、测试和 CI/CD 环境。当前版本为 Compose v2(集成在 Docker CLI 中,作为 docker compose 子命令)。

Docker Compose 的优势

  • 声明式配置:用 YAML 文件定义整个应用栈,一键启动/停止。
  • 依赖管理:自动处理服务启动顺序(使用 depends_on)。
  • 环境变量和秘密:支持 .env 文件和 secrets。
  • 与 Docker Swarm/Kubernetes 集成:可扩展到集群。
  • 替代方案:对于单容器,直接用 docker run;复杂应用推荐 Compose。

安装和要求

  • Docker Compose v2 默认随 Docker Desktop(Windows/Mac)或 Docker Engine(Linux)安装。
  • 检查版本:docker compose version(应显示 v2.x,如 v2.29.1)。
  • 如果未安装(旧系统),从 Docker 官网 下载。
  • 要求:Docker Engine v20.10+。

常用 Docker Compose 指令

Compose 指令以 docker compose 开头(v1 为 docker-compose,已弃用)。以下表格列出核心指令,假设在项目目录下运行(含 docker-compose.yml)。

指令 描述 示例
docker compose up 构建镜像、创建并启动容器(前台运行) docker compose up
docker compose up -d 后台启动 docker compose up -d
docker compose down 停止并删除容器、网络(保留卷) docker compose down
docker compose down -v 同时删除卷 docker compose down -v
docker compose ps 列出项目容器 docker compose ps
docker compose logs 查看所有服务日志 docker compose logs -f(实时跟踪)
docker compose exec <service> <command> 在服务容器中执行命令 docker compose exec web bash
docker compose build 构建或重建镜像 docker compose build
docker compose pull 拉取镜像 docker compose pull
docker compose config 验证和查看 YAML 配置 docker compose config
docker compose restart <service> 重启特定服务 docker compose restart db
docker compose scale <service>=<num> 扩展服务实例 docker compose scale web=3

提示:添加 --project-name <name> 指定项目名;用 --file <path> 指定 YAML 文件路径。

YAML 文件基本结构(docker-compose.yml)

Compose 使用 YAML 定义服务。以下是一个简单示例:一个 Web 应用(Nginx) + 数据库(MySQL)。

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
version: '3.8'  # 指定 Compose 文件版本(推荐 3.x)

services: # 定义服务
web: # 服务名
image: nginx:latest # 镜像
ports: # 端口映射
- "80:80" # 主机:容器
volumes: # 卷映射
- ./html:/usr/share/nginx/html # 主机目录:容器目录
depends_on: # 依赖服务
- db
networks: # 网络
- app_net

db:
image: mysql:8.0
environment: # 环境变量
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
volumes:
- db_data:/var/lib/mysql # 命名卷
networks:
- app_net

volumes: # 定义卷
db_data: # 命名卷

networks: # 定义网络
app_net: # 自定义桥接网络
driver: bridge
  • 关键部分
    • services:每个服务对应一个容器。
    • volumes:支持绑定挂载(./host:/container)或命名卷(myvol:)。
    • networks:默认创建项目网络,或自定义。
    • environmentenv_file:设置变量。
    • 其他选项:command 重写入口命令、restart 策略、healthcheck 健康检查。

操作步骤示例:搭建简单栈

  1. 创建项目目录:mkdir myapp && cd myapp
  2. 创建 docker-compose.yml(如上例)。
  3. 启动:docker compose up -d
  4. 测试:浏览器访问 http://localhost(Nginx 首页);用 docker compose exec db mysql -uroot -pexample 连接 MySQL。
  5. 停止:docker compose down

与先前话题的结合

  • 卷映射:在 YAML 中用 volumes 定义(如上例的 db_data)。
  • 自定义网络:用 networks 部分创建(如 app_net)。
  • Redis 主从集群:如前述响应,可直接用提供的 docker-compose.yml 启动多容器 Redis。

注意事项

  • 版本兼容:v2 指令无连字符(docker compose 而非 docker-compose)。
  • 环境变量:在 .env 文件中定义(如 MYSQL_ROOT_PASSWORD=secret),Compose 会自动加载。
  • 生产环境:使用 secrets 管理敏感数据;结合 Orchestrator 如 Swarm。
  • 常见错误:YAML 缩进问题(用空格,非 Tab);镜像不存在(先 pull);端口冲突。
  • 迁移 v1 到 v2:简单替换指令;旧项目用 COMPOSE_FILE=docker-compose.yml

如果需要特定示例(如多环境配置、集成 CI)、高级功能(如 profiles 或 extensions),或针对某个应用的 YAML,请提供更多细节!

简单例子:wordpress

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
31
32
33
34
35
36
37
38
39
40
41
name: myblog
services:
mysql:
container_name: mysql
image: mysql:8.0
ports:
- "3306:3306"
environment: # 这里需要是 mapping 结构
MYSQL_ROOT_PASSWORD: "123456" # 改为 key: "value" 格式
MYSQL_DATABASE: "wordpress" # 改为 key: "value" 格式
volumes:
- mysql-data:/var/lib/mysql
- /app/myconf:/etc/mysql/conf.d
restart: always
networks:
- blog

wordpress:
# (wordpress 配置无需修改,保持原样即可)
image: wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
restart: always
depends_on:
- mysql
networks:
- blog

volumes:
mysql-data:
wordpress:

networks:
blog:

七.Dockerfile

Dockerfile 是一个文本文件,用于自动化构建 Docker 镜像。它定义了镜像的构建过程,包括基础镜像、文件复制、命令执行等。通过 Dockerfile,你可以创建可重复、可版本化的镜像,适合 CI/CD 和团队协作。Dockerfile 无扩展名,通常命名为 Dockerfile(大写 D),并放置在项目根目录。

Dockerfile 的基本概念

  • 构建过程:Docker 按顺序执行 Dockerfile 中的指令,每条指令创建一个镜像层(layer),优化缓存以加速后续构建。
  • 语法:指令大写(如 FROM),参数小写;支持 # 注释;多行用 \ 续行。
  • 多阶段构建:支持多个 FROM 语句,用于分离构建和运行环境,减少镜像大小。
  • 构建命令:使用 docker build -t <image:tag> . 构建(. 表示当前目录)。
  • ARG 和 ENV:ARG 用于构建时变量(--build-arg 传递);ENV 用于运行时环境变量。

常用 Dockerfile 指令

以下表格列出核心指令,按典型顺序排列。每个镜像至少需一个 FROM

指令 描述 示例
FROM <image> [AS <name>] 指定基础镜像(必须是第一条非注释指令) FROM ubuntu:22.04 AS builder
ARG <name>[=<default>] 定义构建时变量 ARG VERSION=1.0
RUN <command> 在镜像中执行命令(shell 形式) RUN apt-get update && apt-get install -y curl
RUN ["executable", "param1", ...] 执行命令(exec 形式,避免 shell) RUN ["/bin/bash", "-c", "echo hello"]
COPY <src> <dest> 复制主机文件/目录到镜像 COPY ./app /usr/src/app
ADD <src> <dest> 类似 COPY,但支持 URL 和 tar 解压 ADD https://example.com/file.tar /tmp/
WORKDIR <dir> 设置工作目录(后续指令相对路径) WORKDIR /app
ENV <key>=<value> 设置环境变量 ENV PATH=/app/bin:$PATH
EXPOSE <port> 声明暴露端口(不实际映射) EXPOSE 80
VOLUME <path> 定义匿名卷(数据持久化) VOLUME /data
USER <user> 指定运行用户(默认 root) USER appuser
CMD ["executable", "param1", ...] 默认容器启动命令(可被覆盖) CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT ["executable", ...] 容器入口点(不可覆盖,常与 CMD 结合) ENTRYPOINT ["/app/entrypoint.sh"]
LABEL <key>=<value> 添加元数据标签 LABEL version="1.0" maintainer="user@example.com"
HEALTHCHECK [options] CMD <command> 定义健康检查 HEALTHCHECK --interval=30s CMD curl -f http://localhost/

提示

  • RUN 应合并命令以减少层数(e.g., 使用 &&)。
  • COPY 优先于 ADD,除非需要解压。
  • 多阶段:从一个阶段复制文件到另一个(COPY --from=<name> /src /dest)。

示例 Dockerfile:构建简单 Node.js 应用

假设项目目录有 app.jspackage.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 第一阶段:构建
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 第二阶段:运行
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
ENV PORT=3000
EXPOSE 3000
CMD ["node", "dist/server.js"]
  • 构建:docker build -t myapp:1.0 .
  • 运行:docker run -p 3000:3000 myapp:1.0

构建和优化镜像

  • 构建选项
    • -t <name:tag>:标签镜像。
    • --build-arg <key>=<value>:传递 ARG。
    • --no-cache:忽略缓存重新构建。
    • -f <file>:指定 Dockerfile 文件名。
  • 优化技巧
    • 最小化层数:合并 RUN 指令。
    • 放置变化频繁的文件在后:如先 COPY package.json,再 RUN install,最后 COPY 代码。
    • 使用 .dockerignore 文件排除不必要文件(类似 .gitignore)。
    • 选择 slim/alpine 基础镜像减少大小。
  • 查看镜像docker images;细节 docker inspect <image>
  • 推送docker push <image:tag>(需登录 docker login)。

与先前话题的结合

  • 卷映射:在 Dockerfile 中用 VOLUME 定义默认卷;在 docker run 或 Compose 中映射。
  • 自定义网络:构建后,在 Compose 的 networks 中使用。
  • Redis 集群:可为 Redis 自定义 Dockerfile 添加配置,但官方镜像通常足够。
  • Docker Compose:Compose 可引用 Dockerfile(build: .)构建服务。

注意事项

  • 安全:避免 root 用户;扫描镜像用 Trivy 或 Docker Scout。
  • 多平台:用 --platform linux/amd64,linux/arm64 构建跨平台镜像。
  • 常见错误:路径错误(WORKDIR 影响相对路径);权限问题(USER 后文件所有权)。
  • 版本管理:将 Dockerfile 放入 Git,标签镜像版本。

如果需要特定应用的 Dockerfile 示例(如 Python/Go)、多阶段高级用法,或构建问题的排查,请提供更多细节!

八.其他笔记

批量删除:

1
docker rm -f $(docker ps -aq)
1
docker rmi -f $(docker images -q)

redis主从复制

主机:

1
docker run -d -p 6379:6379 -v /app/rd1:/bitnami/redis/data -e REDIS_REPLICATION_MODE=master -e REDIS_PASSWORD=123456 --network mynet --name redis01 bitnami/redis

从机:

1
docker run -d -p 6380:6379 -v /app/rd2:/bitnami/redis/data -e REDIS_REPLICATION_MODE=slave -e REDIS_MASTER_HOST=redis01 -e REDIS_MASTER_PORT_NUMBER=6379 -e REDIS_MASTER_PASSWORD=123456  -e REDIS_PASSWORD=123456 --network mynet --name redis02 bitnami/redis

DockerCheatSheet-ByGeekHour.pdf

DockerXMind.pdf

【尚硅谷3小时速通Docker教程,名师带练docker部署到实战!】https://www.bilibili.com/video/BV1Zn4y1X7AZ?p=22&vd_source=941455fe2c7174431d55039a85b22ebd

[up主专用,视频内嵌代码贴在这]