インストール - Docker CE
概要
Dockerとは、軽量なコンテナ型のアプリケーション実行環境である。dotCloud社(現Docker社)が開発し、2013年にオープンソースのプロジェクトとして公開された。
ソフトウェアの高速な配布・実行、容易なイメージのカスタマイズ、導入運用の手軽さ、豊富なプレビルドイメージの提供などの理由により、当初はソフトウェアの開発やテスト段階における利用が多かったが、
現在ではパブリッククラウドからオンプレミスシステムまで、さまざまなシーンで急速に普及しつつある。
コンテナは、Linuxの通常のプロセスとほぼ同じものであるが、利用できる名前空間やリソースが他のプロセスやコンテナからは隔離され、それぞれ固有の設定を持てるようになっている。
そのため、コンテナ内のアプリケーションから見ると、独立したコンピュータ上で動作しているように振る舞う。
コンテナを管理するコストは、プロセスを管理するコストとほぼ変わらず、仮想マシンを管理するコストと比較すると非常に軽い。
- 名前空間の隔離機能
- ファイルシステムやコンピュータ名、ユーザー名(ユーザーID)、グループ名(グループID)、プロセスID、ネットワーク機能などを、コンテナごとに独自に設定できるようにする機能。
- リソースの隔離機能
- CPUやメモリ、ディスク入出力など、コンテナ内で利用するリソースを他のコンテナから隔離したり、設定に基づいて振り分けたりする機能。
様々なDockerイメージは下記のWebサイトよりダウンロードできる。
https://hub.docker.com
Docker公式サイトからバイナリをインストールする
サポート外のプラットフォーム用の手順として、バイナリインストールの手順が以下にある。
Install Docker CE from binaries | Docker Documentation
最新版をインスールする場合はこの手順が推奨される。
バイナリは以下のWebサイトから選択する。
https://download.docker.com/linux/static/stable/x86_64/
(stable以外のedgeやtestは好みで選択する)
wget https://download.docker.com/linux/static/stable/x86_64/docker-<バージョン>.tgz tar xf docker-<バージョン>.tgz sudo cp docker-<バージョン>/* /usr/local/bin
正常にインストールできたか確認する。
docker version # 結果 Client: Version: 18.06.3-ce API version: **** Go version: ******* Git commit: ******* Built: ************** OS/Arch: linux/amd64 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
次に、systemdユニットファイルを作成する。
パッケージ管理システムを使用せずにバイナリファイルをインストールする場合、Dockerとsystemdを手動で統合する。
以下のGitHubにアクセスして、docker.serviceファイルとdocker.socketファイルを/etc/systemd/systemディレクトリに配置する。
https://github.com/moby/moby/tree/master/contrib/init/systemd
リポジトリを追加してインストール
Dockerのリポジトリを追加してインストールする場合は、こちらの手順を用いる。
ただし、リポジトリに含まれるDocker CEの更新が遅い場合があるので注意すること。
RHELの場合
まず、Docker CEをインストールするために、依存関係のライブラリをインストールする。
sudo dnf install yum-utils device-mapper-persistent-data lvm2
続いて、Docker CEをインストールする。
sudo dnf install docker-ce
※注意
Docker CEの最新バージョンを使用する場合は、標準設定では無効になっているリポジトリを有効にする必要がある。
sudo yum-config-manager --enable docker-ce-edge sudo yum-config-manager --enable docker-ce-test
SUSEの場合
まず、Dockerのリポジトリを追加するため、以下のファイルを任意のエディタで作成する。
sudo vi /etc/zypp/repos.d/docker.repo # 追記 [Virtualization_containers] name=Virtualization:containers (SLE and openSUSE 15) type=rpm-md baseurl=http://download.opensuse.org/repositories/Virtualization:/containers/SLE_xx_SPx/ # SLEの場合 baseurl=http://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_Leap_xx.x/ # openSUSEの場合 gpgcheck=1 gpgkey=http://download.opensuse.org/repositories/Virtualization:/containers/SLE_xx_SPx/repodata/repomd.xml.key # SLEの場合 gpgkey=http://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_Leap_xx.x/repodata/repomd.xml.key # openSUSEの場合 enabled=1
ファイル作成後、リポジトリの更新とdockerのインストールを行う。
sudo zypper --gpg-auto-import-keys refresh sudo zypper install docker docker-compose yast2-docker
または、SLEの場合は、以下の手順を行うこともできる。
- YaSTを起動して、[ソフトウェア] - [ソフトウェアリポジトリ]を選択する。
- [ソフトウェアリポジトリ]画面から、[追加]ボタンを押下する。
- [Extensions and Module from Registration Server]を選択して、[次へ]ボタンを押下する。
- [利用可能なextensionsとmodules]から、[Container Module]を選択して、[次へ]ボタンを押下する。
この時、containerモジュールとリポジトリがシステムに追加される。 - Subscription Management Toolを使用している場合、SMTサーバのリポジトリリストを更新する。
または、以下のコマンドを実行する。sudo SUSEConnect -p sle-module-containers/15/x86_64 -r
- または
sudo SUSEConnect -p sle-module-containers/15/x86_64
Docker Rootlessのインストール
Docker Rootless (ルートレスモード) とは
Docker Rootless (ルートレスモード)は、非スーパーユーザとしてDockerデーモンを実行することができる。
ルートレスモードでは、一般ユーザとしてDockerデーモンとコンテナを実行して、デーモンとコンテナランタイムの潜在的な脆弱性を軽減することができる。
ルートレスモードは、前提条件さえ満たしていれば、Dockerデーモンのインストール中であってもroot権限を必要としない。
Docker-Rootlessの詳細を知りたい場合は、Docker-Rootlessの公式ドキュメントを参照すること。
どのように動作するか
ルートレスモードは、Dockerデーモンとコンテナをユーザネーム空間内で実行する。
これは、userns-remapモードとよく似ているが、
userns-remapモードではデーモン自体がスーパーユーザ権限で実行されるのに対して、ルートレスモードではデーモンとコンテナの両方が一般ユーザ権限として実行される。
ルートレスモードでは、SETUIDビットやファイル機能を持つバイナリを使用しない。
ただし、newuidmapとnewgidmapは、ユーザ名前空間で複数のUID/GIDを使用できるようにするために必要である。
前提条件
ホストにnewuidmapとnewgidmapをインストールする必要がある。
これらのコマンドは、ほぼ全てのLinuxディストリビューションのuidmapパッケージで提供されている。
/etc/subuidおよび/etc/subgidには、ユーザの下位UID / GIDが少なくとも65536個含まれていなければならない。
# 実行ユーザIDの確認 id -u # 実行ユーザ名の確認 whoami # 実行ユーザのSubUIDの確認 grep ^$(whoami): /etc/subuid # 実行ユーザのSubGIDの確認 grep ^$(whoami): /etc/subgid
また、fuse-overlayfsパッケージのインストールを推奨する。
# RHEL sudo dnf install fuse-overlayfs iptables # SUSE sudo zypper install fuse-overlayfs sudo modprobe ip_tables iptable_mangle iptable_nat iptable_filter
制限事項
- 以下のストレージドライバのみがサポートされている。
- overlay2 (Linuxカーネル 5.11以降)
- fuse-overlayfs (Linuxカーネル 4.18以降、かつ、fuse-overlayfsがインストールされている場合のみ)
- btrfs (Linuxカーネル4.18以降で動作している、または、~/.local/share/dockerがuser_subvol_rm_allowedマウントオプションでマウントされている場合のみ)
- vfs
- Cgroupは、cgroup v2とsystemdで実行している場合のみサポートされる。
- 以下の機能はサポートされない。
- AppArmor
- チェックポイント
- オーバーレイネットワーク
- SCTPポートの公開
ping
コマンドを使用する場合は、pingパケットのルーティングを参照すること。- 特権TCP / UDPポート (1024番以下のポート) を公開する場合は、特権ポートの公開を参照すること。
docker inspect
コマンドで表示されるIPアドレスは、RootlessKitのネットワーク名前空間内に名前空間が存在する。
これは、IPアドレスがネットワーク名前空間にnsenterせずにホストから到達できないことを意味する。- ホストのネットワーク (
docker run --net=<ホスト名>
) も、RootlessKitの名前空間内に存在する。 - Dockerの"data-root"としてのNFSマウントはサポートされない。
この制限は、ルートレスモード特有のものではない。
Docker Rootlessのインストール
パッケージ管理システムからインストール
# SUSE sudo zypper install docker-rootless-extras
バイナリファイルをダウンロードしてインストール
まず、Docker Rootlessの公式Webサイトにアクセスして、Docker-Rootlessの実行バイナリをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf docker-rootless-extras-<バージョン>.tgz mv docker-rootless-extras-<バージョン> <任意のインストールディレクトリ>
次に、Dockerの公式Webサイトにアクセスして、Dockerの実行バイナリをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf docker-<バージョン>.tgz mv docker-<バージョン>/* <Docker-Rootlessが存在するディレクトリ>
最後に、~/.profileファイル等に、環境変数PATH
を追記する。
vi ~/.profile
# ~/.profileファイル
export PATH="<Docker-Rootlessのインストールディレクトリ>:$PATH"
Docker Rootlessの初期設定
まず、一般ユーザとして、Docker Rootlessデーモンを設定する。
dockerd-rootless-setuptool.sh install
次に、~/.profileファイル等に、環境変数PATH
およびDOCKER_HOST
を追記する。
# ~/.profileファイル
export PATH=<Docker Rootlessのインストールディレクトリ>:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
Docker Rootlessのアンインストール
まず、Dockerデーモンのsystemdサービスを削除する場合、以下に示すコマンドを実行する。
dockerd-rootless-setuptool.sh uninstall
次に、~/.bashrcファイル内の環境変数PATH
とDOCKER_HOST
が追記されている場合は、設定を削除する。
Docker Rootlessのデータディレクトリを削除する場合は、以下に示すコマンドを実行する。
rootlesskit rm -rf ~/.local/share/docker
もし、パッケージ管理システムからdocker-ce-rootless-extrasパッケージをインストールしている場合は削除する。
sudo zypper remove docker-ce-rootless-extras
最後に、Docker Rootlessの実行バイナリを削除する。
cd ~/bin rm -f containerd containerd-shim containerd-shim-runc-v2 ctr \ docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh \ rootlesskit rootlesskit-docker-proxy runc vpnkit
Docker Rootlessの実行
Systemdサービスユニットは、~/.config/systemd/user/docker.serviceとしてインストールされる。
Docker Rootlessを起動する。
systemctl --user start docker
システム起動時にDocker Rootlessデーモンを起動する場合は、Systemdサービスユニットとlingeringを有効にする。
systemctl --user enable docker sudo loginctl enable-linger $(whoami)
※注意
Docker Rootlessをシステム全体(/etc/systemd/system/docker.service)として起動することは、User=ディレクティブを使用してもサポートされていないことに注意する。
クライアントにおいて、ソケットパス、または、CLIコンテキストのいずれかを明示的に指定する必要がある。
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock docker run -d -p 8080:80 nginx
クライアントにおいて、CLIコンテキストを指定する。
docker context use rootless docker run -d -p 8080:80 nginx
特権ポートの公開
ホスト側において、特権ポート (1024番ポート未満) を公開する場合、 Docker Rootless実行バイナリに対してCAP_NET_BIND_SERVICE
を設定する。
sudo setcap cap_net_bind_service=ep <Docker Rootless実行バイナリ>
/etc/sysctl.confファイル、または、/etc/sysctl.dディレクトリ内のファイルにおいて、非特権ポートの開始ポート番号を指定する。
この設定を行うことにより、システム上で使用可能な非特権ポートの範囲を制御できる。
また、ポート番号を上げることにより、特定のセキュリティポリシーに従い、一般ユーザーが使用できるポートの範囲を制限することができる。
# 非特権ポートの開始ポート番号は0番ポート以降となる # つまり、全てのポートが非特権ポートとなる net.ipv4.ip_unprivileged_port_start=0
設定を反映する。
sudo sysctl -p または sudo sysctl --system
注意
DockerとDocker Rootlessの共存
システム全体のDockerデーモンが既に起動している場合は、無効にする必要がある。
sudo systemctl stop docker.service docker.socket sudo systemctl disable docker.service docker.socket
ディレクトリパス
Docker Rootlessソケットのパスは、$XDG_RUNTIME_DIR/docker.sockに設定されている。
(環境変数XDG_RUNTIME_DIR
は、通常、/run/user/$UIDディレクトリに設定されている)
データディレクトリは、~/.local/share/dockerに設定されている。
また、データディレクトリはNFS上であってはならない。
デーモン設定ディレクトリは、~/.config/dockerディレクトリに設定されている。
このディレクトリは、クライアントが使用する~/.dockerとは異なることに注意する。
Docker RootlessとPodmanの共存
Docker Rootlessのコマンドを実行する前に、環境変数DOCKER_HOST
を設定する。
# Docker Rootlessのソケットパスは、$XDG_RUNTIME_DIR/docker.sockである export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/docker.sock" # Dockerコマンドの実行 docker ...略
Docker Compose
Docker Composeとは
Docker Composeとは、複数のコンテナを定義し実行するDockerアプリケーションのためのツールである。
YAMLファイルを使用してDockerコンテナの起動やコンテナ起動時の設定等を行うことができる。
Docker Composeのメリットを以下に示す。
- 複数のDockerfileを同時に起動することができる。
- 実行コマンドによる環境の違いを気にせずに済む。(ポートやバージョン等)
- ブリッジネットワークが自動で生成されるため、コンテナ同士の通信が可能となる。
- インフラ構成の可視化やバージョン管理が完結する。
Docker Composeのインストール
Docker ComposeのGithubにアクセスして、Docker Composeの実行バイナリをダウンロードする。
ダウンロードしたファイルに実行権限を付与する。
chmod u+x docker-compose-linux-<アーキテクチャ名>
Docker CompposeをDocker Rootlessのインストールディレクトリに配置する。
mv docker-compose-linux-<アーキテクチャ名> docker-compose mv docker-compose <Docker Rootlessのインストールディレクトリ>
~/.profileファイル等に環境変数PATH
を追記する。
vi ~/.profile
# ~/.profileファイル
export PATH="<Docker Composeのインストールディレクトリ>:$PATH"
Docker Composeのインストールが正常に完了しているかどうかを確認する。
docker-compose version
.ymlファイルに対してdocker-compose up -d
コマンドを実行する時、以下に示すようなエラーは出力される場合がある
これは、Docker Composeがdocker.sockファイルを見つけられない場合に発生する。
WARNING:root:could not open file '/etc/apt/sources.list.d/mongodb-org-5.0.list'
この時、~/.profileファイル等に環境変数DOCKER_HOST
を設定する必要がある。
# ~/.profileファイル
export DOCKER_HOST="unix:///run/user/$UID/docker.sock"
Dockerのアンインストール
Dockerエンジン、Docker CLI、Containerdをアンインストールする。
sudo zypper remove docker-ce docker-ce-cli containerd.io
Dockerイメージ、Dockerコンテナ、ボリューム、Dockerの設定ファイルを削除する。(自動的に削除されない)
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
Docker CEの設定
正常にインストールできたか確認する。
docker version # 結果 Client: Version: 18.06.3-ce API version: **** Go version: ******* Git commit: ******* Built: ************** OS/Arch: linux/amd64 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
インストールが正常に完了したら、Dockerサービスを開始する。
sudo systemctl start docker
また、システムの起動後すぐにDockerを実行する場合、以下のコマンドを実行する。
sudo systemctl enable docker
また、管理者権限不要でDockerを使用する場合は、以下のコマンドを実行する。
sudo usermod -aG docker $(whoami)
Docker CEの動作確認
最後に、Docker CEが正常に動作するか確認する。
これを行うには、以下のように、Dockerのテストイメージを使用する。
sudo docker run --rm hello-world # 出力 Hello from Docker!
上記のメッセージは、インストールが正常に動作していることを示す。
また、上記のメッセージを生成するために、Dockerは以下の手順を実行している。
- Dockerクライアントが、Dockerデーモンに接続される。
- Dockerデーモンが、Docker Hubから"hello-world"イメージをプルする。
- Dockerデーモンが、実行可能な"hello-world"イメージから、現在読み込んでいる出力を生成する新しいコンテナを作成する。
- Dockerデーモンは、Dockerクライアントにその出力をストリーミングして、Dockerクライアントは各自のターミナルに送信する。
設定
接続方法の設定
変数DOCKER_HOST
は、DockerクライアントにDockerデーモンへの接続方法を指示するためのものである。
変数DOCKER_HOST
を設定する場合、docker
コマンドを実行するたびに、ローカルホスト上のソケットではなくHTTP APIを使用する。
未設定の場合は、HTTP APIは無効となる。
例えば、変数DOCKER_HOST
をtcp://localhost:2375
に設定する時、ローカルホスト上のHTTP APIを監視できるが、
通常は、tcp://0.0.0.0:2375
と設定して、リモートサーバ上のAPIを監視する。(この時、ファイアウォールを適切に設定すること)
- 方法 1
- ~/.profileファイル等に、変数
DOCKER_HOST
の設定を追記する。
vi ~/.profile
export DOCKER_HOST='tcp://localhost:2375'
- ~/.profileファイル等に、変数
- 方法 2
- Dockerデーモンの設定ファイルをバックアップする。
sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker_org.service
- Dockerデーモンの設定ファイルにある
execstart
項目を、以下のように編集する。sudo vi /usr/lib/systemd/system/docker.service
- # 編集前
ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS
- # 編集後
ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS -H fd:// -H tcp://localhost:2375
- Dockerデーモンの設定を有効化する。
sudo systemctl daemon-reload
- Dockerデーモンの設定ファイルをバックアップする。
Dockerイメージおよびコンテナの保存先
Dockerのイメージおよびコンテナの保存先は、初期設定では、/var/lib/dockerディレクトリに保存される。
もし、保存先を変更する場合は、以下の手順を実施する。
- /etc/docker/daemon.jsonファイルが存在する場合
- /etc/docker/daemon.jsonファイルに、
data-root
パラメータを追加する。
詳細は、https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file を参照すること。sudo vi /etc/docker/daemon.json
/etc/docker/daemon.jsonファイル
{
# ...略
"data-root": "<Dockerイメージおよびコンテナの保存先のフルパス>",
# ...略
}
- /etc/docker/daemon.jsonファイルに、
- /etc/docker/daemon.jsonファイルが存在しない場合
- Dockerデーモンの設定ファイルをバックアップする。
sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker_org.service
- Dockerデーモンの設定ファイルにある
execstart
項目を、以下のように編集する。sudo vi /usr/lib/systemd/system/docker.service
- # 編集前
ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS
- # 編集後
ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS -g <Dockerの保存先のフルパス>
- Dockerデーモンの設定を有効化する。
sudo systemctl daemon-reload
- Dockerデーモンの設定ファイルをバックアップする。
Dockerイメージの作成
Dockerイメージを作成するには、まず、Dockerfileを記述する必要がある。(Dockerfileはテキストファイルである)
このDockerfileに、インストールするOSやライブラリを指定して、最後に、コンテナで実行したいソフトウェアを指定する。
まず、Dockerfileでは、Base Imageを指定する。(例えば、OSのImageはBase Imageの一種である)
Base Imageは"FROM"で指定する。以下の例は、CentOS 7を指定する例である。
FROM centos:centos7
次に、コンテナが必要とするソフトウェアのインストール等を行う。(各OSのパッケージ管理システムを使用すると簡単である)
CentOSであればyum、Ubuntuならaptを使用する。(yumやapt等のコマンドの実行は、RUNで行う)
RUN yum install xxxx
特定のファイルをコンテナに埋め込むには、"COPY"を使用する。コンテナのどこにファイルを埋め込むのかを指定する。
COPY <File Name> /home/xxx
コンテナが実行するソフトウェアが通信を行う場合、そのソフトウェアは特定のポート番号を使用する。(例えば、Webサーバであれば80番や443番を使用する)
そのポート番号を、ホストOSのポート番号とマッピングする必要がある。
マッピングは、コンテナを実行する際に使用するが、そのためには、コンテナのポート番号を公開する必要がある。
それを行うには、"EXPOSE"を使用する。
EXPOSE 80
コンテナが実行するソフトウェアは、"CMD"で指定する。
CMDは、Dockerfileに1個だけである。諸々の準備の完了後、最後にCMDを指定する。
CMD ["python", "/usr/src/app/app.py"]
以下の例では、pythonがコマンドで、その後は、コマンドに対する引数である。つまり、上記の例は、以下のコマンドをコンテナ上で実行することを意味する。
python /usr/src/app/app.py
Dockerfileが完成したら、イメージを作成する。
-tオプションを使用してイメージの名前を指定する。
その後ろの"."は、Dockerfileがあるディレクトリのパスである。Dockerfileと同じディレクトリであれば、"."でoである。
Dockerfileの内容が正しければ、イメージが作成される。
sudo docker build -t xxxx/yyyy .
プロキシ配下でbuildする場合は、プロキシを設定する必要がある。
例えば、コンテナ上でyumやaptを使用する場合は、プロキシの設定が必要である。
環境変数は、"ENV"で指定できる。
ENV https_proxy "http://proxy.hoge.server:8080/" ENV http_proxy "http:// proxy.hoge.server:8080/"
※注意(yum関連のエラー)
yumのリポジトリが見つからないというエラーが表示される場合がある。
標準のリポジトリではなく、特定のレポジトリを指定する場合、そのリポジトリを記載した設定ファイル(CentOS-Base.repoなど)をCOPYするように、
Dockerfileに記載しておけばよい。
COPY CentOS-Base.repo /etc/yum.repos.d/
yumの処理は、ユーザに対して"yes or no"を訊ねる場合があるので、自動的にyesと答えないと途中でイメージ作成が止まるので、以下のように記述する。
CMD yum update –y
Docker Compose
Docker Hubの登録
- Docker Hubにアクセスして、新規登録またはサインインする。
- サインイン後、右上にあるアバターを選択して、[My Account]を選択する。
- [Security]タブを選択して、[New Access Token]を選択する。
- 任意のトークンの説明を入力する。
これは、トークンのユースケースまたは目的を示すものを入力する。 - アクセス権限を設定する。
アクセス権限は、リポジトリに制限を設定するスコープである。
例えば、読み取りおよび書き込み権限の場合、自動化パイプラインでイメージを構築して、それをリポジトリにプッシュできる。
ただし、リポジトリを削除することはできない。 - [Generate]を選択して、画面に表示されるトークンをコピーして保存する。
この画面を閉じた後は、トークンを取得できなくなることに注意する。
Docker Hubに登録する。
docker login -u <Docker Hubのユーザ名> または docker login --username <Docker Hubのユーザ名> # 直後にパスワードを入力する
正常に登録される場合、~/.docker/config.jsonファイルが自動的に生成される。
詳細を知りたい場合は、Dockerの公式Webサイトを参照すること。
エラー関連
エラー : error checking context: 'no permission 〜'
dockerfileファイルとdocker-compose.ymlファイルのパーミッションを755にする必要がある。
chmod 755 dockerfile docker-compose.yml
Systemdエラー
openSUSEコンテナをDockerコンテナとして動作する時、以下のようなエラーが出力されてsystemdが起動できない。
Failed to connect to bus: No such file or directory.
これは、Dockerコンテナを実行する時、initシステムを実行していないからである。
systemctl
コマンドは、dbusを介してsystemdと通信するプロセスである。
openSUSEコンテナでは、dbusとsysvinitがインストールされていないため(dbusやsystemdが動作していない)、systemctl
コマンドは失敗する。
Dockerコンテナでsystemctl
を実行するには、その依存関係をインストールして、特殊なコマンドを実行する必要がある。
dockerfileを作成および使用して解決する手順を、以下に記載する。
まず、以下のようなdockerfileを作成する。
FROM opensuse/leap:15.3 MAINTAINER Annonymas RUN zypper update -y RUN zypper install -y dbus-1 systemd-sysvinit RUN cp /usr/lib/systemd/system/dbus.service /etc/systemd/system/; \ sed -i 's/OOMScoreAdjust=-900//' /etc/systemd/system/dbus.service VOLUME ["/sys/fs/cgroup", "/run"] CMD ["/sbin/init"] EXPOSE 22 EXPOSE 80
次に、作成したdockerfileからDockerイメージを作成する。
sudo docker build -t <イメージ名>:<タグ名> -f <Dockerfile名> . # イメージ名:タグ名およびDockerfile名(Dockerfile名がdockerfileの場合のみ)は省略できる 例. sudo docker build -t suse153i .
Dockerコンテナを実行する。
sudo docker run -d --name=<コンテナ名> --hostname <コンテナのホスト名> <ポートマッピングする場合: -p <ホストのポート番号>:<コンテナのポート番号>> --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <イメージ名> 例. sudo docker run -d --name=suse153c --hostname suse153 -p 50080:80 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro suse153i # 開始しているコンテナ内にアクセスする場合 sudo docker exec -it <コンテナ名> /bin/bash 例. sudo docker exec -it suse153c /bin/bash # 停止したコンテナを開始する場合 sudo docker container start <コンテナ名> 例. sudo docker container start suse153c
openSUSEコンテナにおいて、systemctlコマンドが実行できるかどうかを確認するには、以下のコマンドを実行する。
systemctl list-units
Systemdサービスのサポート
openSUSEコンテナリポジトリで公開されているコンテナイメージは、containers-systemdパッケージがインストールされている。
例えば、Systemdサービスを使用してNginXコンテナを設定して、自動的に起動するためのSystemdサービスファイルとSysconfigファイルが含まれている。