强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Emacs 完全指南 / 第 18 章:Docker 集成

第 18 章:Docker 集成

18.1 Docker 集成概览

Emacs 提供了多种与 Docker 集成的方式,从简单的命令运行到完整的容器内开发环境。

集成方案

方案功能适用场景
docker.el管理容器/镜像/卷Docker 资源管理
dockerfile-modeDockerfile 编辑编写 Dockerfile
docker-compose-modeCompose 文件编写 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-composeDocker 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.elM-x docker 管理容器/镜像
Dockerfiledockerfile-mode语法高亮、构建命令
Composedocker-compose-modeM-x docker-compose
容器编辑TRAMP/docker:name:/path
远程容器TRAMP 组合/ssh:host|docker:name:/path
Kuberneteskubel / kubernetesC-c k 管理 K8s

18.9 扩展阅读


← 上一章 第 17 章:键位设计 | 下一章 → 第 19 章:故障排除