Emacs 完全指南 / 第 18 章:Docker 集成
第 18 章:Docker 集成
18.1 Docker 集成概览
Emacs 提供了多种与 Docker 集成的方式,从简单的命令运行到完整的容器内开发环境。
集成方案
| 方案 | 功能 | 适用场景 |
|---|---|---|
| docker.el | 管理容器/镜像/卷 | Docker 资源管理 |
| dockerfile-mode | Dockerfile 编辑 | 编写 Dockerfile |
| docker-compose-mode | Compose 文件 | 编写 docker-compose.yml |
| TRAMP docker | 容器内文件编辑 | 直接编辑容器内文件 |
| Eshell / Vterm | 命令行 | 运行 Docker 命令 |
18.2 docker.el(Docker 管理)
安装配置
(use-package docker
:bind ("C-c d" . docker))
(use-package docker-tramp
:after docker)
(use-package docker-compose-mode
:mode "docker-compose\\.yml\\'")
(use-package dockerfile-mode
:mode "Dockerfile\\'")
docker.el 核心命令
| 命令 | 说明 |
|---|---|
M-x docker | 打开 Docker 总控面板 |
M-x docker-containers | 管理容器 |
M-x docker-images | 管理镜像 |
M-x docker-volumes | 管理卷 |
M-x docker-networks | 管理网络 |
M-x docker-compose | Docker Compose 操作 |
容器管理操作
在 Docker 容器列表中:
RET → 查看容器详情
s → 启动容器
S → 停止容器
R → 重启容器
D → 删除容器
l → 查看日志
e → 进入 Eshell
a → 附加 (attach)
T → 打开 Vterm
f → 查看文件(TRAMP)
i → 检查 (inspect)
c → 提交为新镜像
m → 标记
x → 执行标记的操作(批量)
18.3 Dockerfile 编辑
(use-package dockerfile-mode
:mode "Dockerfile.*\\'"
:config
(setq dockerfile-use-buildkit t))
;; Dockerfile 模板插入
;; C-c C-b → 插入 build 命令
Dockerfile 常用片段
# 多阶段构建模板
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
;; 使用 yasnippet 加速 Dockerfile 编写
;; ~/.emacs.d/snippets/dockerfile-mode/multi-stage
# -*- mode: snippet -*-
# name: multi-stage
# key: multistage
# --
FROM ${1:node}:latest AS builder
WORKDIR /app
COPY package*.json ./
RUN ${2:npm ci}
COPY . .
RUN ${3:npm run build}
FROM ${4:nginx}:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE ${5:80}
CMD ["$6"]
18.4 TRAMP Docker(容器内编辑)
TRAMP 让你像编辑本地文件一样编辑 Docker 容器内的文件。
连接语法
;; 基本连接
C-x C-f /docker:container_name:/app/config.json RET
;; 通过容器 ID
C-x C-f /docker:abc123def:/etc/nginx/nginx.conf RET
;; 在容器内运行 sudo
C-x C-f /docker:container_name|sudo::/etc/hosts RET
;; 多跳连接
C-x C-f /ssh:user@host|docker:container_name:/app/code.py RET
使用场景
场景 1:修改容器内配置文件
C-x C-f /docker:my-nginx:/etc/nginx/nginx.conf
→ 直接编辑,保存后立即生效
场景 2:调试容器内应用
1. C-x C-f /docker:my-app:/app/src/main.py → 打开代码
2. M-x shell → 在容器内运行 shell
3. 直接在容器内测试
场景 3:修改数据库容器配置
C-x C-f /docker:my-db|sudo::/etc/mysql/my.cnf
→ 以 root 权限编辑数据库配置
18.5 Docker Compose 集成
(use-package docker-compose-mode
:mode "docker-compose\\.ya?ml\\'"
:mode "compose\\.ya?ml\\'")
;; 在 Eshell 中操作 Compose
;; $ docker compose up -d
;; $ docker compose logs -f
;; $ docker compose exec app bash
;; $ docker compose down
;; 使用 docker.el 的 Compose 功能
;; M-x docker-compose
;; u → up
;; d → down
;; l → logs
;; r → restart
18.6 远程 Docker 开发工作流
完整工作流示例
场景:远程服务器上的 Docker 项目开发
1. 通过 TRAMP 连接到远程服务器:
C-x C-f /ssh:deploy@production:/opt/myproject RET
2. 在远程项目目录中打开 Dired:
C-x d /ssh:deploy@production:/opt/myproject RET
3. 编辑项目代码:
C-x C-f /ssh:deploy@production:/opt/myproject/src/app.py RET
4. 在远程运行 Docker 命令:
M-x eshell → docker compose restart app
5. 查看容器日志:
M-x vterm → docker logs -f my-app
6. 直接编辑容器内文件:
C-x C-f /ssh:deploy@production|docker:my-app:/app/config.json RET
7. 提交更改:
C-x g → 在远程 Magit 中提交
18.7 Kubernetes 集成(扩展)
;; kubel - Kubernetes 管理
(use-package kubel
:bind ("C-c k" . kubel))
;; 或使用 kubernetes-el
(use-package kubernetes
:commands (kubernetes-overview)
:bind ("C-c K" . kubernetes-overview)
:config
(setq kubernetes-poll-frequency 300
kubernetes-redraw-frequency 300))
;; TRAMP kubectl
;; C-x C-f /kubectl:pod-name:/path/to/file RET
18.8 本章小结
| 功能 | 工具 | 核心操作 |
|---|---|---|
| Docker 管理 | docker.el | M-x docker 管理容器/镜像 |
| Dockerfile | dockerfile-mode | 语法高亮、构建命令 |
| Compose | docker-compose-mode | M-x docker-compose |
| 容器编辑 | TRAMP | /docker:name:/path |
| 远程容器 | TRAMP 组合 | /ssh:host|docker:name:/path |
| Kubernetes | kubel / kubernetes | C-c k 管理 K8s |
18.9 扩展阅读
← 上一章 第 17 章:键位设计 | 下一章 → 第 19 章:故障排除