LoginSignup
7
6

More than 5 years have passed since last update.

Go + Docker + CoreOS + Vagrant で開発環境を構築

Last updated at Posted at 2016-03-11

備忘録

ローカルで実行してもいいけれど、最終的にnginxをフロントに置く構成を想定していたのでVagrantで環境を構築。せっかくなので構成を出来る限り再現するためDocker経由の構成まで作った。

Vagrantの共有フォルダでローカルのsrcを含むパスをGOPATHとして参照するようにして、ソースコードの編集〜Docker再起動でビルドして実行が可能としている。

ホストOS:MacOS X El Capitan
Vagrant: CoreOS 976.0.0

Dockerイメージを作成

開発時はビルドができるようにgbを入れる。

FROM golang:1.6.0

RUN go get github.com/constabulary/gb/...
RUN mv /go/bin/gb /usr/local/go/bin
RUN mv /go/bin/gb-vendor /usr/local/go/bin

EXPOSE 9090

COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.shはsrc/があればビルドしてからアプリ(bin/app)を実行。

#!/bin/bash
set -e

cd /go
if [ -e src ]; then
  gb build
fi
bin/app

Dockerイメージを作成してdocker pushする。

cloud-configを作成

NginxとGoアプリを導入。-vオプションを指定してホストOSと接続する。Docker側では/goがGOPATHになっている。

#cloud-config

---
coreos:
  units:
  - name: docker-tcp.socket
    command: start
    enable: true
    content: |
      [Unit]
      Description=Docker Socket for the API

      [Socket]
      ListenStream=2375
      Service=docker.service
      BindIPv6Only=both

      [Install]
      WantedBy=sockets.target
  - name: nginx.service
    command: start
    enable: true
    content: |
      [Unit]
      Description=Nginx
      After=docker.service
      Requires=docker.service

      [Service]
      TimeoutStartSec=15m
      ExecStartPre=-/usr/bin/docker kill nginx
      ExecStartPre=-/usr/bin/docker rm nginx
      ExecStartPre=-/usr/bin/docker pull danday74/nginx-lua
      ExecStart=/bin/bash -c "\
        /usr/bin/docker run --name nginx \
        -p 80:80 \
        -v /nginx/conf:/nginx/conf:ro \
        -v /nginx/html:/nginx/html:ro \
        -v /nginx/log:/var/log/nginx \
        danday74/nginx-lua"
      ExecStop=/usr/bin/docker stop nginx

      [Install]
      WantedBy=multi-user.target
  - name: app.service
    command: start
    enable: true
    content: |
      [Unit]
      Description=App
      After=docker.service
      Requires=docker.service

      [Service]
      TimeoutStartSec=15m
      ExecStartPre=-/usr/bin/docker kill app
      ExecStartPre=-/usr/bin/docker rm app
      ExecStartPre=-/usr/bin/docker pull sample/app:1.0
      ExecStart=/bin/bash -c "\
        /usr/bin/docker run --name app \
        -p 9090:9090 \
        -v /go:/go \
        sample/app:1.0"
      ExecStop=/usr/bin/docker stop app

      [Install]
      WantedBy=multi-user.target

Vagrantfileを作成

coreos/coreos-vagrantを使用する

Dockerの-vオプションで指定したフォルダをVagrantの共有フォルダでローカル側と接続すると、ローカル環境をDockerボリュームに接続できる。以下ではapp/をGOPATHとしている。

ROOT_PATH = File.dirname(__FILE__)
LOG_PATH = File.join(ROOT_PATH, "log")
NGINX_CONF = File.join(ROOT_PATH, "config/nginx")
NGINX_ROOT = File.join(ROOT_PATH, "html")
GOPATH = File.join(ROOT_PATH, "app")

$shared_folders = {
  "#{LOG_PATH}" => "/nginx/log",
  "#{NGINX_CONF}" => "/nginx/conf",
  "#{NGINX_ROOT}" => "/nginx/html",
  "#{GOPATH}" => "/go"
}

Vagrantを起動してログインする

$ vagrant up
$ vagrant ssh

CoreOSのサービスが起動していることを確認する

$ systemctl | grep app
app.service                        loaded active running   App

コードを変更して動作確認を行う

ローカル側でapp/srcのコードを変更して、CoreOSからサービスの再起動を行うとDocker内でビルドを実施する

$ sudo systemctl restart app
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6