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の生成手順
- Dockerfile記述
- BuildしてDocker imageの作成
- imageをもとにRunしてContainerの起動
例: Go Appの実行
下記のようなGolangのHello 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オプションについてもまとめられたら良いですね。