【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」コマンドが実行できるようにします。

本環境はConoHaVPSを使用しています。

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を使えるまでの手順は以上となります。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

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

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

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