Blog

DockerでGo言語の環境構築をしてGo Modulesを試してみた

はじめまして!

2019年度新入社員の大川です。現在は、WEBサービス開発グループでOJT中です。

皆さん、Dockerを知っていますか?すでに使っている人も多いと思いますが、中には「名前は知ってるけど使ったことは無い」という人もいると思います。私もその一人で、「コンテナを作って共有とか出来るんでしょ?」それくらいのイメージでした。

そんなDocker初心者の私が、Dockerを用いてGo言語の環境を構築しWEBサーバーを立ち上げてみたので、そのことについて書いていきたいと思います。

また、Go1.12からGo Modulesという新機能が登場したので試してみました。

環境

Docker:18.06.1

Docker Compose:1.21.0

Go言語:1.12.6

Dockerとは

DockerとはDocker社が提供している、コンテナ型の仮想環境を構築するためのプラットフォームです。

PCの中に軽量な仮想マシンを構築でき、コンテナを入れ替えれば様々な仮想環境を扱うことが出来ます。よってプロジェクトごとに開発環境を変えることが出来ます。

また、コンテナを共有することも出来るので、開発環境をそのまま本番環境に移植したり別のPCで同じ環境を作ることが出来ます。

これだけですごく便利だということが分かると思います。

今回の流れ

今回は、コンテナを作成するための処理は、DockerfileとCompose file (docker-compose.yml) に記述し、 $ docker-compose up と入力すればコンテナを作り出せる状態にしようと思います。

Dockerのインストール

Dockerをインストールしていない人は以下のサイトを参考にインストールしましょう。

必要なプログラムを記述する

最終的なディレクトリ構造は以下のようになるので必要なファイルを作成していきます。

Dockerfile

Dockerfileとは、必要なパッケージや設定を記述することで、自分でDockerイメージを作ることが出来るファイルです。

今回はGo言語のバージョン1.12.6をベースに、イメージを作成していきます。

また、今回はGo Modulesでモジュールを管理をするのでGO111MODULEという環境変数をonにする必要があります。

go mod download で go.mod に記述されている依存パッケージをダウンロードします。

Compose file (docker-compose.yml)

Compose fileとは、複数のコンテナを利用するときに記述するファイルです。

今回は、バインドマウント (ローカルのファイルをコンテナで利用できる状態に) するために利用しました。

go.mod

パッケージの依存関係を記述していきます。

main.go

Webサーバーを立ち上げてログを収集するためのプログラムを書いていきます。

今回は、net/httpパッケージを利用してWebサーバーを立ち上げます。

http.HandleFuncでは、第1引数にパスを、第2引数に処理を指定することでリクエストを処理できるようになります。

http.ListenAndServeを用いてサーバーを起動します。

また、zapを使ってログを収集してみようと思います。

実行する

必要なファイルを記述したら、Dockerfileと同じディレクトリで以下のコマンドを入力しましょう。オプションで -d を付けるとバックグラウンドでの実行になります。

URLにアクセスしてみましょう!

Please check the log. と表示されたらlogファイルの中のerror.logの中身を確認してみましょう。

このような内容が記述されていれば成功です。お疲れ様でした!

終わりに

今回は、Dockerを用いたGo言語の環境構築とGo Modulesを試しました。

今回はすべてのファイルを自分で作りましたが、GitでDockerfileなどの必要なファイルさえ共有できれば 、$docker-compose up コマンド1つですぐに同じ環境を構築できることが分かりました。とても便利ですね。

今後は、AWSとの連携を視野に入れつつ勉強を進めていきたいと思います。閲覧していただきありがとうございました!

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!