遅ればせながら入門してみました。
brew cask install docker
- ネイティブで Docker サポートするクライアント
- Apple ネイティブの xhyve を利用する
- 以前は VirtualBox を利用した二階建て Docker 環境だった
- もう VirtualBox も Vagrant もいらないぜー
$ docker run -it -p 80:9000 criluc/play1:1.2.7 bash //コンテナ作成
Unable to find image 'criluc/play1:1.2.7' locally
1.2.7: Pulling from criluc/play1
fdd5d7827f33: Downloading [===> ] 3.653 MB/51.37 MB
a3ed95caeb02: Download complete
0f35d0fe50cc: Downloading [==================> ] 6.878 MB/18.53 MB
e35d3d8894c3: Waiting
83d275c7c0eb: Waiting
10397f12c44d: Waiting
d20b9d39882c: Waiting
bea6ca7f9be2: Waiting
3fa8eee0a6d4: Waiting
c297bc9e8e67: Waiting
docker $ play new Hoge
docker $ play run Hoge
- ローカルにイメージがなければ、自動的にダウンロードする
- http://localhost/ にアクセスすると Play1 が起動していることがわかる
- コマンドの説明は後述するよ
$ docker run --name postgres -d postgres //コンテナ作成
$ docker exec -it postgres bash //コンテナに接続
docker $ createdb -U posgres Hoge
docker $ exec
- Postgres に Hoge データベース作成
$ docker run -it -p 80:9000 --link postgres:postgres -u root criluc/play1:1.2.7 bash
docker $ ping postgres //Docker posgres に ping が通ることを確認
docker $ apt-get install vim -y //vimインストール
docker $ play new Hoge
docker $ vim Hoge/conf/application.conf //DB接続設定
db.url=jdbc:postgresql://postgres/Hoge
db.driver=org.postgresql.Driver
db.user=postgres
db.pass=
docker $ play run Hoge
03:21:10,921 INFO ~ Connected to jdbc:postgresql://postgres/Hoge
- Hoge データベースに接続することを確認
というようなありがちな面倒な要件も
$ docker run -d -p 1080:80 -p 1025:25 -h maildev --name maildev djfarrelly/maildev
SMTPコンテナにメールを送ってみる
% telnet localhost 1025
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 maildev ESMTP
HELO hoge.com
250 OK: Nice to meet you [172.17.0.1]
MAIL FROM:<[email protected]>
250 Accepted
RCPT TO:<[email protected]>
250 Accepted
DATA
354 End data with <CR><LF>.<CR><LF>
hoeeeeeeeeeee
.
250 Message queued as SpAX1xaJ
http://localhost:1080/ で受信したメール一覧を参照できる
https://gist.github.com/asufana/229cdac01fccee1a7d32ca8b5d7cfee6
- Dockerイメージとコンテナの関係
- イメージはクラスで、コンテナはインスタンスのようなもの
- いわゆる仮想マシンのイメージ
- レイヤを積み重ねたもの
- レイヤにはファイルの実体が含まれる
- リードオンリー、更新不可
- Dockerストレージドライバがレイヤを積み重ねて単一のファイルシステムとして見せている
- イメージから作成される実行環境
- 実際には
- イメージのレイヤの一番上に、更新可能なレイヤーを一枚かぶせ、
- そしてコンテナ毎の名前空間(プロセスの分離)やリソース制御を行っている
- イメージの公開サイト
- Chrome のカスタム検索に登録しておくと良い
https://hub.docker.com/search/?isAutomated=0&isOfficial=0&page=1&pullCount=0&starCount=0&q=%s
$ docker run -it -p 80:9000 criluc/play1:1.2.7 bash
- DockerHub から criluc/play1 イメージを使ってコンテナを起動する
- https://hub.docker.com/r/criluc/play1/
- イメージがローカルになければ自動でダウンロードする
- タグ一覧から 1.2.7 を指定
-it
オプションでその標準入力を開くbash
コマンドを実行するが、そのままだと起動してそのまま終了してしまうため、- その標準入力を捉えるために設定する
-p 80:9000
オプションで、コンテナの 9000 ポートを、ローカルの 80 にマッピングする- ホストからコンテナ内のプロセスにアクセスしたいため設定する
$ docker run --name postgres -d postgres
$ docker exec -it postgres bash
- DockeHub から postgres イメージを使ってコンテナ起動する
- https://hub.docker.com/_/postgres/
- オフィシャルリポジトリやDocker公式リポジトリはユーザ名を持たない
--name
オプションででコンテナ名を指定する- 指定しなければコンテナ名は適当に付与される
- Playコンテナから後述する
--link
オプションで、Postgresコンテナを指定したいために設定する
-d
オプションでコンテナをデタッチする- バックグラウンドモードで動作させる
- Dockerはフォアグラウンドとバックグラウンドを意識する
exec
コマンドで稼働しているコンテナで新たにプロセスを実行する
$ docker run -it -p 80:9000 criluc/play1:1.2.7 bash
docker $ play new Hoge
docker $ play start Hoge
Ctrl+P, Ctrl+Q //デタッチする
$
docker run -it -p 80:9000 --link postgres:postgres -u root criluc/play1:1.2.7 bash
- Playコンテナを起動するが、既に起動しているPostgresコンテナに接続する
--link
オプションを設定する- Playコンテナの
/etc/hosts
に postgres コンテナのIPが設定される
- ローカルにあるイメージ一覧
docker images
- ローカルにあるコンテナ一覧
docker ps
docker ps -a
(停止しているものも含めて表示)
- コンテナ起動(フォアグラウンド)
docker run -it postgres:9.4 bash
- コンテナ起動(バックグラウンド)
docker run -d postgres:9.4
- コンテナの停止・開始
docker stop コンテナID
docker start コンテナID
- コンテナの削除
docker rm コンテナID
- コンテナIDの指定は省略可能、ユニークなら一文字でもOK
- `docker rm a` とか
- コンテナIDの指定は省略可能
- ユニークなら一文字でもOK
docker rm a
とか
docker ps -aq
- 全停止
docker stop $(docker ps -aq)
- 全削除
docker rm $(docker ps -aq)
- DockerHubにログイン
docker login
- イメージのアップロード
docker push asufana/my-postgres:0.1
$ docker run -it --name hoge criluc/play1:1.2.7 bash
docker $ play new Hoge
docker $ exit
$ docker commit -m "Installed Hoge app" hoge asufana/hoge:0.1
$ docker run -p 80:9000 -d asufana/hoge:0.1 /usr/local/bin/play run /opt/play/Hoge
$ docker push asufana/Hoge:0.1
- デスクトップアプリなどと比べ、Webアプリケーションの導入は面倒だけど、
- Dockerを使えば簡単に配布できるよ!
- 1コンテナ1プロセスが推奨
- コンテンツは ホストに保存する
-v
オプションを使って、ホストのディレクトリをコンテナにマウントする
- コンテナの振る舞いを変更する
docker run -e 環境変数
などパラメータを渡すのが良い
- Infrastructure as a Code を実現する
- Dockerfile でイメージを DSL 的に記述する
- Dockerfile をソースリポジトリで管理、利用時にはイメージを自動生成
- Docker Compose で複数コンテナの管理を容易に
- 複数コンテナの構成を YAML で管理できる
- Alpine Linux で激軽イメージの生成