Docker初心者のUbuntuコンテナ docker runとコンテナ削除(Mac)

スポンサーリンク
Docker-main-image Docker
この記事は約15分で読めます。

こんにちは!ともわん(@TomoOne4)です。

僕は、IT企業でマーケティングやセールスをやっています。

Dockerについての第4回目投稿です。

今回は、「今まで使ってきた docker runコマンドの本質深堀りと、コンテナの削除、そしてdetached mode と foreground modeまでを扱います。

UbuntuはLunuxのOSですのでこの上でWordPressなども動かす事ができますよ。

今回のポイント

  1. docker runって、どういう意味?
  2. デフォルトコマンドを上書きしてみる
  3. コンテナの削除関連コマンド
  4. detached modeとforeground mode

ここで書く内容は、Udemy で受講できる、
かめ れおんさんの米国AI開発者がゼロから教えるDocker講座

で学んだ内容を自分の中で定着するために調べたり考えたりした内容を踏まえて進めていきます。

導入は文章より動画のほうがすっと入ってくる人も多いと思いますので、少し記事を読んでいただき

「Docker面白そうだし、簡単そう」

と思った人はぜひUdemyで米国AI開発者がゼロから教えるDocker講座を受けてみてください。

Dockerやコンテナ、仮想化については第1回、第2回、第3回がありますのでこちらをみてみてください!

スポンサーリンク

docker runコマンドとは?

今までの記事で散々 docker runコマンドは実行してきましたが、このコマンドは分解できるのです。

docker runコマンドのrunは以下の2つに分解できる。

run = create + start

runの挙動としては、指定したイメージをまず探しに行き、そこからコンテナをCreateしてStartさせるような動きになります。

なので、

docker run = docker create + docker start

に分けて実行しても同じことになります。

※docker create, docker startコマンドは、ほぼ使われないかもしれませんが、よく使うrunコマンドを分解するとどうなるかという原理を知っておくために重要なため扱います。

$ docker create hello-world
52d53046df95d7379fd20b17ccbcf5466f57edb6cb928849c515306117aa5810

これで、コンテナは作成されたので、確認してみます。

$ docker ps -a

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                      PORTS                    NAMES
52d53046df95        hello-world              "/hello"                 5 seconds ago       Created                                              practical_pasteur

STATUSがCreatedになっていますね。作られただけで、Startもされていない状態です。

それでは、Startしてみましょう。

$ docker start 52d53046df95
52d53046df95

できたっぽいので、確認してみます。

$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                      PORTS                    NAMES
52d53046df95        hello-world              "/hello"                 2 minutes ago       Exited (0) 19 seconds ago                            practical_pasteur

STATUSがExitedになりました。

しかし、runのときに見ることができた、hello-worldのデフォルトコマンドである、テキスト出力結果が見れていないです。

というのも、docker startでは、デフォルトコマンドは実行されるが、実行結果は確認できないからなのです(マジか)

そこで、-aというオプションを追加してstartする必要があります。

すると、無事に出力結果が出てきました!

$ docker start -a 52d53046df95

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

docker startでは、コンテナにあるデフォルトコマンドが実行されるような仕組みになっています。挙動としてはそれだけで、実行が完了したらExitedになります。

デフォルトコマンドというのは、docker ps -a などを実行した結果として出てくる COMMAND部分のことです。(これからやるhello-worldでは、”/hello”)

docker runでデフォルトコマンドの上書きを行う

コンテナでは、デフォルトコマンドが予め用意されているのですが、デフォルトコマンドを上書きする場合は、

docker run <Inamge name> <Command>

の<Command>を指定してあげればいいだけです。

ちなみに、ubuntuコンテナのデフォルトコマンドを見てみます。

$ docker run ubuntu

出力などはされませんし、-itオプションを付けてもいないのでインタラクティブなやり取りもされません。

状態を確認してみます。

$ docker ps -a

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                      PORTS                    NAMES
6ed8dac4d6e4        ubuntu                   "/bin/bash"              24 seconds ago      Exited (0) 22 seconds ago                            gracious_jennings

COMMANDの部分を見ると、デフォルトコマンドは、“/bin/bash” が指定されていることがわかります。

ちなみに、デフォルトコマンドをls -lにしてみましょう。

$ docker run ubuntu ls -l

すると、

$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS                          PORTS                    NAMES
694cbd34fb37        ubuntu                   "ls -l"                  7 seconds ago        Exited (0) 6 seconds ago                                 heuristic_pasteur

COMMANDのところが変わりましたね!

こんな感じでデフォルトコマンドの上書きをすることができます。

コンテナ名を指定してrun

これは、以下のようなときに使うようです。

【どういうときに使う?】
・ずっと起動させつるけるコンテナをたてるとき
・共有のサーバを使うとき(クラウドサーバなど)
・他のプログラムで使うとき
→Container IDだと判別がしにくいから

やり方は以下です。

$ docker run –name <Container name> ubuntu

実際にやってみます。

$ docker run --name hogehogehoge ubuntu

確認をしてみます。

$ docker ps -a

CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS                     PORTS               NAMES
897cb37b4838        ubuntu                   "/bin/bash"         4 seconds ago       Exited (0) 3 seconds ago                       hogehogehoge

はい!NAMESところが、hogehogehogeに変更されました!

※Container Nameが重複してしまうとエラーになるので注意です。

コンテナの削除をする

docker runとかを実行しまくるとコンテナがどんどん増えていきます。

$ docker ps -a

で現在のコンテナを見てみると、かなり多くなっていることがあります。

さらにそこのSTATUSがExitedになっているものは、もう使わないことが多いので、定期的に削除すべきです

そこで、コンテナの削除をする便利なコマンドたちを見ていきます。

【削除】
$ docker rm <Container ID / Image name>
※動いているコンテナに対しては、rmコマンドはエラーになるので一度stopしてからrmを実行する。
※スペース区切りで<Container ID / Image name> を複数指定することも可能

【コンテナを停止】
$ docker stop <Container ID / Image name>
※スペース区切りで<Container ID / Image name> を複数指定することも可能

【コンテナを全部削除(便利)】
$ docker system prune

【docker runしてそのまま削除できる(便利)】
$ docker run –rm <Image ID>

docker system pruneをやってみます。

このコマンドは、「ほんとに続けますか?」を聞かれるので、yを押して続けます。

$ docker system prune

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N]

Deleted Containers:
694cbd34fb37b188f4ce46012aa4a7732efcd03b8e2a49ecda2ac2991a1253ea
6ed8dac4d6e4f601fc181d4600fb69d3785eb1d05602948c65c8c06b19e102e4
52d53046df95d7379fd20b17ccbcf5466f57edb6cb928849c515306117aa5810
9bae5479ddfcd537a8a62125679fc1acecbfbeafb639842b22569e3928bf3e11
7d63192d0439697a550d24e89906e3d933070412e71010256e87a3eb9b22595d
672f87d4ea6c7f970e78c6f9219c306caa08672d0e0b7b01e63fdab650ccff73
87c7defe8c717ed527095cedbe7a262bdc006d4f264041d5d1e0fda07190df1c
948fc75b6c494a2f5332f25cb1639a43377bddb94d55479922190d51a88add65

Deleted Networks:
product-register_default

Deleted Images:
untagged: xxxxxxxx/my-first-repo@sha256:42118a301bdb4392ac48501d35795defd3a69d9f5af73ecafb1296b47230f0e3
deleted: sha256:4998b82db3c41512f443c869dde65add61f396807f04e5d3bbfd7192d188c81f
deleted: sha256:f6235db8fcfc7614c025bcac32eb074df87048268e44af288fb52dc6c0e4f85d

Total reclaimed space: 320B

すると、色々全部消えます。

docker ps -aで確認してみると、STATUSがExitedになっているコンテナが全部消えているのが確認できます。

コンテナごとのファイルシステムは独立している

これは、理解しておくだけで良いのですが、複数のコンテナを作った際にそのコンテナ毎にファイルシステムは独立しています。

コンテナAのファイルシステムの操作編集がコンテナBのファイルシステムに影響を及ぼすことはありません。

detached modeとforeground mode

Docker コンテナの起動時に、コンテナをバックグラウンド(detached mode)で実行するか、デフォルトのフォアグラウンド(foreground mode)で実行するかを決める必要があります。

【detached mode】

$ docker run -d <Image ID>

コンテナを起動後にdetachするコマンドで、これをするとバックグラウンドでプロセスを動かすことができます。-dのオプションをつけます。

コンテナをデタッチド・モードで起動するには、 -d=true-d オプションを使います。設計上、コンテナが実行するルート・プロセスが終了したら、デタッチド・モードで起動したコンテナも終了します。デタッチド・モードのコンテナは停止しても自動的に削除できません。つまり -d オプションでは –rm を指定できません。

https://docs.docker.jp/engine/reference/run.html#d

試しにやってみます。

$ docker run -it -d ubuntu bash
63388ae0f51aed4f5152ae66624db14720081a79b9a2c735a3fd2f2200ca0e3e

確認をすると、STATUSがUpのままで、動いていることがわかります。

$ docker ps -a

CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS                     PORTS               NAMES
63388ae0f51a        ubuntu                   "bash"              4 seconds ago       Up 3 seconds                                   suspicious_murdock

【foreground mode】

$ docker run –rm <Image ID>

-dオプションを付けない場合のデフォルトではこのモードになります。

上の例の場合だと、コンテナをExitしたあとに削除する、1回しか使わないコンテナに使います。

フォアグラウンド・モード( -d を指定しないデフォルト )の場合、 docker run はコンテナの中でプロセスを開始し、プロセスの標準入出力・標準エラーをコンソールにアタッチします。これは TTY の振りをするだけでなく(TTY は大部分のコマンド・ラインで実行可能なものと想定しています)、シグナルも渡せます。

https://docs.docker.jp/engine/reference/run.html#foreground

まとめ

お疲れさまでした(^^)

Dockerでよくつかうrunコマンドの意味を知り、その上で実際に使うことが多い削除関連のコマンドについて学びました。

直接は使うことが少ないかもしれませんが、コマンドの上書きやdetached modeについても確認し、理解してきました。

いや〜理解すること多いですね(^_^;)でも楽しくなってくるところでもあると思います。

教材と参考資料

米国AI開発者がゼロから教えるDocker講座
AI開発のプロが徹底的に現場目線でわかりやすく教えます.Dockerを使って超本格的なデータサイエンスやWeb開発の環境が作れるようになります.
タイトルとURLをコピーしました