在容器化技术中,环境变量(Environment Variables)是解耦"应用代码"与"配置信息"的核心纽带。它允许你在不修改镜像(Image)的情况下,动态调整容器在运行时的行为(如数据库连接串、API 密钥、运行模式等),从而实现"一次构建,到处运行"。
一、 Docker 环境变量的底层机制
在 Linux 操作系统中,环境变量是进程级的。当 Docker 启动一个容器时,实质上是在宿主机上隔离出了一个独立的进程空间。
scss
[ 宿主机 Docker Daemon ]
│
├─► 注入环境变量 (读取 -e / --env-file)
│
▼
[ 容器 (隔离的 PID 命名空间) ]
│
└─► 目标进程 (例如: Node.js/Java/Go App) ──► 通过 os.environ 或 process.env 读取
Docker 在创建容器的 containerd 运行阶段,会将指定的键值对(Key-Value)写入到容器内 1 号进程(PID 1)的进程环境中。容器内随后衍生出的所有子进程,都会自动继承这些变量。
二、 设置环境变量的四种主流方式
在实际开发和部署中,根据不同的场景,我们有四种方式来注入环境变量。它们的优先级从高到低依次为:
1. docker run -e 命令参数(最高优先级)
在命令行启动容器时直接指定,适合临时调试或覆盖配置。
bash
docker run -d --name my_app -e APP_ENV=production -e DB_PORT=3306 nginx
2. --env-file 文件导入
当变量较多时,将其写入一个 .env 文件中(每行一个 KEY=VALUE,支持 # 注释),然后批量导入。这可以避免命令行暴露敏感信息。
bash
# config.env 文件内容
DB_HOST=192.168.1.100
DB_USER=admin
# 启动命令
docker run -d --env-file ./config.env nginx
3. Docker Compose 中的 environment 或 env_file
在多容器编排时,通过 YAML 文件进行配置。
yaml
version: '3.8'
services:
web:
image: node:18
# 方式 A:直接在 YAML 中定义
environment:
- NODE_ENV=production
# 方式 B:引用外部文件
env_file:
- ./production.env
4. Dockerfile 中的 ENV 指令(最低优先级)
在构建镜像时打包进去的默认值。如果启动容器时没有传同名变量,就会使用这个值。
dockerfile
FROM alpine
# 设置默认的环境变量
ENV DOWNLOAD_DIR=/tmp/downloads
RUN mkdir -p $DOWNLOAD_DIR
**⚠️ 澄清一个高频误区:
ARGvsENV**
ARG(构建参数): 只在docker build阶段有效,镜像构建完成后就消失了,容器运行时无法读取。
ENV(环境变量): 在构建阶段和容器运行阶段都有效,会永久保留在镜像元数据中。
三、 企业级安全与最佳实践
虽然环境变量很方便,但在实际生产中如果使用不当,极易造成安全漏洞(如秘钥泄露)。以下是必须遵守的几条铁律:
1. 严禁将敏感秘钥硬编码在 Dockerfile 中
由于 ENV 会写入镜像的 Layer 元数据,任何拿到镜像的人只需执行 docker inspect <image_id> 就能把你的密码、Token 看得一清二楚。Dockerfile 中只存放非敏感的默认值。
2. 避免在 CI/CD 日志中暴露命令
使用 docker run -e PASSWORD=xyz 时,宿主机的 ps -ef 命令或者 CI/CD 工具(如 Jenkins、GitLab CI)的日志里会直接打印出这条命令。
- 对策: 优先使用
--env-file,或者利用宿主机环境变量的"透传"特性:
bash
# 如果不指定系统变量的值,Docker 会自动读取宿主机的同名变量
export SECRET_KEY="super-secret"
docker run -e SECRET_KEY my_image
3. 终极安全方案:利用 Docker Secret 或挂载
对于金融级或严格合规的项目,环境变量依然不够安全(因为 docker inspect <container_id> 依然能看到运行中的变量)。
- 更优解: 使用 Docker Swarm 的
secrets机制,或者将证书/秘钥文件挂载到容器的/run/secrets/目录下,让应用程序直接读取文件内容,而不是读取环境变量。
四、 演练:通过 Docker 环境变量技术部署私有化客服系统
准备域名
假设您的域名是 yourname.com,那么建立三个二级域名,分别用于访问系统的三个站点:
| 站点 | 域名示例 |
|---|---|
| 服务端主程序 | https://kf-api.yourname.com |
| 访客端 | https://kf-resource.yourname.com |
| Web 管理后台 | https://kf-m.yourname.com |
从 Docker Hub 下载升讯威客服系统镜像 docker pull iccb1013/linkup:latest
用以下启动命令为例: docker run -e ApiUrl=http://kf-api.yourname.com -e ResourceUrl=http://kf-resource.yourname.com -e TcpIpAddress=您的服务器公网IP地址 -p 8021-8023:8021-8023 -p 9527:9527 -dit --restart=always --privileged=true --name=linkup_latest iccb1013/linkup:latest
环境变量
启动命令中,包括了 3 个环境变量,分别是:
ApiUrl:服务端主程序域名 ResourceUrl:访客端域名 TcpIpAddress:服务器公网IP地址
在 Nginx 中配置域名并代理到 Docker 容器
在宿主机环境中,配置 Nginx ,将服务器接收到的 http 请求转发到容器内部。
配置 Nginx
-
创建配置文件
vim /etc/nginx/sites-available/kf -
放入以下内容 其中 server_name 后为您对应的域名。 proxy_pass 后的 localhost 不用修改。
ini
# 服务端主程序站点
# 把 kf-api 域名对应的请求转发到本地 8021 端口,该端口在启动容器时映射到了容器内的 8021 端口
server {
listen 80;
listen [::]:80;
server_name kf-api.yourname.com;
#设置请求主体允许的大小限制,此设置会影响文件上传
client_max_body_size 100m;
location / {
proxy_pass http://localhost:8021;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 访客端站点
# 把 kf-resource 域名对应的请求转发到本地 8022 端口,该端口在启动容器时映射到了容器内的 8022 端口
server {
listen 80;
listen [::]:80;
server_name kf-resource.yourname.com;
location / {
proxy_pass http://localhost:8022;
proxy_http_version 1.1;
}
}
# Web管理后台站点
# 把 kf-m 域名对应的请求转发到本地 8023 端口,该端口在启动容器时映射到了容器内的 8023 端口
server {
listen 80;
listen [::]:80;
server_name kf-m.yourname.com;
location / {
proxy_pass http://localhost:8023;
proxy_http_version 1.1;
}
}
-
创建符号链接
sudo ln -s /etc/nginx/sites-available/kf /etc/nginx/sites-enabled/kf -
验证配置文件的语法
sudo nginx -t -
使 Nginx 应用更改
sudo nginx -s reload
访问主程序页面
在浏览器中访问您的主程序域名,如"http://kf-api.yourname.com",显示主程序运行状态页面,表示安装部署成功。

从容器中下载客服端软件
从部署好的站点中下载匹配的客服端软件 http://kf-resource.yourname.com/Shell.zip
客服端软件版本需要与服务端匹配使用,请直接从容器中下载提供的对应版本。
解压后运行 Sheng.Linkup.Client.Shell.exe,并在登录画面中修改服务器地址为您的主程序地址,然后使用默认账户登录。 主程序地址: http://kf-api.yourname.com 如果使用 IP 地址访问客服系统,则主程序地址为:http://ip:8021 如果使用 Windows Docker Desktop 于本机运行,主程序地址可填入:http://localhost:8021
默认站点代码 :
freesite,账户:kf1,密码 :123登录。
站点代码和客服的账户信息可以登录 Web 管理后台修改。

打开访客端聊天窗口
打开访客聊天页面,输入内容后点击发送按钮即可开始与客服聊天。 http://kf-resource.yourname.com/WebChat/WebChat.html?sitecode=freesite


访问 Web 管理后台
访问 Web 管理后台站点的域名,显示登录画面。使用默认登录账户密码登录即可。 访问地址: http://kf-m.yourname.com
默认站点代码是
freesite,登录账户是kf1,密码是123。
