Dockerについて調べたので備忘録メモ的な。
自分用なので他人が読むことを考慮してないですけど、何か間違いがあって指摘したい気分ならコメントか何か入れてください。
コンテナ vs VM
なんかコンテナってやつはVMとは違うらしい。
Microsoftが良い感じな説明してた
まぁ、コンテナのほうが色々便利な場合もあるし基本的によほどのことをしないならコンテナのほうが幸せになれるよね的な。
container vs image
class/instance的な感じでimage/containerという理解。
同じimageのcontainerが複数存在できるけど、複数の同じcontainerが存在することはあり得ないよね。
dockerのCLIツール
docker run [options] {image} / docker rm [options] {container_name/id}
docker run {image} でコンテナを作る(動かす)
docker rm {container} でコンテナを消す
使いそうなoption(run):
-
-iinteractive mode (MinTTYとかだとwinpty docker run -it {image}) -
-tterminal -
-ddaemon化する(detachのdっぽい)再起動したとき勝手に起動するんだっけ・・・? -
-p {machine_port:container_port}portをlocalhostにバインドする -
-P適当な空いているportにバインドする -
--rmstopしたらコンテナをrmする。 -
-v {host/path:container/path}ホストマシンのドライブに、コンテナ内のパスのものを保存する(DBとか)1
docker ps [options]
docker ps linuxのpsコマンドと似た感じで「起動しているコンテナとその情報」を表示する
使いそうなoption:
-
-astopしているコンテナの情報も表示する -
-l最も最近編集したコンテナを表示する -
-qPID(多分コンテナのUUID的なもの、rmとかに与えるパラメータ)を抽出する。
docker start/stop {container_name/id}
docker startで停止しているコンテナを動かす
docker stopで動いているコンテナを止める(消さない)
docker exec {container_name/id} {command}
docker execで起動しているコンテナ内で新しいプロセスを起動する
ex: docker exec adoring_shaw bash でコンテナ内のLinuxを探索する。
docker build [options] {path_to_dockerfile}
docker build {path_to_dockerfile}でDockerfileと呼ばれる.shのようなファイルを元にimageをコンパイルしていく感じ。
使いそうなoption:
-
-t {user/image:tag}変なimageの名前( になるんだっけ・・・)じゃなくてちゃんと名前つける
docker images
docker psのimage版みたいな。 gitとかもこういう機能があるといいのだが・・・
docker rmi [options] {image}
docker rmi {image} でimageを削除する。
docker top {container_name/id}
docker toplinuxのtopと似たやつ。コンテナの中のリソース使用率を表示。
docker logs [options] {container}
docker logsコンテナのstdoutを表示。
使いそうなoption:
-
-flinuxのtail -fのように逐次更新される。
DockerHub系
docker commit [options] {container_name/id} [new_name]
docker commit {container_name/id} [new_name]でコンテナの現在の状態からimageを新しく作る
使いそうなoption:
-
-a "{Author <e-mail>}authorをつける -
-m "{message}"commit messageをつける
docker login
docker login で dockerhubにログインする(セッション中persistする)
docker pull {user/image:tag}
(gitと同じ)docker pull でDocker Hubからimageの最新版を落としてくる
tagを忘れるとlatestという特殊なタグ(最新版とは限らない)を落とされるので明示的に指定しよう。
docker push {user/image:tag}
(gitと同じ)docker pushでDocker Hubに変更をupする
tagを忘れるとlatestという特殊なタグ(最新版とは限らない)を勝手に作られるので明示的に指定しよう。
docker tag {image} {tag}2
docker tagで既存のimageと内容は全く同じな別の名前のimage作る。 DockerHubにpushする前に username/imagename:tag形式にするときとかに使う.
docker-compose
docker-composeは複数のコンテナ(db, serverなど)をまとめて起動するためのツール。ROS Launch的なものを感じる
各コンテナはserviceと呼ばれる模様。
docker-compose.ymlというファイルに様々な設定を書き込んでいく感じ。(完全なReference)
注意点
expose と portsの違い
docker-composeをするときにデフォルトでcompose内の独自ネットワークが構築される。これはLocalhostから隔離された環境なので内部からしかアクセスできないようになってる(多分)
ポートの公開に2種類あって:
- exposeはdocker-compose内の他のコンテナに対してポートを公開する設定。
- portsはlocalhostのポートとコンテナのポートをバインドする設定(docker run -pと同じ)。
depends_onまたはlinksを使う
compose内のホスト名はservice名で繋げられるけど、そのためには
-
depends_onをする。この場合dependencyが先に起動される。 -
linksをする。この場合ただcurl -X PUT http://db:5984/hogehogeなどができる。
例:
version: "2"
services:
srv:
image: spaghet/srv:latest
build: .
ports:
- "80:80"
depends_on:
- db
db:
image: klaemo/couchdb
volumes:
- //c/Users/spaghet/Documents/hoge/fuga/:/opt/couchdb/data
expose:
- "5984"
