【Go初学】Dockerを使った最もシンプルなgolangアプリケーション[2]
■概要
Dockerを使った最もシンプルなgolangアプリケーションの作成について調べつつ書いていきたい。簡単なgolangを記述し、Dockerイメージの作成、コンテナの実行を行う。
前回はDockerfileの作成まで。今回はそれを用いてDockerイメージを作成し、イメージのレジストリである Docker Hub へイメージを登録、最後にコンテナ起動を行い動作確認する。
※Dockerのインストール、Docker Hubアカウント登録などは割愛
■仕様
Dockerイメージの作成、コンテナ実行のコマンドについて見てみる。
▼docker build
// 例
$ docker build -t artefactdoc/minimum_docker_sample .
Dockerfile配置先を「.」でカレントディレクトリ指定している。Dockerfile実行時にDockerイメージに不要なファイルが入り込んで不必要にイメージサイズが大きくならないよう、構築に必要なもののみを配置するよう注意が必要する。またURLはGitのリポジトリを指定することも可能とのこと。
▼docker run
// 例
$ docker run -d --rm --name minimum -p 8080:8080 artefactdoc/minimum_docker_sample:v1.0.0
「-d」
コンテナをバックグラウンド起動する指定。コンソールアプリなどと異なりWebアプリなどは実行後も動作し続ける性質のため、デフォルトのフォアグラウンド起動の場合はターミナルを占有する形になる。そのためバックグラウンドで動作する起動指定を「-d」で行う。
「--rm」
コンテナ実行終了時にコンテナを削除する指定。
「--name <コンテナ名>」
起動するコンテナ名の指定。
「-p <ホスト側受付ポート>:<コンテナ側受付ポート>」
双方の受付ポートの指定。「-p 80:8080」の形であれば、ブラウザで「http://localhost:80/」でアクセスした通信をコンテナ側の「8080」ポートへ流す指定となる。ローカルで複数コンテナを起動する場合、同じポートが利用出来ないので「-p 8080:8080」「-p 8081:8080」のように変える用途になると思われる。
その他「-e」の環境変数指定や「-v」のボリュームマウント指定などよく使われるものがあるが最小構成のため割愛。
■作業と動作確認
▼Dockerイメージの作成
Dockerfileと同階層にターミナルのカレントディレクトリを移動し、buildコマンドを実行してDockerイメージを作成する。
// docker build -t <イメージ名> <Dockerfile参照パス>
$ docker build -t artefactdoc/minimum_docker_sample .
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
artefactdoc/minimum_docker_sample latest fb904aa5586d 3 weeks ago 308MB
イメージ名を「〜/〜」としているのは、後程DockerイメージリポジトリのDocker Hubへ登録するため予めアカウント名を付加したものにしている。
▼Dockerイメージからコンテナを起動
作成したイメージで正常に動作するかコンテナ起動してみる。
$ docker run -d --rm --name minimum -p 8080:8080 artefactdoc/minimum_docker_sample
95568083558b6766d6193ec1e36ddb022ddcb5d3963c63fb7fd74985e25a2a1a
$ docker logs 955
Hello world
home
home
▼Docker HubへDockerイメージを登録
まずはログインを行う。
$ docker login
イメージをアップロードする。
$ docker push artefactdoc/minimum_docker_sample
Using default tag: latest
The push refers to repository [docker.io/artefactdoc/minimum_docker_sample]
バージョンを指定しなかったため、「Using default tag: latest」とデフォルトの「latest」が設定された。運用上、常にlatestを上書きすると特定バージョンの検証など行えないため、バージョン1.0.0としてもイメージを保存してみる。
// まずはバージョン1.0.0のタグをイメージに付加する
$ docker tag artefactdoc/minimum_docker_sample artefactdoc/minimum_docker_sample:v1.0.0
// 付加されたことを確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
artefactdoc/minimum_docker_sample latest fb904aa5586d 3 weeks ago 308MB
artefactdoc/minimum_docker_sample v1.0.0 fb904aa5586d 3 weeks ago 308MB
// Hubへ登録
$ docker push artefactdoc/minimum_docker_sample:v1.0.0
The push refers to repository [docker.io/artefactdoc/minimum_docker_sample]
▼Docker Hubからイメージをダウンロードしてコンテナ起動
作成したイメージからコンテナを起動する。ついでにローカルにイメージが存在しない場合にDocker Hubに登録したイメージをダウンロードする動作確認も行ってみる。
// 動作確認テストのため、ローカルに先ほど作成したv1.0.0のイメージを削除しておく
$ docker image rm artefactdoc/minimum_docker_sample:v1.0.0
Untagged: artefactdoc/minimum_docker_sample:v1.0.0
// 削除した1.0.0イメージを指定してコンテナを起動する
$ docker run -d --rm --name minimum -p 8080:8080 artefactdoc/minimum_docker_sample:v1.0.0
Unable to find image 'artefactdoc/minimum_docker_sample:v1.0.0' locally
v1.0.0: Pulling from artefactdoc/minimum_docker_sample
// 起動時点のログを確認
$ docker logs minimum
Hello world
// ブラウザで「localhost:8080」アクセス後にログを確認
$ docker logs minimum
Hello world
home
home
コンテナ起動時のログ「v1.0.0: Pulling from 〜」からDocker Hubからイメージを取得していることが分かる。アプリケーションの方も、コンテナ起動時オプションの8080→8080ポート指定が機能し正常に動作することが確認できる。
■あとがき
何も動作しないコンテナではあるが基本的な一連の流れは把握できた。起動オプションはたくさんあるが、単純なコンテナ起動であれば上記のほか頻繁に必要になるのは環境変数や永続領域の指定くらいかと思われる。
これらは複数コンテナ実行のDocker ComposeやオーケストレーションのKubernetesやECSなどの基礎知識になるため最低限理解しておきたい。