たくさんのプログラムを動かす

Dockerは「アプリケーション・コンテナ」であり、プロセス一つ(orアプリケーション一つ)動かすのが基本だが、まるごとOSのようにたくさんのプログラム(プロセス)を起動する例もある。

まず、複数のコマンドを実行する方法から。


コンテナ起動時にコマンドを複数渡す

コンテナで複数コマンド(ソフト)を起動するため、bash -c "コマンド1; コマンド2;.."を引数に使う。

# whoami,sleep、psコマンドの実行
# \で改行をエスケープしている
docker run --rm -it --name test centos:7 \
  bash -c " \
    whoami; \
    sleep 3s & \
    ps -A --format pid,user,args,etime; \
  "
root
  PID USER     COMMAND                         ELAPSED
    1 root     bash -c      whoami;     sl       00:01
    8 root     sleep 3s                          00:00
    9 root     ps -A --format pid,user,arg       00:00

このように、BashシェルがプロセスID1で、他のコマンドが別プロセスで動く。


後からdocker execでプロセスを追加

起動済みのコンテナにdocker execでプロセスを追加することもできる。

# バックグラウンド・モード
# sleep365日
docker run --rm -dit --name test centos:7 sleep 365d 

# プロセス追加: sleep24時間
docker exec -dit test sleep 24h

# フォアグラウンド・モード
# プロセス確認
docker exec -it test ps -A --format pid,user,args,etime
  PID USER     COMMAND                         ELAPSED
    1 root     sleep 365d                        00:49
    6 root     sleep 24h                         00:07
   12 root     ps -A --format pid,user,arg       00:00

# コンテナ停止・削除
docker stop test

Ubuntuデスクトップを起動するコンテナ例

以下はUbuntu(16.04 LXDE)とVNCサーバが動くイメージの例で、Ubuntuデスクトップをブラウザから操作できる。イメージサイズは1.1GB程度。(Docker公式イメージではない)

dorowu/ubuntu-desktop-lxde-vnc

# バックグラウンド・モード
docker run --rm -dit --name test -p 6080:80 dorowu/ubuntu-desktop-lxde-vnc

これだけで、ブラウザでhttp://127.0.0.1:6080/にアクセスできる。

下記のように、たくさんのプロセスが動いているのがわかる。

# プロセス確認
docker exec -it test ps -A --format pid,ppid,user,args,etime
  PID  PPID USER     COMMAND                         ELAPSED
    1     0 root     /bin/tini -- /usr/bin/super       01:01
   13     1 root     /usr/bin/python /usr/bin/su       00:58
   16    13 root     nginx: master process nginx       00:56
   17    13 root     python /usr/local/lib/web/b       00:56
   18    13 root     bash /usr/local/lib/web/fro       00:56
   22    13 root     /usr/bin/Xvfb :1 -screen 0        00:56
   23    13 root     x11vnc -display :1 -xkb -fo       00:56
   25    16 www-data nginx: worker process             00:56
   40    18 root     python /usr/local/lib/web/f       00:56
   44    13 root     /usr/bin/openbox                  00:55
   45    13 root     /usr/bin/lxpanel --profile        00:55
   47    13 root     /usr/bin/pcmanfm --desktop        00:55
   58     1 root     /usr/lib/menu-cache/menu-ca       00:55
   80     0 root     ps -A --format pid,ppid,use       00:00

# コンテナ停止・削除
docker stop test