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を使えるまでの手順は以上となります。
Dockerを構築するならVPSがおすすめです。
エンジニアのオンライン学習
ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。
おすすめオンライン教材 | |
自宅で学習ができるオンラインスクール | |
ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。
コメントを残す