急いでイソイテク

並盛り技術ダクダクで。

Dockerコマンドまとめ

コンテナ起動・終了

普通に起動

# docker run -i -t docker.io/centos /bin/bash
-i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定 -t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定

名前を付けて起動

# docker run --name isoittech01 -i -t docker.io/centos /bin/bash

終了と同時にコンテナ破棄する

# docker run --rm --name isoittech01 -i -t docker.io/centos /bin/bash

コンテナをバックグラウンドで起動する

# docker run --name isoittech01 -i -t -d docker.io/centos /bin/bash
※BG起動時は「--rm」オプションは指定できない(Conflictする)

BGで起動したコンテナへのアタッチ

# docker ps -aでCONTAINER IDを確認する
# docker attach 3437f04ffc49のようにCONTAINER IDを指定してコマンド実行する
※CONTAINER IDではなく、IMAGE NAMEでも可。 (ENTER)を押してアタッチする

BG起動コンテナへアタッチからのログアウト

dockerコンテナ内でCtrl + pキーとCtrl + qキーの順に押下

BGで起動したコンテナの停止

# docker ps -aでCONTAINER IDを確認する
# docker stop 3437f04ffc49のようにCONTAINER IDを指定してコマンド実行し、停止する
※CONTAINER IDではなく、IMAGE NAMEでも可。

ポートフォワードして起動

docker run -i -t -p 50050:80 centos:centos6/httpd /bin/bash

他の(データストレージ用の)コンテナをVolume指定して起動

docker run -h localmysql -p 3306:3306 --name mysql -d --volumes-from=storage centos7/mysql
-h localmysqlでは任意のホスト名を指定

再起動

docker restart <コンテナ名>


コンテナ保存

保存

# docker ps -aでCONTAINER IDを確認する
# # docker commit c731793b5526 docker.io/centos:latestで保存


コンテナ一覧

全て表示
# docker ps -a 
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
738d5df288a8        docker.io/centos:latest   "/bin/bash"         10 minutes ago      Exited (0) 9 minutes ago                        isoittech01         
7aaf20cac495        docker.io/centos:latest   "/bin/bash"         14 minutes ago      Exited (0) 11 minutes ago                       jovial_elion

イメージ・コンテナ管理

イメージ取得

# docker pull centos

タグ名変更

# docker imagesでIMAGE IDを確認する
# docker tag <IMAGE ID> <TAG>

(例)
# docker tag centos7/mysql:latest centos7/mysql:20150815
# docker rmi <古いイメージのID>

イメージ削除

# docker rmi docker.io/centos:centos7
Untagged: docker.io/centos:centos7

コンテナ削除

# docker ps -aでCONTAINER IDを確認。
# docker rm 738d5df288a8 7aaf20cac495 でコンテナ削除(複数可能)。
※CONTAINER IDではなく、IMAGE NAMEでも可。
-f付けるとstopやってから削除してくれる。

イメージ作成

# docker commit <CONTAINER ID> <REPOSITORY:TAG>

イメージ作成(Dockerfile利用)

# docker build [ -t <イメージ名< [ : <タグ名> ] ] <Dockerfileのあるディレクトリ>
例:docker build -t centos7/httpd:latest .

イメージの系譜確認

# docker images --tree

Docker Registry

起動

# docker run -d -p 5000:5000 -v /var/docker/registry:/var/docker/registry registry:2.0

今後、Docker Registry自体を別サーバへ移行する際、上記/var/docker/registryを圧縮して
同様に起動する(※それが正規手法・効率的なのかは未確認)

push
  • まず、push対象イメージにタグを付ける

# docker tag <イメージ名> <レジストリホスト>[:<レジストリポート>]/<イメージ名>
例:docker tag docker.io/centos xxxxxx.com:5000/my_centos
例:docker tag docker.io/centos localhost:5000/my_centos
docker imagesREPOSITORYに表示されるdocker.io/centosdocker.ioは、要はタグ=レポジトリホスト名という理解でOK。

  • そしてpush

# docker push <レジストリホスト>[:<レジストリポート>]/<イメージ名>


コンテナ起動中のテクニック

コンテナ内のコマンドをコンテナ外から実行する

docker exec -d コンテナ名 <コマンド> <引数1> <引数2>...<引数Z>
-dを付けるとバックグラウンド

コンテナ内のファイルをホストOSにコピーする

docker cp <コンテナID>:/etc/some.txt some.txt

コンテナへファイルを送信する

docker cp <コピー元ファイル> <コンテナID>:<コピー先ファイルフルパス>
例:docker cp some.txt httpdocker:/etc/some.txt

Docker 1.7以前は下記:

docker exec -i <コンテナ名> bash -c 'cat > <コピー先ファイル>' < <コピー元ファイル>
ex)docker exec -i httpdocker /bin/bash -c 'cat > /path/to/file' < /path/from/file
  • docker exec でコンテナ内でコマンドを実行
  • その際 -i オプションによりホスト側の標準入力がコンテナ内の標準入力に接続される
  • ホスト側ではコピー元ファイルを標準入力に流し込む
  • コンテナ内では cat が標準入力の内容をコピー先ファイルに書き出す

コンテナのIPアドレスを調べる

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <コンテナ名>


トラブルシューティング

dockerコマンド何してもアカン

FATA[0000] Get http:///var/run/docker.sock/v1.18/images/json: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

が出る場合は、service docker restartする。


未分類メモ

ストレージコンテナ

stopしただけじゃデータは無くならない。
  • ストレージコンテナとして/optをVOLUME指定でimageを作成。
  • 上記イメージからコンテナstorageを作成。
  • storageをストレージとして、mysqlコンテナを起動
  • mysqlコンテナ上でテストとしてDB,テーブルを作成。
  • mysql, storage両コンテナをstopで落とす。
  • 再度コンテナ起動して作成したテーブルの存在を確認を試みる。結果は存在。
  • docker rmしないとやっぱり無くならないのね。
ストレージコンテナ使用先コンテナでの見え方
  • 例えばVOLUME /optとしてstorageコンテナをbuildした場合、--volume-from=storageでrunしたコンテナでは、 /optが存在する。
  • mysqlの場合は/opt/mysqlにインストールされていた。
    ※ちょっと意味不明だが放置