Open6
Docker
Docker操作の基本的な流れ
- イメージを探す
- イメージの確認
- 起動する
- 実行状態の確認
- コンテナの停止と再開
- ログの確認
- コンテナの破棄
- イメージの破棄
イメージを探す
- DockerHubから探す
-
docker search
コマンドを使う -
docker pull イメージ名
でDokcerイメージを取得する - タグ名を省略したときは
latest
タグが指定されたものとしてpullする
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 7002 [OK]
ansible/centos7-ansible Ansible on Centos7 135 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC session… 135 [OK]
# 公式のDockerイメージを検索する
$ docker search centos --filter is-official=true
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 7002 [OK]
イメージの確認
-
docker images
コマンドを使う -
docker inspect
コマンドでイメージの詳細情報を確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2e7e2ec411a6 6 days ago 134MB
httpd 2.4 b03352b171b7 6 days ago 136MB
$ docker insepct nginx
[
{
"Id": "sha256:2e7e2ec411a6fdeee34c78b4d41d9a7f6d4cd311f320f03bcec11a239f524341",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767"
],
"Parent": "",
"Comment": "",
"Created": "2022-01-26T05:02:41.260830926Z",
"Container": "759f1b94f6a49945eecb185036762311b091fcbca4a3fe58db55b823a61532f6",
"ContainerConfig": {
"Hostname": "759f1b94f6a4",
.
.
.
- フォーマットオプション(
--format
)はGoテンプレートを使い出力を見やすくする
IDとRepositoryのエントリをコロン区切りで表示
docker images --format "{{.ID}}: {{.Repository}}"
2e7e2ec411a6: nginx
b03352b171b7: httpd
起動する
-
docker run
コマンドで、コンテナを実行する -
docker run
コマンドは、docker pull
,docker create
,docker start
の一連のコマンドをまとめて実行する -
docker create
コマンドは、コンテナを停止状態で作成する
--nameオプション
- コンテナ名を指定する
-
--name
オプションを付けないと、ランダムなコンテナ名が付与される
-vオプション
ボリュームのマウント-
-v
フラグはコンテナの特定のディレクトリに、ホストのディレクトリをマウント設定する - v ホストのディレクトリ:コンテナのディレクトリ
-d(--detach)オプション
- コンテナ作成後、コンテナプロセスの標準入出力をコンソールからデタッチする
-
-d
がないとアタッチモードで起動する
$ docker run --name hogehoge -d -p 8080:80 nginx
4d29b586c8774231ff9fd64554a68760596332474837b0c2a690684cf7954114
-pオプション
- ホストのポート番号とコンテナ番号をマッピングする
-
-p 8080:80
は、DockerホストのTCPポート8080番を、コンテナの80番にマッピングする - マッピングの状態は
docker port
コマンドで確認できる
$ docker port hoge
80/tcp -> 0.0.0.0:8080
-e(--env)オプション, --env-file
環境変数の設定 - コンテナの環境変数を設定
$ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash
--restartオプション
再起動ポリシー- 再起動ポリシーを指定する
# :終了コードの状態に関わらず、常に再起動する
$ docker run --restart=always redis
# 失敗したら (on-failure) 10回カウントするまで再起動を行う
$ docker run --restart=on-failure:10 redis
実行状態の確認
-
docker ps
コマンドで実行中のコンテナの一覧が表示される
コンテナの停止と再開
-
docker stop
コマンドで停止できる -
docker start
コマンドで再開できる
ログの確認
-
docker logs
コマンドでログを確認できる -
docker logs コンテナ名 -f
でログを出し続ける
コンテナの廃棄
-
docker stop
で停止状態にしてから、docker rm
コマンドでコンテナを廃棄する -
docker ps -a
コマンドで完全に削除されたかどうか確認できる
イメージの廃棄
-
docker image rm
コマンドでイメージを削除できる
M1にてMySQLのdocker runが失敗する
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
コンテナの操作
停止中もしくはまだ作られていないとき
-
docker run
の引数にbin/sh
やbin/bash
などのシェルを指定する、-itオプション
もつける
動作中のとき
docker exec -it コンテナ名 /bin/bash
PID 1 Problem
- 一般的にはPID1はinitプロセスで、システムが起動した際に最初に起動するプロセス
- initプロセスの役割は、ゾンビプロセスの除去とサブプロセスへのシグナル伝播
- 何の対策もしないと、アプリケーションの起動プロセスがコンテナ上の最初のプロセスとなる為、
ゾンビプロセスが残ったり、シグナルが正しく処理されないという問題が発生する - 回避策として、「明示的にシグナルをハンドリングする」、または「PID1で実行されないようにする」の方法がある
DockerホストとDocerコンテナ間のファイルをコピーする
ホスト->コンテナの向きにコピーする場合
docker cp my.cnf <コンテナID>:/etc/my.cnf
コンテナ->ホストの向きにコピーする場合
docker cp <コンテナID>:/etc/my.cnf my.cnf
Docker Compose
- あらかじめコンテナの起動方法やボリュームなどを書いた定義ファイルを用意して、まとめて実行する方法
- 定義ファイルは
docker-compose.yml