Dockerを使った Goの環境構築方法を紹介


Photo by Firos nv on Unsplash

この記事はユアマイスター Advent Calendar 2021 10日目の記事です。

こんにちは!

Webエンジニアをしています。
南です。

最近Goの勉強をしていて、まずはじめに行ったのがGoの環境構築でした。

ローカルのマシンの環境を汚したくないというのと、他のPCでも同じ用に環境構築ができたらいいなという理由でDokcerを使って環境構築を行うことにしました。

今回は僕がGoの勉強を行う際に、行った環境構築について紹介します。

ちなみに使用するGoのバージョンは、勉強の際に最新だった1.16で環境構築を行っていきます。

また、Dockerのバージョンは3.3.1を使用しています。

ディレクトリ構成


Photo by Maksym Kaharlytskyi on Unsplash

今回行った環境構築では、次のような構成にしました。

元々Go側でAPI、フロント側でVueJsを使ったアプリを作ろうと思っていて、このような構成にしました。

Dockerについてはdockerディレクトリにまとめて、APIについてはsrc/apiにまとめておいた方が、管理もしやすいと思ったからです。

Goの環境構築


Photo by Josh Hild on Unsplash

では、ここから実際にGoの環境構築を行っていきます。

今回行った環境構築は以下のリポジトリから、クローン可能ですので、良かったら試してみてください。

※今回はあくまで勉強用に作った物になるため、プロダクション環境において適切かどうかは、各自お調べ頂ければと思います。

.envファイルの作成

まずはdokcer-compose.ymlなどで使っていく環境変数を、.envファイルにまとめていきます。

以下のような構成で作ってください。

docker-compose.ymlの作成

.envが作成できたら、次はdocker-compose.ymlを作っていきます。

Go用のDokcerfileの作成

docker-compose.ymlが作成できたら、次はGo用のDockerfileを作っていきます。

dockerディレクトリ内に、apiというディレクトリを作ってください。

apiというディレクトリにする理由は、docker-compose.yml内で、contextの箇所に./apiと指定しているからです。

apiというディレクトリができたら、Dockerfileを作成します。

Dockerfileの中身は、以下のように設定します。

Goファイルの作成


Photo by Kelly Sikkema on Unsplash

Go用のDockerfileが作成できたら、最後にGoのファイルを作成します。

go-dockerディレクトリ内に、src/apiという階層でディレクトリを作成します。

apiのディレクトリ内で、main.goというファイルを作成します。

中身は、一旦以下のようにしましょう。

Dockerの立ち上げ


Photo by Andy Hermawan on Unsplash

ここまでできたら、最後に以下のコマンドをdocker-compose.ymlがあるディレクトリで、叩いてみてください。

dockerが立ち上がります。

dockerが立ち上がったら、以下のコマンドでdokcerのコンテナの中に入りましょう。

中に入ってlsコマンドを打つと以下のようになっていると思います。

上記のように表示されたら、同じ場所で以下のコマンドを打ってGoのビルドを行って立ち上げます。

コマンドをうった後に、以下のURLにアクセスします。
すると、以下のように表示されるはずです。

URL:http://localhost:8000/

画面に表示されるもの: indexページ

これでGoの環境構築は完了です。

Goファイルの中身紹介


Photo by Vladislav Klapin on Unsplash

最後に今回処理を書いている、Goファイルの中身について少し紹介します。

以下のGoファイルで行っていることは、次のようなことをしています。

1.HTTPリクエストに対するレスポンスを実装。
2.URLのパターンにマッチした際の関数をDefaultServeMuxに登録。
3.ListenAndServeを使って、HTTPサーバーを起動。

HTTPリクエストに対するレスポンスを実装について

HTTPリクエストに対するレスポンスを実装については、以下の箇所で行っています。

ioはGoが提供している入出力用のパッケージで、その中のWriteStringというメソッドを使って文字を出力しています。

URLのパターンにマッチした際の関数をDefaultServeMuxに登録について

URLのパターンにマッチした際の関数をDefaultServeMuxに登録している処理は以下の箇所で行っています。

DefaultServeMuxは、net/httpパッケージで使用されているグローバル変数のことで、次で紹介するListenAndServeの第2引数をnilとした場合に使用されます。

以下のHandleFuncメソッドで、各パターンをDefaultServeMux内に登録します。

ListenAndServeを使って、HTTPサーバーを起動について

ListenAndServeを使うことで、httpパッケージのServeメソッドを呼び出します。

このメソッドの中で受け取ったHTTPリクエストに対して対応するハンドラーを返すといったことをして、レスポンスを返却しています。

ListenAndServeについては以下。

Serveメソッドについては以下に詳しく記載されています。

まとめ

今回は僕がGoを勉強する際に行った環境構築について紹介しました。

この記事が同じようにGoの勉強を始めるために、環境構築について悩む人のために慣れば幸いです。

今回環境構築に使ったソースは以下から使用できますので、良かったら参考にされてみてください!

この記事を書いた人

南 健太郎

1991年生まれ。都内でエンジニアをしています。
このブログでは、個人開発や日々の技術に関する情報などを発信していきます。