DockerでGo環境を構築する話 -前編-

メイン記事

こんばんは!
今日はDockerでGo環境を構築したので
忘れないうちに備忘録に残していこうと思います!

Docker、Go言語って何???って方は以下を参照してください!

それでは早速やっていきます!

コンソールを起動し、
Dockerがインストールされていることを確認します。

$docker 

このコマンドでdockerのコマンドリストが出てきたらインストールされています。
出てこない場合はインストールしてね!

確認が済んだら、新規作業フォルダを作成し、移動します。

$mkdir docker-test
//フォルダを作成

$cd docker-test
//フォルダ移動

$docker pull golang
//Go言語のイメージをプル

色々方法はあると思うんですが、
今回の方法はdockerhub上にある、Go言語のイメージをpullし、
そのイメージからコンテナを作成するという手法をとります。

イメージとコンテナの違いですが、
イメージはOSやソフトウェアの元データを持ったCDみたいなもので、
そのイメージを読み込んで複製された作業場所がコンテナと理解しています。

$docker pull golang

ですのでこのコマンドによってgolang(Go言語)イメージをローカル環境に持ってきています。

GaonoMacBook-Air:~$ docker images //イメージの確認
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
golang                    latest              8e2ffcb73e11        35 hours ago        839MB

無事イメージを持ってこれましたね。

ではそのイメージを使って、コンテナを作成します。

GaonoMacBook-Air:~ $ docker run -it golang bash
root@4d4dad03181d:/go# 

docker runコマンドによって、コンテナを作成します。
その後に続くコマンドの説明ですが、-itは-iと-tのオプションコマンドの複合表記で、
-iで標準入力を開いたままの状態にし、-tでコンテナ内でターミナルを起動しています。

golangは先ほど持ってきたイメージ名です。
イメージの確認をしたときのREPOSITORY名、またIMAGE IDを指定しても大丈夫です。

bashというのはシェルスクリプトのうちの一つで、他にもashとかあるんですが、
処理を実行するためのプログラムを指定しているという風に理解しています。
(この辺も一記事としてまとめたい)

ということで無事コンテナが作成出来ました。

root@4d4dad03181d:/go# 

root@の後に続くのがコンテナIDです。
runというコマンドはコンテナを作って、コンテナを起動して、そのコンテナに入るという動作を一括で行っています。
それぞれを単体でする場合はdocker createとかdocker start、docker execコマンドをする必要があります。

補足ですが、コンテナは起動状態と非機動状態があります。
作業場所なので、部屋やパソコンの電気をつけたままかどうかというイメージをしています。

電気をつけたまま(起動状態)だと、すぐ作業に戻れますが、電気代(PCのリソース)がかかります。

:/goは現在のフォルダ位置を表しています。

ではコンテナが出来たところで早速ですが、コンテナから出ましょう!笑

root@4d4dad03181d:/go# exit

コンテナから出るにはexitコマンドを使用します。
注意なのがexitコマンドはコンテナを停止状態にして出ます。
電気とかちゃんと消して部屋を出るんですね、えらい!(?)
ちなみにコンテナを起動状態のまま出たい時にはctrl + P + Qを押します。

GaonoMacBook-Air:~ $ docker ps //起動中のコンテナ一覧を参照する
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

exitで抜けてホストに戻ってきたところで、docker psをすると何も表示されません。
これは起動中のコンテナを参照したためです。
(私は始めコンテナが海に捨てられなくなったんだと思いました。)

非起動中のものも含めた全コンテナを参照したい場合はdocker ps -aを入力します。
-aはallのオプションだったかな?

GaonoMacBook-Air:~ $ docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                      PORTS                    NAMES
4d4dad03181d        golang                    "bash"                   6 minutes ago       Exited (0) 10 seconds ago                            beautiful_kare

きちんと先ほどのコンテナが出てきましたね。ID名も一致しています。
他の項目にも情報が書かれています。
bashで入ったこと。コンテナ作成時間。今は停止していること(exitしたこと)。
NAMESはdocker run時に –nameオプションで指定しない場合は勝手に名付けられます。
(beautiful_kareは美しい旦那様??????どゆこと???笑)

GaonoMacBook-Air:~ $ docker start 4d4dad03181d
4d4dad03181d

dockerを再度起動する場合はdocker start コンテナIDです。
その後、docker exec -it コンテナID bashでコンテナ内に入れます。
(execコマンドは起動中のコンテナにしか入れません)

GaonoMacBook-Air:~ $ docker exec -it 4d4dad03181d bash
root@4d4dad03181d:/go# 

無事戻ってこれましたね!

他にもホストで再度docker runコマンドでgolangイメージからコンテナを作成することが出来ます。
ただし、その場合は以前のコンテナと別のコンテナ(部屋)になりますので注意してください。

間違ってコンテナを作り過ぎた場合はdocker rm コンテナ名で削除することが出来ます。
コンテナを削除する場合はコンテナを出る時にexitするか、docker stop コンテナ名でコンテナを非起動状態にしてから行いましょう!

root@4d4dad03181d:/go# ls  //ファイル構造の確認
bin  src

それではコンテナ内でファイル構造を確認します。

root@4d4dad03181d:/go# cd src/
root@4d4dad03181d:/go/src# ls
root@4d4dad03181d:/go/src# mkdir app
root@4d4dad03181d:/go/src# ls 
app
root@4d4dad03181d:/go/src# cd app/
root@4d4dad03181d:/go/src/app# go mod init
go: creating new go.mod: module app
root@4d4dad03181d:/go/src/app# 

srcフォルダに移動し、appフォルダを作成。
その中にでgo mod initを行います。
これによってgo.modファイルが作成され、後々必要となる拡張機能のバージョン管理ができるようになります。

それではここまでのコンテナの作業の記録を残してみましょう。
そうすることで間違えてコンテナを消してもいいようにしておきます。

root@4d4dad03181d:/go# exit
exit
GaonoMacBook-Air:~ $ docker commit 4d4dad03181d docker-test
sha256:e883635ec0026dd051688c3fdefe2f5e260c77112f197dc6bb521ce239cbf215
GaonoMacBook-Air:~ $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-test         latest              e883635ec002        7 seconds ago       839MB
golang              latest              8e2ffcb73e11        2 days ago          839MB
GaonoMacBook-Air:~ $ 

コンテナ内からexitで抜け、docker commit コンテナID 記録したい名前 でイメージを新規に作ります。
そうです、コンテナの記録はイメージとして作成し残すのです!(自分なりの驚きポイント)

docker imagesで確認すると新しくイメージが出来ていますね!
(golangは一番最初にpullしたイメージ)

私もまだ全然使いこなせていないので想像で話しますが、コンテナの状態をイメージとして残せるので、
次はイメージからファイルを作成した状態のコンテナを新しく作成することが出来ます。

もちろんコンテナに再度入って再会することも出来ます。
では何が良いかといいますと、イメージを始めpullしたときのように、
誰かに配布することができるようになるんです!

golangのpullも実際には誰かがcommitしてpushしたイメージです。
dockerhubにはそういった記録を残し、そして引っ張ることができるサービスです。
(githubとまんま同じですね)

結構長くなってきたので、一旦区切りにしたいと思います。

次でハローワールドの出力まで行く予定ですので、お楽しみに!

2020.12.6 ガオ

コメント

タイトルとURLをコピーしました