Docker 笔记
本文最后更新于0 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

Docker 环境部署与基础操作

核心概念

  • Docker 安装:使用 install-docker.sh 脚本一键安装
  • 镜像管理:模板/只读、可复用、可版本控制
  • 容器管理:镜像的运行实例,生命周期短暂

关键命令

# 镜像管理
docker image pull <image>          # 拉取镜像
docker image ls                    # 查看镜像列表
docker image save -o xxx.tar <image>  # 导出镜像
docker image load -i xxx.tar        # 导入镜像
docker image tag <old> <new>       # 打标签
docker image rm <image>            # 删除镜像

# 容器管理
docker container run [options] <image>  # 创建并启动容器
 -d: 后台运行
 -it: 交互式终端
 --name: 指定容器名
 -p: 端口映射
 --restart: 重启策略
 -v: 挂载卷

docker container exec -it <container> <cmd>   # 进入容器执行命令
docker container logs -f <container>          # 查看日志
docker container ls -a                        # 查看容器
docker container rm <container>                # 删除容器
docker container start/stop/restart <container>

常见中间件部署

服务关键启动参数
MySQL-e MYSQL_ALLOW_EMPTY_PASSWORD=yes -e MYSQL_DATABASE=xxx
Redisredis:7.2.8-alpine3.21
WordPress-e WORDPRESS_DB_HOST=xxx -e WORDPRESS_DB_USER/PASSWORD/NAME
ES-p 9200:9200 -m 1GB
Kibana需关联 ES
SkyWalkingoap-server + web-ui

面试常考点

  • docker run vs docker start 的区别
  • 如何查看容器日志:docker logs -f -t --since 20m

容器重启策略、网络与存储卷

核心概念

  • 虚拟机 vs 容器:虚拟机虚拟化硬件,容器虚拟化操作系统
  • 重启策略:防止容器异常退出后数据丢失

重启策略(–restart)

策略说明
no不自动重启(默认)
always总是自动重启
unless-stopped除非手动停止,否则自动重启
on-failure[:次数]退出码非0时重启
docker run -d --name nginx --restart always nginx:1.27

单机网络类型

类型说明
bridge默认类型,为容器创建虚拟网卡对
host共享宿主机网络命名空间,性能最高
none仅 lo 回环网卡
container:<name>与指定容器共享网络
custom自定义网段、网关、DNS
# 自定义网络
docker network create -d bridge --subnet 172.20.0.0/16 --gateway 172.20.0.254 oldboyedu

端口映射原理

  • 宿主机 iptables DNAT 规则:iptables-save | grep 90
  • 转发流程:外部请求 → docker0 网桥 → veth pair → 容器 eth0

存储卷方案

  • 匿名卷:Docker 自动管理,宿主机目录在 /var/lib/docker/volumes/
  • 命名卷docker volume create myvol,手动管理
  • 绑定挂载docker run -v /host/path:/container/path
docker volume ls
docker volume inspect <volume_name>

面试常考点

  • 重启策略的区别和应用场景
  • bridge 网络的工作原理
  • 容器与宿主机之间数据共享方案

容器底层原理与 Dockerfile 基础

Linux 底层特性

技术作用
chroot隔离进程根目录
namespace资源隔离(6种:mnt/net/pid/user/uts/ipc)
cgroups资源限制(CPU/内存/IO)
iptables网络规则控制
overlayFS联合文件系统,镜像分层

Dockerfile 基础指令

指令说明
FROM指定基础镜像(第一条指令)
MAINTAINER维护者信息(已废弃,推荐 LABEL)
COPY拷贝文件到镜像
RUN构建时执行命令
CMD容器启动时的默认命令
FROM ubuntu:22.04
MAINTAINER JasonYin
RUN apt update && apt -y install nginx
COPY index.html /usr/share/nginx/html/
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 制作流程

  1. 手动运行基础镜像,测试部署命令
  2. 将命令转化为 Dockerfile 指令
  3. 优化 Dockerfile

面试常考点

  • 虚拟机与容器的本质区别
  • namespace 和 cgroups 的作用
  • CMD 和 RUN 的区别

Dockerfile 进阶与多阶段构建

扩展指令

指令说明
EXPOSE声明端口(文档作用)
VOLUME创建匿名卷
ENTRYPOINT入口点,可接收参数
USER指定运行用户
HEALTHCHECK健康检查
WORKDIR设置工作目录
ENV环境变量(构建+运行)
ARG构建参数(仅构建时)
ONBUILD触发器,派生镜像时执行
LABEL元数据

CMD vs ENTRYPOINT

# CMD 会被 docker run 参数覆盖
CMD ["nginx"]

# ENTRYPOINT 会追加参数
ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]

ARG vs ENV 区别

特性ARGENV
生效时机构建时构建时+运行时
用途传递构建参数容器环境变量
示例--build-arg school=oldboy-e username=admin

多阶段构建

# 第一阶段:构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .

# 第二阶段:运行
FROM alpine:latest
COPY --from=builder /app/main /usr/local/bin/
CMD ["main"]

Dockerfile 优化技巧

优化点方法
构建速度使用 .dockerignore、缓存、国内源
镜像体积删除缓存、使用轻量基础镜像、合并指令
多阶段分离构建与运行环境
# .dockerignore 示例
*.log
node_modules/
.git/

面试常考点

  • 多阶段构建的优势
  • 如何减小镜像体积
  • ONBUILD 的使用场景
  • scratch 镜像的制作

Docker-Compose 与私有仓库

Docker-Compose

# 常用命令
docker-compose up -d          # 启动所有服务
docker-compose down           # 停止并删除
docker-compose ps             # 查看状态
docker-compose logs -f        # 查看日志
docker-compose exec <service> <cmd>  # 进入服务

docker-compose.yml 结构

services:
  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - backend

volumes:
  mysql-data:

networks:
  backend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

私有仓库

Docker Registry(轻量级)

# 启动 registry
docker run -d -p 5000:5000 --name registry registry:3

# 推送镜像
docker tag nginx localhost:5000/my-nginx
docker push localhost:5000/my-nginx

# 拉取镜像
docker pull localhost:5000/my-nginx

Harbor(企业级)

  • Web UI 管理界面
  • 镜像安全扫描
  • 角色权限控制
  • 项目/用户管理
# Harbor 部署后
docker tag <image> harbor.yinzhengjie.com/project/<image>
docker login harbor.yinzhengjie.com
docker push harbor.yinzhengjie.com/project/<image>

面试常考点

  • docker-compose 与 docker run 的区别
  • 多容器编排的实现方式
  • 私有仓库的作用和优势

传统业务容器化

若依项目(RuoYi-Vue)容器化

架构

  • MySQL:持久化存储
  • Redis:缓存
  • 后端:Java Spring Boot
  • 前端:Vue + Nginx

MySQL 部署

docker run -d --name mysql-server \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
  -e MYSQL_DATABASE=ry-vue \
  -e MYSQL_USER=linux102 \
  -e MYSQL_PASSWORD=oldboyedu \
  -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0.36-oracle \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

Redis 部署

docker run -d --name redis-server -p 6379:6379 redis:7.2.8-alpine3.21

后端 Dockerfile

FROM openjdk:8-jdk-alpine
WORKDIR /app
COPY target/ruoyi.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

前端 Dockerfile

FROM nginx:1.27
EXPOSE 80
RUN rm -rf /usr/share/nginx/html/*
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/nginx.conf

一键启动(docker-compose)

services:
  mysql-server:
    image: mysql:8.0.36-oracle
    ports:
      - "3306:3306"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      MYSQL_DATABASE: "ry-vue"
      MYSQL_USER: "linux102"
      MYSQL_PASSWORD: "oldboyedu"
    volumes:
      - ./sql/:/docker-entrypoint-initdb.d
    networks:
      - ruoyi

  redis-server:
    image: redis:7.2.8-alpine3.21
    ports:
      - "6379:6379"
    networks:
      - ruoyi

  ruoyi-server:
    image: ruoyi-backend:v0.1
    ports:
      - "8080:8080"
    depends_on:
      - mysql-server
      - redis-server
    networks:
      - ruoyi

  ruoyi-ui:
    image: ruoyi-frontend:v0.1
    ports:
      - "80:80"
    depends_on:
      - ruoyi-server
    networks:
      - ruoyi

networks:
  ruoyi:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

面试常考点

  • 数据持久化方案
  • 容器间的网络通信
  • 初始化 SQL 的自动执行

传统业务优化与 Containerd

业务优化问题

1. 数据库字符乱码

  • 原因:MySQL 容器未指定字符集
  • 解决:添加 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

2. 健康检查配置

services:
  nginx:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 5s

Containerd 基础

Kubernetes 1.20+ 移除 Docker,使用 containerd 作为运行时

# 镜像管理
ctr i ls                         # 查看镜像
ctr i pull <image>               # 拉取镜像
ctr i tag <old> <new>           # 打标签
ctr i push <image>               # 推送镜像

# 容器管理
ctr c ls                         # 查看容器
ctr c create <image> <name>     # 创建容器
ctr c rm <name>                  # 删除容器

# 任务管理
ctr task start <container>      # 启动容器
ctr task ls                      # 查看任务
ctr task pause <container>      # 暂停
ctr task resume <container>     # 恢复
ctr task kill <container>        # 停止任务

# 执行命令
ctr tasks exec -t --exec-id $RANDOM <container> sh

Containerd 对接 Harbor

# 添加解析
echo 10.0.0.91 harbor.yinzhengjie.com >> /etc/hosts

# 打标签
ctr i tag registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 \
  harbor.yinzhengjie.com/oldboyedu-containerd/apps:v1

# 推送(HTTP 需要 --plain-http)
ctr i push -u admin:1 harbor.yinzhengjie.com/oldboyedu-containerd/apps:v1

数据持久化(Containerd)

# 创建容器并挂载卷
ctr container create \
  --mount type=bind,src=/yinzhengjie/games,dst=/usr/local/nginx/html,options=rbind:rw \
  registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 xiuxian01

Docker 对接 Containerd

# 修改 Docker 启动参数,使用 containerd
/usr/bin/dockerd --containerd /run/containerd/containerd.sock

面试常考点

  • Containerd 与 Docker 的关系
  • Containerd 的核心命令
  • 为什么 Kubernetes 弃用 Docker

附录:Docker 核心命令速查表

镜像操作

docker pull <image>
docker images / docker image ls
docker rmi <image>
docker tag <old> <new>
docker save -o xxx.tar <image>
docker load -i xxx.tar

容器操作

docker run [options] <image>
docker ps / docker ps -a
docker start/stop/restart <container>
docker exec -it <container> <cmd>
docker logs -f <container>
docker rm <container>
docker cp <container>:/path /host/path

网络操作

docker network ls
docker network create <name>
docker network rm <name>

卷操作

docker volume ls
docker volume create <name>
docker volume rm <name>
docker volume inspect <name>

Compose 操作

docker-compose up -d
docker-compose down
docker-compose ps
docker-compose logs -f
docker-compose exec <service> <cmd>
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇