本文章同时发布于:
MediumiT 邦帮忙大家好,继上次Week25 - 用 Minecraft 来说明 Docker 为什么这么香 - Docker-Compose 篇的文章后,接下来要来介绍一下 Docker 在软体实战中的一些应用。
Docker 在实战中有个很实用的功能就是:
> 统一开发环境
就像Week22 - 用 Redis 来帮 Line bot 髒沙发设计一次性功能 - 实作篇,透过 Docker 可以快速建立一个有 Redis 的开发环境,让开发者专心于开发,而不是忙于架设 Redis。
在还没有 Docker 以前,关于怎么建立开发环境一直是个麻烦的问题,常见的作法就是请 Infra team 的人员统一建立一个 Development 的环境供大家开发,但如果有天有同事不小心把这个环境的 Redis 用爆了,就...
然后架设环境的 Infra team 就要加班了 QQ
所以用 Docker 建立一个「个人电脑上的环境」,无不是个好方法。
遇到的问题 - 在 Docker 里 debbuging
在 Docker 里面开发,环境上的确方便,不过在 Docker 里 debbuging,就变成了另一个问题。
而 Golang 针对这个问题的解决方案就是:
在 Docker 里设定一个对外的 debug port
实作
实作我们以 Golang Server 来讲解,
首先先 clone example code。
然后起动 Docker。
$ docker-compose up
我们会看到以下 log,代表 Docker 的环境已经启动完成,「但 Server 实际上还没启动,我们必须透过 VSCode Debug Mode 来启动」,
透过 Debug Mode 启动 Golang Server,
在 main.go
里头标注第 10 行,会看到 终端机
显示已经新增中断点的 log,
在浏览器进入localhost:8080
时可以看到,Debug Mode 的中断点发挥的作用,
如何配置 Debug Mode
首先,Dockerfile 必须安装delve,这是 Golang 专门拿来「Remote(远端)」Debug 的工具,而这个远端就是指 Docker。
# DockerfileFROM golang:1.14-alpineWORKDIR /appCOPY . /appRUN apk add --no-cache g++ git# 安装 delveRUN go get github.com/go-delve/delve/cmd/dlv
接下来我们必须设定 docker-compose,解释我写在注解里,
# docker-compose.yamlversion: "3.5"services: server: build: . working_dir: /app volumes: - .:/app ports: # Golang Server 的对外 8080 Port - 8080:8080 # 由于 delve 的 Debug Port 是 6379,所以 Docker 必须要对外开放 6379 Port 供 VSCode 的 Debug Mode - 6379:6379 # 会以 delve 来启动 Golang Server,而这个 Debug Port 是 6379 entrypoint: dlv debug --headless --listen=:6379 --log --api-version=2
最后是 Debug Mode 的设定档.vscode/launch.json
,
workspaceRoot
这个环境变数{ "version": "0.2.0", "configurations": [ { "name": "Launch remote", "type": "go", "request": "launch", "mode": "remote", "remotePath": "/app", "port": 6379, "host": "127.0.0.1", "program": "${workspaceRoot}", "env": {} } ]}
设定好这些参数后,就可以在 Docker 里兼顾开发环境与 debugging 功能啦~
谢谢你的阅读,也欢迎分享讨论指正~