Docker で Go の開発環境を作る（Docker × Go × Mysql）

# やりたいこと
docker を使って go の開発環境を作る
ローカル環境で go の開発、実行ができるように docker で環境構築を行なっていきます。


# 作るもの
docker, docker-compose を使った go の開発環境
以下の環境をつくっていきます。
・ docker コンテナで go が動く
・ docker コンテナで mysql が動く
・ docker コンテナで phpadmin が動く(おまけ)

# やってき
## 今回作っていくものは以下の通りです。

```
../
└── go-template
    ├── Dockerfile
    ├── docker-compose.yml
    └── main.go
```

### 1.Dockerfile の作成
go の動作環境を作るための Dockerfile です

```ruby:Dockerfile
# ベースになる docker イメージを指定
FROM golang:1.17.1-alpine

# 作業ディレクトリの作成
RUN mkdir /go/src/app

# 作業ディレクトリの設定
WORKDIR /go/src/app

# ホストのファイルをコンテナの作業ディレクトリにコピー
ADD . /go/src/app
```

### 2.docker-compose.yml の作成
mysql, phpadmin は~~めんどう~~とりあえず最低限の設定のみとするので、
Dockerfile は作らずに、 docker-compose.yml で最低限の記述のみとしています。

```ruby:docker-compose.yml
version: '3'
services:
  go-app: # サービス名
    container_name: app # コンテナ名
    build: .  # ビルドに使う docker ファイルの場所
    tty: true # コンテナの永続化
    ports:
      - 80:8080 # api 立てた時に使えるように
    volumes: 
      - .:/go/src/app # マウントディレクトリ
  mysql:
      image: mysql:5.7
      container_name: mysql
      ports:
        - 3306:3306
      environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: docker
          MYSQL_USER: docker
          MYSQL_PASSWORD: docker
          TZ: 'Asia/Tokyo'
  phpadmin:
      image: phpmyadmin/phpmyadmin
      container_name: phpadmin
      depends_on:
          - mysql
      environment:
        - PMA_ARBITRARY=1
        - PMA_HOSTS=mysql
        - PMA_USER=docker
        - PMA_PASSWORD=docker
      ports:
        - 3000:80
```

### 3.main.go の作成
シンプルに hello world 

```ruby:main.go
package main

func main() {
	print("Hello World!")
}

```
## 動作確認
docker-compose でコンテナを起動します。

```
# コンテナを起動
% docker-compose up -d

# 起動確認
% docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                               NAMES
322d31850870        phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   55 seconds ago      Up 54 seconds       0.0.0.0:3000->80/tcp                phpadmin
343fb73f905a        mysql:5.7               "docker-entrypoint.s…"   57 seconds ago      Up 55 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
4d1e2248e0f8        go-template_go-app      "/bin/sh"                57 seconds ago      Up 55 seconds       0.0.0.0:80->8080/tcp                app
```
無事に起動してますね

phpadmin と mysql の確認をしていきます
下記の URL に接続します。
`http://localhost:3000/`
こんな感じの画面が表示されれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1974822/92e91e7e-def6-e6cd-0f09-eb9234b47de7.png)

画面左に「docker」もされており、DBへの接続も問題なさそうですね。
⇨ 以下で指定した DB に接続できているので

```ruby:docker-compose.yml
  mysql:
      image: mysql:5.7
      container_name: mysql
      ports:
        - 3306:3306
      environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: docker
          MYSQL_USER: docker
          MYSQL_PASSWORD: docker
```

続いて、  main.go の hello world です。
以下のコマンドで実行、確認します。

```
% docker exec app go run main.go
Hello World!                                                                                                                                                                                                                    

```
無事、Hello World! が出力されました。
今回の作業はこれで以上です。

今後はこれをベースに開発していきます💪

# 最後に
今回作ったものは以下のリポジトリに配置しています。
https://github.com/Ixy-194/go-template