Posted at

Docker入門 Hello world

More than 1 year has passed since last update.


Dockerを利用する意義


  • 冪等性の確保

  • IaaSとImmutable Infrastructure

  • 実行環境とアプリケーションの一体化によるポータビリティ性の向上

  • アプリケーションやミドルウェアの構成管理の容易さ


Dockerコンテナのデプロイ


簡単なアプリケーションとDockerイメージを作成

簡単なサーバープログラムを作成

package main

import (
"fmt"
"log"
"net/http"
)

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Println("received request")
fmt.Fprintf(w, "Hello Docker!!")
})

log.Println("start server")
server := &http.Server{Addr: "8080"}
if err := server.ListenAndServe(); err != nil {
log.Println(err)
}
}

Dockerfileの方はこう

FROM golang:1.9

RUN mkdir /echo
COPY main.go /echo

CMD ["go", "run", "/echo/main.go"]


Dockerfileの解説

FROM

Dockerイメージをビルドする際に、一番最初にFROMで指定したイメージをダウンロードする。上記の例の場合、Goのv1.9を必要とするため、最初にダウンロードしている。

RUN

Dockerイメージビルド時に、Dockerコンテナ内で実行するコマンドを定義。

CMD

コンテナとして実行するときに、コンテナ内で実行するプロセスを指定。RUNがイメージをビルドするときに実行するのに対して、CMDはコンテナ起動時に一度だけ実行される。また、CMDはdocker container runでも指定できる。(CMDよりこちらを優先)


Dockerイメージをビルド

$ docker iamge build -t example/echo:latest .

-t オプションでイメージの名前を指定する。:のあとにはバージョン。


Dockerコンテナの実行

$ docker container run -d -p 9000:8080 example/echo:latest

-d : コンテナの実行をバックグラウンドで行う。

-p : ホストマシンとコンテナ間でポートフォワーディングを行う。

これでコンテナが起動したので、curlでリクエストを投げてみる。

$ curl http://localhost:9000

Hello Docker!!とレスポンスが返ってくるはず。