【2021年対応】これだけ覚えればOK!dockerの基本コマンド集【初心者用】

仮想化

ぜひ覚えたいdockerの新しい基本コマンド

dockerのこれだけは覚えた方がいい!という初心者向けの基本コマンド集です。

普通にdockerの学習コストは半端じゃなく高いのですべて覚えてられないと思います。なるべく重要なところだけ効率よく学びたいですよね。

そんな人のためのコマンド集になっております。

※2017年リリースされたDocker v1.13よりコマンドの仕様が一新されていますが新しい仕様で説明します。

ネット上で探せる記事では古いコマンドでの紹介がとても多かったので公式リファレンスで確認しながら書きました。

公式コマンドリファレンスだと実際に運用するうえで使うものも使わないものも並列に書いてありわかりづらいので、実際に覚えておいた方がいいものを書いてあります。

公式のコマンドリファレンスはこちら
http://docs.docker.jp/engine/reference/commandline/index.html

Dockerイメージを表示【docker images】

ダウンロードしたDockerイメージを一覧表示する

$ docker images -a

REPOSITORY    TAG                 IMAGE ID       CREATED       SIZE
wordpress     5.7-php7.4-apache   67c9c1ed40ff   3 days ago    550MB
wordpress     latest              67c9c1ed40ff   3 days ago    550MB
hello-world   latest              d1165f221234   3 weeks ago   13.3kB

※a, –all=false 全てのイメージを表示(デフォルトは中間コンテナを非表示)
※docker images ls は旧仕様

Dockerイメージをオンライン上で検索する【docker search】

キーワードからオンライン上のDockerイメージを探す

searchコマンドでwordpressに関するイメージを検索してみます

$ docker search wordpress

NAME                                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
wordpress                                The WordPress rich content management system…   4078      [OK]       
bitnami/wordpress                        Bitnami Docker Image for WordPress              160                  [OK]
appcontainers/wordpress                  Centos/Debian Based Customizable WordPress C…   34                   [OK]
bitnami/wordpress-nginx                  Bitnami Docker Image for WordPress with NGINX   25                   [OK]
aveltens/wordpress-backup                Easily backup and restore your WordPress blo…   19                   [OK]
conetix/wordpress-with-wp-cli            WordPress with wp-cli integration               18                   [OK]
arm32v7/wordpress                        The WordPress rich content management system…   14                   
centurylink/wordpress                    WordPress image with MySQL removed.             14                   [OK]
appsvcorg/wordpress-alpine-php            This is a WordPress Docker image which can …   11                   
wordpressdevelop/php                     PHP images for the WordPress local developme…   7                    
wodby/wordpress-php                      PHP for WordPress                               6                    [OK]
dalareo/wordpress-ldap                   WordPress images with LDAP support automatic…   6                    [OK]
wodby/wordpress-nginx                    Nginx for WordPress                             6                    [OK]
arm64v8/wordpress                        The WordPress rich content management system…   5                    
ansibleplaybookbundle/wordpress-ha-apb   An APB which deploys WordPress HA               4                    [OK]
gwee/wordpress-sendmail-docker           wordpress with sendmail                         4                    [OK]
wordpressdevelop/phpunit                 PHPUnit images for the WordPress local devel…   3                    
s390x/wordpress                          The WordPress rich content management system…   3                    
wodby/wordpress                          Vanilla WordPress container image               2                    
bakudankun/wordpress-ja                  WordPress Japanese Edition forked from offic…   1                    [OK]
i386/wordpress                           The WordPress rich content management system…   1                    
ppc64le/wordpress                        The WordPress rich content management system…   1                    
dsteinkopf/wordpress                     wordpress clone plus some php extensions        1                    [OK]
amd64/wordpress                          The WordPress rich content management system…   0                    
arm32v5/wordpress                        The WordPress rich content management system…   0                    

さらに条件を絞ってオンライン上のDockerイメージを探す

こちらの公式WebサイトDockerHub上からもDockerイメージを探せます
https://hub.docker.com/search?type=image

使えるフィルターはこちら

  • stars (整数 – イメージが持つスター数)
  • is-automated(true|false)- イメージが自動構築されたかどうか
  • is-official(true|false)- イメージが公式かどうか

filterで公式のものに絞ってみます。

$ docker search --filter "is-official=true" wordpress

NAME        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
wordpress   The WordPress rich content management system…   4078      [OK]   

サイト上で評価が一定数以上ついているものに絞ることもできます

$ docker search --filter "stars=10" --filter "is-official=true" mysql

NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10676     [OK]       
mariadb   MariaDB Server is a high performing open sou…   4010      [OK]       
percona   Percona Server is a fork of the MySQL relati…   529       [OK]    

後述のイメージ取得の際に説明しますが、searchコマンド上でイメージのタグを確認することはできません。

公式ページから検索することで確認ができます。
https://hub.docker.com/search?type=image

Dockerイメージをオンライン上からダウンロード取得する【docker pull】

探し当てたイメージをリポジトリからダウンロードします

$ docker pull wordpress

Using default tag: latest

latest: Pulling from library/wordpress
ac2522cc7269: Pull complete 
5b2eaf06d6cf: Pull complete 
353d7ace7314: Pull complete 
37e4975b15a3: Pull complete 
f54c541ce8ea: Pull complete 
4c5f70c3328b: Pull complete 
7721d733906f: Pull complete 
15a49155542c: Pull complete 
a365bc9f6bef: Pull complete 
60a4e47167a5: Pull complete 
24b65d3ed44f: Pull complete 
0c1e61773eb8: Pull complete 
c29159fb4bcc: Pull complete 
26fb7e4f01ad: Pull complete 
9c202d0c403c: Pull complete 
0c3ce41d4ac1: Pull complete 
9c5aa7a09350: Pull complete 
474825f9ea74: Pull complete 
94703b17fe04: Pull complete 
73c68a1f3a28: Pull complete 
5c2036f3fca4: Pull complete 
Digest: sha256:a78e00e214e7422e80602bc8e217b7ec3c56392b23cfcf308caf1db82f8de76f
Status: Downloaded newer image for wordpress:latest
docker.io/library/wordpress:latest

対象のアプリの細かなバージョンやアプリの種類を指定するためにイメージにはタグがついています。
なにも指定しないとlatest(最新版)というタグがつけられます。

タグの確認の仕方はsearchコマンドの項で説明しています。

wordpressひとつとってもこの画像の3倍以上のタグが存在します。バージョン違い多くの環境がすぐに手に入れられるなんて感動ものですね

wordpress5.7がPHP7.4+Apacheで構築されているタグがあるようなのでそちらを指定してインストールしてみます

$ docker pull wordpress:5.7-php7.4-apache

5.7-php7.4-apache: Pulling from library/wordpress
Digest: sha256:a78e00e214e7422e80602bc8e217b7ec3c56392b23cfcf308caf1db82f8de76f
Status: Downloaded newer image for wordpress:5.7-php7.4-apache
docker.io/library/wordpress:5.7-php7.4-apache

一瞬で終わります・・すごい

Dockerイメージを作成【docker commit】

作成したコンテナのファイル変更や設定を、新しいイメージに収容

docker commit [オプション] コンテナ [リポジトリ[:タグ]]

$ docker commit [オプション] コンテナ [リポジトリ[:タグ]]

Dockerイメージの削除【docker rmi】

$ docker rmi wordpress:latest

Untagged: wordpress:latest

※docker image rmは旧仕様です

イメージの強制削除

$ docker rmi -f mysql:latest

不要なDockerイメージをすべて削除(クリーンアップ)【docker image prune】

docker image prune コマンドは、使っていないイメージのみ削除します。タグを持たず、他のコンテナからも参照されないイメージが全て削除できます。

$ docker image prune

コンテナ一覧を表示【docker ps】

コンテナ一覧を表示します。オプションなしだと動作中のコンテナを表示します。

基本的にはここでコンテナIDやコンテナ名(NAMES)を確認して個別のコンテナの操作をすることになります。

$ docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
07ec75551564   debian    "bash"    8 minutes ago   Up 8 minutes             xxx

主要なステータスの見方

Created 作成されただけの状態。まだ起動されてない
Up *** コンテナ起動中
UP *** (paused) コンテナ一時停止中
Exited *** コンテナ終了済

※docker container lsは旧仕様です
※-a, –all 全てのコンテナを表示 (デフォルトは実行中コンテナのみ表示)

コンテナの詳細情報を表示【docker inspect】

コンテナの詳細情報がJSON形式で出力されます。
かなりの量が表示されます。

docker inspect 【コンテナ名 or コンテナID】

$ docker inspect status-test

[
    {
        "Id": "4632d8089906c2f634aaa7a8741617d99e5ed6ccffcb30b3b6e312a1ac59ea19",
        "Created": "2021-03-31T13:22:21.268519586Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "created",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "0001-01-01T00:00:00Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:109b803c6a30d5b613caf528e4b8f96d2aa4205c58de6ac494825d81380125c8",
        "ResolvConfPath": "",
        "HostnamePath": "",
        "HostsPath": "",
        "LogPath": "",



~略~

コンテナの作成(初期化)【docker create】

イメージをダウンロードしたらコンテナの作成をします。

※あらかじめdocker pull debianをしておいてください。

docker create [オプション] イメージ [コマンド] [コマンドの引数]

$ docker create -it --name debian-test debian

9b9b5f5983dacdc464ac1e2563dfb80fc2155a47600987fe38ed59ca518a209c

–name で名前を指定できます。

名前を付けない場合はランダムな英単語の名前が勝手につけられます。

ここで一番大事なのは -itというオプションです。
必ずつけるようにしてください。
つけないとアプリの内容によって起動しなくなります。
つけても意味のないことはありますが、どうせならいつもつけておいてよいでしょう。

-itオプションを付ける理由

-itオプションをつける理由が気にならない方は読み飛ばしてもOKです。

-itオプションの意味的には
-i:コンテナにアタッチしていなくても STDIN を開き続ける
-t:疑似ターミナル (pseudo-TTY) を割り当て

つまりはコンテナの中のアプリの標準入力と外のOSの標準入力を結びつけるための設定です。標準出力も同様。

標準入力や出力が必須となっているOSようなアプリがコンテナの中身の場合は起動しない場合があります。
一方、apacheなどの標準入力や出力がないものはなしでも起動します。

起動できる docker create -it debian
× 起動できない docker create debian
起動できる docker create -it wordpress
起動できる docker create wordpress

もしこの時点で意味がわからなくても後述のattachの項まで進むとイメージが付くかもしれません。

コンテナの起動・終了・再起動【docker start/stop/restart】

作成したコンテナをバックグラウンドで起動・終了・再起動します

docker start 【コンテナ名 or コンテナID】
docker stop 【コンテナ名 or コンテナID】
docker restart 【コンテナ名 or コンテナID】

$ docker start debian-test

debian-test

$ docker ps -a

CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                  PORTS     NAMES
9b9b5f5983da   debian    "bash"    6 minutes ago   Up Less than a second             debian-test
$ docker stop debian-test

debian-test

$docker ps -a;

CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                      PORTS     NAMES
9b9b5f5983da   debian    "bash"    6 minutes ago   Exited (0) 35 seconds ago             debian-test

コンテナ本体にアタッチ(ログイン)【docker attach】

これまででcreateしてstartした状態だとコンテナはバックグラウンドで動作しています。

このままだと処理中の出力を見たりや入力をしたりなどもできません。

現在の入力出力とコンテナの入力出力を実際に結びつけるのがアタッチ(attach)です。

簡単に言うと端末でコンテナ本体にログインするようなものです。

前述のcreateの項で出てきた-itオプションはこのための設定だったというわけです。
-itオプションでパイプの接合部分を準備して、attachで実際にパイプ同士を接続するみたいなイメージです。

docker attach 【コンテナ名 or コンテナID】

$ docker attach debian-test
root@486a247f11d1:/#                  ←DebianLinuxの標準入出力

Debianの中であることを確認してみます。

root@486a247f11d1:/# cat /etc/issue
Debian GNU/Linux 10 \n \l

今はコンテナ本体につないでいる状態なのでCtrl+Dやexitで抜けるとコンテナプロセス自体が終了(Exited)してしまいます。

コンテナを起動したままアタッチ状態を抜けるには、アタッチの逆であるデタッチ(detach)をしてパイプの接続を切ります。

アタッチ状態でCtrlを押したままP、Qと順番に入力するとdetachすることができ、コンテナは起動したままバックグラウンドで動いている状態に戻ります。

コンテナ上の新規プロセスを実行【docker exec】

execは実行中のコンテナ内で、新しいコマンドを実行します

docker exec [オプション] コンテナ コマンド [コマンド引数]

実行中のコンテナ内に新しい Bash セッションを作成してログイン

$ docker exec -it debian-test bash
実行中のコンテナ内に新しいセッションでsleepコマンド実行(フォアグラウンド)

$ docker exec debian-test sleep 3
$                                                   ←3秒後に入力状態に復帰
実行中のコンテナ内に新しいセッションでsleepコマンド実行(バックグラウンド)

$ docker exec -d debian-test sleep 3
$                                                   ←すぐに入力状態に復帰

初期化~アタッチまとめてやる【docker run】

docker run は今まで記述したcreate, start, attach を一度に実行するコマンドです。

docker create [オプション] イメージ [コマンド] [コマンド引数]

次に示す①~③はすべて同じ結果になります。

①runを使う

$ docker run -it --name debian-test debian

②create + start

$ docker create -it --name debian-test debian
$ docker start -i debian-test

③create + start + attach

$ docker create -it --name debian-test debian
$ docker start  debian-test
$ docker attach debian-test

コンテナの削除【docker rm】

停止中のコンテナ削除

$ docker rm 【コンテナ名 or コンテナID】

起動中のコンテナでも強制削除

$ docker rm -f 【コンテナ名 or コンテナID】

ボリュームの一覧表示【volume ls】

$ docker volume ls

DRIVER    VOLUME NAME
local     basic-php-mysql_docker_share ←名前付きボリューム
local     basic-php-mysql_my_mysql_etc
local     basic-php-mysql_my_mysql_lib
local     basic-php-mysql_my_mysql_log
local     c11f7d87b4b7ea1bcaf205dfc81fe4e0abe1029773cde03603b874a59d4545dd ←名前なしボリューム

ボリュームの削除【volume rm】

使用されていないボリュームを削除できます。
事前に利用しているコンテナを調べて削除しておきましょう

$ volume rm 【ボリューム名 or ボリュームID】

$ docker volume ls

DRIVER    VOLUME NAME
c11f7d87b4b7ea1bcaf205dfc81fe4e0abe1029773cde03603b874a59d4545dd

$ docker ps 

CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS              PORTS                               NAMES
32b611e04e18   basic-php-mysql_mysql       "docker-entrypoint.s…"   About a minute ago   Up About a minute   33060/tcp, 0.0.0.0:3308->3306/tcp   my_mysql

$ docker stop my_mysql ←コンテナ停止

$ docker rm my_mysql ←コンテナ削除

$ docker volume rm c11f7d87b4b7ea1bcaf205dfc81fe4e0abe1029773cde03603b874a59d4545dd ←ボリューム削除

コンテナの内外でのファイルコピー【docker cp】

docker cp [オプション] 転送元 転送先

※転送元・先の記述方法
 ・コンテナ外はパスそのまま
 ・コンテナ内は記述方法は 【コンテナ名 or コンテナID】:【パス】

例) 外→コンテナ内
$ docker cp test.log my_mysql:/mnt/docker/
例) コンテナ内→外
$ docker cp mysql:/mnt/docker/ test.log my

コメント

タイトルとURLをコピーしました