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

メイン記事

こんばんは!
一週間が始まりましたね!
今日は昨日の続きをします!

↓読んでない方は是非前編から読んでみてくださいね。

では後編はホストから始めていきます。

$cd docker-test //前編で作ったdocker-testフォルダ内に移動
$touch main.go  //main.goファイルを作成

今回はGo言語のフレームワークの1つであるEchoを使っていきます。
フレームワークを詳しく知りたい人は下記を参照。

新規作成したmain.goファイルを編集していきます。

//main.goファイルの中身

package main

import (
    "net/http"

    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.Logger.Fatal(e.Start(":1323"))
}

少しややこしいですが、簡単に説明します。
Go言語はルールとして、後ほどコードを走らせるgo run main.goというコマンドで、
mainパッケージのmain関数から展開するというものがあります。

厳密にはファイル名はmain.goでなくても大丈夫です。

なので、main.goファイルの中でpackage mainを、
func main()でmain関数ををそれぞれ宣言しています。

パッケージについてはGo言語におけるプログラムの書き方と認識しています。

importは他のパッケージに記述した関数などの決め事を
このパッケージ内でも使用できるようにするための記述です。

func main()は関数の宣言。
その中でeという変数にechoクラスの新しいインスタンスを作成しています。
クラスは設計図で、インスタンスは設計図から出来た実像です。

別言語ですが、クラスとインスタンスなどのオブジェクト指向については以下参照。

そしてそのインスタンスに対してGETメソッドを使用し、
ルートにアクセスした際に”Hello World!”を返す(return)ようにしています。

最後の1323はポートを開けています。
ローカルホストの1323番にアクセスしたらいいよ!って意味です。
後ほど確認します。

ポートについては下記参照。

ほんとに細かいところまでは私も分かってないっす!多分これから理解していきます。
少し話がそれますが、プログラマーはカンニングOKの仕事です。
色々なことを頭の片隅に知っておいて実装するときに「あ、なんかあの方法でいけそうやから詳しく調べるか。」
くらいの感覚でいいと思っています。
なのでこのプログラムも何をしているかなんとなくわかればいいです。
(私はそう自分に言い聞かせています。)

てなわけで、main.goの中身が出来ました!

では再びコンテナに戻るんですが、訳あって新しくコンテナを作ります。
訳とはポートを設定できるのはコンテナ作成時のみということ。
そして、ホストフォルダのマウントを行うためです。

では前編で作ったイメージを確認しましょう!

GaonoMacBook-Air:docker-test $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-test         latest              e883635ec002        30 hours ago        839MB
golang              latest              8e2ffcb73e11        3 days ago          839MB

そしてそのイメージからコンテナを作成します。

GaonoMacBook-Air:docker-test $ docker run -it --name docker-test -p 1323:1323 -v $PWD:/go/src/app e883635ec002 bash
root@302f14c7f547:/go# 

なんか色々増えましたね笑
–nameはコンテナに名前をつけています。–(2つ)のことをロングオプションといいます。
-pの1323:1323はポートを指定しています。ローカルホストのポート:コンテナのポートで繋ぐという意味です。
-vはホストフォルダとのマウント(同期)です。これにより、ホストで編集したファイルがコンテナにも反映されるようになります。
マウント元のホストフォルダ位置:コンテナ内の位置で記述します。$PWDは現在のフォルダです。

確認してみましょう。

root@302f14c7f547:/go# ls
bin  pkg  src
root@302f14c7f547:/go# cd src/
root@302f14c7f547:/go/src# ls
app
root@302f14c7f547:/go/src# cd app/
root@302f14c7f547:/go/src/app# ls
main.go

ちゃんと先ほど作成したmain.goがコンテナにもありますね。

もう少しです、頑張りましょう!

それではフレームワークのEchoを導入します。

root@302f14c7f547:/go/src/app# go get -u github.com/labstack/echo
root@302f14c7f547:/go/src/app# cd ..
root@302f14c7f547:/go/src# ls
app  github.com  golang.org

go get -u github.com/labstack/echoでgithubからEchoを引っ張っています。
その後確認するとsrcフォルダ内にgithub.comとgolang.orgが増えていますね。

ちなみにホストではなく、コンテナ内でgo gitする理由は、
ホストにgolangが入っていないからです。
golangがないホストの作業場ではgoコマンドは使えません。
コンテナにはイメージからgolangをインストールしていますよね^ ^

これだけでEchoが使えるようになるんです。すごい。
githubのサーバーが落ちたらエンジニアが「今日の仕事終わりや〜」と言うのは、
それだけgithubがなくてはならない存在だかららしいです笑

で、ちょっと前編と重複しちゃうんですが、
appフォルダ内で再度go mod initをします。

原因はホストフォルダをマウントしたため、
元々appフォルダにあったgo.modファイルが消えてしまったからです。

ホストが優先されてしまうんですね。

root@302f14c7f547:/go/src# cd app
root@302f14c7f547:/go/src/app# go mod init
go: creating new go.mod: module app
root@302f14c7f547:/go/src/app# ls
go.mod	main.go

go.modファイルを再度作成しました。
では満を時して、go run main.goをしましょう!


   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323

なんか色々ダウンロードした後に上のようなのが出てきたらサーバーが立ち上がっています!

うっひょおおおおお!!!Echoの文字!!!!カッコえええええええええ!!!!(?)

では一番したにちょこっと書いてあるように、ブラウザでlocalhost:1323にアクセスしてみましょう!

真っ白な画面に“Hello World!”出てきましたでしょうか!

出た?やりましたね!!!!!よっ!プログラマー!!!!

出てない?すまん、ゆっくり見直しながら何度でも挑戦や‥!!

はい、よくわからないテンションになってきましたが、お疲れ様でした!

小さな一歩ですが、どんなエンジニアもここから始まったはずです。
今回組んだプログラムではHello World!が出力されましたが、
その部分を変えていけばwebサービスへと変わっていきます。

私自身もまだこの先は未知ですが、一緒に頑張っていきましょう!!!

2020.12.7 ガオ

コメント

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