Skip to content

Instantly share code, notes, and snippets.

@asufana
Created August 2, 2016 04:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save asufana/8ea40116d1c78ba90b1181775aea8c36 to your computer and use it in GitHub Desktop.
Save asufana/8ea40116d1c78ba90b1181775aea8c36 to your computer and use it in GitHub Desktop.
Docker入門

Docker入門

遅ればせながら入門してみました。

とりあえず触ってみよう

Docker for mac をインストール

  • brew cask install docker
    • ネイティブで Docker サポートするクライアント
    • Apple ネイティブの xhyve を利用する
    • 以前は VirtualBox を利用した二階建て Docker 環境だった
  • もう VirtualBox も Vagrant もいらないぜー

気を取り直して Play1 環境を構築してみる

$ 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 Play から Docker Postgres に接続する

$ 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:<hoge@hoge.com>
250 Accepted

RCPT TO:<hogege@hoge.com>
250 Accepted

DATA
354 End data with <CR><LF>.<CR><LF>

hoeeeeeeeeeee
.
250 Message queued as SpAX1xaJ

http://localhost:1080/ で受信したメール一覧を参照できる

GUIアプリも使えるよ

https://gist.github.com/asufana/229cdac01fccee1a7d32ca8b5d7cfee6

Dockerの基本構成

  • Dockerイメージとコンテナの関係
    • イメージはクラスで、コンテナはインスタンスのようなもの

Dockerイメージ

  • いわゆる仮想マシンのイメージ
  • レイヤを積み重ねたもの
  • レイヤにはファイルの実体が含まれる
  • リードオンリー、更新不可
  • Dockerストレージドライバがレイヤを積み重ねて単一のファイルシステムとして見せている

Dockerコンテナ

  • イメージから作成される実行環境
  • 実際には
  • イメージのレイヤの一番上に、更新可能なレイヤーを一枚かぶせ、
  • そしてコンテナ毎の名前空間(プロセスの分離)やリソース制御を行っている

DockerHub

  • イメージの公開サイト
  • Chrome のカスタム検索に登録しておくと良い
  • https://hub.docker.com/search/?isAutomated=0&isOfficial=0&page=1&pullCount=0&starCount=0&q=%s

Dockerの基本コマンド

コンテナの作成

Playコンテナを起動する
$ docker run -it -p 80:9000 criluc/play1:1.2.7 bash
  • DockerHub から criluc/play1 イメージを使ってコンテナを起動する
  • タグ一覧から 1.2.7 を指定
  • -it オプションでその標準入力を開く
    • bash コマンドを実行するが、そのままだと起動してそのまま終了してしまうため、
    • その標準入力を捉えるために設定する
  • -p 80:9000 オプションで、コンテナの 9000 ポートを、ローカルの 80 にマッピングする
    • ホストからコンテナ内のプロセスにアクセスしたいため設定する
Postgresコンテナを起動する
$ docker run --name postgres -d postgres
$ docker exec -it postgres bash
  • DockeHub から postgres イメージを使ってコンテナ起動する
  • --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イメージに対するコマンド

  • ローカルにあるイメージ一覧
    • docker images

Dockerコンテナに対するコマンド

  • ローカルにあるコンテナ一覧
    • 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の指定

  • コンテナIDの指定は省略可能
  • ユニークなら一文字でもOK
  • docker rm a とか

全コンテナの指定

  • docker ps -aq
  • 全停止 docker stop $(docker ps -aq)
  • 全削除 docker rm $(docker ps -aq)

DockerHubに対するコマンド

  • DockerHubにログイン
    • docker login
  • イメージのアップロード
    • docker push asufana/my-postgres:0.1

おれおれイメージを作ってみる

Playコンテナを作成してHogeアプリを登録する

$ 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

イメージから新たにコンテナを生成してHogeアプリを起動する

$ 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 で激軽イメージの生成
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment