日記
春が来ました。
速攻で風邪を引きましたが、みなさまいかがお過ごしでしょうか。
お金を稼ぐエンジニアになるのか、お金を稼ぐビジネスマンになるのか、幸せなエンジニアになるのか、幸せな人間になるのか、いろいろと悩ましい今日この頃です。
ブログについても、アウプットするものをちゃんと考えないと無駄に時間がかかるわりに得るものが少ないと感じたりします。
そもそもなんのために書くのがはっきりしないからこんことになるんですが。
今までの振り返り
以前、簡単にチュートリアルをやって、その際のメモを書きました。
www.tohuandkonsome.site
www.tohuandkonsome.site
基礎もそうなんですが、平行してやりたいことができないとなかなか定着しないので、先行してdocker-composeやらなんやらでつくたい環境をなんとなく作れるようになった気がしたところで、もう一回復習しようと思い、振り返りもかねて書くことにしました。
イメージとコンテナの整理
初回は、なんだかよくわからないけれどもdocker run
でHelloWorld
を表示してみました。
HelloWorldをやってみた
$ docker run ubuntu:14.04 /bin/echo 'Hello world'
これについて、もう少し掘り下げていきたいと思います。
公式のリファレンスをみるとdocker run
は以下のようになっています。
(オプションとかもろもろは消しちゃってるよ!)
docker run の形式
$ docker run <イメージ名> <コマンド> <引数>
ここで、もう一度、初回のHelloWorldの動きをみてみます。
HelloWorldをやってみた
$ docker run ubuntu:14.04
Hello world
これは、イメージubuntu:14.04
をとってきてecho
コマンドに引数Hello wolrd
を渡しています。
その結果、専用のコンテナが作成され、コンテナ内でechoが実行され、コンソールにHello world
と表示されています。
コンテナが実際の仮想マシンみたいなもので、イメージはその仮想マシンをつくるための元となるデータという感じでしょうか。
docker run
を実行した後に、docker ps -a
を実行してみると、停止中のコンテナも含めてすべてのコンテナが表示されます。
以下は、さきほどdocker run
をした際にできたコンテナになります。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8771e2a2a729 ubuntu:14.04 "/bin/echo 'Hello ..." 10 minutes ago Exited (0) 10 minutes ago amazing_yonath
このとき、おもむろに再度docker run
をしてみます。
もう一回挨拶する。
$ docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
再度、`docker ps -a 'とするとコンテナが増えていることが確認できます。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8771e2a2a729 ubuntu:14.04 "/bin/echo 'Hello ..." 10 minutes ago Exited (0) 10 minutes ago amazing_yonath
76020fdd87aa ubuntu:14.04 "/bin/echo 'Hello ..." 10 minutes ago Exited (0) 10 minutes ago cocky_wescoff
このことから、docker run
は指定されたイメージからコンテナを作成し起動することがわかります。
コンテナが毎回できると思うと、なんとなくディスク容量を圧迫するのかなぁと思ったので、コンテナそのもののサイズを確認ができそうなdocker ps -a -s
を実行してみました。
dockerコンテナのサイズ確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
8771e2a2a729 ubuntu:14.04 "/bin/echo 'Hello ..." 36 minutes ago Exited (0) 8 minutes ago amazing_yonath 0 B (virtual 222 MB)
76020fdd87aa ubuntu:14.04 "/bin/echo 'Hello ..." 36 minutes ago Exited (0) 36 minutes ago cocky_wescoff 0 B (virtual 222 MB)
なんと0B!と思ったのですが、この0Bとはコンテナを作成する際に元となったイメージとの差分とのことで、実際のサイズはvirtual 222MB
みたい。
ということは、毎回コンテナをつくっていく、というのはちょっとどうかなというところです。
作成したコンテナを利用したい場合は、どうしたらいいんだろうと思い調べてみると、docker strart
というものがありました。
docker strart
$ dokcer start <コンテナ名>
試しに、実行してみます。
実際にやってみる
$ docker start 8771e2a2a729[f:id:konoemario:20180412145913p:plain]
8771e2a2a729
コンテナIDっぽいのが返ってくるだけで、挨拶もなにもないです。
どうも-a
オプションをつけることで、標準出力をアタッチすることができるみたいです。
標準出力をアタッチ
$ docker start -a 8771e2a2a729
Hello world
(標準出力をアタッチってなんぞって感じなんですが、これだ!っていう説明ができないので、頭の中のイメージを図にしました。)
コンテナに接続するということ
前回、docker run -i -t イメージ名
とすることで、コンテナの中に接続することができた。
dockerコンテナに接続する
docker run -i -t ubuntu:14.04 /bin/bash
root@be667a4efa85:/#
さきほど、つくったHelloWorldを返すコンテナにも接続してみたいと思ったんだけれども、どうしていいかわからない。
試しに以下のよう、docker run
実行時に-t
と`-t'オプションをつければいいんじゃろ!とやってみる。
オプションをつけてためしてみる
docker run -i -t ubuntu:14.04 /bin/echo 'Hello world'
Hello world
が、これを実行しても速攻で終了してしまう。
というのも、そもそもdockerは何かしらのプロセスがフォアグランドで動いている必要があるからみたい、
ここでいう何かしらというのはecho HelloWorld
で、これが終わりしだいコンテナは終了してしまう。
一方、起動時に/bin/bash
のみとしている以下のコンテナは、bash
というプロセスがずっと実行されているので、コンテナは起動しっぱなしということなのかもしれない。
試しにdocker ps
でみてみると、起動中のコンテナとして存在していることがわかる。
docker ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be667a4efa85 ubuntu:14.04 "/bin/bash" 14 minutes ago Up 13 minutes musing_carson
起動中のコンテナに接続するには、docker attach
を用いることで接続することができる。
起動中のコンテナに接続する
$ docker attach be667a4efa85
root@be667a4efa85:/#
ただ、attachの場合、コンテナから抜けようと、exit
コマンドを打つと、コンテナが終了してしまう。
コンテナ起動時に実行しているbashプロセスに接続していて、exitをすることでそのbashプロセスが終了してしまうからなのかな?あんまりよくわからない。
もう一つの、起動中のコンテナを利用してコマンドを実行できるexec
なるものがある。
起動中のコンテナに接続する
$docker exec -it be667a4efa85 /bin/bash
root@be667a4efa85:/#
こちらであれば、exit
してもコンテナは終了しないので便利。
attachと違って、bashプロセスを新規に立ち上げてるのかな?
コンテナ内の変更について
イメージからコンテナをつくって、コンテナ内でパッケージをインストールしたり、ファイルをつくったりしたりしたらどうなるんだろう。
ということで、既存のコンテナに接続して、適当にファイルをつくってみます。
コンテナ内でファイルをつくる
$ docker exec -it be667a4efa85 /bin/bash
root@be667a4efa85# touch buhiii
root@be667a4efa85:/# ls | grep bu
buhiii
その後、コンテナを停止、起動として再度コンテナに接続してみます。
コンテナを再起動して接続する
$ docker stop be667a4efa85
$ docker exec -it be667a4efa85 /bin/bash
root@be667a4efa85:/# ls | grep bu
buhiii
おお、ファイルが残ってますね。
ということは、コンテナを削除するまでは残っているということですね。
コンテナ内で作業したデータ状態を共有したい場合は、コンテナから再度イメージに固めてあげてあげればよさそうです。
このへんはまたどっかで試そうと思います。
イメージについて
イメージを何かしら作成してみようと思ったとき、例えばnginxが動くイメージなんかをつくろうとおもったとき、大本となるものってなんだろうって思い手がとまっちゃいました。
いかにdockerをわかっていないかっていうだけの話なんですが、(そして今もわかっていない)イメージの大本は、何かしらのOSイメージが必要になります。
前回もPythonのWebフレームワークであるFlaskを動く既存イメージをもってきてコンテナを作成していました。
Flaskを動かすコンテナを起動
docker run -d -p 80:5000 training/webapp python app.py
trainig/webapp
というイメージをもとにコンテナを作成しているんですが、trainig/webapp
というイメージは、Pythonが実行できるなにかぐらいの感覚しかなくっていろいろと混乱しました。
冷静に考えるとPythonがインストールされた、UbuntuだったりCentOSのイメージになります。
以降も気になることがあれば追記していきます。