はじめに
Dockerコンテナを実際に動かして確認しながら、動いているコンテナの様子をざっくり眺めていきます。
前回はコンテナを作ったり壊したりしました -> さわっておぼえるDocker入門🐳#1
目的
Dockerを触りながら、コンテナの様子を確認したり、コンテナ内のシェルを使用できるようになる
今回は、下記の操作を行います。
- コンテナのメタデータを確認
- コンテナのステータスを確認
- コンテナのシェルにアクセス
- ubuntuコンテナにパッケージをインストール
- コンテナのプロセスを確認
環境
- macOS Mojave 10.14.6
- Docker engine 19.03.5
まずはDockerのインストール
コンテナをアレコレしてみる
まずはコンテナを起動させてみる
以下のコマンドは、nginxのコンテナを起動します。
-
-d
オプションによって、バックグラウンドでコンテナが起動します。 -
--name
オプションによって、nginx
と名付けました。
docker container run -d --name nginx nginx
さらに、MySQLのコンテナも起動します。
MySQLサーバーには、rootパスワードが必要なので-e
オプションを使用してランダムなパスワードを設定しています。
-e
はenvironmentオプションです。
docker container run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql
これで、nginxとmysqlの2つのコンテナが起動しました。
container inspect
指定したコンテナのメタデータを取得します。
以下のコマンドを実行すると、mysqlコンテナのメタデータがJSON形式で表示されます。つまりコンフィグです。
このメタデータを確認することで、どんな設定でこのコンテナが作られているのかを知ることができます。
docker container inspect mysql
container stats
メタデータではなく、現在の様子を知りたい場合は以下のようにstats
コマンドを使用します。
コマンドを実行することで、CPU使用率やRAMの占有率など、リアルタイムのデータが表示されます。
docker container stats mysql
コンテナ内のシェルにアクセスする
立ち上げたコンテナの中で作業するには、シェルにアクセスする必要があるかもしれません。
その場合は-it
オプションを使用します。SSHは必要ありません。
bash
を指定しbashシェルが使えるようにします。
docker container run -it --name proxy nginx bash
# root@96d294dee3b4:/#
これで、コンテナ内でファイルをいじったり、パッケージをインストールしたりすることができます。
コンテナの「コマンド」が変化していることを確認する
コンテナの一覧を確認してみると-it
オプション付きで立ち上げたコンテナは、
COMMAND
の値が変化しています。
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96d294dee3b4 nginx "bash" 4 minutes ago Exited (0) 12 seconds ago proxy
d43f74bd3fea mysql "docker-entrypoint.s…" 20 minutes ago Up 20 minutes 3306/tcp, 33060/tcp mysql
40a021da02c9 nginx "nginx -g 'daemon of…" 22 minutes ago Up 22 minutes 80/tcp nginx
シェルを使用するために、デフォルトで使用するプログラムを「bash」に指定したので、COMMAND
が書き換わっています。
したがって、シェルからexit
した場合には、コンテナは停止状態になります。
コマンドで指定したプログラムが停止した時には、コンテナは停止するからです。
Ubuntuを起動してみる
以下のコマンドでubuntuイメージからコンテナを起動し、シェルにアクセスします。
docker container run -it --name ubuntu ubuntu
ubuntuはapt
というパッケージマネージャを使用してパッケージのダウンロードを行うことができます
まずはパッケージリストを更新します。
apt-get update
さらに、curl
という Httpリクエストを行うパッケージをインストールしてみます。
apt-get install -y curl
試しにGoogle.comにHttpリクエストを送信してみると、
レスポンスがちゃんと返ってきます。
curl google.com
# <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
# <TITLE>301 Moved</TITLE></HEAD><BODY>
# <H1>301 Moved</H1>
# The document has moved
# <A HREF="http://www.google.com/">here</A>.
# </BODY></HTML>
ubuntuコンテナを停止する
先ほどと同じくexit
することで自動的にコンテナも停止します。
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a881f1a18c6 ubuntu "/bin/bash" 12 minutes ago Exited (0) 2 seconds ago ubuntu
96d294dee3b4 nginx "bash" 23 minutes ago Exited (0) 19 minutes ago proxy
d43f74bd3fea mysql "docker-entrypoint.s…" 39 minutes ago Up 39 minutes 3306/tcp, 33060/tcp mysql
40a021da02c9 nginx "nginx -g 'daemon of…" 41 minutes ago Up 41 minutes 80/tcp nginx
ubuntuのCOMMAND
をみると、デフォルトで起動するプログラムがbash
であることを確認できます。
そのため、特に何も設定しなくてもbashが起動しました。
さらにbashからexitすることで、コンテナも停止しました。
コンテナを再起動する
もう一度このコンテナに入りたい場合は、container start
を使用します。
container run
だと、新しいコンテナが起動してしまうので、先ほどダウンロードしたcurlはありません。
run
の時は-it
だったところが-ai
になっていることに注意です。
docker container start -ai ubuntu
バックグラウンド起動中のコンテナに入る
では、バックグランドで起動しているコンテナ内のシェルにアクセスしたい場合はどうすれば良いでしょうか。
container exec
コマンドを使用します。
今回は先ほどバックグラウンドで起動したmysqlコンテナを使用します。
bashシェルを指定することを忘れないでください。
docker container exec -it mysql bash
コンテナのプロセスを確認する
この時、mysqlコンテナ内ではどのようなプロセスが動いているのでしょうか。
ps aux
コマンドを使用することで、起動中のプロセス一覧を確認できます。
まずはmysqlコンテナがps
コマンドを使用できるよう、必要なパッケージを更新&インストールします。
最初にパッケージの更新。
apt-get update
続いて、パッケージをインストールします。
apy-get install -y procps
これでps
コマンドが利用可能です。
早速、mysqlコンテナのプロセスを確認してみます。
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 1 0.9 20.0 2135592 408776 ? Ssl 13:26 0:32 mysqld
root 197 0.0 0.1 3868 3244 pts/0 Ss 14:15 0:00 bash
root 602 0.0 0.1 7640 2724 pts/0 R+ 14:20 0:00 ps aux
- まず一番上、mysqlのデーモンがバックグランドで起動中です。
- 次に真ん中、これは今使っているbashのプロセスです。
- 最後に、たった今打ち込んだ
ps aux
のプロセスが表示されています。
今回は、exit
してもコンテナは停止しません。
なぜなら、mysqlのデーモンがバックグラウンドで動いているからです。
まとめ
- コンテナのメタデータを確認
- コンテナのステータスを確認
- コンテナのシェルにアクセス
- ubuntuコンテナにパッケージをインストール
- コンテナのプロセスを確認
上記を実際に動かして確認しながら、動いているコンテナの様子をざっくり眺めました。🐳