Dockerとコンテナ技術 その6:コマンド操作

コンテナの仮想環境が作成できるようになったので、次は起動しているコンテナでの操作を実行できるようにしていきます。
今回はコマンド実行による操作方法をいくつかまとめていきます。

ホストOSとコンテナ間のファイルのやりとり

まずはホストOSとコンテナ間でのファイルのやり取りを行うコマンド操作をご紹介します。
コンテナは一つの隔離された仮想環境です。
そのため、コンテナはホストOS上に存在するファイルに、ホストOSはコンテナ上のファイルにアクセスすることはできません。
そのため、それぞれのファイルを利用したい場合はファイルをコピーしてくる必要があります。
このホストOS・コンテナ間のファイルのコピーはdocker compose cpコマンドで実行します。

// ホストOS上のファイルをコンテナにコピーする場合
docker compose cp [ホストOS上のファイルパス] [コンテナ名]:[コンテナ内のファイルパス]
// コンテナ上のファイルをホストOSにコピーする場合
docker compose cp [コンテナ名]:[コンテナ内のファイルパス] [ホストOS上のファイルパス]

これらのコマンドは、ホストOS上で作成したプログラムをコンテナ上に反映させたい場合や、コンテナ内で生成されたファイルをホストOS上で確認したい場合などで利用します。

コンテナ内でコマンド実行

コンテナ内のディレクトリ確認やソフトウェアインストールを行いたい場合、普通のPC上で実施するようにコンテナ内でコマンド実行をする必要があります。
コンテナ内でコマンドを実行するためには2通りの方法があります。
docker compose execコマンドを利用する方法とコンテナ内でシェルを立ち上げる方法です。

docker compose execによるコマンド実行

まず一つ目の方法として、docker compose execコマンドを利用する方法があります。
以下のようにコマンドプロンプトで実行することで、コンテナ内でコマンド実行をできます。

docker compose exec [コンテナ名] [コンテナ内で実行したいコマンド]

コンテナ内でシェルを立ち上げる

2つ目の方法として、コンテナ内でシェルを立ち上げそこでコマンド実行を行います。
docker compose execコマンドでは1つずつしかコマンドを実行できませんでしたが、シェルを立ち上げればコンテナに対して連続でコマンドを実行することができます。
コマンドプロンプトで以下のように実行することで、シェルを立ち上げることができます。

docker compose exec -it [コンテナ名] [立ち上げたいシェル]
[立ち上げたいシェル]の箇所にはシェルの種類によって変わります。
主要なシェルと対応するコマンドは以下の通りです。

シェルの種類コマンド
Bash/bin/bash
Sh(Bourne shell)/bin/sh
Zsh/bin/zsh
Ash (Almquist shell)/bin/ash

実際にシェルを立ち上げてみます。
前回の記事で作成したMariaDBのコンテナを利用します。
まずはホストOSでmariadb --versionコマンドを実行してみましょう。

ホストOS上にはMariaDBをインストールしていないのでnot foundとなります。
では、docker compose exec -it db /bin/bashでBashを立ち上げましょう。

画像のような表示になっていれば成功です。
ではコンテナ内のシェルで先ほどのmariadb --versionコマンドを実行してみましょう。

今度はnot foundではなく、コンテナ内にインストールされているMariaDBのバージョンが表示されました。
この挙動からもコンテナがホストOSとは隔離された仮想空間であるということがわかります。
では最後にexitコマンドでシェルを落とし、ホストOSに戻りましょう。

シェルを使った操作の場合、このような一連の流れでコンテナに対するコマンド操作を実行します。
一見すると何をしているかわからないですが、一つ一つのコマンドの意味を理解しながら見ていくと簡単ですね。

まとめ

今回は、コンテナにまつわるコマンド操作について2つのトピックについてまとめてみました。

コンテナとホストOSの間でのファイルのやり取り

  • docker compose cpコマンドを利用する。
  • ホストOSとコンテナ内のそれぞれのファイルパスを指定してコピーを行う。

コンテナ上でコマンド実行

  • docker compose exec [コンテナ名] [実行コマンド]でコマンドを単発で実行できる。
  • docker compose exec -it [コンテナ名] [立ち上げるシェル]でコンテナ上のシェルを立ち上げることができる。

どちらにも共通して言えることは、コンテナとホストOSが分離された空間であり、どちらからどちらに操作を行なっているのか、どちらの環境にいるのかなどを正確に捉えることが重要だということです。
そのためにもコマンドの意味を正しく理解していく必要があります。
ここまで読んでいただきありがとうございました。
それでは、また。