RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

CentOS8にDockerを入れようとして躓いた話

はじめに

こんにちは。新卒1年目エンジニアのdd_fortです。 今回はDockerを勉強しようと思い、CentOS8でDockerの環境構築をしようとした話です。 Dockerが公式サポートされていないCentOS8にDockerを使用するときに躓いた点や気を付ける点を中心にインストール方法を紹介しようと思います。

目次

Docker とは

Docker社が開発している、コンテナ型の仮想環境を用いてアプリケーションを開発・配置・実行するためのプラットフォームです。

コンテナ型仮想環境
f:id:dd_fortran:20200331144535p:plain

Doecerのメリット

  • ホストOSを直接アクセスするためオーバーヘッドが少ない
  • 可搬性が高くDockerをインストールすれば、ホストOS環境に依存せず動作する
  • コード化されたファイルを共有することで開発環境のセットアップが容易になる

リポジトリの追加

まず、Docker のリポジトリを追加します。

$ dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

以下のようになっていればOKです。

$ dnf repolist
repo id                  repo の名前                                               状態
AppStream                CentOS-8 - AppStream                                    5,120
BaseOS                   CentOS-8 - Base                                         2,126
extras                   CentOS-8 - Extras                                          13
docker-ce-stable         Docker CE Stable - x86_64                                  63

Docker のインストール

dnfコマンドを使用してdnf install dockerのようなコマンドでインストールしようすると依存関係の問題でインストールできません。
回避策として今回は、--nobestオプションを付けて実行します。

$ dnf install --nobest docker-ce containerd.io

この状態のままだと、dnf upgradeを実行すると Dockerを強制的にインストールしているためエラーが発生します。
そのため、CentOS7 のリポジトリを利用してcontainerd.io をアップデートします。

$ dnf update https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.10-3.2.el7.x86_64.rpm

以下を実行してエラーが発生しなければOKです。

$ dnf -y update docker-ce

Docker の起動

Docker を起動します。

$ systemctl start docker
$ systemctl enable docker

バージョン確認

$ docker --version
Docker version 19.03.8, build afacb8b

ネットワークの問題

しかし、CentOS8の場合はこのままではコンテナ内から名前解決ができずdnf 等が使えません。

回避策1:Docker 起動時のオプション

コンテナの構築時や起動時に--network host を指定して実行することで解決することができます。

$ docker pull wordpress
$ docker run --name wordpress-test --network host -d wordpress

上記はWordPressのコンテナを立てるときのコマンドです。

回避策2:firewalld の設定変更

iptablesが動いている場合は、firewalld でNAPTするように設定を変更することで解決することができます。

$ firewall-cmd --add-masquerade --permanent
$ firewall-cmd --reload

回避策3:パケットフィルタリングツール変更

根本的な原因としては、CentOS8からパケットフィルタリングツールが iptables から nftables に変わったことです。 (Docker が nftables を設定できないため)

CentOS のパッケージフィルタリング構成
CentOS6 : iptables
CentOS7 : firewalld(管理I/F), iptables
CentOS8 : firewalld(管理I/F), nftables

iptables を利用するように変更することで解決可能

  • firewalld を止める
$ systemctl stop firewalld
$ systemctl disable firewalld
$ dnf install iptables-services
$ systemctl enable iptables
$ systemctl start iptables

最後に

私はCentOS8にDockerが公式非対応であること知らずに環境構築をはじめてしまったため、環境構築だけで時間が多く掛かってしまいました。
しかし、CentOS8とDockerの勉強になったのでよかったかなと思っています。 また、CentOS8ではpodman(Docker互換のコンテナエンジン)が使えるみたいなのでそれを試してみるのもいいかなと思いました。 この記事がCentOS8でDockerを使おうとしている人の助けとなれば幸いです。

Copyright © RAKUS Co., Ltd. All rights reserved.