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": {}
- }
- ]