一、SSH 免密登录配置
1️⃣ 生成 SSH 密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
2️⃣ 将公钥复制到远程服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub user@example.com
3️⃣ 配置 SSH 别名(可选)
编辑 ~/.ssh/config:
Host myserver HostName example.com User user IdentityFile ~/.ssh/id_rsa
之后可以直接:
ssh myserver
无需输入完整 IP。
二、Docker 核心概念
1️⃣ Docker 本质解决的三件事
| 能力 | 对应概念 |
| 打包环境 | 镜像(Image) |
| 隔离运行 | 容器(Container) + 网络(Network) |
| 数据持久化 | 卷(Volume) |
2️⃣ Jenkins + Shell + Docker 职责分工
Jenkinsfile → 负责流程编排(Pipeline) ↓Shell Script → 负责部署逻辑(解耦、可本地调试) ↓Docker → 负责运行容器
优点
- Jenkinsfile 保持干净
- 部署脚本可脱离 Jenkins 单独运行
- 支持本地调试
- 部署逻辑纳入 Git 版本管理
三、常用 Docker 命令
1️⃣ 构建镜像
docker build -t <镜像名:tag> .
Jenkins 中常见写法
sh "docker build -t {env.IMAGE_TAG} ."
2️⃣ 启动容器
docker run -d \ -p <宿主机端口>:<容器端口> \ -e KEY=VALUE \ --name <容器名> \ <镜像名:tag>
常用参数说明
| 参数 | 说明 |
| -d | 后台运行(detach) |
| -p | 端口映射(宿主机端口:容器端口) |
| -e | 注入运行时环境变量 |
| --name | 指定容器名称 |
注意
- 内部任务(爬虫、定时任务等)可以不加 -p
- 不暴露端口更安全
四、ARG 与 ENV 的区别
核心区别:作用时机不同
1️⃣ ARG —— 构建时变量
- 仅在 docker build 阶段有效
- 容器启动后不可见
- 通过 --build-arg 传入
示例
ARG NODE_VERSION=20FROM node:${NODE_VERSION}-alpine
docker build --build-arg NODE_VERSION=18 -t myapp .
2️⃣ ENV —— 运行时环境变量
- 构建阶段和运行阶段都有效
- 容器启动后可通过 docker exec env 查看
- 可通过 -e 覆盖
示例
ENV NODE_ENV=productionENV PORT=3000
运行时覆盖:
docker run -e NODE_ENV=development myapp
3️⃣ 对比总结
| 对比项 | ARG | ENV |
| 作用阶段 | 仅构建时 | 构建 + 运行时 |
| 容器内可见 | ❌ | ✅ |
| 传入方式 | --build-arg | -e或 compose |
| 典型用途 | 基础镜像版本、构建参数 | 应用配置、端口、运行模式 |
4️⃣ 组合使用技巧
让构建参数在运行时仍然可见:
ARG APP_VERSION=1.0.0ENV APP_VERSION=${APP_VERSION}
docker build --build-arg APP_VERSION=2.0.0 -t myapp .
容器运行后仍可访问 APP_VERSION=2.0.0
五、Docker Network 概念整理
1️⃣ 什么是 Docker Network?
Docker Network 用于容器之间通信
本质是一个容器虚拟局域网
2️⃣ 为什么使用自定义 Network?
✅ 1. 通过容器名访问
docker network create my-net docker run -d --network my-net --name redis redis docker run -d --network my-net --name backend my-backend
在 backend 中可直接通过容器名访问:
redis:6379
✔ 无需 IP
✔ Docker 内置 DNS 自动解析
✅ 2. 更安全(无需暴露端口)
docker run -d --network my-net --name redis redis
- 仅内部容器可访问
- 外网无法访问
- 提高安全性
✅ 3. 隔离不同项目
projectA-net projectB-net projectC-net
优点:
- 避免端口冲突
- 避免服务串线
- 结构更清晰
✅ 4. 符合生产架构
外网 ↓ nginx(暴露端口) ↓ backend(内部网络) ↓ redis / mysql(内部网络)
✔ 只有 nginx 需要 -p
✔ 数据库和缓存不对外开放
3️⃣ 如果不用自定义 Network
可能会:
-p 6379:6379 -p 3306:3306
问题:
- 所有端口暴露给外网
- 存在安全风险
- 端口冲突
- 不利于扩展
4️⃣ 核心理解
docker network ≈ 私有局域网-p 参数 ≈ 路由器端口映射
5️⃣ 一句话总结
自定义 Docker Network 的作用是:
让容器内部通信,对外只暴露必要端口,提高安全性与架构清晰度。