Dockerのコンテナとホストとの関係の条件付け


はじめに

Dockerは多くのIT開発企業で導入されている環境構築を楽にする技術です。
Dockerで作成したコンテナはホスト(自身のPCやAWSなどのクラウド)に対して、ファイルを読み込んだり、また、ホストのサーバーからコンテナへ接続したり、というような関係を持ちます。
それらの関係の条件を指定するために、docker runにオプションを付けて、実行します。
今回はコンテナとホストとの関係の条件付けのためのオプションを紹介します。

今回紹介する内容(docker runコマンドとオプション)

  • コンテナからホストのファイルに接続できるようにする (docker run -v)
  • ユーザーIDやグループIDの指定する (docker run -u)
  • ホストのポートとコンテナのポートをつなげる (docker run -p)
  • コンテナがアクセスできるCPUやメモリの上限を設定する(docker run --cpus)(docker run --memory)

コンテナからホストのファイルに接続できるようにする (docker run -v)

ホストのファイルをコンテナの中にも存在するように振舞わせることをマウントと言います。
コンテナは誰かに使ってもらったり、手軽に実行させたりできるように、サイズが小さいことが望ましいので、可能な限りコンテナ自体にファイルを設置しないようにします。
例えば、コードのファイルはホストに置いておき、コンテナからホストのコードのファイルを読み込ませるという場合、コードのファイルをコンテナにマウントさせる、と言います。

docker run -it -v (ホストのパス):(コンテナのパス) (DockerImageの名前 or ID) bash

例) docker run -it -v /Desktop/sample_dir:/new_dir (DockerImageのID) bash
=> コンテナのnew_dirというディレクトリにホストのDesktopに存在するsample_dirというディレクトリがマウントされます。
(コンテナにnew_dirというディレクトリが存在しない場合は、コンテナにnew_dirというディレクトリが自動で作成されます。)

ユーザーIDやグループIDの指定する (docker run -u)

ホストのファイルをコンテナでマウントさせる場合、ユーザーIDやグループIDを指定しないと、コンテナがルート権限を持ってアクセスすることができてしまいます。
ルート権限がコンテナ側にあると、コンテナからホストのファイルを作成したり、編集したり、様々なことができてしまいます。
ルート権限を持たせたくない場合には、ユーザーIDやグループIDを指定して、マウントさせます。

docker run -it -u (ユーザーID):(グループID)

例) docker run -it -u $(id -u):$(id -g) -v /Desktop/sample_dir:/new_dir (DockerImageのID) bash
=> ユーザーIDとグループIDが指定して、ホストのファイルをマウントしたコンテナが作成される。

ホストのポートとコンテナのポートをつなげる (docker run -p)

ポートとはサーバーの中の特定の場所です。
例えば、サーバーに複数のサービスがあった場合、IPアドレスだけではどのサービスに接続するか分からないため、ポートを指定します。
作成したコンテナを一つのWebサービスとする場合、コンテナのポートとホストのポートをつなげる必要があります。

docker run -it -p (ホストのポート):(コンテナのポート)

例) docker run -it -p 3000:3000 rails bash
=> railsというDockerImageからコンテナが作成され、railsのデフォルトのポート3000に繋がるため、ホスト側でlocalhost:3000にアクセスするとrailsにアクセスすることができます。

コンテナがアクセスできるCPUやメモリの上限を設定する(docker run --cpus)(docker run --memory)

コンテナが動く時、ホストのCPUやメモリを使います。
例えば、一つのコンテナが限界までCPUやメモリを使ってしまった場合、メモリが枯渇してシステム全体が落ちてしまう可能性があります。
そのようなリスクを避けるために、それぞれのコンテナに対して、CPUやメモリの上限設定をします。

docker run -it --cpus (論理コア数) --memory (メモリ容量)

例) docker run -it --cpus 4 --memory 2g ubuntu bash
=> ubuntuというDockerImageからコンテナが作成され、このコンテナが使えるCPUの論理コアの上限は4つで、メモリの上限は2ギガとなります。
(コンテナのCPUやメモリを確認したい時は、"docker inspect (コンテナID)"を入力します。)

※自身のPCのCPUやメモリが知りたい場合はターミナルに以下の入力をすると確認できます。

  • sysctl -n hw.logicalcpu_max => CPU(論理コア数)
  • sysctl hw.memsize => メモリ(byte)

参考

Udemy

かめれおん講師 「米国AI開発者がゼロから教えるDocker講座」

https://www.udemy.com/share/103aTRAEAdd1pTTHoC/

有料ですが、初学者の私にも非常に理解しやすかったです。

最後に

本投稿が初学者の復習の一助となればと幸いです。