Docker Commands
Dockerの特徴
Linux Namespace
http://www.usupi.org/sysad/260.html
- Linuxの namespace は、リソースを区切って、 あたかもそれだけしか存在しないように見せるためのものです。
- 具体的には、mount、UTS、IPC、PID、ネットワークおよびユーザの6つが 対象となるリソースです。
- 各プロセスの namespace は、 /proc/プロセスID/ns/ を以下のように見ることで、それとなく確認できます
# ls -l /proc/$$/ns 合計 0 lrwxrwxrwx. 1 root root 0 8月 3 22:30 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 root root 0 8月 3 22:30 mnt -> mnt:[4026531840] lrwxrwxrwx. 1 root root 0 8月 3 22:30 net -> net:[4026531956] lrwxrwxrwx. 1 root root 0 8月 3 22:30 pid -> pid:[4026531836] lrwxrwxrwx. 1 root root 0 8月 3 22:30 uts -> uts:[4026531838]
ちなみに、$$ は、bash のプロセスID。
Docker では、Linux Namespaceを利用し、プロセス、ネットワークの隔離といったコンテナ化を実現している。
Kernel 3.8+ である必要がある。
cgroups
Docker は、Control Groups(cgroups) を利用指定コンテナ内で使用するリソースを制御している。
http://ja.wikipedia.org/wiki/Cgroups
http://www.usupi.org/sysad/228.html
cgroups とは、プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能。
cgroups を使うと、CPU時間やメモリ、ネットワークなどといったリソースを、 グループ単位で割り当てたり、制限をかけることができます。
また、Linux Namespaceを使って、 PIDやネットワークなどをそれぞれ独立して持たせることができます。
cgroups は以下の機能を提供
- リソース制限 : グループのメモリ使用量を制限可能
- 優先順位 : CPU、I/Oスループットの割り振り
- 計上 : あるシステムが利用しているリソースの計測
- 隔離 : グループを他の名前空間に置き、切り離す
- コントロール : グループのフリーズ、チェックポイント、再開など
UnionFS
http://ja.wikipedia.org/wiki/UnionFS
http://www.usupi.org/sysad/187.html
Dockerは環境構築の時に行った操作を、UnionFSに記録していく。
UnionFSは差分で管理されており、操作ごとに差分レイヤーが作成され、レイヤーを合わせてファイルシステムとなっている。
イメージとテンプレートとコンテナ
レイヤーを合わせたものを、イメージと呼んでいる。
このイメージが、テンプレートとなり、さらにレイヤーを重ねることが出来る。
イメージ上からのオペレーション実行毎にコンテナが作成され、読み書き可能なファイルシステムとして機能する。
名前をつけて管理することができ、REPOSITORY と呼ばれる。
イメージを分岐して作成したものに別名をつけた場合、TAGと呼ばれる。
コンテナの実行
イメージを実行すると、コンテナが作成される。このコンテナも差分で、ベースにはイメージを使用する。
イメージ部分は読み取り専用で、書込みが必要になった部分のみコピーオンライトでコンテナに書き込まれる。
Dockerfile
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
コンテナの構成内容をまとめて記述するテキスト形式のファイル。
イメージをベースにオペレーションを積み重ねるように記述する。
コンテナをDockerfile から構築するには、build コマンドを使用する。
基本操作
バージョンの確認(version)
# docker version Client version: 1.0.0 Client API version: 1.12 Go version (client): go1.2.2 Git commit (client): 63fe64c/1.0.0 Server version: 1.0.0 Server API version: 1.12 Go version (server): go1.2.2 Git commit (server): 63fe64c/1.0.0
情報の確認(info)
# docker info Containers: 1 Images: 3 Storage Driver: devicemapper Pool Name: docker-253:1-203234686-pool Data file: /var/lib/docker/devicemapper/devicemapper/data Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 569.2 Mb Data Space Total: 102400.0 Mb Metadata Space Used: 0.9 Mb Metadata Space Total: 2048.0 Mb Execution Driver: native-0.2 Kernel Version: 3.10.0-123.el7.x86_64
イメージの取得
Docker Registry
https://registry.hub.docker.com/
取得(pull)
# docker pull openshift/wildfly-8-centos Pulling repository openshift/wildfly-8-centos f3ba582d4042: Download complete f3ba582d4042: Pulling image (latest) from openshift/wildfly-8-centos 511136ea3c5a: Download complete : 7e1fd6711692: Download complete 6244d7d2948c: Download complete
確認(images)
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE openshift/wildfly-8-centos latest f3ba582d4042 6 days ago 539.3 MB centos latest 1a7dc42f78ba 8 days ago 236.4 MB
実行
インタラクティブ実行(run -t)
run -t でインタラクティブにシェルを実行出来る
任意のコマンドをコンテナ内で実行可能
停止する場合は、Ctrl+D
# docker run -i -t -h openshift/wildfly-8-centos openshift/wildfly-8-centos /bin/bash bash-4.1#
バックグラウンド実行(run -d)
# docker run -d openshift/wildfly-8-centos /wildfly/bin/standalone.sh 564e5343046f97da12ba09273020eabbb7a84d4b0299f13c256b43aa449d1bb7
プロセスの確認(ps)
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 564e5343046f openshift/wildfly-8-centos:latest /wildfly/bin/standal About a minute ago Up About a minute 7600/tcp, 8080/tcp, 9990/tcp, 9999/tcp insane_euclid
プロセス監視(top)
# docker top 564e5343046f UID PID PPID C STIME TTY TIME CMD root 5739 1401 0 23:22 ? 00:00:00 /bin/sh /wildfly/bin/standalone.sh root 5867 5739 14 23:22 ? 00:00:07 java -D[Standalone] -server -XX:+UseSerialGC -Xms40m -Xmx256m -XX:MaxPermSize=102m -XX:+AggressiveOpts -Dorg.apache.tomcat.util.LOW_MEMORY=true -DOPENSHIFT_APP_UUID= -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.resolver.warning=true -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8 -Djboss.node.name=564e5343046f -Djgroups.bind_addr=0.0.0.0 -Dorg.apache.coyote.http11.Http11Protocol.COMPRESSION=on -Dorg.jboss.boot.log.file=/wildfly/standalone/log/server.log -Dlogging.configuration=file:/wildfly/standalone/configuration/logging.properties -jar /wildfly/jboss-modules.jar -mp /wildfly/provided_m
コンテナの停止(stop)
# docker stop 564e5343046f 564e5343046f
コンテナの強制終了(kill)
# docker kill faff5b7c7492 faff5b7c7492
コンテナの再起動(restart)
# docker restart 564e5343046f 564e5343046f
イメージの管理
イメージの削除(rmi)
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE openshift/wildfly-8-centos latest f3ba582d4042 3 weeks ago 539.3 MB <none> <none> 1a7dc42f78ba 3 weeks ago 236.4 MB # docker rmi -f 1a7dc42f78ba Deleted: 1a7dc42f78ba213ec1ac5cd04930011334536214ad26c8000f1eec72e302c041
不要になったコンテナとイメージの削除
http://blog.n-z.jp/blog/2013-12-24-docker-rm.html
停止しているコンテナを削除
docker rm `docker ps -a -q`
不要なイメージ(REPOSTORYがnone)の削除
docker rmi $(docker images | awk '/^<none>/ {print $3}')
コンテナ状態の確認(inspect)
]# docker inspect faff5b7c7492 [{ "Args": [], "Config": { "AttachStderr": false, "AttachStdin": false, "AttachStdout": false, "Cmd": [ "/wildfly/bin/standalone.sh" ], "CpuShares": 0, "Cpuset": "", "Domainname": "", "Entrypoint": null, "Env": [ "HOME=/", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "STI_SCRIPTS_URL=https://raw.githubusercontent.com/openshift/wildfly-8-centos/master/.sti/bin" ], "ExposedPorts": { "7600/tcp": {}, "8080/tcp": {}, "9990/tcp": {}, "9999/tcp": {} }, "Hostname": "faff5b7c7492", "Image": "openshift/wildfly-8-centos", "Memory": 0, "MemorySwap": 0, "NetworkDisabled": false, "OnBuild": null, "OpenStdin": false, "PortSpecs": null, "StdinOnce": false, "Tty": false, "User": "", "Volumes": null, "WorkingDir": "/opt/wildfly/source" }, "Created": "2014-08-03T14:37:58.975398521Z", "Driver": "devicemapper", "ExecDriver": "native-0.2", "HostConfig": { "Binds": null, "ContainerIDFile": "", "Dns": null, "DnsSearch": null, "Links": null, "LxcConf": [], "NetworkMode": "bridge", "PortBindings": { "7600/tcp": null, "8080/tcp": null, "9990/tcp": null, "9999/tcp": null }, "Privileged": false, "PublishAllPorts": false, "VolumesFrom": null }, "HostnamePath": "/var/lib/docker/containers/faff5b7c749257ff79180b5c9b90e3cadabec91a76895c086ec4e66fd84b3733/hostname", "HostsPath": "/var/lib/docker/containers/faff5b7c749257ff79180b5c9b90e3cadabec91a76895c086ec4e66fd84b3733/hosts", "Id": "faff5b7c749257ff79180b5c9b90e3cadabec91a76895c086ec4e66fd84b3733", "Image": "f3ba582d4042e5e506e787e102bd122617cf4d574a32ff75ec5c5606aa60c4f0", "MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c219,c329", "Name": "/compassionate_babbage", "NetworkSettings": { "Bridge": "docker0", "Gateway": "172.17.42.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "PortMapping": null, "Ports": { "7600/tcp": null, "8080/tcp": null, "9990/tcp": null, "9999/tcp": null } }, "Path": "/wildfly/bin/standalone.sh", "ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c219,c329", "ResolvConfPath": "/etc/resolv.conf", "State": { "ExitCode": 0, "FinishedAt": "2014-08-19T13:58:30.659032186Z", "Paused": false, "Pid": 3503, "Running": true, "StartedAt": "2014-08-19T14:00:08.994894748Z" }, "Volumes": {}, "VolumesRW": {} } ]