-
Notifications
You must be signed in to change notification settings - Fork 2
Docker
joniyjoniy edited this page Nov 17, 2016
·
4 revisions
手軽に使えることで人気の仮想コンテナツールDockerの入門講座です.
- Docker社(旧DotCloud社)が開発
- dotCloudというPaaSを提供していた
- 自分が開発したアプリケーションをクラウドに アップロードして,クラウド上で実行できるというもの
- PaaSでは実行フレームワークや各種ライブラリを クラウド側で用意されている
- しかし,自分が使いたいライブラリがクラウド上に用意されていなかったりする
- そこで,利用者が独自のPaaS環境を自由に構築できるように dotCloudのコアコンポーネント(コア技術みたいなもの) を公開した
- アプリケーションイメージの作成と実行
- アプリケーションの実行に必要なファイルを全て含んだアプリケーションイメージを作成する
- 実際にアプリケーションを実行する実行基盤
- 一般的なPaaSでは実行環境はクラウド側で用意するので,開発者はクラウド環境に合わせる必要がある
- しかしDockerならアプリケーションのコードだけでなく 実行に必要なすべてのファイルを含んだ「アプリケーションイメージ」 を作成できる
- これをDockerイメージという
- 実行環境とアプリケーションを管理できる
- 手元の環境では動くのにサービス環境では動かないという問題が無くなる
- インフラエンジニアとアプリケーション開発者のやりとりが楽に
- チーム開発でも楽!
- Dockerをインストールするためのシェルスクリプトが公開されているので,それを利用する.
- Ubuntuだけかもしれない.
- インストール後,dockerを実行するユーザをdockerグループに追加する.
- dockerのデーモンを起動する.
- dockerデーモンの状態を確認する.
wget -qO- https://get.docker.com/ | sh
sudo usermod -aG docker vagrant
sudo start docker
sudo status docker
- dockerデーモンの起動を確認後,ubuntu:14.04のコンテナイメージを使ったコンテナを起動する.
-
docker run {オプション} {--name 新しいコンテナ名} {利用するコンテナ名} {実行する処理}という順に記述する. -
--nameは指定しなくとも良いが,よく分からない名前が勝手に生成されてわからなくなるので,できるだけつけたほうが良い.
-
- [host]がdockerを起動するホストOS側で実行するコマンド,
[docker]がdocker側で実行するコマンドである. - dockerを起動後パッケージのupgradeを行い,apache2をインストールする.
- インストール後,
Ctrl-p Ctrl-qを実行. -
Ctrl-p Ctrl-qを実行することでプロセスを停止せずに,コンテナから出ることができる. -
exitでコンテナから抜けると,実行しているbashプロセスが終了する. - 実行しているプロセスが終了するとコンテナは自動で停止してしまう.
-
docker stop {コンテナ名}で指定したコンテナを停止する.
[host]
docker run -it --name ubuntu01 ubuntu:14.04 /bin/bash
[docker]
apt-get update && apt-get upgrade -y
apt-get install apache2
Ctrp-p Ctrl-q
[host]
docker stop ubuntu01
- docker run でコンテナ生成&コンテナ起動
- docker stop でコンテナ停止
- docker start でコンテナ起動
- docker attach で起動しているコンテナに接続
- docker rm でコンテナ削除

- コンテナ内のApacheへポートフォワードするためVagrantfileを編集する
- このままで,vagrantの80番ポートをコンテナの80番ポートに転送してもいいが,
ちょっとわかりづらいので,ホストOSの10100番をvagrantの8000番に転送して,
vagrantの8000番をコンテナの80番に転送するようにする.
ホスト:10100 -> VM(vagrant):8000 -> コンテナ:80 という感じ. - ここでは,ホスト:10100 -> VM(vagrant):8000 部を設定する.
# config.vm.network :forwarded_port, guest: 80, host: 10100
config.vm.network :forwarded_port, guest: 8000, host: 10100
- [host]がdockerを起動するホストOS側で実行するコマンド,
[docker]がdocker側で実行するコマンドである. -
docker commit {コンテナ名} {保存後のコンテナ名}で指定したコンテナを別名で複製して,コンテナイメージとして保存することができる. -
docker rm {コンテナ名}で指定したコンテナを削除できる.- 停止中の場合のみ削除できる?
- コンテナイメージを削除する場合は
docker rmi {コンテナイメージ名}
-
docker imagesで存在するコンテナイメージ一覧を表示する.-
docker images {コンテナイメージ名}で指定したコンテナイメージのみ表示.
-
[host]
docker commit ubuntu01 vagrant/apache2:ver1.0
docker rm ubuntu01
docker images vagrant/apache2
-
docker runコマンドでコンテナを起動する.-
-pオプションでポートフォワードの設定を行う. -
-p {ホストポート}:{コンテナポート}というように指定.
-
- Apacheで表示したいページ
/var/www/html/index.htmlに文字列を書き込む. -
serviceコマンドでapache2を起動. -
Ctrl-p Ctrl-qを実行することでプロセスを停止せずに,コンテナから出ることができる.
[host]
docker run -it -p 8000:80 --name web01 vagrant/apache2:ver1.0 /bin/bash
[docker]
echo 'Hello, Docker' > /var/www/html/index.html
service apache2 start
Ctrl-p Ctrl-q でホストOSに戻る
- ブラウザで 133.92.147.245:10100にアクセス
- 書き込んだ内容が表示されていることを確認
- もしくは,vagrant上でcurl実行
curl http://192.168.11.100:8000
-
docker diffコマンドでコンテナ内で変更のあったディレクトリ・ファイルを確認できる. -
docker cpコマンドでコンテナ内の指定したディレクトリ・ファイルをホスト側にコピーできる.docker cp {コンテナ名}:{パス} {保存する名前}
- コピーした
access.logを確認.
[host]
docker diff web01
docker cp web01:/var/log/apache2 tmp
cat tmp/access.log
- 作成したコンテナイメージを共有できるサイト
- Docker版Githubのようなもの.
- ここまで手動でコンテナイメージを作成した.
- Dockerfileを定義することで自動で生成することができる.
- Dockerfileの詳細な説明はDockerfileについてに記載する.
[host]
mkdir docker
cd docker
- 以下の内容を記述したDockerfileを作成する.
- user-00の部分は自分のユーザ名に変更する.
- dockerでApacheを起動してみようで行ったapacheの操作と同じ処理.(なぜかリンク飛んでくれない)
FROM ubuntu:14.04
MAINTAINER user-00
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y apache2
ADD index.html /var/www/html/index.html
CMD service apache2 start & bash
echo 'Hello, Docker' > ~/docker/index.html
docker build -t vagrant/apache2:ver1.1 ~/docker
- 以下に実行例を示す.
$ docker build -t vagrant/apache2:ver1.1 ~/docker
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM ubuntu:14.04
---> 1e0c3dd64ccd
Step 2 : MAINTAINER user-00
---> Running in ba8a155480cb
---> a158d53ae084
Removing intermediate container ba8a155480cb
Step 3 : RUN apt-get update
---> Running in 6391ea0e3e56
Ign http://archive.ubuntu.com trusty InRelease
Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
Get:2 http://archive.ubuntu.com trusty-security InRelease [65.9 kB]
...(中略)
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
Processing triggers for ureadahead (0.100.0-16) ...
---> 7cbc5a8e9d22
Removing intermediate container b500a124f44b
Step 6 : ADD index.html /var/www/html/index.html
---> 7b86e8473254
Removing intermediate container 95c1534eb995
Step 7 : CMD service apache2 start & bash
---> Running in a9132e596272
---> a92267bde908
Removing intermediate container a9132e596272
Successfully built a92267bde908
-
Step1 ~ Step7の7つのステップが実行されていることがわかる.
-
各ステップの完了後にはステップを実行したコンテナイメージを保存し,中間コンテナを破棄する.
-
次のステップでは,保存したコンテナイメージを起動して,ステップを実行 -> コンテナイメージ保存 -> コンテナ破棄 といった流れになる.
-
Step3に当たる部分だけを編集して再度buildした場合はStep2完了時点のコンテナイメージを利用して,以降の処理を行う.
-
中間イメージを利用しない場合は,
--no-cacheオプションを指定する. -
なるべくDockerfileを配置するディレクトリには,コンテナイメージに関係無いファイルは置かないようにする.
-
build実行後
Sending build context to Docker daemon 3.072 kBと出力されているが,ここで指定したディレクトリ内のすべてのファイルを転送するためである. -
コンテナイメージに不要だが,同じディレクトリ配置する必要のあるファイルがある場合は,
.dockerignoreファイルに記載しておくことで,転送対象から除外できる.
docker run -itd -p 8000:80 --name web02 vagrant/apache2:ver1.1
- -dオプションをつけることでバックグラウンドでdockerを起動する.
- 起動していることは
docker psコマンドで確認できる.実行例を示す.
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
66438f3c522e vagrant/apache2:ver1.1 "/bin/sh -c 'service " 2 minutes ago Up 2 minutes 0.0.0.0:8000->80/tcp web02
-
-lオプションで直近のプロセスのみ確認できる.-aオプションをつけると,停止しているコンテナの情報も確認できる.
-
コンテナ内のプロセスは
docker topコマンドで確認することができる. -
実行例を以下に示す.
docker top web02
UID PID PPID C STIME TTY TIME CMD
root 4978 4969 0 02:28 pts/2 00:00:00 /bin/sh -c service apache2 start & bash
root 5004 4978 0 02:28 pts/2 00:00:00 bash
root 5044 4978 0 02:28 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 5047 5044 0 02:28 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 5048 5044 0 02:28 ? 00:00:00 /usr/sbin/apache2 -k start
-
curlコマンドで,htmlファイルの内容を確認する.
curl http://192.168.11.100:8000
- ブラウザから確認する場合は,
133.92.147.245:10100等にアクセスする.
- Dockerhubで公開されているコンテナイメージを利用することで簡単にアプリケーションを実行することができる.
mkdir ~/nyan
cd ~/nyan
docker run -it --rm supertest2014/nyan
-
Ctrl-cで動作を停止する. -
--rmオプションを指定するとコンテナが停止するとそのまま,コンテナを破棄する.
-
Docker実践入門
- ほとんどの項目でDocker実践入門を参考にしています.
- 著作権侵害になりそうだから公開できない...
- Software Design 2014年12月号
- ubuntu 14.04にDockerをインストール
- 私のDocker TIPS
- Create a Docker group
- Dockerにおけるコンテナのライフサイクル