本文最后更新于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=xxxRedis redis:7.2.8-alpine3.21WordPress -e WORDPRESS_DB_HOST=xxx -e WORDPRESS_DB_USER/PASSWORD/NAMEES -p 9200:9200 -m 1GBKibana 需关联 ES SkyWalking oap-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 制作流程
手动运行基础镜像,测试部署命令
将命令转化为 Dockerfile 指令
优化 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 区别
特性 ARG ENV 生效时机 构建时 构建时+运行时 用途 传递构建参数 容器环境变量 示例 --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>