TaNA LABO
エンジニアリング

April 26, 2020

コンテナ
Docker

今更だけどDockerコンテナ技術の理解が曖昧だったのでコンテナ再入門

post 37

昨今のシステム開発では欠かせないコンテナ技術だが、今まで人が作ったDockerfileを流用したりで、正確に理解出来ていなかった。このままでも良いかなと思っていた矢先、バージョアップで急に動かなくなり、結構ムダな時間を要してしまうこともしばしば。

今まで何かと理由をつけて逃げていたが、エラーに遭遇すると結構困ることが多いので、流石にマズいと思うので上の書籍を再読してみた(Kubernetesは学習コスト大なのでDockerの仕組みだけ)

Dockerfileの書き方

Dockerイメージをビルド とは、Dockerfileやアプリケーションの実行ファイルから、Dockerコンテナの元となるイメージを作ることで、Dockerfileは独自のDLSでイメージ構成を定義。

# Dockerfile
FROM golang:1.9

RUN mkdir /echo
COPY main.go /echo

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

FROM は作成するDockerイメージのベースとなるイメージを指定し、ビルド時にはFROMで指定されたイメージをダウンロードして実行(取得イメージはデフォルトでDocker Hubレジストリを参照)

RUN はDockerイメージビルド時、Dockerコンテナ内で実行するコマンドを定義し、引数にはDockerコンテナ内で実行するコマンドをそのまま指定出来る。

COPY はDockerを動作させるホストマシン上のファイル等をDockerコンテナにコピーする操作。

CMD はDockerコンテナとして実行する際、コンテナ内で実行するプロセスを指定(RUNではアプリケーションの更新や配置、CMDでアプリケーションそのものを動作させる)

コンテナの操作

サンプルで作成したDockerfileで動作させるためのmain.goを新規作成。

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)
	}
}

まずDockerイメージを作成して、作成されたイメージを一覧化。

docker image build -t example/echo:latest .
docker image ls

作成されたイメージでコンテナ実行(-dでバックグラウンド処理、-pでポートフォワーディング)

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

localhost:9000で画面上に「Hello Docker!!」されるのを確認したら不要なコンテナを削除。

docker container stop コンテナID
docker container rm コンテナID

コンテナ実行に利用したイメージも併せて削除。

docker image ls
docker rmi イメージID

Dockerイメージ操作

DockerイメージDockerコンテナ を作成するためのテンプレートで、UbuntuなどOSとして構成されたファイルシステム、コンテナ上で実行するためのアプリケーション、依存するライブラリ・ツール、プロセスがコンテナ上で実行されるか等の設定情報まで含んだもの。

イメージ操作に関わる主なコマンドは以下のとおり↓

docker help
docker image --help

イメージの ビルド で行うコマンド。

# -t オプションで[イメージ名]と[タグ名]を指定.
docker image build -t イメージ名:タグ名 Dockerfile配置ディレクトリのパス

# -f オプションは、指定ファイル(Dockerfileでない名称)を指定してイメージをビルド.
docker image build -f Dockerfile-test -t example/echo:latest

# --pull オプションは、ベースイメージを強制的に再取得してイメージのビルド.
docker image build --pull=true -t example/echo:latest

イメージの 取得 を行うコマンド。

# DockerレジストリからDockerイメージをダウンロード.
docker image pull [options] リポジトリ名:タグ名

# 例) jenkinsのイメージ取得コマンド.
docker image pull jenkins:latest

イメージの 削除 を行うコマンド。

docker rmi イメージID

# 強制的に削除.
docker rmi -f イメージID

イメージの 一覧 を確認するコマンド。

# Dockerホストに保持されているイメージの一覧表示.
docker image ls [options] [リポジトリ:タグ]

イメージの タグ付け を行うコマンド。

# Dockerイメージのタグはある特定のイメージIDを持つDockerイメージを識別しやすくするために利用.
docker image tag 元イメージ:タグ 新イメージ:タグ

Dockerコンテナ操作

Dockerコンテナ実行中・停止・破棄 の3つの状態のいずれかに分類される。

コンテナの 作成と実行 を行うコマンド。

# Dockerイメージからコンテナを作成、実行するコマンド.
docker container run [options] イメージ名:タグ コマンド コマンド引数
docker container run [options] イメージID コマンド コマンド引数

# -p ポートフォワーディング(ホスト側の9000ポートからコンテナ側の8080ポートへアクセス)
# -d バックグラウンド
docker container run -d -p 9000:8080 example/echo:latest

# 名前付きコンテナ
docker container run --name コンテナ名 イメージ名:タグ

# 例)
docker container run -t -d --name gihyo-echo example/echo:latest

コンテナの 一覧 を確認するコマンド。

# 実行中のコンテナ及び終了したコンテナの一覧表示.
docker container ls [options]

# 例) コンテナIDのみ抽出.
docker container ls -q

# 例) 特定のコンテナ名のみ抽出.
docker container ls --filter "name=echo1"

# 例) 特定のイメージで抽出.
docker container ls --filter "ancestor=example/echo"

# 例) 終了したコンテナも抽出.
docker container ls -a

コンテナの 停止 を行うコマンド。

# 実行中のコンテナの停止.
docker container stop コンテナID または コンテナ名

コンテナの 再起動 を行うコマンド。

# 一度停止したコンテナの再実行.
docker container restart コンテナID または コンテナ名

コンテナの 破棄 を行うコマンド。

# 停止したコンテナの完全廃棄.
docker container rm コンテナID または コンテナ名

# 実行中のコンテナを強制的に破棄.
docker container rm -f コンテナID または コンテナ名

実行中のコンテナで コマンド を行う。

# 実行中コンテナの中で任意のコマンドを実行.
docker container exec [options] コンテナID または コンテナ名 コマンド

# ex)
docker container exec -it cronjob tail -f /var/log/cron.log

Docker運用向け操作

コンテナの 一括削除 を行うコマンド。

# 実行していないコンテナの一括削除.
docker container prune [options]

イメージの 一括削除 を行うコマンド。

# 不要なイメージファイルの一括削除.
docker image prune [options]

Dockerリソースの 一括削除 を行うコマンド。

# コンテナ、イメージ、ボリューム、ネットワークなどDockerリソースを一括削除.
docker system prune


©Copyright2020 TaNA LABO. All Rights Reserved.