docker部署常见问题

4 阅读2分钟
一、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.DOCKERIMAGENAME:{env.DOCKER_IMAGE_NAME}:{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️⃣ 对比总结

对比项ARGENV
作用阶段仅构建时构建 + 运行时
容器内可见
传入方式--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 的作用是:

让容器内部通信,对外只暴露必要端口,提高安全性与架构清晰度。