mcaz
9/30/2019 - 2:00 PM

Docker

Reference

# 生成するDockerイメージのベースとなるイメージを指定
# Dockerファイルでイメージを生成する際、まず最初にFROMで指定されたイメージをDLしてから実行される
# FROMで取得するDockerイメージはデフォルトでDockerHubレジストリで公開されている
# golang イメージ名
# 1.9 タグ
FROM golang:1.9

# Dockerイメージビルド時に実行されるコマンド
# アプリケーションの更新や配置等に使う
RUN mkdir /echo

# Dockerを動作させているホストマシン所魚のファイルやディレクトリをDockerコンテナ内にコピーするためのインストラクション
COPY main.go /echo


# Dockerコンテナとして実行する際にコンテナ内で実行するプロセスを指定
# イメージをビルドするためのRUNに対して、CMDはコンテナ起動時に一度実行される
# アプリケーションそのものを実行する際などに使う

# $ go run /echo/main.go
# 1つのコマンドを空白で分割して配列化した形式で市営
# 配列化させずに記述することも可能だが、配列家のほうが推奨されている
CMD ["go", "run", "/echo/main.go"]

# コマンドをbashからgoに変更
ENTRYPOINT ["go"]

# イメージのダウンロード
$ docker image pull gihyodocker/echo:latest
___

# コンテナ実行
$ docker container run -t -p <port_number1>:<port_number2> <docker_image> [<command>]
- ポートフォワーディング設定でport:9000でアクセス可能
$ docker container run -t -p 9000:8080 gihyodocker/echo:latest
$ curl http://localhost:9000

# ポートフォワードの外部ポート番号を指定せずに、エフェメラルポートを使用する
$ docker container -d -p 8080 main/go:1.9
  - 8080はコンテナ内でのみ使用できるコンテナポート
$ docker container ls
  - PORT番号が確認できる

- コンテナ実行後、コマンドを実行(コマンドの種類はデフォルトでbash, DockerfileのENTRYPOINT設定で変更も可能)
$ docker container run gihyodocker/echo:latest go version
___

# コンテナ停止
$ docker stop $(docker container ps -q)

# DockerfileからDockerイメージ生成
- <namespace>/<image_name>[:<tag_name>]は自由につけられる
$ docker image build -t <namespace>/<image_name>[:<tag_name>] <Dockerfile配置ディレクトリのパス>
$ docker image build -t example/echo:latest .

- example/echo:latest
  - exampleは名前空間、衝突回避のため使用した方が良さそう
___

# Dockerイメージの確認
$ docker image ls
___

# 指定したイメージのコンテナを取得
- イメージ:main/go:1.9
$ docker container ls --filter="ancestor=main/go:1.9"
___

# 指定したイメージのコンテナをすべて停止
$ docker container stop $(docker container ls --filter="ancestor=main/go:1.9" -q)

# 表示情報をイメージID/コンテナIDのみに絞る
$ docker image ls -q
$ docker container ls -q

Docker-docs-ja

docker build -t friendlyname .               # このディレクトリ内にある DockerCile でイメージ作成
docker run -p 4000:80 friendlyname  # "friendlyname" の実行にあたり、ポート 4000 を 80 に割り当て
docker run -d -p 4000:80 friendlyname                            # 同じですが、デタッチド・モード
docker container ls                                                  # 全ての実行中コンテナを表示
docker container ls -a                                       # 停止中も含めて全てのコンテナを表示
docker container stop <hash>                                       # 指定したコンテナを丁寧に停止
docker container kill <hash>                               # 指定したコンテナを強制シャットダウン
docker container rm <hash>                                   # マシン上から指定したコンテナを削除
docker container rm $(docker container ls -a -q)                           # 全てのコンテナを削除
docker image ls -a                                               # マシン上の全てのイメージを表示
docker image rm <image id>                                       # マシン上の特定のイメージを削除
docker image rm $(docker image ls -a -q)                         # マシン上の全てのイメージを削除
docker login                                       # CLI セッションで Docker の認証を行いログイン
docker tag <image> username/repository:tag      # レジストリにアップロードする <image> にタグ付け
docker push username/repository:tag                                  # タグ付けしたイメージを送信
docker run username/repository:tag                               # レジストリにあるイメージを実行

Docker image 操作

Docker Image

Dockerコンテナを生成するためのテンプレート UbuntuなどOSとして構成されたファイル コンテナ上で実行するためのアプリケーションや依存しているライブラリ・ツール どのプロセスがコンテナ上で実行されるかといった実行環境としての設定情報まで含んだ アーカイブのようなもの

Dockerfile

イメージを構築するための手順を記述したもの。 Dockerfile自身がイメージとなるわけではない

# imageのビルド
$ docker image build

# タグを指定してビルド
$ docker image build -t <image_name>[:<tag>] <Dockerfile_directory_path>
$ docker image build -t example/test:node .

# Dockerfile名を指定してビルド
$ docker image build -f <Dockerfile_name> -t <image_name>[:<tag>] <Dockerfile_directory_path>
$ docker image build -f dockerfile_example -t example/docker:1.0 .

# FROMのベースイメージを強制的に再取得(通常はイメージのキャッシュを再利用)
$ docker image build --pull=true -t <image_name>[:<tag>] <Dockerfile_directory_path>
$ docker image build --pull=true -t exmple/001:tag .

- Options
  -t: タグを指定する場合に必要。ほぼ必須
  -f: Dockerfile名を指定
  --pull: DockerfileのFROMで指定されているベースイメージを強制的に再取得
___

# リポジトリからイメージを取得する
$ docker image pull [options] <repository_name>[:<tag>]

# タグを省略して実行
- 省略するとデフォルトタグが指定される
- デフォルトタグはlatestの場合が多い
$ docker image pull jenkins:latest
___

# ホストのDockerイメージ一覧表示
$ docker image ls [options] <repository>[:<tag>]
___

# イメージの削除
$ docker image rm <image_name>
$ docker image rm php:7.2-apache
___

# イメージの強制削除(依存関係ごと)
$ docker image rmi -f <image_name>
$ docker image rmi -f php:7.2-apache
___

# イメージを指定してタグを付けて複製する
- 更新→ビルドすると古いイメージとタグとの紐付けが解除されて<none>になる
- イメージをいつでも再利用できるようにタグを付けて目印にする必要がある
- 複製されたイメージは複製元イメージと同じIDを持つ
$ docker image tag <from_image>[:<tag>] <to_image>[:<tag>]
$ docker image tag jenkins:latest jenkins/example:1.0
___

# イメージの公開
$ docker image push [options] <repository_name>[:<tag>]

# まずイメージの名前空間をDockerHubのアカウントの名前空間に変える
- DockerHubは自分が所有している、または所属しているorganizationのリポジトリにしかPush出来ない
$ docker image tag jenkins/example:0.1.0 cazma/jenkins-example:0.1.0

# プッシュ
$ docker image push cazma/jenkins-example:0.1.0

# prune 使用していないイメージの一括破棄
$ docker image prune [options]
$ docker image prune

# 利用されていないイメージ、コンテナ、ボリューム、ネットワークといった
  すべてのDockerリソースを一括削除
$ docker system prune

dockerイメージ検索

docker search [options] <keyword>

DockerHubログイン

# ログイン
$ docker login -u <account_id> -p <password>
=> Login Succeeded

docker container

command

# コンテナの作成と実行
$ docker container run [options] <image_name>[:<tag>] [command] [command_options...]
$ docker container run [options] <image_id> [command] [command_options...]

# -it CMDコマンドを上書き
- [command] [command_options...]を指定すると、DockerfileのCMDを上書きして実行できる
- -iは正確にはDocker起動時にコンテナ側の標準入力をつなぎっぱなしにする。
  そのためシェルに入って実行などができる。単体だと入力あできるが表示出来ない
- -tはターミナルの表示、単体だと表示だけで入力出来ない
$ docker container runn -it example/image:v1 echo "test"
=> test

# --name コンテナを名前付きで実行
- 名前を指定しない場合、Docker側で適当な名前をつけてしまい、
  自動操作の際などに名前を指定できな
$ docker container run --name <container_name> <image_name>[:<tag>]
$ docker container run --name example_container example/image:v2
___

# --rm コンテナ終了後にコンテナを破棄する
$ docker container run --rm <image_name>[:<tag>]
$ docker container run --rm jenkins/example:0.1.0

# -p ポートフォワードを指定して実行
$ docker ocntainer run -p <from_port>:<to_port>/<image_name>[:<tag>]
$ docker container run -p 9000:8080 example/image:1.0
$ curl localhost:9000
___

# -d バックグラウンドで実行
$ docker container run -d <image_name>[:<tag>]
$ docker container run -d jenkins/example:latest

# バックグラウンドで実行しっぱなしにする
$ docker container run --name <name> -itd <image>:<image_tag> <command>
$ docker container run --name centos7 -itd centos:centos7 /bin/bash
___

# コンテナの一覧
$ docker container ls [options]

# コンテナIDだけを取得
$ docker container ls -q

# 名称でフィルターを掛ける
$ docker container --filter "name=<container_name>"
$ docker container --filter "name=echo1"

# イメージでフィルターを掛ける
$ docker container --fiter "ancestor=<image_name>[:<tag>]"
$ docker container --fiter "ancestor=example/echo"

- CONTAINER ID: コンテナに付与されるユニークID
- IMAGE: コンテナ作成に使用されたDocekrイメージ
- COMMAND: コンテナで実行されているアプリケーションのプロセス
- STSTUS: Up(実行中)、Exited(終了)
- PORTS: ホストのポートとコンテナポートの紐付け(ポートフォワーディング)
- NAMES: コンテナにつけられた名前
___

# stop コンテナの停止
$ docker container stop <<container_id>|<container_name>>
$ docker container stop d47389f8f1c0
$ docker container stop confident_buck
___

# restart コンテナの再起動
$ docker container restart <<container_id>|<container_name>>
$ docker container restart d47389f8f1c0
$ docker cotnainer restart confident_buck
___

# rm コンテナの破棄
$ docker container rm <<container_id>|<container_name>>
$ docker container rm d47389f8f1c0
$ docker cotnainer rm confident_buck

# rm -f 実行中のコンテナも強制的に破棄する
$ docker container rm -f <<container_id>|<container_name>>
___

# logs コンテナの標準入出力の表示
- 一度だけ表示
$ docker container logs <<conainer_id>|<container_name>>
$ docker container losg example
- ずっと表示
$ docker cotnainer logs -f <<container_id>|<container_name>>
$ docker container losg -f example

# Dockerイメージをフィルタリングしてログを取得
$ docker container logs -f $(docker container ls --filter="ancestor=<image_name>" -q)
$ docker container logs $(docker container ls --filter="ancestor=2c3c2d17f330" -q)
___

# ホストとコンテナの共有用ディレクトリを指定する
$ docker contaienr [options] -v <host_dir>:<container_dir> <<image_id>|<image_name>>[:<tag>]
$ docker cotnainer -v ${PWD}:/workspace example/cronjob:latest
___

# コンテナの中でコマンドを実行する
$ docker container exec [options] <<container_id>|<container_name>> <command>
$ docker container exec jenkins/example:0.1.0 echo "test"
# コンテナ内でコマンドをずっと実行できる状態にする(うまく行かない、要検証)
$ docker container exec -it echo sh
$ docker container exec -it jenkins_example echo "aaa"
___

# コンテナのファイルをホストにコピー
- コンテナ間、ホスト・コンテナ間でファイルのコピーが可能
- 停止中のコンテナに対してもファイルを配置できる
$ docker container cp <<container_id>|<container_name>>:<file(dir)_path> <host_path>
$ docker container cp 639fc5420a16:bin/hello.sh .
$ docker container cp 639fc5420a16:bin/hello.sh ./dir
docker container cp echo:/echo/main.go .

# ホストのファイルをコンテナにコピー
$ docker container cp <host_file_path> <<container_id>|<container_name>>:<cotnainer_file_path>
$ docker container cp dummy.txt echo:/tmp
$ docker container exec ehcho ls /tmp | grep dummy
=> dummy.txt

# コンテナのファイルをホストにコピー
# mysql-data内のデータを他のコンテナを経由してホストに移す
- busyboxイメージを使ってコンテナを作成する
- ホストとbusyboxコンテナの共有ディレクトリを設定
- busyboxのData Volumeコンテナにmysql-dataを指定
- Data Volumeコンテナのデータをホストと共有しているディレクトリ/tmp配下に圧縮して配置
$ docker container run -v ${PWD}:/tmp \
--volumes-from mysql-data \
busybox \
tar cvzf /tmp/mysql-backup.tar.gz /var/lib/mysql
___

# 実行時に環境変数を設定
$ docker container run -d --rm --name mysql \
-e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" \
-e "MYSQL_DATABASE=volume_test" \
-e "MYSQL_USER=example" \
-e "MYSQL_PASSWORD=example" \
___

# データボリュームを設定
$ docker container run --volumes-from <<container_id>|<container_name>>
$ docker container run --volumes-from mysql-data

$ docker container run -d --rm --name mysql \
-e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" \
-e "MYSQL_DATABASE=volume_test" \
-e "MYSQL_USER=example" \
-e "MYSQL_PASSWORD=example" \
--volumes-from mysql-data \
mysql:5.7
___

# prune 実行していないコンテナの一括破棄
$ docker container prune [options]
$ docker container prune

# status 利用状況の取得
$ docker container stats [options] <<container_id>|<contianer_name>>
$ docker container stats jenkins_example

docker-compose

Command

# コンテナ起動
$ docker-compose up

# コンテナ終了
$ docker-compose down

# 永続化したデータ(value)をついでに削除
$ docker-compose down -v

# イメージ一覧表示
$ docker-compose images

# JenkinsでSSH鍵を作成
$ docker container exec -it ssh-keygen -t rsa -C ""

# コンテナ一覧表示
$ docker-compose ps
```


# コンテナのIPアドレスを取得
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name | container_id>

```