サイトアイコン APPSWINGBY Developers Blog

Dockerでsystemctlを使えるようにする

最近は、もっぱらローカル環境での開発もdockerのコンテナを使って開発することが多いのですが、デプロイ先でコンテナではなく、Linuxサーバ(AWS EC2)にデーモンとして立ち上がるプログラムの起動スクリプトの検証をしたいなと思った際に調べたので、その内容についてまとめようと思います。

デーモン化する

Ubuntu 18.04のOSを使ったコンテナを利用していたので、systemd を使ったデーモン化について記載します。コンテナ化されてないときのUbuntuでは、initプロセスがPID=1として起動されるので、はじめにそのあたりがコンテナ内でどうなっているのか確認してみます。

普通に立ち上げたときのプロセスIDを確認する

Ubuntu 18.04のコンテナをdockerで起動した場合には、下記のようにPID=1がbashとして起動されています。

Ubuntuは通常だと「/sbin/init」では起動するのですが、今回は、「/bin/bash」で起動しているという状況です。Initとプロセスが起動していないので、Initプロセスを起動できるようにします。

Initプロセスを起動できるようにする

また、Ubuntuは通常だと「/sbin/init」では起動せず、「/bin/bash」で起動します。init、systemdを利用できるようにしたカスタムコンテナを生成します。下記にDockerfile例を示します。

 
FROM ubuntu:18.04

# setup requirements packages
RUN apt update -y && \
    apt install -y init && \
    apt install -y systemd

ビルドしたコンテナを起動する。

docker-compose.ymlファイルは、下記のようにします。

 
version: '3'
 
services:
  test:
    build:
      context: ./
      dockerfile: Dockerfile # 上で作ったDockerfile
    tty: true
    command: /sbin/init 
    privileged: true
    ports:
    - 8000:8000

buildして、立ち上げる

 
$ docker-compose build
$ docker-compose up -d
$ docker-compose exec test sh

プロセスを確認する。

まとめ

systemd系を使う場合のデーモン化向けのスクリプトの確認をしたい場合でも、コンテナを使って簡単に検証環境が作れるので、ぜひ利用してみてください。

モバイルバージョンを終了