はじめに
docker buildを中心とするdockerコマンドの基本的なところをまとめた。基礎に立ち返って再入門する。
Dockerコマンドについて
よく使うのはこのあたり
コマンド | 意味 |
run | DockerイメージからDockerコンテナを作成 |
exec | Dockerコンテナでコマンド実行 |
push | DockerイメージをDockerレジストリへ送信 |
build | Dockerfileに基づき、imageを作成 |
rm | 停止中のコンテナを削除 |
rmi | Dockerホスト上のイメージを削除 |
commit | Dockerコンテナからイメージを作成する |
kill | 起動中のコンテナを強制停止 |
load | tarアーカイブからDockerイメージを読み込む |
tag | 既存のDockerイメージから新しDockerイメージを作成 |
history | Dockerイメージの精製履歴を表示 |
ps | Dockerコンテナ一覧を表示 |
Dockerfileとは
DockerイメージはDockerfileというファイルを生成、buildコマンドで読み込ませることによりイメージにすることが可能。
基本構文はこちら
docker build -f {Dockerfileへのパス} -t {イメージ名}:{タグ名} {Dockerfileのあるディレクトリ}
デフォルトでコマンドを実行するディレクトリにあるDockerfileが読み込まれる。
AnsibleやChefなどを用いて環境構築することもできるが、Dockerfileでも構築手順が明確になる。
コマンド | 意味 |
FROM | ベースになるDockerイメージを指定 |
ENV | 環境変数を設定 |
ARG | build時の引数を定義するコマンド
デフォルト値の設定も可能
buildコマンドから –build-argsオプションを使う |
LABEL | Dockerイメージにメタデータを付与
versionやdescriptionを記載
|
RUN | shellの実行を行う
|
SHELL | デフォルトのシェルを設定 |
WORKDIR | 基点となるいディレクトリを設定
これを設定すると、Dockerfile内の多くのコマンドが相対パスで利用可能 |
ADD | ファイルやディレクトリのコピー
(重要!圧縮ファイルは自動的に展開される) |
COPY | ファイルやディレクトリを指定したURLからコピー。(重要!圧縮ファイルは展開されない) |
EXPOSE | コンテナがlistenするポートを明記 |
ENTRYPOINT | コンテナ起動時に実行するコマンド |
CMD | ENTRYPOINTと同じくコンテナ起動時に実行するコマンドを指定 |
動いているコンテナを全て止める
停止前の状態
MacBook:Dockerfile darkenergy$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10fea02bca93 redash/nginx:latest "nginx -g 'daemon of…" 5 weeks ago Up About an hour 0.0.0.0:80->80/tcp, 443/tcp redash_nginx_1
25581536faf9 redash/redash:latest "/app/bin/docker-ent…" 5 weeks ago Up About an hour 0.0.0.0:5000->5000/tcp redash_server_1
b71d8b8f7dd4 postgres:9.5.6-alpine "docker-entrypoint.s…" 5 weeks ago Up About an hour 5432/tcp redash_postgres_1
e60a2354c981 redis:3.0-alpine "docker-entrypoint.s…" 5 weeks ago Up About an hour 6379/tcp redash_redis_1
24229a9e8831 redash/redash:latest "/app/bin/docker-ent…" 5 weeks ago Up About an hour 5000/tcp redash_worker_1
MacBook:Dockerfile darkenergy$
docker ps -qでコンテナIDのみ表示させることが可能。
それとdocker stopコマンドを組み合わせることにより、動いているコンテナを停止させる事ができる。
MacBook:Dockerfile darkenergy$ docker stop `docker ps -q`
10fea02bca93
25581536faf9
b71d8b8f7dd4
e60a2354c981
24229a9e8831
MacBook:Dockerfile darkenergy$ docker ps -q
MacBook:Dockerfile darkenergy$
止まっているコンテナを削除する
MacBook:Dockerfile darkenergy$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10fea02bca93 redash/nginx:latest "nginx -g 'daemon of…" 5 weeks ago Exited (0) About a minute ago redash_nginx_1
25581536faf9 redash/redash:latest "/app/bin/docker-ent…" 5 weeks ago Exited (0) About a minute ago redash_server_1
b71d8b8f7dd4 postgres:9.5.6-alpine "docker-entrypoint.s…" 5 weeks ago Exited (0) About a minute ago redash_postgres_1
MacBook:Dockerfile darkenergy$
このコンテナを削除
docker ps -qaで停止しているコンテナID一覧が表示できる。これとdocker rmコマンドを組み合わせる。
MacBook:Dockerfile darkenergy$ docker rm `docker ps -qa`
10fea02bca93
25581536faf9
b71d8b8f7dd4
MacBook:Dockerfile darkenergy$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
MacBook:Dockerfile darkenergy$
docker build時のキャッシュの利用を止める
Dockerをbuildしている時、以下のようにキャッシュを使われてしまう事がある。その利用を停止させる
---> Using cache
docker buildするとデフォルトで “` –no-cache=false “` が設定されている。これを “` –no-cache=true “` にすることにより、キャッシュを使わずbuildする事が可能になる。
Dockerfileは以下とする
FROM ubuntu
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
RUN echo "$myName, $myDog, $myCat"
キャッシュを利用した場合
MacBook% docker build -f env/Dockerfile_first -t build:env_first .
Sending build context to Docker daemon 72.7kB
Step 1/5 : FROM ubuntu
---> 113a43faa138
Step 2/5 : ENV myName John Doe
---> Using cache
---> 94a9595b4ad2
Step 3/5 : ENV myDog Rex The Dog
---> Using cache
---> 8e541e0cadf3
Step 4/5 : ENV myCat fluffy
---> Using cache
---> d7f742cdd48d
Step 5/5 : RUN echo "$myName, $myDog, $myCat"
---> Using cache
---> 08403e0b3e95
Successfully built 08403e0b3e95
Successfully tagged build:env_first
MacBook%
キャッシュを利用しなかった場合
MacBook% docker build -f env/Dockerfile_first -t build:env_first . --no-cache=true
Sending build context to Docker daemon 72.7kB
Step 1/5 : FROM ubuntu
---> 113a43faa138
Step 2/5 : ENV myName John Doe
---> Running in f14667b92f6d
Removing intermediate container f14667b92f6d
---> 7b9af0d9b741
Step 3/5 : ENV myDog Rex The Dog
---> Running in 042dc782bef6
Removing intermediate container 042dc782bef6
---> 51d13644f407
Step 4/5 : ENV myCat fluffy
---> Running in 482cfc9e924e
Removing intermediate container 482cfc9e924e
---> b0dd7f89783c
Step 5/5 : RUN echo "$myName, $myDog, $myCat"
---> Running in 099ffe8325d8
John Doe, Rex The Dog, fluffy
Removing intermediate container 099ffe8325d8
---> 327d3ea27902
Successfully built 327d3ea27902
Successfully tagged build:env_first
MacBook%
docker inspectを利用する
docker inspectはイメージの詳細を調べるコマンド
FROM ubuntu:16.04
LABEL maintainer="tsukada@sumito.jp"
MacBook% docker inspect build:label
[
{
"Id": "sha256:19832872f5b87f8adf2f212d9371a32f396537394ecedd86ad7794487e4cbd4d",
"RepoTags": [
"build:label"
],
"RepoDigests": [],
"Parent": "sha256:7aa3602ab41ea3384904197455e66f6435cb0261bd62a06db1d8e76cb8960c42",
"Comment": "",
"Created": "2018-11-24T08:40:08.172027394Z",
"Container": "22d4da4c92440ad7a9b946088a0ce970919c801bef124a1587c9f3d5374b714a",
"ContainerConfig": {
"Hostname": "22d4da4c9244",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"LABEL maintainer=Image maintainer team <hogehoge@example.com>"
],
"ArgsEscaped": true,
"Image": "sha256:7aa3602ab41ea3384904197455e66f6435cb0261bd62a06db1d8e76cb8960c42",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "tsukada@sumito.jp"
}
},
"DockerVersion": "18.09.0",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"ArgsEscaped": true,
"Image": "sha256:7aa3602ab41ea3384904197455e66f6435cb0261bd62a06db1d8e76cb8960c42",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "tsukada@sumito.jp"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 114808794,
"VirtualSize": 114808794,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/80942b3ef1ac6bd6683a0a610ebe509f493b3ab8e9981f55dad8277363dc5481/diff:/var/lib/docker/overlay2/44018ca585286af57480e331d2fa04d89de442742fe0432d9ee1ee0290872bf6/diff:/var/lib/docker/overlay2/c5e674d237e84ae63fcc71cf3e8fea790ea6072635406d095c16a9f22fa72706/diff:/var/lib/docker/overlay2/38077e61ba31390b978a4eabe12f01e31cc638590344241909c137356cae60c8/diff",
"MergedDir": "/var/lib/docker/overlay2/020aa677865cf852f816916ac2e7df525a26d9984f4e78e8c2d9e7e478a2c22b/merged",
"UpperDir": "/var/lib/docker/overlay2/020aa677865cf852f816916ac2e7df525a26d9984f4e78e8c2d9e7e478a2c22b/diff",
"WorkDir": "/var/lib/docker/overlay2/020aa677865cf852f816916ac2e7df525a26d9984f4e78e8c2d9e7e478a2c22b/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:0a42ee6ceccb1b90de2a3badec7c74cc452ce61e7ef20a80bb7f20ea53f2825e",
"sha256:c2af38e6b250a39e0e7b9665687385c75fdf7bab5ea856a2eec4fd6b74adda95",
"sha256:5e95929b27983df137a6cff59695739f69f6571e70fa68eb6a7abe3b74e402d2",
"sha256:2166dba7c95bfbc84b38b7a6c7d96d323d16239aeff2f2292c61821002df2dfb",
"sha256:bcff331e13e35a0beb71d43b4f6b859327f18587f084a1036a603e64a990e44d"
]
},
"Metadata": {
"LastTagTime": "2018-11-24T08:40:08.241971894Z"
}
}
]
MacBook%
docker run
shellの実行を行うためのコマンド
RUN <command> shell from
shell fromと呼ばれる使われ方
SHELLの値にもとづいたコマンドによって実行される。
“` /bin/sh -c “` で実行される
RUN [“executable”, “param1″,”param2”] (exec from)
exec fromと呼ばれる使われ方
SHELLの値とは無関係に実行可能コマンドを直接実行
shell fromとexec fromの違い
shell fromはSHELLの設定により実行される
“` /bin/sh -c echo $HOGE “`
exec from はexecutableに指定されたコマンドが実行
コマンドシェル経由での実行ではなく、直接実行する
“` echo $HOGE “`
参考方法: https://docs.docker.com/engine/reference/builder/#run
/bin/sh: 1: Syntax error: “(” unexpected
shellの指定がされていない可能性が高い
SHELL ["/bin/bash", "-c"]
RUNコマンドの前に上記SHELLを追加することにより解消できる
SHELL
SHELLコマンドはRUNやCMD,ENTRYPOINTなどでshell fromが行われた際のコマンドを指定する事が可能
“` SHELL [“executable”, “parameters”] “`
WORKDIR
linuxで言うところの、mkdirとcdを同時に実行しているようなコマンド
FROM ubuntu:16.04
WORKDIR /sumito.tsukada
WORKDIR b
WORKDIR c
RUN pwd
と言うdockerfileがあったとすると、
/sumito.tsukada/b/c
と表示される
ADDとCOPYの違い
COPYはURLを指定する事ができない
圧縮ファイル(tarファイル)を自動で解凍しない
ENTRYPOINT
exec from
exec fromは推奨された使い方。
Dockerfile
FROM ubuntu:16.04
ENTRYPOINT ["top", "-H"]
build
docker build -f entrypoint/exec/Dockerfile -t build:entrypoint_exec ./entrypoint/exec/.
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM ubuntu:16.04
---> a51debf7e1eb
Step 2/2 : ENTRYPOINT ["top", "-H"]
---> Running in f48801d93416
Removing intermediate container f48801d93416
---> 8c57c2838f55
Successfully built 8c57c2838f55
Successfully tagged build:entrypoint_exec
PIDが1で起動される
docker run --rm -it build:entrypoint_exec
top - 12:27:52 up 4:39, 0 users, load average: 0.00, 0.03, 0.00
Threads: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.5 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2047036 total, 502868 free, 260180 used, 1283988 buff/cache
KiB Swap: 1048572 total, 1048104 free, 468 used. 1599568 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 36660 3036 2620 R 0.0 0.1 0:00.07 top
shell from
こちらが推奨された使い方ではない
Dockerfile
FROM ubuntu:16.04
ENTRYPOINT top -H
build
build -f entrypoint/shell/Dockerfile -t build:entrypoint_shell ./entrypoint/shell
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM ubuntu:16.04
---> a51debf7e1eb
Step 2/2 : ENTRYPOINT top -H
---> Running in 30505870ab0c
Removing intermediate container 30505870ab0c
---> e5825519f101
Successfully built e5825519f101
Successfully tagged build:entrypoint_shell
docker run
docker run --rm -it build:entrypoint_shell
top - 12:31:56 up 4:43, 0 users, load average: 0.00, 0.02, 0.00
Threads: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2047036 total, 502612 free, 260024 used, 1284400 buff/cache
KiB Swap: 1048572 total, 1048104 free, 468 used. 1599720 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 4500 696 624 S 0.0 0.0 0:00.04 sh
6 root 20 0 36660 3140 2724 R 0.0 0.2 0:00.00 top
1はshが動き、shell fromによって起動されたコマンドは別プロセスになってしまう。これにより、ホスト側が実施したコマンドを直接受け取る事ができない。
docker stopの動作
docker stopを実施すると、PID 1にSIGTERMを送信する。
しかしデフォルトで10秒応答が返ってこない場合はSIGKILLを実施。強制終了させると言う仕様がある。
shell fromとexecの違い
RUNはあくまでもDockerイメージをbuildするために実際にコンテナでコマンドを実施。commitすることにイメージに変更を加える。
参考情報
オライリー本より読みやすく、Dockerについて体系的に学ぶことができるのでおすすめ。