dockerを使うと、比較的簡単にソフトウェアがインストールできる。また、dockerアプリ内で使用されるディレクトリを、ホスト環境の任意の場所に「マウント」できるため、必要なデータをバックアップしたり、ホストを移行するのも容易になる。
※良く言われる「開発者のあいだで開発環境を統一できる」などのメリット等はとりあげない。あくまでもdockerをソフトのインストール方法、環境移行の方法としてとらえている。
CentOSの流れを組むRockyLinuxでdocker及びdocker-composeのインストールを行う。
※単純に「dnf install docker」としない方が良い。かなり古いバージョンがインストールされてしまうようだ。
CentOS8にDockerを入れるを参考にした。ただし、この記事の途中で生じるエラーは、現在の環境では生じなかった。
システムを最新の状態にする
dnf update
dnf upgrade
dockerのリポジトリを追加し、インストール
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf -y install docker-ce docker-ce-cli containerd.io
バージョンを確認する
docker --version
自動起動を有効化し、起動する
systemctl enable docker
systemctl start docker
次に、docker-composeをインストールする。なぜかこれはパッケージになっておらず、バイナリを直接とってくる。CentOS8 Docker/Docker Composeインストールを参考にした。
※最新版をとってくる方法もあるのだが、Version1で十分なので、この方法をとる。
wget https://github.com/docker/compose/releases/download/1.25.5/docker-compose-Linux-x86_64
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
これでdocker及びdocker-composeがインストールできた。
これは意外にもほとんど語られておらず、なぜこんな重要なことが一般的に語られていないのか不可思議である。これは、dockerのコンテナのポートをpublish設定すると、そのポートは自動的に外部からもアクセス可能になってしまうことだ。
例えば、ポート開放の制御をfirewalldで行い、そこで外向けに開ける開けないをどう設定しようが、dockerはその制御をバイパスしてポートを開放してしまうのである。dockerが勝手に内部でiptablesをいじっているものと思われる。
※dockerコンテナでポートをpublishするとfirewalldに何も設定しなくとも、外部からアクセス可能になっていることにはすぐに気がついた。dockerの記事を書いている人達は、このことに気がついていないのだろうか?
これについての記事を探すと以下が見つかった。
解決策としてわかりやすいのは、portsでpublishしてしまうのではなく、exposeを指定するということらしい。
【Docker Compose】ports / expose、書式別の挙動まとめ【version 3】