🎩

docker + docker composeでRHELを使う

2024/04/20に公開

TL;DR

ローカルのRHELコンテナ環境を試しに作ってみたときの備忘録です。
docker composeを使用してRHEL8(ubi)とRHEL8(python-39)コンテナを作成しました。
(最新では既にRHEL9のコンテナイメージがありますね。。。)

前提環境

OS: Windows11(wsl2)
Docker: version 25.0.3
Docker Compose: version v2.24
wsl上でdockerおよびdocker composeコマンドを使います。

事前準備

作業ディレクトリ作成

下記コマンドでRHELコンテナ環境構築で作業するディレクトリを作成します。

$ mkdir rhelContainer
$ mkdir -p rhelContainer/rhel8
$ mkdir -p rhelContainer/py39_rhel8

また、本記事ではdocke-composeファイルとDockerfileを使用するので、touch <file name>コマンドで作成しておきます。
(先に作成しなくても大丈夫です。本記事ではディレクトリ・ファイル構成を示すために先に作成しています。)

今回の例では下記のような構成となります。
(treeコマンドがない場合は、sudo apt updateした後にsudo apt install treeで最新verをインストールできます。)

ディレクトリ・ファイル構成
$ tree
.
├── compose.yml
├── py39_rhel8
│   └── Dockerfile
└── rhel8
    └── Dockerfile

使用するイメージの検索

使用するコンテナイメージを探します。
Red Hat UBIイメージregistry.access.redhat.com/ubiにあるので、docker searchコマンドで確認できます。

$ docker search registry.access.redhat.com/ubi
NAME                      DESCRIPTION                                     STARS     OFFICIAL
ubi9/go-toolset           rhcc_registry.access.redhat.com_ubi9/go-tool…   0
ubi8/go-toolset           Platform for building and running Go 1.11.5 …   0
ubi8/openjdk-8-runtime    OpenJDK 1.8 runtime-only image on Red Hat Un…   0
...

今回の例では下記2つを利用します。

  • ubi8/ubi
  • ubi8/python-39

環境構築手順

RHEL8(UBI)コンテナ

ubi8/ubi用のDockerfile設定を記載します。
追加パッケージとしてvimとhostnameパッケージを入れるようにしています。
hostnameコマンドはipアドレスを調べるために入れています。ipコマンドを入れたい場合はiprouteパッケージをインストールしてください。
(--disableplugin=subscription-managerオプションをいれるとsubscription-managerに関するメッセージを非表示にできます。)

Dockerfile
FROM registry.access.redhat.com/ubi8/ubi

RUN mkdir /my_work
ARG my_work_dir=/my_work
WORKDIR $my_work_dir

RUN dnf -y install --disableplugin=subscription-manager vim
RUN echo "set number" >> ~/.vimrc
RUN echo "set encoding=utf-8" >> ~/.vimrc
RUN echo "set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8" >> ~/.vimrc
RUN echo "set fileformats=unix,dos,mac" >> ~/.vimrc
RUN dnf -y install --disableplugin=subscription-manager hostname
# RUN dnf -y install --disableplugin=subscription-manager iproute

RHEL8(python39)コンテナ

次にubi8/python-39用のDockerfile設定を記載します。
このコンテナイメージにはhostnameコマンドが入っているので、インストールしません。
単にイメージの記載のみしています。

Dockerfile
FROM registry.access.redhat.com/ubi8/python-39

optional:ネットワーク設定(固定ip)

optionalですが、ipアドレスを固定する場合の設定をします。(参考)
docker composeファイルで各サービスとネットワークで設定をする必要があります。

ubi8/ubi用
    networks:
      my-network:
        ipv4_address: 192.168.1.2
ubi8/python-39用
    networks:
      my-network:
        ipv4_address: 192.168.1.3
docker compose用
networks:
  my-network:
    ipam:
      driver: default
      config:
        - subnet: 192.168.1.0/24

docker composeファイル

上記の設定などを含めたdocker composeファイルの例は下記となります。
作成されるコンテナ名やVMのhostnameなども指定しています。
(VM動詞はサービス名で疎通できるので、サービス名とhostnameを合わせたほうが良さそうですね。。。)

docker compose
services:
  rhel:
    build:
      context: ./rhel8
      dockerfile: Dockerfile
    container_name: my-rhel8-container
    hostname: my-rhel8
    tty: true
    networks:
      my-network:
        ipv4_address: 192.168.1.2
  py39:
    build:
      context: ./py39_rhel8
      dockerfile: Dockerfile
    container_name: my-py39-rhel-container
    hostname: my-py39-rhel
    tty: true
    networks:
      my-network:
        ipv4_address: 192.168.1.3
    depends_on:
      - rhel
    entrypoint: /bin/bash

networks:
  my-network:
    ipam:
      driver: default
      config:
        - subnet: 192.168.1.0/24

環境実行と確認

環境を実行し、簡易的な確認をします。

コンテナ環境の開始

下記コマンドでコンテナ環境を開始します。

start
$ docker compose up -d
...
[+] Running 2/3
 ⠸ Network study_rhel8_my-network    Created                           1.3s
 ✔ Container my-rhel8-container      Started                           0.8s
 ✔ Container my-py39-rhel-container  Started                           0.9s

RHEL8環境の確認

ubi8/ubiコンテナに入って、hostname, ipアドレス, OSの確認をしてみます。

$ docker-compose exec rhel bash
[root@my-rhel8 my_work]# hostname
my-rhel8
[root@my-rhel8 my_work]# hostname -I
192.168.1.2
[root@my-rhel8 my_work]# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.9 (Ootpa)
[root@my-rhel8 my_work]# exit

RHEL8(python39)環境の確認

次にubi8/python-39コンテナに入って、hostname, ipアドレス, OSの確認をしてみます。

$ docker-compose exec py39 bash
(app-root) bash-4.4$ hostname
my-py39-rhel
(app-root) bash-4.4$ hostname -I
192.168.1.3
(app-root) bash-4.4$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.9 (Ootpa)
(app-root) bash-4.4$ exit

コンテナ環境の停止、削除

コンテナ環境を停止する場合は、docker compose stopコマンドを実行します。(削除はしない)
docker compose downコマンドでは、upで作成したコンテナとネットワークを削除します。(デフォルト)
下記コマンドでは、オプション--rmi allをつけてイメージも削除しています。ボリュームを削除する場合は-vまたは--volumesオプションでvolumesセクションの名前付きボリュームを削除できます。

$ docker compose down --rmi all
[+] Running 5/5
 ✔ Container my-py39-rhel-container  Removed                           0.4s
 ✔ Container my-rhel8-container      Removed                           0.5s
 ✔ Image study_rhel8-rhel:latest     Removed                           0.0s
 ✔ Image study_rhel8-py39:latest     Removed                           0.0s
 ✔ Network study_rhel8_my-network    Removed                          0.2s

その他

今回はpython39のコンテナイメージを利用しましたが、他にもたくさんのイメージがあるので使ってみたいです。

参考

Discussion