opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

Dockerはじめてみた

前々から気になっていたが、なんとなく(必要に迫られなかったから)手を出してなかったDockerについに手を出してみた。もちろんホストとする環境はArchLinux
今回は簡単なまとめを書くことにする。
今日のは備忘録というより、今日やったことの一部のログみたいな感じかな。

Install

WikiにはInstall手順のみ書いている。

$ (sudo) pacman -S docker

$ (sudo) systemctl start docker

して、dockerをインストールしてサービスを起動する。必要ならenableして起動時に有効にする。
また、dockerを一般ユーザーが使うにはそのユーザーをdockerグループに追加する必要がある。

$ (sudo) gpasswd -a username docker

とする。

ImageとContainerについて

dockerを使いはじめるとはじめに出てくる用語で最初はよくわからなかったが、わからないと何もできない気がする。
というか公式チュートリアルにもドキュメントにもぱっと見た感じちゃんとした説明がない気がしたけど気のせいかな。結構使って覚えろ的な勢いで書いてた気がする。(それともこの界隈では常識なのかな・・・)
そんなわけで、正しい定義は知らないのだが、今日いろんなサイトを読んだり実際に触ってみた感じだと

Image:

  • 意味としてはディスク"イメージ"とかいう時のそれと大体同じような感じ。
  • Dockerfileという、どうImageを構築するかを定義するファイルから生成(build)したり、Containerをcommitして生成したりできる。
  • OSやサーバー環境などのデータを含んでいる感じ。

Container:

  • Imageに保存された環境上で実際に何かしらのプロセスを動かす(runする)と生成される。
  • プロセスによって何かしらのファイルなどが書き換えられたとしても元のImageには影響はない。
  • 影響させるにはCommitする必要がある(gitみたいに更新はcommitしなければリポジトリには残らないということかな)。
  • 一度生成されたContainerは(runした)プロセスが終了しても残る。

という感じの模様。

使ってみた

実際にいろいろ動かしてみた。詳しいコマンドの書式やオプションはdockerのhelp出力を見るか、参考URLでも参照。

dockerは、dockerコマンドでいろいろ操作することができる。

$ docker images

とすると、現在ローカルに保存されているdocker imageを表示してくれる。はじめは何も存在しない状態になっている。

dockerは(多分)いきなりrunでlocalにないimageを指定してもリモート上から勝手に落として動かしてくれると思うが、今回はちゃんとpullしてから動かしてみる。

$ docker pull base/archlinux:latest

とする。これでDocker Hubに公開されているbase/archlinuxのimageがダウンロードされローカルのimagesに入る(latestはタグ)。
ちなみにbase/archlinuxとはリポジトリの名前。リポジトリは多分複数のimageを含むもののこと。(gitのリポジトリはcommitを含むけどdockerではimageを含むという感じかな?)

$ docker run -it base/archlinux /bin/bash

とすると、localに落としたbase/archlinuxでbashを動かしてくれる。
bashが起動したら、そこはすでにコンテナの中。ファイルを作ったりもできるし、pacmanも動く。
また、bashがpid 1になっている。

普通にexitなどを使いbashを終了すると、元のホストOSに戻ることができる。
次にpingを投げてみる。

$ docker run -d base/archlinux ping 8.8.8.8

このように"-d"をつけると、コマンドをdetachして実行できる。pingの出力は表示されずに、すぐにホストOSのターミナルに戻るが、バックグラウンドでずっと実行されている。

$ docker ps

とすると確認できる。

$ docker attach [CONTAINER ID]

すると、そのcontainerにattachできる。IDはdockerのpsコマンドで見ることができる。
また、終了したcontainerは

$ docker ps -a

でみることができる。

また、一度作成したContainerは基本的に消えずに差分としてどんどん保存されていく。
消すには

$ docker rm [CONTAINER ID]

で削除できる(動いているcontainerは削除できないのでstopなどで停止させる)。また、

$ docker rmi [IMAGE ID]

とすると、imageも削除できる。

runして生成されたContainerは内部が変更されても元のImageには影響が及ばないようになっているので、設定ファイルなどを変更したりサーバーソフトのバージョンを上げたりした場合はCommitする必要がある。

$ docker commit [CONTAINER ID] [REPOSITORY]

という書式で指定する。存在しない名前のREPOSITORYを指定した場合は新規に生成される。

docker imagesに表示されるREPOSITORYはDocker Hubなどにpushすることもできるが、容量がデカすぎたりすると何故かpushが失敗するっぽい。
いろいろ調べてみたがdockerのversionは大丈夫か?とかバグではないか?などの意見は見られたが、残念ながら最新版だし、バグだとしたら私では対処できない。
容量を減らしたら成功したという例もあったので、多分それではないかと思っている。

結論からいうと、Dockerfileを使ってImageを定義してgithubなどに公開してautomated buildしたほうが良い気がする。

Dockerfileについて

bese/archlinuxなどをpullしてrunしてそこでpacmanして設定ファイルを書いてcommitして...などとしているとあまり便利ではないので、その一連の作業を自動化して環境構築済みのimageを作るためにDockerfileを使う。

dockerfileの書き方は参考URLを参照ということにして、とりあえず実際に書いてみたのをgithubにあげてみた。

opamp/simple-dockerfile · GitHub

base/archlinux上に簡単なapacheによるwebサーバーを立てたImage。phpも一応モジュールで実行できるようにしてみた。

参考URL

コマンドは
http://qiita.com/deeeet/items/ed2246497cd6fcfe4104
http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html
http://apatheia.info/blog/2013/06/17/docker/

Dockerfileは
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
http://knowledge.sakura.ad.jp/tech/1811/

このへんかな?
参考にさせていただきました。ありがとうございました。

Firefox ブラウザ無料ダウンロード