Software Engineer Blog

エンジニアブログです。技術情報(Go/TypeScript/k8s)や趣味の話も書くかもです。

Dockerについて

概要

Dockerについて、本当に簡単な部分だけまとめてみました。
(ここから、Docker->ECS->k8s->GKEと進めていければなぁと思っています。)

Dockerとは

Software Container Platform=コンテナが動作するプラットフォーム

Containerとは

  • 一つSoftwareが実行されるために必要なすべてをパッケージングしたもの
  • Softwareを動かすために必要なライブラリと設定のみが入っている
  • Container内で、独自にリソースを持つ(メモリ/プロセス/ネットワーク)

どういった問題を解決するのか

「自分のローカルに環境で動いたけど、検証サーバーに載せると動かない..」
→ こういった、環境差分を解決することができる
Containerにくるむことで、どこでも同じように安全に動作することが保証されます。 そのため、Containerにくるんでおけば安心して、検証、本番環境へとSoftwareをリリースすることができます。

Container(= Docker Container)の作り方

Dockerfileを書きましょう。

Dockerfileとは

  • Docker Containerの設計が書かれたファイル
  • Dockerfile` というファイル名で作成する
  • 記述はDockerfile用DSL
  • Dockerエンジン + Dockerfile + ソースファイル があればどの環境でも同じように実行可能

Docker image

  • Dockerfileに記述されたOSやアプリケーションコード等をまとめたテンプレート
  • Containerはimageを実体化したもの
  • Dockerfileをbuildすることで作成することができる
  • Dockerエンジン + Docker image があればどの環境でも同じように実行可能
    • imageを作成して、Docker Hub等のコンテナ管理サービスにpushしておく
    • Docker Hub等からimageをpullしてくるだけで実行可能に

Docker Containerの生成手順

  1. Dockerfile記述
  2. BuildしてDocker imageの作成
  3. imageをもとにRunしてContainerの起動

例: Go Appの実行

下記のようなGolangHello WorldのコードをContainer内で実行してみます。

package main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}

\1. Dockerfile記述
下記のようなDockerfileを作成します。(詳細はコメント参照)

# ベースイメージの指定
# Docker Hub(https://hub.docker.com/)上に様々なイメージが公開されている
# そちらから利用したいベースイメージを選択
FROM golang:1.8.3-alpine3.6

# 作業を行うディレクトリを選択
WORKDIR /go/src

# コマンドを実行
# golangイメージは Alpine Linuxをもとに作成(軽量のためDockerでよく利用される)
# linuxコマンド(ls,mkdir)等が実行可能
RUN mkdir hello

# 作業を行うディレクトリを変更
WORKDIR /go/src/hello

# 作業ディレクトリからコンテナ内にファイルをコピー
# COPY [ホスト側] [コンテナ内]
COPY . .

# Go Appをbuild
RUN go build -o hello main.go

# コンテナ起動時に実行されるコマンド
CMD ["/go/src/hello/hello"]

\2. BuildしてDocker imageの作成

% ls
Dockerfile      main.go

# imageの作成
# (-t でタグを設定できる)
% docker build -t hello:1.0 ./

# imageの確認
% docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello               1.0                 df9a562be589        10 minutes ago      259MB

\3. imageをもとにRunしてContainerの起動

# コンテナの実行
% docker run hello:1.0
Hello World

まとめ

docker-composeやswam等は別途まとめようかなと思います。 また、詳細なDockerfileのDSLや、docker build/runオプションについてもまとめられたら良いですね。

参考