2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

④1日10分で理解するコンテナ技術入門 - リモートレジストリの利用とサービスの公開 -

Last updated at Posted at 2024-06-17

前回はシンプルなウェブアプリケーションをDockerを使って動かしてみました。今回は、リモートレジストリとCaaSを使って、前回ローカルで動かしたアプリケーションをインターネット上に公開してみたいと思います。

コンテナイメージの編集

前回はコンテナ同士の通信にコンテナ名を用いましたが、今回利用するOCIのCaaSではコンテナ名による通信ができないので少しコードを変更します。

app.py
# データベースの初期化
def init_db():
    conn = mysql.connector.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='password',
        database='flask_app'
    )
    cursor = conn.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS articles (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255), content TEXT)')
    conn.commit()
    cursor.close()
    conn.close()

init_db()

def get_db_connection():
    conn = mysql.connector.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='password',
        database='flask_app'
    )
    return conn

app.pyのDB関係の部分のコードにおいて、hostmysqlから127.0.0.1に変更しておきます。
変更したら、以下のコマンドでビルドします。

docker build -t simple-knowledge-sharing-platform .

リモートレジストリの利用

コンテナ化したアプリケーションをCaaS (Container as a Service)をつかって公開するべく、まずはリモートレジストリにイメージをプッシュします。本稿ではOCIを利用するのでOCIのコンテナレジストリサービスとCaaSを利用しますが、基本的な手順はどのクラウドベンダーでも同様です。また、Docker Hubのようなレジストリサービスを利用して、インスタンスだけクラウドベンダーのものを利用するといったことも可能です。

リモートレポジトリの作成

まずはリモートレジストリサービス側で、レポジトリを作成します。OCIにおいては、ホーム画面左上のハンバーガーメニューから、下記画像のような手順でレジストリサービスにアクセスできます。
image.png
レポジトリの作成をクリックします。
image.png
ご自身のコンパートメントが選択されていることを確認して、アクセスをパブリックにし、任意のリポジトリ名を入力して作成します。なお、リポジトリ名はテナンシ内で重複できないので注意してください。
image.png
作成すると、以下のようにリポジトリの詳細が表示されます。
image.png

リモートレポジトリへ接続するための準備

リモートレポジトリへ接続する際、ユーザー名とパスワードを聞かれます。ユーザー名はリポジトリの詳細にあるユーザーから確認できます。パスワードは、OCIでは認証トークンを用います。
認証トークンは、以下の手順で取得できます。
右上のアイコンをクリックし、出てくるメニューからユーザー名をクリックします。そうすると、以下のような画面に遷移します。
image.png
この画面を下へスクロールすると、左に認証トークンというメニューがあるのでクリックします。
image.png
トークンの生成をクリックします。
image.png
適当な説明を入力し、作成ボタンを押すと、以下のように認証トークンが取得できます。
image.png
このトークンをメモ帳などにコピーしておきます。
また、トークンの画面を閉じた後、テナンシのネームスペースを画面上のユーザー情報からメモ帳などにコピーしておきます。

リモートレジストリへログイン

ここからは、dockerコマンドを使ってリモートレジストリへログインします。作成したリポジトリのリージョンコードをここから調べます。私はトロントに作成したので、yyzになります。
下記のコマンドでリモートレジストリにログインします。

$ docker login yyz.ocir.io
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Username: <テナンシのネームスペース>/<リポジトリの詳細画面に表示されている、ユーザー名>
Password: <作成した認証トークンを入力>
Login Succeeded!

以上で接続準備は完了です。

リモートリポジトリにイメージをプッシュ

次に、前回作成したコンテナイメージをリモートリポジトリにプッシュします。まずは、前回作成したイメージをdocker image lsコマンドで確認します。

$ docker image ls
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY                                   TAG         IMAGE ID      CREATED        SIZE
localhost/simple-knowledge-sharing-platform  latest      7ddb674174a7  5 seconds ago  238 MB
docker.io/library/mysql                      8.0         1eba4c9bcaa8  6 weeks ago    583 MB
docker.io/library/python                     3.9-slim    4602238ffbdc  2 months ago   131 MB

この中で、カスタムイメージはlocalhost/simple-knowledge-sharing-platformだけなので、これをプッシュします(カスタムではないイメージは、CaaS側で公式レポジトリから取得できるため)。
dockerイメージは、REPOSITORY名 + TAGで識別します。REPOSITORY名は通常、コンテナレジストリのドメイン + そのコンテナレジストリで作ったレポジトリ名になります。TAGは、同じレポジトリ内でイメージを区別するための識別子で、バージョン管理などに使われます。
これを整理すると以下のようになります。

用途 今回の場合
レジストリのドメイン イメージが保存されているレジストリの場所を示す yyz.ocir.io
レポジトリ名 レジストリ内の特定のプロジェクトやアプリケーションを識別する simple-knowledge-sharing-platform
REPOSITORY イメージのグループ名で、同じソフトウェアの異なるバージョンを管理する yyz.ocir.io/テナンシのネームスペース/simple-knowledge-sharing-platform
TAG リポジトリ内の特定のイメージバージョンを識別する latest

上の表を参考にしながら、実際にカスタムイメージをプッシュします。カスタムイメージはlocalhost/simple-knowledge-sharing-platformですが、このままではプッシュできません。それは、レジストリのドメインが今回利用するOCIのレジストリと異なるからです。なので、まずはレジストリのドメインを変更する必要があります。変更は、以下のコマンドで行います。

$ docker tag localhost/simple-knowledge-sharing-platform yyz.ocir.io/<テナンシのネームスペース>/simple-knowledge-sharing-platform:latest

私のテナンシのネームスペースはorasejapanなので、以下のようになります。

$ docker tag localhost/simple-knowledge-sharing-platform yyz.ocir.io/orasejapan/simple-knowledge-sharing-platform:latest

ここでもう一度docker image lsを実行すると、イメージ一覧に今入力したものが増えています。

$ docker image ls
REPOSITORY                                                TAG         IMAGE ID      CREATED       SIZE
localhost/simple-knowledge-sharing-platform               latest      7ddb674174a7  18 hours ago  238 MB
yyz.ocir.io/orasejapan/simple-knowledge-sharing-platform  latest      7ddb674174a7  18 hours ago  238 MB
docker.io/library/mysql                                   8.0         1eba4c9bcaa8  6 weeks ago   583 MB
docker.io/library/python                                  3.9-slim    4602238ffbdc  2 months ago  131 MB

docker pushコマンドを使ってリモートレジストリにイメージをプッシュします。

docker push yyz.ocir.io/orasejapan/simple-knowledge-sharing-platform:latest
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Getting image source signatures
Copying blob 205262265e50 done
Copying blob 146826fa3ca0 done
Copying blob 5d4427064ecc done
Copying blob ae96698df02c done
Copying blob e555c0055a9b done
Copying blob fd8c1935b82d done
Copying blob 53af208dc77a done
Copying blob 3561557866f1 done
Copying blob 1b3e866d3731 done
Copying blob 26caac8dde11 done
Copying blob 60298db5d2d2 done
Copying blob ce168d0041d5 done
Copying blob e31afd319957 done
Copying config 7ddb674174 done
Writing manifest to image destination

以上で、カスタムのコンテナイメージをリモートレジストリにあげることができました。

CaaSの利用

Container Instanceの作成

OCIでは、Container InstanceというCaaSがあるので、それを利用します。画面左上のハンバーガーメニューから、コンテナインスタンスを選択します。
image.png
Create Container Instanceをクリックします。
image.png
コンテナインスタンス作成の画面が表示されます。この画面で入力するのは、

  1. コンテナインスタンスの名前
  2. コンテナインスタンスを作成するネットワーク(Networking)

の2つです。コンテナインスタンスの名前はお好きなものを入力してください。Networkingは、Create new virtual cloud networkを選択してください。他はデフォルトで大丈夫です。
image.png
次をクリックします。
Select Imageをクリックし、先ほどプッシュしたイメージを選択します。
image.png
image.png
Another ContainerボタンをクリックしてMySQLのコンテナを追加します。
image.png
nameにmysqlを入力して、Select Imageをクリックします。
image.png
下の画像のように選択します。
image.png
下の画像のように環境変数を設定します。
image.png
次を押した後、Createを押して作成します。
作成が完了すると、以下のような画面になります。
image.png

ネットワークの設定

今回のウェブアプリでは、5000ポートで待ち受けています。そのため、コンテナインスタンス作成時に作成したネットワークのファイアウォールに、5000番を許可するルールを追加します。
左上のハンバーガーメニューから、仮想・クラウドネットワークを選択します。
image.png
作成したネットワーク名を選択し、詳細画面に入ります。
画面を下にスクロールして、セキュリティ・リストをクリックして、Default Security List for xxxをクリックします。
image.png
イングレスルールの追加をクリックします。
image.png
下記のように設定して、5000番ポートへのアクセスを受け付けます。
image.png
以上でネットワークの設定は終了です。

アプリケーションが公開されているかを確認

コンテナインスタンスのパブリックIPアドレスを確認して、実際にウェブアプリケーションにインターネットからアクセスしてみましょう。
もういちどコンテナインスタンスの詳細画面を開きます。
下記画像の位置にパブリックIPアドレスが書いてあるので確認します。
image.png
私の環境では、192.18.146.40となっているので、ブラウザに入力するのは192.18.146.40:5000になります。
アクセスすると以下のように無事接続できました。
image.png

まとめ

今回はリモートレジストリの利用と、CaaSを使ったアプリケーションの公開を行いました。次回はここまでのまとめと、仮想マシンとの違いについて説明したいと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?