Dockerの基本的な使い方・コマンドまとめ

はじめに

Dockerを勉強中です. コマンドを忘れがちなので,主要なものに限りまとめました. 環境構築の方法等は割愛します.

バージョン

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.14
BuildVersion:   18A391

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

$ docker --version
Docker version 18.06.1-ce, build e68fc7a

Docker Hub / イメージ操作関連

イメージの表示(docker images)

$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
ubuntu                        latest              ea4c82dcd15a        5 days ago          85.8MB
nginx                         latest              dbfc48660aeb        8 days ago          109MB
...

イメージの詳細情報表示(docker inspect)

$ docker inspect <image id>
$ docker inspect ubuntu
[
    {
        "Id": "sha256:ea4c82dcd15a33e3e9c4c37050def20476856a08e59526fbe533cc4e98387e39",
        ...
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

イメージのタギング(docker tag)

$ docker tag <image name> <tag name>

以下は,nginx:latestsz4rny/my-nginx:1.0というタグを付与する際のコマンド.

$ docker tag nginx:latest sz4rny/my-nginx:1.0

$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
nginx                         latest              dbfc48660aeb        8 days ago          109MB
sz4rny/my-nginx               1.0                 dbfc48660aeb        8 days ago          109MB

Docker HubからイメージをPull(docker pull)

$ docker pull <image name>:<version>

以下はmysql v8をPullするときの例

$ docker pull mysql:8

全バージョンをPullすることも可能

$ docker pull -a mysql

Docker HubにイメージをPush(docker push)

$ docker push <image name>:<version>

なお,<image name><username>/<image name>というフォーマットである必要がある.

$ docker push sz4rny/hogefuga-image:1.0

イメージの削除(docker rmi)

$ docker rmi <image name>

コンテナ操作関連(概要)

コンテナ一覧の表示(docker ps)

以下は,停止中のコンテナも含めたコンテナの一覧を表示するコマンド例です.

$ docker ps -a
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                           PORTS               NAMES
0252be07dca5        ubuntu                               "/bin/sh"                34 seconds ago      Exited (2) 8 seconds ago                             ecstatic_lumiere
7c2eaee2cb3c        ubuntu                               "/bin/bash"              2 minutes ago       Exited (0) 59 seconds ago                            blissful_lamport
69bf8e697867        ubuntu                               "/bin/sh"                3 minutes ago       Exited (0) 3 minutes ago                             quirky_mirzakhan

コンテナ統計の表示(docker stats)

以下は,起動中のコンテナの統計を表示するコマンド例です.

$ docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
bcb9056e3142        jovial_hopper       0.00%               380KiB / 1.952GiB   0.02%               758B / 0B           0B / 0B             1

コンテナ操作関連(ライフサイクル)

コンテナの生成(docker create)

$ docker create <image name> <args>

コンテナの起動(docker start)

$ docker start <container id>

以下はubuntu上で/bin/lsを実行するコンテナを生成し起動するコマンド例です.

$ docker create ubuntu /bin/ls
7952e6de6a85690349c716bf5be35d099e6479e6cf6a1e46d5d9cafb126b2464

$ docker start -i 7952e6de6a85690349c716bf5be35d099e6479e6cf6a1e46d5d9cafb126b2464
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

コンテナの生成と起動(docker run)

$ docker run [option] <image name> <args>

以下は,ubuntuイメージにtest-ubuntuという名前をつけ,/bin/lsを実行する際のコマンド例です.

$ docker run -it --name="test-ubuntu" ubuntu /bin/ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

--detachオプションを利用することでバックグラウンド実行も可能です.

$ docker run --detach ubuntu /bin/ls
e7dd9bcb6a4602fd5795bba7e6bc2acc97b58f74d7508d8323eab854679e9423

$ docker logs -t e7dd9bcb6a4602fd5795bba7e6bc2acc97b58f74d7508d8323eab854679e9423
2018-10-24T16:11:58.269607900Z bin
2018-10-24T16:11:58.269784000Z boot
2018-10-24T16:11:58.269815900Z dev
2018-10-24T16:11:58.269849900Z etc
2018-10-24T16:11:58.269882700Z home
2018-10-24T16:11:58.269915100Z lib
2018-10-24T16:11:58.269944800Z lib64
2018-10-24T16:11:58.269977600Z media
2018-10-24T16:11:58.270008600Z mnt
2018-10-24T16:11:58.270041100Z opt
2018-10-24T16:11:58.270073300Z proc
2018-10-24T16:11:58.270105900Z root
2018-10-24T16:11:58.270135900Z run
2018-10-24T16:11:58.270168500Z sbin
2018-10-24T16:11:58.270199700Z srv
2018-10-24T16:11:58.270232300Z sys
2018-10-24T16:11:58.270264500Z tmp
2018-10-24T16:11:58.270296800Z usr
2018-10-24T16:11:58.270326600Z var

コンテナの停止(docker stop)

$ docker stop <container id>

以下は,稼働しているnginxのコンテナを停止する際のコマンド例です.

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
5a434a8bf3ec        nginx               "nginx -g 'daemon of…"   15 seconds ago      Up 9 seconds        80/tcp              gracious_fermi

$ docker stop 5a434a8bf3ec
5a434a8bf3ec\

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

コンテナの削除(docker rm)

$ docker rm <container id>

以下は,停止中のnginxのコンテナを削除する際のコマンド例です.

$ docker container ls -a
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                           PORTS               NAMES
5a434a8bf3ec        nginx                                "nginx -g 'daemon of…"   2 minutes ago       Exited (0) About a minute ago                        gracious_fermi

$ docker rm 5a434a8bf3ec
5a434a8bf3ec
$ docker container ls -a
CONTAINER ID        IMAGE                                COMMAND             CREATED             STATUS                           PORTS               NAMES

コンテナ操作関連(詳細設定)

コンテナのファイルコピー(docker cp)

$ docker cp <container id | name>:<path(container)> <path(host)>
$ docker cp <path(host)> <container id | name>:<path(container)>

以下は,ubuntuコンテナの/etc/passwdをホスト側の~/にコピーする際のコマンド例です.

$ docker run -it --name="my-ubuntu" ubuntu /bin/sh
# exit

$ docker cp my-ubuntu:/etc/passwd ~/

$ cat passwd 
root:x:0:0:root:/root:/bin/bash
...

コンテナとのポートマッピング(docker run -p / docker port)

-p <host port>:<container port>を指定することで,ホストの特定のポートに対するアクセスをコンテナ上の特定のポートにマッピングすることができます.
以下は,8888ポートを80ポートにマッピングした上でlocalhostでnginxを起動するコマンド例です.

$ docker run -d -p 8888:80 nginx
17d653c16fe965bca2d0d9b15dde689bbe4a2f5f600f2b0ebed87e3dc667286b

$ wget localhost:8888
--2018-10-25 01:18:31--  http://localhost:8888/
localhost (localhost) をDNSに問いあわせています... ::1, 127.0.0.1
localhost (localhost)|::1|:8888 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 612 [text/html]
`index.html.1' に保存中

index.html.1                               100%[=======================================================================================>]     612  --.-KB/s 時間 0s       

2018-10-25 01:18:31 (29.2 MB/s) - `index.html.1' へ保存完了 [612/612]

$ head index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }

なお,ポートマッピングの設定はdocker portコマンドで確認できます.

$ docker run -d -p 8080:80 --name="my-nginx" nginx
fbadd34244073dbbe72a4a7d9c061de00db266c32e29132e015049165f7a489f

$ docker port my-nginx
80/tcp -> 0.0.0.0:8080

リソース制限の指定(docker run --cpu-shares= --memory=)

$ docker run --cpu-shares=<cpu shares> --memory=<memory amount> <image name> <args>

以下は,CPU時間を規定の半分にし,メモリの最大使用量を256MBに指定した上でubuntuイメージを起動するコマンド例です.

$ docker run -it --cpu-shares=512 --memory=256m ubuntu
root@7c2eaee2cb3c:/#

環境変数の設定(docker run -e key=value)

$ docker run -e <key>=<value> <image name> <args>

以下は,環境変数MYENVDOCKERという値を設定した上でubuntuイメージを起動するコマンド例です.

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker run -it -e MYENV=DOCKER ubuntu /bin/sh
# set
HOME='/root'
HOSTNAME='0252be07dca5'
IFS='    
'
MYENV='DOCKER'
...

稼働中のコンテナ操作関連

稼働中のコンテナへのアタッチ(docker attach)

$ docker attach <container name>

以下は,バックグラウンドで稼働しているubuntu(/bin/sh)のコンテナにアタッチする際のコマンド例です.

$ docker run -d -it --name="my-ubuntu" ubuntu /bin/sh
47c02430413cf78ee1dcdf3002823dc584e7f8803df8f3749f532a4908fb3d9a
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
47c02430413c        ubuntu              "/bin/sh"           4 seconds ago       Up 2 seconds                            my-ubuntu

$ docker attach my-ubuntu
ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

稼働中のコンテナ上でのプロセスの実行(docker exec)

docker exec <container id>|<container name> <arg>

以下は,バックグラウンドで稼働しているnginxコンテナ上で/bin/shプロセスを実行する際のコマンド例です.

$ docker run -d -p 8888:80 --name="my-nginx" nginx
f6053d4806a0398790f0dd83883144b312497331e20bd9af6532a80ef10c2cc1

$ docker exec -it my-nginx /bin/sh
# head /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }

コンテナとイメージ

コンテナからイメージを作成(docker commit)

docker commit -a <author> -m <message>  <container id | name> <image name>

以下は,イメージから生成したubuntuコンテナになんらかのファイルを追加し,再度イメージ化する際のコマンド例です.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ea4c82dcd15a        6 days ago          85.8MB
nginx               latest              dbfc48660aeb        8 days ago          109MB

$ docker run -it --name="my-nginx" nginx /bin/sh
# touch nullfile.txt
# exit

$ docker diff my-nginx
A /nullfile.txt

$ docker commit -a "sz4rny" -m "sample ubuntu" my-nginx sz4rny/my-nginx:1.0
sha256:fd22612ed858f9c4bb7bed80b3dbfb7d3a23bec8b6c507bfe8e9722fc22bd089

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sz4rny/my-nginx     1.0                 fd22612ed858        3 seconds ago       109MB
ubuntu              latest              ea4c82dcd15a        6 days ago          85.8MB
nginx               latest              dbfc48660aeb        8 days ago          109MB

参考

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化(WINGSプロジェクト阿佐志保 山田祥寛)|翔泳社の本