EC2上のRHEL8 にDockerコンテナ作る

RHEL8ではDockerサポートしてないので、Podmanを利用する必要がある。

[1.3. Docker を使用せずにコンテナーを実行 Red Hat Enterprise Linux 8 | Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/con_running-containers-without-docker_assembly_starting-with-containers)

> Red Hat では、RHEL 8 から Docker コンテナーエンジンと、docker コマンドが削除されました。
> 
> 
> RHEL で Docker を使用する場合は、異なるアップストリームプロジェクトから Docker を取得できますが、RHEL 8 では対応していません。

どうしてもDockerでないといけない場合、DockerのEnterprize版を使えばできるらしい。
https://docs.mirantis.com/mcr/23.0/compat-matrix/mcr-23.0-compatibility-matrix.html
(DockerのEnterPrize版はMirantis Container Runtimeに変わった)


PodmanはDockerコマンドを自動的に内部でPodmanコマンドに変換してくれるので、通常のDockerコマンドを打てばコンテナが立ち上がったりしてくれる。

Podmanの仕様などを調べるため、EC2上に簡単なwordpress+MySQL環境をdocker-composeで立ち上げるまでを記載する。

### やること

1. AWS EC2をAMIイメージのRHEL8を利用して起動しssh接続
2. Podmanインストール
3. Docker-composeでwordpressを起動する

## 1　AWS EC2をAMIイメージのRHEL8を利用して起動

1. AWS　EC2コンソールにログインし、インスタンスを起動
    
    - マシンイメージ（AMI）は検索窓にRHEL等打てばRHEL8のイメージが見つかるのでそれを選択する
    - キーペアは新しいキーペア作ると公開鍵がダウンロードフォルダに保存される
    - セキュリティグループも作成
    - ストレージも任意で設定

2. 起動できたら、EC2コンソールからパブリックIPアドレスを控えておく（EC2を起動すると毎回変わるので、起動後はここのIPを確認）

3. 公開鍵の設定
    - (windowsの場合)ダウンロードした.pemファイルをダウンロードフォルダからCドライブ＞ユーザー＞ユーザー名>.sshへ移動させる

    - .sshのフォルダがない場合は、新たに作成し、移動させる
    - もし.sshのフォルダは隠しファイルのため、表示されない場合は、表示タブ＞隠れファイルにチェックを入れ確認する

4. ssh接続

    ```bash
    ssh -i ~/.ssh/鍵の名前.pem  ec2-user@パブリックIPアドレス
    ```


    - 接続を続けるかメッセージが初回だけ出る（IPが変わると毎回）のでyesを打つ

    ```bash
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    ```

5. EC2にログインできたらRHELのバージョンを確認

    ```bash
    [root@rhel77 ~]# cat /etc/redhat-release
    Red Hat Enterprise Linux Server release xxxxxx
    ```

    無事RHEL8でEC2が起動していることを確認

## 2. Podmanインストール

1. 以下のコマンド打ってpodmanをインストールする

    ```bash
    # Podmanのインストール
    sudo yum module install -y container-tools
    
    # インストールできたかを確認する
    podman --version
    # >podman version 4.4.1
    
    # podman-dockerパッケージのインストール
    sudo yum install -y podman-docker
    
    # Dockerのバージョンを確認する
    docker --version
    # >Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
    # >podman version x.x.x
    
    # Docker動作確認(任意)
    docker run --rm hello-world
    ```

    こんなんが出てくればOK
    
    （hello worldではなくhello Podman　worldなんだなー）
    
    ```bash
    !... Hello Podman World ...!
    
             .--"--.
           / -     - \
          / (O)   (O) \
       ~~~| -=(,Y,)=- |
        .---. /`  \   |~~
     ~/  o  o \~~~~.----. ~~
      | =(X)= |~  / (O (O) \
       ~~~~~~~  ~| =(Y_)=-  |
      ~~~~    ~~~|   U      |~~
    ```

1. composeのインストール

    composeを使うので以下コマンドを打ちcomposeをインストール
    
    ```bash
    $ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    $ sudo chmod +x /usr/local/bin/docker-compose
    $ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    $ docker-compose version
    # >docker-compose version 1.29.2, build 5becea4c
    
    ```

1. コンテナ間通信するためにプラグインをインストール

    ```bash
    $ sudo yum install podman-plugins
    Updating Subscription Management repositories.
    Unable to read consumer identity
    
    This system is not registered with an entitlement server. You can use subscription-manager to register.
    ```

    途中でインストールサイズこれだけあるけどいい？って聞かれるのでyを押す
    
    ```bash
    Total download size: 5.2 M
    Installed size: 16 M
    Is this ok [y/N]: y
    ....................
    ............
    Complete!
    ```

1. 常時起動しているように設定

    ```bash
    sudo su -
    
    # podman.socketの自動起動設定
    systemctl enable podman.socket
    
    # podman.socketの起動
    systemctl start podman.socket
    ```

### 3.Docker-composeでwordpressを起動する

今回はパブリックIPで接続してみたいためパブリックIPからの接続検証をする

立てるコンテナ

- wordpress
- MySQL

1. 任意のディレクトリを作ってdocker-compose.yamlを作成する。

    ```bash
    mkdir wordpress_project
    cd wordpress_project
    ```

    ```bash
    touch docker-compose.yaml
    vi docker-compose.yaml
    ```



    ```Docker-compose.yaml
    version: '3'
    services:
      wordpress:
        image: wordpress:latest
        ports:
          - "80:80"  # パブリック IP アドレスからのアクセスを許可
        environment:
          WORDPRESS_DB_HOST: mysql
          WORDPRESS_DB_USER: exampleuser
          WORDPRESS_DB_PASSWORD: examplepass
          WORDPRESS_DB_NAME: exampledb
        depends_on:
          - mysql
    
      mysql:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: examplepass
          MYSQL_DATABASE: exampledb
          MYSQL_USER: exampleuser
          MYSQL_PASSWORD: examplepass
    ```

    （ボリュームの記載をしてないので、データ永続化させる場合はボリューム情報記載してください。）

　

1. EC2のセキュリティグループを修正

    1. EC2コンソールの左ペインからセキュリティグループ＞EC2が紐づいてるセキュリティグループをクリック
    
    2. インバウンドルールを編集押してHTTP (ポート 80) および MySQL (ポート 3306) のトラフィックを許可する

1. コンテナ起動

    普通にdocker-compose up すると権限がないので、できないのでsudoを付けて起動
    
    ```bash
    sudo docker-compose up -d
    ```

    起動ができたか念のため確認する

    両方upになってればOK
    
    ```bash
    $ sudo docker-compose ps
                Name                           Command               State          Ports
    --------------------------------------------------------------------------------------------
    wordpress_project_mysql_1       docker-entrypoint.sh mysqld      Up ()   3306/tcp, 33060/tcp
    wordpress_project_wordpress_1   docker-entrypoint.sh apach ...   Up ()   :80->80/tcp
    ```

1. サイトへアクセス

*`http://<EC2のパブリックIPアドレス>`*  をブラウザで開いて接続する

言語を選ぶようなwordpressの設定画面が出ればOKです。

## ちなみに

サイトアクセス時に

Error establishing a database connection

と出ている場合は、コンテナ間通信ができてない可能性があるので、

```bash
sudo yum install podman-plugins
```

でプラグインをインストールし、立ち上げ直せば出るかもです。

それでも出ない場合、データベースの設定が正しくない可能性があるのでdocker-copmose.ymlやセキュリティグループを見直してみてください。

### 参考サイト

[Red Hat Enterprise Linux 8 で Docker を使う](https://zenn.dev/rescuenow/articles/dad3082ab1348c)

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index