用Docker定制你的Golang开发环境

HundredLee · · 867 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

这篇文章主要针对MacBook用户,并且实验的环境也是MacOS。Windows上应该也可以正常地进行,但是我没有测试过,有兴趣的童鞋可以试试。

这篇文章针对有一定Docker基础的童鞋,如果你还不懂Docker的一些基础命令,或者操作方式,那么你需要先预习一下。

先说说为什么需要用Docker来定制一个Golang开发环境。首先如果你有用过Vagrant,那么你一定知道,这种基于容器开发的好处。首先你不需要在本机安装太多的类似MySQL、PHP、JAVA等软件,这样会让你的电脑变得非常的乱,而且并不是特别好管理。而如果你用了Docker或者Vagrant,你可以很轻松的搭建你需要的环境。并且这一切都是在容器或者虚拟机中。

这篇文章不讲Vagrant,我们讲Docker。在开始之前,我们要知道什么是Docker、Docker-Compose。

Docker:是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker-Compose:是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。

下载&安装 Docker

  • 打开 https://www.docker.com/get-docker
  • 选择“Get Docker Community Edition” 下载即可
  • 安装完后,正常状态下,你就可以看到状态栏多了一个像河豚一样的图标。这里不详讲。

更改Docker镜像源

  • 你懂的,改成国内的源。方法很多,我是直接注册Daocloud
  • 然后你打开这个URL https://www.daocloud.io/mirror 就可以获取你的加速地址。

  • 填入Registry mirrors就行了。接着Restrat就OK了。

构建一个基础Docker-Compose

我们需要构建一个基础的容器组合,例如我们每个应用都需要用到nginx、mysql、redis,那么我们在这个基础镜像里面添加这几个服务,然后启动,启动后基础的Docker-Compose会创建一个network,我们后续将所有要开发的项目都和这个network连通,那么他们之间就可以互相访问了。

  • 首先我们需要创建一个docker-compose.yml,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '2.1'
services:
mysql:
image: mariadb:latest
container_name: mysql_service
volumes:
- ./data/mysql/data:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
redis:
image: redis:alpine
ports:
- 6379:6379
volumes:
- ./data/redis/data:/data
nginx-lb:
build: services/nginx/
ports:
- 80:80
command: >
nginx -g "daemon off;"
  • 然后在docker-compose.yml同目录下创建service/nginx文件夹。也可以用terminal 执行 mkdir -p service/nginx 来创建
  • 在nginx 文件夹里面新建default.conf Dockerfile两个文件
  • default.conf 这个文件是为了后续的web项目可以通过container_name来访问
1
2
3
4
5
6
7
8
9
10
server {
listen 80 default_server;
resolver 127.0.0.11 valid=10s;
location / {
proxy_pass http://$host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
  • Dockerfile 不多说,有docker基础的都能看懂
1
2
3
4
5
6
7
8
9
FROM nginx:latest
MAINTAINER HundredLee <hundred9411@gmail.com>
RUN apt-get update && apt-get install -y curl unzip
COPY default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
  • 那么现在我们可以在docker-compose.yml所在的目录下执行docker-compose build && docker-compose up -d

  • 如果你执行上述命令,得到的和图片的结果一致,那么你的基础docker-compose已经构建并成功启动。

  • 接下来我们查看network的名称,执行 docker network list

  • godockerdev-default 就是我们这个docker-compose的网络。一般来说,他是根据你这个项目名来决定的,你可以自定义,否则他便会按照你的文件夹名来命名。

独立项目的Docker-Compose

  • 好了,万事俱备,我们已经建设好了基础的容器组合,接下来我们要创建一个beego项目作为本次的测试项目。
  • 首先我们创建一个beego项目,我们通过bee工具来创建
  • 执行 go get github.com/beego/bee 就可以了。
  • 然后创建项目,执行 bee new BeegoD

  • 酱紫就创建成功了,那么我们进入BeegoD文件夹。
  • 接着创建两个文件,分别是:
    • Dockerfile
    • docker-compose.yml
  • Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM library/golang
# Godep for vendoring
RUN go get github.com/beego/bee
ENV APP_DIR $GOPATH/src/BeegoD
RUN mkdir -p $APP_DIR
# Set the entrypoint
ENTRYPOINT (cd $APP_DIR && bee run > debug_log.log 2>&1)
#ADD . $APP_DIR
EXPOSE 80
  • docker-compose.yml
  • 将该beego项目加入godockerdev_default网络中,使得服务间可以互相访问通信。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '2.1'
services:
service:
container_name: beegod.dev
build:
context: .
expose:
- 80/tcp
networks:
- godockerdev_default
- local
volumes:
- .:/go/src/BeegoD
networks:
godockerdev_default:
external:
name: godockerdev_default
local:
internal: true
  • 在docker-compose.yml中,container_name 将是你在本机中可以访问的域名。当然你比如添加进/etc/hosts中。像这样127.0.0.1 beegod.dev
  • 然后在项目中执行docker-compose build && docker-compose up -d ,成功后,就可以访问beegod.dev了。

  • 在BeegoD文件夹下面有一个debug_log.log,这里面会实时写入beego应用当前的状态,报错等。可以在terminal中执行 tail -f debug_log.log 来实时查看
  • 像酱紫。。。。

  • 然后就搞定了。不懂的,不清晰的,可以留言说一下。我都会回复。谢谢

有疑问加站长微信联系(非本文作者)

本文来自:HundredLee's Blog

感谢作者:HundredLee

查看原文:用Docker定制你的Golang开发环境

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

867 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传