【Docker】Ubuntuコンテナで「systemctl」を使うために「/sbin/init」で起動する方法


DockerでUbuntuコンテナを構築したのですが、DockerはデフォルトでLinux系コンテナに対して制限がかかっているため、「systemctl」などのシステム系のコマンドが使えなかったり、動作しません。

また、Ubuntuは通常だと「/sbin/init」では起動せず、「/bin/bash」で起動します。
この状態だと、以下のように「systemd」が使用するsystemID「1」が「/bin/bash」で使用されており、動作しません。

root@25ea4973ebfb:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   3744  2916 pts/0    Ss+  02:30   0:00 /bin/bash
root         9  0.1  0.1   3744  2964 pts/1    Ss   02:30   0:00 /bin/bash
root        17  0.0  0.1   5472  2232 pts/1    R+   02:30   0:00 ps -aux

この状態だと、Ubuntuコンテナを使うにも色々と制約があるので、「/sbin/init」を使用できるようにし、「systemctl」コマンドが実行できるようにします。

Ubuntuコンテナを「/sbin/init」で起動し、「systemctl」コマンドを使用できるようにする手順

Ubuntuコンテナで「/sbin/init」で起動する方法は、「docker comit」コマンドを使用しカスタマイズしたイメージを「/sbin/init」で起動する方法となります。

まずは以下のように通常にUbuntuコンテナを起動します。
システムデバイスにアクセスできるように「–privileged」オプションを必ず付けるようにしましょう。
「-p」オプションはコンテナにアクセスするために使用するポートを書いていますが、カスタマイズするコンテナでは使用しなくても大丈夫です。

$ docker run -itd --privileged -p 3222:22 -p 13389:3389 -p 5901:5901 --name ubuntu --hostname ubuntu:latest  ubuntu
6a77e56ccb22a872923106af7fe3a4c698cdb857954e79272def334fea1452d1

コンテナが正常に起動すると以下のように表示されます。

$ docker ps
CONTAINER ID   IMAGE                        COMMAND        CREATED          STATUS         PORTS                                                                   NAMES
6a77e56ccb22   ubuntu                       "/bin/bash"    13 seconds ago   Up 8 seconds   0.0.0.0:5901->5901/tcp, 0.0.0.0:3222->22/tcp, 0.0.0.0:13389->3389/tcp   ubuntu

Ubuntuコンテナをカスタマイズする

次に起動したUbuntuコンテナにアクセスし、コンテナイメージをカスタマイズします。

ubuntuコンテナにアクセス

$ docker exec -it ubuntu /bin/bash
root@ubuntu:latest:/# 

アクセス後、Ubuntuのアップデート実施を実施します。

root@ubuntu:latest:/# apt -y update
root@ubuntu:latest:/# apt -y upgrade

「/sbin/init」が使用できるように「init」のインストールと、「systemctl」をインストールします。
インストール後、「exit」でコンテナから抜けます。

root@ubuntu:latest:/# apt-get install -y init
root@ubuntu:latest:/# apt-get install -y systemctl
root@ubuntu:latest:/# exit

※追記
こちらもインストール

root@ubuntu:latest:/# apt-get install -y systemd


「docker commit」コマンドでカスタマイズした新しい「Ubuntu」イメージを作成

次にカスタマイズしたUbuntuコンテナから、新規にUbuntuイメージを作成します。

対象のコンテナのIDを確認します。
今回のコンテナIDは「6a77e56ccb22」となります。

$ docker ps      
CONTAINER ID   IMAGE                        COMMAND        CREATED         STATUS         PORTS                                                                   NAMES
6a77e56ccb22   ubuntu                       "/bin/bash"    6 minutes ago   Up 6 minutes   0.0.0.0:5901->5901/tcp, 0.0.0.0:3222->22/tcp, 0.0.0.0:13389->3389/tcp   ubuntu

「docker commit」コマンドを使用して新規にイメージ「ubuntu-test:test」を作成します。

$ docker commit  6a77e56ccb22 ubuntu-test:test 
sha256:1800d0ff0c096c93149a71538f9a53d44607f1888dafb726c21da5e2df71b3c7

新規に作成したdockerイメージから新規に「sbin/init」でコンテナを起動

上記で新規に作成したイメージから、「sbin/init」でDockerコンテナを起動します。

$ docker run -itd --privileged -p 3222:22 -p 13389:3389 -p 5901:5901 --name ubuntu-test --hostname ubuntu-test  ubuntu-test:test /sbin/init 
7386e5d47ad4247450b95b36ec26db35847b885c551800d62d7186f74756a0df

起動した新規のコンテナにアクセスし、systemdが使用できたことが確認できます。

$docker exec -it ubuntu-test /bin/bash
root@ubuntu-test:/# ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.5 167660 10248 ?        Ss   May08   0:12 /sbin/init
root          23  0.0  0.6  45384 12612 ?        S<s  May08   0:00 /lib/systemd/systemd-journald
systemd+      37  0.0  0.4  20968  8468 ?        Ss   May08   0:00 /lib/systemd/systemd-resolved
systemd+      38  0.0  0.3  89944  6192 ?        Ssl  May08   0:03 /lib/systemd/systemd-timesyncd
message+      41  0.0  0.2   8592  4564 ?        Ss   May08   0:09 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --sys
root          43  0.0  0.8  26092 16308 ?        Ss   May08   0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root          45  0.0  0.3  16032  6212 ?        Ss   May08   0:04 /lib/systemd/systemd-logind
root          48  0.0  0.0   2348  1412 tty1     Ss+  May08   0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root          54  0.0  0.1   3876  3088 pts/1    Ss   May08   0:00 /bin/bash
root       20219  0.0  0.2 232944  6012 ?        Ssl  May08   0:00 /usr/lib/policykit-1/polkitd --no-debug
root       22485  0.0  0.1   6408  2700 pts/1    R+   11:23   0:00 ps -aux

「/sbin/init」でUbuntuコンテナを起動し、systemdを使えるまでの手順は以上となります。


関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUTこの記事をかいた人

blank

インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!