豆腐とコンソメ

豆腐とコンソメ

ラズパイ工作ともろもろのプログラム勉強記録

Dockerをさわってみる(3):ちょっと振り返り

日記

f:id:konoemario:20180412204108p:plain:w500

春が来ました。
速攻で風邪を引きましたが、みなさまいかがお過ごしでしょうか。

お金を稼ぐエンジニアになるのか、お金を稼ぐビジネスマンになるのか、幸せなエンジニアになるのか、幸せな人間になるのか、いろいろと悩ましい今日この頃です。

ブログについても、アウプットするものをちゃんと考えないと無駄に時間がかかるわりに得るものが少ないと感じたりします。

そもそもなんのために書くのがはっきりしないからこんことになるんですが。


今までの振り返り

以前、簡単にチュートリアルをやって、その際のメモを書きました。

www.tohuandkonsome.site

www.tohuandkonsome.site


基礎もそうなんですが、平行してやりたいことができないとなかなか定着しないので、先行してdocker-composeやらなんやらでつくたい環境をなんとなく作れるようになった気がしたところで、もう一回復習しようと思い、振り返りもかねて書くことにしました。


イメージとコンテナの整理

初回は、なんだかよくわからないけれどもdocker runHelloWorldを表示してみました。

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と表示されています。

コンテナが実際の仮想マシンみたいなもので、イメージはその仮想マシンをつくるための元となるデータという感じでしょうか。

f:id:konoemario:20180412143622p:plain
dockerイメージとdockerコンテナ

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

(標準出力をアタッチってなんぞって感じなんですが、これだ!っていう説明ができないので、頭の中のイメージを図にしました。)

f:id:konoemario:20180412145913p:plain
標準出力をアタッチする


コンテナに接続するということ

前回、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


おお、ファイルが残ってますね。

ということは、コンテナを削除するまでは残っているということですね。

コンテナ内で作業したデータ状態を共有したい場合は、コンテナから再度イメージに固めてあげてあげればよさそうです。
このへんはまたどっかで試そうと思います。

f:id:konoemario:20180412173936p:plain
コンテナを再度イメージに


イメージについて

イメージを何かしら作成してみようと思ったとき、例えば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のイメージになります。

以降も気になることがあれば追記していきます。