Skip to content

Instantly share code, notes, and snippets.

@Ryomasao
Created June 11, 2020 08:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ryomasao/50f0b68cc2ede6f4b32a9afc0d84876d to your computer and use it in GitHub Desktop.
Save Ryomasao/50f0b68cc2ede6f4b32a9afc0d84876d to your computer and use it in GitHub Desktop.
Docker tutorial

Hello Docker

導入

何はともあれ、Vagrantっぽくベースとなるイメージをとってこよう

> docker pull centos:centos7

cenotosのimageをとってこれた。 imageは、OSインストールする際のCD-ROMみたいなものだと思うといいかもしれない。

> docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos7             b5b4d78bc90c        5 weeks ago         203MB

コンテナをつくる。コンテナはimageをもとに動く仮想環境みたいなもの。vagrant upしたら起動するやつって思ってていい。

> docker run b5b4d78bc90c ls 
anaconda-post.log
bin
dev
etc
home
# 省略

これは、イメージIDb5b4d78bc90cもとにコンテナを作って、lsコマンド叩いた結果になってる。 Vagrantから入門した場合、ここでまず戸惑うかと思う。自分も、え?コマンド叩いたのはわかったけど、コンテナどうなったの?って思った。

結論から言うと、このコンテナは、lsコマンドを叩くためだけに起動して、lsコマンドを叩き終わったら、終了している。 docker ps -aを叩くとコンテナを確認することができる。 -aは、停止しているコンテナも表示するっていうオプション。 ��Status欄を見ると、Exitedになってるね。

> docker ps -a              
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
353e87f036e4        b5b4d78bc90c        "ls"                2 seconds ago       Exited (0) 1 second ago                       hardcore_shtern

試しに、sleepを使って処理を遅延させてみよう。

# 10秒後にlsを叩くコマンド
> docker run b5b4d78bc90c sleep 10s;ls 

このとき急いで、別ターミナルでdocker psを叩くと起動中のコンテナとして確認できる

> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d2c89808ede3        b5b4d78bc90c        "sleep 10s;"         5 seconds ago       Up 3 seconds                            gifted_kowalevski

ちなみに、docker runは毎回イメージからコンテナをつくってしまう。

停止中のコンテナを起動するには、docker start コンテナIDでいける。

# 起動
$ docker start 5895622e50c8
# 起動していることが確認できる
$ docker ps 

まとめ

  • imageは、コンテナを作成する大本のCDROMみたいなもの
  • コンテナはimageから作成されて、コンテナに実行するコマンドが終了すると、コンテナは終了しちゃう
  • 終了したコンテナは再度起動できる

コンテナに入る

コンテナ起動中であれば、コンテナに渡したコマンドとは別のコマンドを実行できる。 sleepを60秒に増やしてみよう。

> docker run b5b4d78bc90c sleep 60s

その状態で、docker ps でコンテナIDを確認して、以下を叩くと起動したコンテナ内でdateコマンドが実行される

> docker exec コンテナID date
Thu Jun 11 07:41:39 UTC 2020

この考え方の延長で、起動中のコンテナに端末をアタッチすることができる。

# 682fd380744dはコンテナID
> docker exec -it 682fd380744d bash
[root@682fd380744d /]# 

これは、bashを新しく起動して、そのプロセスに��疑似端末を割り当てるってコマンド。 疑似端末否々はLinuxのログインの知識があんまりわかってないので、うまく説明できない。

今のやり方は、

  • コンテナに60秒sleepさせるコマンドを実行させる
  • 起動中のコンテナにアタッチする

というフローを踏ん出る。

これはちょっと回りくどくって、最初からコンテナにbashを起動させるようにしてあげればいい。

# bashはなくてもうまくいくみたい
> docker run -it イメージID bash
root@44c6e2199a2f /]# 
root@44c6e2199a2f /]# exit

次にコンテナ内を更新してみる。

作成したコンテナを再度起動しよう。その際、 -iをつけると、同じように端末をアタッチすることができる。

>docker start -i コンテナID
[root@44c6e2199a2f /]#  touch test.txt
[root@44c6e2199a2f /]#  exit

ファイルを作成したら、exitでコンテナを抜けよう。
コンテナは終了してしまうので、再度起動し、もっかいコンテナに接続してみよう。

>docker start -i コンテナID
[root@44c6e2199a2f /]#  ls

さっきつくったファイルが残っていることが確認できる。

一方、別のコンテナを作成してみよう。

> docker run -it b5b4d78bc90c bash
[root@55f7832f7ce2 /]# ls

こうすると、新しくできたコンテナにはさっきのファイルが存在しないことがわかる。

まとめ

  • コンテナ単位でデータ(状態)が管理される。
  • コンテナが終了しても、データは残ったまま。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment