Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

コンテナ

Docker Desktop環境で「docker-compose」コマンドを使い、コンテナを操作する方法

Docker Desktopを使っている環境で、「docker-compose」コマンドを使って指定したコンテナに入って操作する方法の解説

Docker Desktopを使っている場合は、マウスなどを使ってコンテナに対して様々な操作が可能です。一方で、ネット上のDockerの解説ページはその大部分が「docker-compose」コマンドを使った解説になっていると思います。

この点Dockerを初めて使う人は、Docker Desktopでは「docker-compose」コマンドは使えないのか?どうすればいいの?と最初は混乱してしまうこともあると思います。

そこで今回は、Docker Desktopアプリを使っていた場合でも、コマンドプロンプトやターミナル上で「docker-compose」コマンドを使ってコンテナを操作できること、そしてその基本的な方法を説明したいと思います。

そもそもDocker Desktopとは?

さてDocker Desktopアプリには、次の機能が含まれています。

  • Docker Engine
  • Docker CLI クライアント
  • Docker Compose
  • Docker Content Trust
  • Kubernetes
  • Credential Helper

ここで3番目にDocker Composeという機能があります。乱暴にいってしまえば、この機能が含まれているので、Docker Desktopでも「docker-compose」コマンドが使えます。

さて以下の説明では、データベースであるMySQLのコンテナを使う場合を例として、まずはDocker Desktopから操作する方法、そして次に「docker-compose」コマンドを使って操作する方法を解説します。とても簡易の解説ではありますが、Dockerのコンテナ操作のイメージはつかんでもらえると思います。

Docker Desktopアプリから操作する方法

Docker Desktopを使っている場合はコンテナ一覧のページが表示されている画面を見ます。

今回はMySQLのコンテナ(docker-compose.yml上のサービス名はdb、コンテナ名はmysql-container)を操作したいので、次の画像のようにそのコンテナをクリックします。

Docker Desktopとコンテナ

すると、次のような画面となり、そこに項目「exec」があるので、それをクリックします。

Docker Desktopとコンテナ

そうすると次のような画面になります。

Docker Desktopとコンテナ

これはMySQLコンテナですので、MySQLコマンドを入力できる状態になっています。たとえば、そのコンテナで使われているMySQLのバージョンを確認してみましょう。

mysql --version

というコマンドを入力して実行します。次のような結果となります。

Docker Desktopとコンテナ

では次に、MySQLサーバーにログインしてみましょう。このログインに成功すると、MySQLを操作できるようになり、新しいデータベースの作成や、新規ユーザーの登録などが様々なことができるようになります。

便宜上、ユーザー名は「root」、パスワードは「root」を使います。これらはMySQLによって最初から自動的に設定されています。

mysql -u root -p

として実行すると、

Enter password:

このようにパスワード入力が促されます。そこで正しくrootと入力して実行すると、次のような画面となります。

Docker Desktopとコンテナ

一番下の表示が、

mysql>

という表示になっている点に注目してください。

では次に、新しいデータベースを作ってみましょう。データベース名は「django_db」とします。次のコマンドを「mysql>」のあとに続けます。

create databse django_db;

行末の「;」を忘れないようにしてください。実行して成功すると、

Query OK, 1 row affected (0.37 sec)

などと表示されます。

ではこの時点で作成されているデータベース一覧をチェックしてみましょう。

show databases;

私の場合は次のような結果となりました。

Docker Desktopとコンテナ

先ほど作成したdjango_dbが存在していることが確認できました。

この「mysql>」から元の状態に戻るためには、

exit;

と実行すれば、

Bye
sh-4.4#

となり、もとの状態へ戻れます。

Docker Desktop上ではこのように、

操作したいコンテナを選ぶ
↓
「exec」項目に入る
↓
そのコンテナにふさわしいコマンドを使って操作する

という流れになります。今回はMySQLのコンテナでしたのでMySQLコマンドを使った解説となりました。PythonのコンテナならばPythonコマンドを、NginxコンテナならばNginxコマンドを使います。

それでは次にDocker Desktopを使わないでコマンドプロンプト(またはPowerShell)やターミナル上で「docker-compose」コマンドを使ったコンテナの操作方法を解説します。なお、あるフォルダ(またはディレクトリ)にdocker-compose.ymlが作られているのを前提とします。

ターミナルなるコマンドプロンプトからコマンドで操作する場合

上述のようにDocker Desktopアプリから操作しても何も問題ないのですが、WindowsのコマンドプロンプトやPowerShellあるいはMacのターミナルからコマンドで操作する方法もできるようになるとDockerそのものの理解が深まりますし、Docker Desktopアプリがない環境での応用力(?)もつくと思います。

そこで次にDocker Desktopアプリを導入していたとしても、それを使わないでコマンドプロンプトやターミナル上でDockerのコンテナを操作する方法を説明します。

上述のようにMySQLのコンテナを操作する場合を例にします。

docker-compose.ymlのあるフォルダ/ディレクトリへ移動

まずコマンドプロンプト/PowerShellまたはターミナル上で、「cd」コマンドを使ってみなさんのPC内部にある、docker-compose.ymlが存在しているフォルダ/ディレクトリへ移動してください。

たとえば、Windowsにおいてdocker-compose.ymlがつぎのような場所にあるならば、

C:\Users\hogehoge\Dropbox\MyProjects\Django_on_XserverVPS_Developing\XserverVPS_Django\.devcontainer\docker\docker-compose.yml
cd C:\Users\hogehoge\Dropbox\MyProjects\Django_on_XserverVPS_Developing\XserverVPS_Django\.devcontainer\docker

という感じです。

コンテナを指定し、docker-composeコマンドを使う

では、そのフォルダ/ディクトリに入った状態のままで、

docker-compose exec db bash

と入力し実行します。

「exec」というのは上のDocker Desktopと使った場合でも項目「exec」として登場したものですね。また、「db」は、docker-compose.ymlにおいてMySQLコンテナのサービス名として設定されているものです。

さて実行結果は、(私の場合は)このような表示となります。

bash-4.4#

これは、上述Docker Desktopを使った場合における、

Docker Desktopとコンテナ

この画面と同じような表示ですね。

さてあとはDocker Desktopを使った場合とやることは同じです。MySQLにログインしてみましょう。

docker-compose command

こちらもDocker Desktop上で行った場合と同じ結果ですね。

データベース一覧も確認してみましょう。

docker-compose command

上で作成したdjango_dbの存在がきちんと表示されています。

このように、「exit;」2回続けて実行すると、コンテナから抜け出して、コマンドプロンプトやターミナル上でdocker-compose.ymlのあるフォルダ/ディレクトリに入っている状態に戻れます。

以上のようにDocker Desktopを使っている場合でも、あえてそれを使わずに「docker-compose」コマンドをコマンドプロンプトやターミナルで入力して、指定したコンテナ内部に入ってコンテナを操作することができます。

Dockerはどうしてもわかりにくいので動画による学習がとても役立ちます。次のような動画がおすすめです。