OktaとAmazon CognitoをSAMLで連携させる【2025年版】
はじめに
外部IdPとAmazon CognitoをSAMLで連携させてみます。
参考動画はこちら How to add Okta as a SAML Identity Provider in AWS Cognito?
また参考Webはこちら。OktaとAWS Cognito連携 ~SAML編~
内容はこの通りの「やってみた記事」ですが、OktaもAmazon Cognitoも画面デザインが変わっているので読み替えが大変でした。
大変参考になりました。ありがとうございます。
Amazon Cognito設定①
ユーザープールを作成
AWS マネージドコンソール > Amazon Cognito > ユーザープール > ユーザープールを作成
※テストに使用したユーザープールがあるのでマスクしてあります。

アプリケーションタイプ:シングルページアプリケーション(SPA)
※ 「従来のウェブアプリケーション」で作成されるクライアントシークレットがあると動作しないかも?
アプリケーションに名前を付ける:userpool-SAML(※お好きな名前をどうぞ)

サインイン識別子のオプション:☑ユーザー名
サインアップのための必須属性:email (識別子にユーザー名を選ぶときは、emailの選択は必須とのこと)
リターンURL:https://jwt.io (認証成功後、Oktaから返されたトークンの内容を調べられるサイトにリダイレクトさせます)
->ページ下の「ユーザーディレクトリを作成する」ボタンをクリック

ページ下の「概要に移動」ボタンをクリック

ユーザープールの名前変更
「概要」ページが開くと、ユーザープール名が「User pool - (ランダム)」になっているので、修正します。
「名前変更」をクリック


セルフサービスのサインアップ >自己登録を無効化
左側の機能一覧から、
認証 > サインアップ > セルフサービスのサインアップ > 編集 ボタンをクリック

□自己登録を有効化 ※チェックを外す
変更を保存 ボタンをクリック

Oktaの設定
Oktaアカウント登録
okta Developerでアカウントを登録します。
※Gmailなどのフリーメールで新しいアカウントを登録しようとすると、ビジネス用メールアドレスで登録するようメッセージが表示されました。
私はGitHub認証で登録しましたが、Googleアカウント認証や、登録するなら会社のメールアドレスで登録するのが良いでしょう。

MFAの登録などが必要になるので、進めてください。
ユーザー登録
SAML認証を行うユーザーを登録します。
ディレクトリ > ユーザー > ユーザーを追加 ボタンをクリックします。

ユーザー情報を入力して「保存」ボタンを押します。

ユーザーが登録されました。

このあと作成するアプリに登録するユーザーには管理者が必要とのことなので、今作成したユーザーを管理者にします。
※管理者ロールが無くても動作することもあり、本当に必要かは追加検証の必要あり
作成したユーザー名をクリック > 管理者ロール(タブ) > 個人の管理者権限を追加

「ロール」から「Organization管理者」を選択して、「変更を保存」をクリックします。
※テストなので強めの権限を当てています。

アプリ統合を作成
左側のリストから、アプリケーション > アプリケーション > アプリ統合を作成 ボタンをクリックします。

●SAML 2.0 にチェックを入れ、「次へ」ボタンをクリックします。

アプリ登録
アプリ名:okta-sso-saml (※お好きな名前を入力)

アプリ名設定 シングルサインオンURL:
CognitoがOktaからの認証レスポンスを受け取るためのURL。Cognitoがユーザープール毎に用意してくれている。下記URLの書式で指定する。
自分のCognitoドメイン/saml2/idpresponse
例: https://ap-northeast-1hnn2w28xx.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse
※Cognitoドメインは、Cognitoのマネジメントコンソール「ブランディング > ドメイン」から確認します。

- オーディエンスURI:
urn:amazon:cognito:sp:ユーザープール ID
例: urn:amazon:cognito:sp:ap-northeast-1_hNn2W28xx
※ユーザープールIDは、Cognitoのマネジメントコンソール「概要」にて確認します。

「シングルサインインURL]と「オーディエンスURI」を入力した画面はこちら

- 属性ステートメント(オプション)
OktaからCognitoに引き渡すユーザー属性を設定します。 (下記は一例) 「値」はプルダウンに表示されるものは選択し、表示されないものは手入力します。
設定後「次へ」をボタンをクリックします。
| Name | Value |
|---|---|
| firstname | user.firstName |
| lastname | user.lastName |
| displayname | user.displayName |
| nickname | user.nickName |
| user.email |
※Name: OktaとCognitoで共通に認識するキー
※Value: Oktaのユーザー情報に含まれる値

- フィートバック
Oktaのアンケートのようなので、下記にチェックを入れます(どちらでもよさそう)
☑ SAMLを有効にするには、ベンダーに問い合わせる必要があります
チェック後、画面下の「終了」ボタンをクリックします。

ユーザーをアサイン
SAML認証を行うユーザーをアサインします。
アプリケーション > okta-sso-saml > 割り当て(タブ) > 割り当て ボタン > ユーザーに割り当て をクリック

SAML認証を行いたいユーザーの右側の「割り当て」をクリックします。

ユーザー名(メールアドレス)を確認して、「保存して戻る」をクリックします。

ユーザーが「割り当て済み」になっているのを確認して、「完了」をクリックします。

メタデータを取得
Oktaの登録情報(メタデータ)を取得して、Cognitoにアップロードします。
サインオン タブをクリックし、画面下の「SAML署名証明書」を表示します。
ステータスが「アクティブ」になっている方の「アクション」をクリックし、「IdPメタデータを表示」をクリックします。


ブラウザの別タブでXMLが表示されるので、ローカルPCに保存します。
ファイル名は「metadata.xml」などにします。

Amazon Cognito設定②
Amazon Cognitoのマネージメントコンソールを開きます。
左側のリストから、認証 > ソーシャルプロバイダーと外部プロバイダー > アイデンティティプロバイダーを追加 ボタンをクリックします。

プロバイダー名:okta-saml (お好きな名前を入力してください)
識別子 - オプション:okta-saml (お好きな名前を入力してください)

プロバイダー名と識別子 メタデータドキュメント:「ファイルを選択」ボタンをクリックして、先ほど保存したXMLファイルをアップロードします。

メタデータドキュメント(XMLファイル)のアップロード SAMLプロバイダーとユーザ―プールの間で属性をマッピング Oktaの「属性ステートメント(オプション)」で設定したユーザー属性とのマッピングを設定します。
ユーザ―プール属性:プルダウンから選択
SAML属性:Oktaの「属性ステートメント」の「値」で設定した値を入力。
入力がすんだら「アイデンティティプロバイダーを追加」ボタンをクリックします。
| ユーザープール属性 | SAML属性 |
|---|---|
| given_name | firstname |
| family_name | lastname |
| name | displayname |
| nickname | nickname |

アプリケーションクライアント の設定
左側の機能一覧から、アプリケーション > アプリケーションクライアント > userpool-SAML をクリック

ログインページ タブをクリック

ログインページ タブ 編集 ボタンをクリック

編集 IDプロバイダー:
☑ okta-saml (チェックを入れます)
□ Cognitoユーザ―プール (チェックを外します)

IDプロバイダー OAuth 2.0許可タイプ
☑ 暗黙的な付与 (チェックを入れます)
□ 認証コード付与 (チェックを外します)

OAuth 2.0 許可タイプ OpenID Connect のスコープ
☑ OpenID のみチェックを付け、他のチェックを外します。

OpenID Connect のスコープ 上記3か所の設定を確認し、「変更を保存」ボタンをクリックします。

変更を保存
ログインページを開く
「ログインページを表示」をクリックします。

サインインページが表示されるのでクリックします。

Oktaのサインインページが表示されるので、Oktaに設定したユーザー名とパスワードを入力して「サインイン」ボタンをクリックします。

認証が行われ、jwt.io にリダイレクトされます。

おわり
実は最後のサインインページを表示する際にエラーになり、3回ほど環境を作り直しています。
結局なにがエラーの原因だったのかはよくわからず(ブラウザやCognito、Oktaのキャッシュのせい?)。
検証はFirefoxなどの別のブラウザやシークレットモードを使用することが大事だったのではないかと思っています。
cfn-lintをpython仮想環境にインストール
はじめに
cfn-lint(AWS Cloudformationの構文チェックをしてくれるツール)をpython仮想環境(venv)にインストールする方法をすぐに忘れるのでメモ
環境
pyenv 2.5.5-2-gee40ad22
python 3.13.3 (pyenv install 3.13.3 にてインストール済)
pip 25.0.1
pyenv でpythonインストール
PCにインストール済みのPythonのバージョンを確認
$ pyenv versions
カレントディレクトリにPythonをインストール
(ここでは3.13.3をインストール)
$ pyenv local 3.13.3
venvで仮想環境を作る
$ python -m venv .venv
($ python -m venv ${仮想環境名})
仮想環境に入る
$ . ./venv/bin/activate
cfn-lintインストール
$ pip install cfn-lint
CloudFormation package / validate-template / deploy
これはなに?
AWS CloudFormationワークショップのパッケージ化とデプロイを学習したのでメモ。
AWS CloudFormationでつかえる便利なコマンド3つ
aws cloudformation package
LambdaコードなどをS3にアップロードし、その保存先をCloudFormationテンプレート内に書いてくれる機能
PythonFunction:
Type: AWS::Lambda::Function
Properties:
(略)
Code: lambda/ # 現ディレクトリ内の、Lambdaが格納されたディレクトリを記載
aws cloudformation packageコマンドを実行する
$ aws cloudformation package \ --template-file infrastructure.template \ --s3-bucket example-bucket-name \ --s3-prefix cfn-workshop-package-deploy \ --output-template-file infrastructure-packaged.template
Code: に書かれたディレクトリをZIPで圧縮し、S3へ保存、保存先をCode:のところに記載してくれる
aws cloudformation validate-template
CloudFormationテンプレートの検証を行うコマンド。
cfn-lintでテンプレートの構文チェックはしてくれるが、それとどう違うのだろう?
$ aws cloudformation validate-template \
--template-body file://infrastructure-packaged.template
(結果)
{
"Parameters": [],
"Description": "AWS CloudFormation workshop - Package and deploy.",
"Capabilities": [
"CAPABILITY_IAM"
],
"CapabilitiesReason": "The following resource(s) require capabilities: [AWS::IAM::Role]"
aws cloudformation deploy
AWSのWebコンソールからデプロイしていたCloudFormationテンプレートですが、aws cliからデプロイすることもできます。
$ aws cloudformation deploy \ --template-file infrastructure-packaged.template \ --stack-name cfn-workshop-package-deploy-lambda \ --region ap-northeast-1 \ --capabilities CAPABILITY_IAM
※--capabilities CAPABILITY_IAM
IAMにリソースを作成するなどの可能性があることを認識していることを示すため、つける引数。
AWSのWebコンソールでCloudFormationテンプレートをデプロイするときにも聞かれ、チェックを入れているが、それを引数で指定している。
pyenv + venv でPython仮想環境を作る
これはなに?
Pythonのパッケージを、隔離された環境(仮想環境)内でのみ有効になるようにインストールする。
環境
pyenv 2.5.5-2-gee40ad22
Python 3.13.2
pyenv のインストール
上記参考ページを参照ください。
venvで仮想環境を作る
仮想環境を作りたいディレクトに移動して、
$ python -m venv ${仮想環境名}
例:
$ python -m venv .venv
※仮想環境名には.venvを付ける例が多いみたい
仮想環境に入る
$ source ${仮想環境名}/bin/activate または
$ . ${仮想環境名}/bin/activate
例:
$ source .venv/bin/activate
$ . .venv/bin/activate
ターミナルのプロンプトが
(.env)ユーザ名@ホスト名:ディレクトリ名$ となったら、仮想環境に入っている。
あとは$ pip install パッケージ名 などでパッケージをインストールできる。
仮想環境から抜ける
$ deactivate で抜けられる。
Ubuntu Desktop 24.04.2 IPアドレスを固定する
これはなに?
Ubuntu Linuxを使用するにあたり、IPアドレスを固定する方法を調べたのでメモ
リモートデスクトップでUbuntu Desktopに接続したい
参考:Ubuntu Server 24.04 LTS インストール後の初期設定3 IPアドレス固定化 メモ
環境
Ubuntu Desktop: 24.04.2 LTS
デバイス名を調べる
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:df:f4:e5 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.100.7/24 brd 192.168.100.255 scope global dynamic noprefixroute ens160
valid_lft 169559sec preferred_lft 169559sec
inet6 fe80::20c:29ff:fedf:f4e5/64 scope link
valid_lft forever preferred_lft forever
ens160というのがデバイス名とわかる。
設定ファイルの設置
設定ファイルは/etc/netplanにあるらしい
$ cd /etc/netplan
$ ls
01-network-manager-all.yaml 50-cloud-init.yaml
$
$ sudo cat 50-cloud-init.yaml
network:
version: 2
ethernets:
ens160:
dhcp4: true
DHCPの設定がされているので、これをコピーして別ファイルに固定IPアドレスの設定を書く。
$ sudo cp 50-cloud-init.yaml 99-ens160-fix.yaml $ sudo vi 99-ens160-fix.yaml
修正後の99-ens160-fix.yamlは次の通り
yaml形式なので、インデントも合わせることに注意
$ sudo cat /etc/netplan/99-ens160-fix.yaml
network:
version: 2
renderer: networkd
ethernets:
ens160:
dhcp4: false
dhcp6: false
addresses: [192.168.100.2/24]
routes:
- to: default
via: 192.168.100.1
nameservers:
addresses: [192.168.100.1]
Ubuntuを再起動
Ubuntuを再起動して、IPアドレスが変更されているか確認します。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:df:f4:e5 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.100.2/24 brd 192.168.100.255 scope global ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedf:f4e5/64 scope link
valid_lft forever preferred_lft forever
Ubuntu Desktop にSSHで接続する
これはなに?
Ubuntu DesktopにSSH接続したいので設定
参考:Ubuntu 24.04にssh接続できるようにする
環境
接続先:Ubuntu Desktop: 24.04.2 LTS
接続元:Windows 11
sshサーバのインストール
$ sudo apt install ssh
sshサーバの起動
$ sudo systemctl start ssh
確認
$ sudo systemctl status ssh
[sudo] ubuntu のパスワード:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
Active: active (running) since Sun 2025-05-04 05:31:42 JST; 4min 39s ago
TriggeredBy: ● ssh.socket
Docs: man:sshd(8)
man:sshd_config(5)
Process: 2705 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 2707 (sshd)
Tasks: 1 (limit: 4610)
Memory: 4.1M (peak: 5.1M)
CPU: 33ms
CGroup: /system.slice/ssh.service
└─2707 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
5月 04 05:31:42 ubuntu systemd[1]: Starting ssh.service - OpenBSD Secure Shell server...
5月 04 05:31:42 ubuntu sshd[2707]: Server listening on :: port 22.
5月 04 05:31:42 ubuntu systemd[1]: Started ssh.service - OpenBSD Secure Shell server.
5月 04 05:36:01 ubuntu sshd[2809]: Accepted password for ubuntu from 192.168.100.2 port 55313 ssh2
5月 04 05:36:01 ubuntu sshd[2809]: pam_unix(sshd:session): session opened for user ubuntu(uid=1000) by ubuntu(uid=0)
鍵を作ります
接続元PCにて、SSHに使う鍵を作ります。
Windows11のPowerShellで作ります。ホームディレクトリで以下を実行。
PS> ssh-keygen -t ed25519 -f ".ssh\id_ubuntu2404"
.sshフォルダに に2つファイルが作成されました。
id_ubuntu2404 -> 秘密鍵
id_ubuntu2404.pub -> 公開鍵 。接続先PC(今回はUbuntu)で使う。
公開鍵を接続先PC(Ubuntu)にコピー
scpで公開鍵を接続先PC(Ubuntu)にコピーします。
まだ公開鍵認証は使えないので、パスワードで接続します。
書式:scp <公開鍵> <ubuntuのユーザー名>@<ubuntuのホスト名 or IPアドレス>:<ディレクトリ>
PS> scp ".ssh\id_ubuntu2404.pub" ubuntu@192.168.1.2:~/.ssh
公開鍵を使えるようにauthorized_keysファイルにコピー
$ ls ~/.ssh authorized_keys id_ubuntu2404.pub
公開鍵をauthorized_keysにコピーします。
※元からあったauthorized_keysは空ファイルですが、バックアップを取っておきます。
$ cp authorized_keys authorized_keys.old $ cp id_ubuntu2404.pub authorized_keys
接続テスト
Windows11のPowerShellからSSH接続してみます。
書式:ssh -i <秘密鍵ファイル> <接続先(Ubuntu)のユーザー名>@<接続先(Ubuntu)のホスト名またはIPアドレス>
PS> ssh -i ".ssh\id_ubuntu2404" ubuntu@192.168.1.2
.ssh\config に接続設定をする
ssh ubuntu で簡単に接続できるように.ssh\configファイルに設定します。
host ubuntu HostName "192.168.1.2" Port 22 User ubuntu Identityfile "C:\Users\<Windowsのユーザ名>\.ssh\id_ubuntu2404"
接続
PS> ssh ubuntu
Ubuntu Linux 上での Docker 操作
はじめに
Dockerの勉強をしたのでメモ
環境
Ubuntu Linux 24.04.2 LTS
Docker version 28.1.1, build 4eba377
インストール
Ubuntu上でCLIで動けばよいので、Docker公式の Docker Engineインストール方法 からインストール
「Install using the apt repository」という項目のスクリプトをコピペするだけでインストールできる。
基礎知識
- Dockerコンテナ内で起動するプログラムは、PID:1番が割り当てられている
- 「イメージ」はDockerHubなどからダウンロードしたり、自分で作ったりする。
持ち出すときはdocker container exportやdocker image saveなどでtarファイルを作る。 - イメージは「レイヤー」が重ね合わさってできている。
- 「Dockerfile」は、イメージにレイヤーを追加するときの作業指示書みたいなもの。
よく使うコマンド
コンテナの操作
- コンテナを起動してbashを使う
$ docker container run \ --name ubuntu \ #コンテナの名前を指定 --rm \ #コンテナを終了したら、コンテナを削除 --interactive \ # コンテナにターミナル(コンソール)を接続 --tty \ # コンテナにターミナル(コンソール)を接続 --publish 8080:80 \ #ホストマシンの8080番ポートをコンテナの80番ポートに紐づけ公開 --env PASSWORD='ABC' \ #環境変数を設定 ubuntu \ #コンテナに使用するイメージ名 bash \ # コンテナ内で実行するコマンド。ここではbashを起動している
コンテナの停止
$ docker container stop ubuntu
ubuntu は、コンテナ起動時に--name ubuntuで指定した名前
ほかにはCONTAINER IDも指定できる実行中のコンテナ一覧
$ docker container ls
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ee91464c2bc ubuntu "bash" 7 seconds ago Up 6 seconds ubuntu
停止中のコンテナ一覧
$ docker container ls --allコンテナの停止
$ docker container rm ubuntu ubuntu -> コンテナ名。CONTAINER ID`でもよい起動中のコンテナの停止
$ docker containe rm --force ubuntuコンテナのコンソール出力の確認
$ docker container logs コンテナ名|コンテナID
※コンテナは起動中または停止中であることコンソール出力の継続監視であれば
$ docker container logs --follow コンテナ名起動中のコンテナで別のコマンドを実行
$ docker container exec \ ubuntu \ #コンテナ名 head -4 /etc/os-release # 実行したいコマンド(例)
イメージ関連
- ホストマシンに持っているイメージの一覧
$ docker image ls
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE my-php pdo_mysql 0494e541a2c8 2 days ago 551MB
イメージの取得
$ docker image pull ubuntu:23.10イメージの詳細確認
$ docker image inspectコンテナ -> イメージ作成
$ docker container commit 作成元コンテナ名 作成後コンテナ名:タグ
例$ docker container commit ubuntu new-ubuntu:commit
※コンテナは起動中または停止中コンテナ -> tar
$ docker container export --output tarファイル名 コンテナ名
例$ docker container export --output export.tar ubuntu
※コンテナは起動中または停止中tar -> イメージ
$ docker image import tarファイル名 コンテナ名:tag
例$ docker image import export.tar new-ubuntu:import
※イメージ -> tar -> イメージ の方法では、レイヤが一つにまとまる。また元のメタデータは欠如するイメージ -> tar
$ docker image save --output tarファイル名 イメージ名:タグ
例$ docker image save --output save.tar ubuntu:22.04tar -> イメージ
docker image load --input tarファイル名
例$ docker image load --input save.tar
※docker image import と docker image load の違い
| image import | image load | |
|---|---|---|
| レイヤー | 残らない | 残る |
| メタデータ | 残らない | 残る |
| セットで使われるコマンド | container export | image save |
※docker container export -> コンテナから作ったtarファイル -> docker image importで読み込む
docker image load では読み込めない
※docker image save -> イメージから作ったtarファイル -> docker image loadで読み込む
docker image import でも読み込めるが...
ストレージ(ボリューム)の作成
Dockerで管理するストレージ(volume)と、ホストマシンのディレクトリをマウントする(bind)がある
volume(ボリューム)
Dockerで管理するストレージ(volume)
- ボリュームの一覧
` $ docker volume ls
ボリュームを作る
$ docker volume create --name my-volumeボリュームをコンテナ起動時にマウントする
$ docker container run --mount type=volume,source=my-volume,destination=my-volume イメージ名
-- mount でなく、短縮形-vも使える
docker container run -v my-volume:/my-volume イメージ名
- ボリュームの削除
$ docker image rm ボリューム名
bind(バインドマウント)
ホストマシンのディレクトリをマウントする(bind)
$ docker container run --mount type=bind,source=./my-bind,destination=/my-bind イメージ名
ネットワークの作成
コンテナ間の通信を行うための通信路を作る
ネットワークの一覧
$ docker network lsネットワークの作成
$ docker network create my-networkコンテナ起動時にネットワークをマウント
$ docker container run --network my-network イメージ名確認
$ docker container inspect コンテナ名 | less
Networksの項目に、マウントしたネットワーク名が記載されている
Docker Hub
Docker公式イメージはDocker Hubで探す
Dockerfile
- Dockerfile というファイル名に書く
FROM ubuntu:22.04 RUN apt-get update RUN apt-get instal -y vim ENV MYSQL_ROOT_PASSPORD=secret COPY ./aaa /home/ubuntu/aaa CMD ["cat", "/home/ubuntu/aaa"]
FROM -> 元になるイメージ名
RUN -> 実行するコマンド
ENV -> 環境変数(書式は[キー:値])
COPY -> イメージを作る際にファイルをコピーする
CMD -> コンテナ起動後に実行するコマンド
※apt ではなく apt-get を使う(apt-getのほうが余計なメッセージ出力が無いからとのこと)
- RUNなどの命令ごとに1レイヤ作られる
イメージサイズを小さくするため、コマンドをまとめたほうがいい
FROM ubunt:22.04 RUN apt-get update && apt-get install -y vim
- Dockerfileを元にイメージを作る
$ docker image build --tag my-ubuntu:22.04 .
--tag -> イメージ名とタグ名
. -> 今いるディレクトリ内のDockerfile ファイルを使用する 。
※--file ファイル名とすることで、イメージ作成に使うDockerfileを指定できる
例:$ docker image build --tag my-ubuntu:22.04 --file Dockerfile_renamed .
(--fileはファイル名を指定する。そのファイルが存在するパスは.で指定する)
Docker Compose
複数のコンテナの起動を、docker コマンドでなく設定ファイルで管理する
- ファイル名はcompose.yamlが推奨されている
よく使うコマンド
- コンテナの作成と起動 -> compose up
- コンテナの停止と削除 -> compose down
- コンテナの一覧 -> compose ps
- 起動中のコンテナでコマンドを実行 -> compose exec
例:
- コンテナの起動
$ docker compose up --detach --build
-- detach -> バックグラウンドで起動
-- build -> Dockerfileに基づいて、イメージのビルドも行う
コンテナの一覧表示
$ docker compose ps
$ docker container ls
※$ docker compose psは、compose.yamlのあるディレクトリまたはその配下のディレクトでしか実行できない
(他のプロジェクトのコンテナは表示されないようになっている)起動中のコンテナでコマンドを実行する
$ docker compose exec サービス名
$ docker compose exec app bash
※--interactive--ttyオプションは不要起動中のコンテナの停止
$ docker compose down
※ネットワークとコンテナが停止する。ボリュームは残る。
$ docker compose down --rmi all --volumes
--rmi all -> ビルドしたイメージを削除する
--volumes -> ボリュームを削除する
環境変数を使う
プロジェクトディレクトリに .env というファイルを作成して、環境変数に設定したいキーと値を書く
例:
$ cat .env APP_HOST_MACHINE_PORT=8000 DB_ROOT_PASSWORD=secret DB_USER=app DB_PASSWORD=pass1234 DB_DATABASE=sample DB_HOST_MACHINE_PORT=3306 MAIL_HOST_MACHINE_PORT=8025
compose.yamlファイルには、${キー名} という書式で書く
services:
app:
ports:
- "8000:8000"
-> "${APP_HOST_MACHINE_PORT}:8000"
環境変数を展開した
compose.yamlを確認する
$ docker compose convert変数にはデフォルト値をセットすることもできる
${APP_HOST_MACHINE_PORT:-8000}:8000(変数が未定義か空なら8000を設定する)変数にはエラーメッセージを表示できる
"MYSQL_PASSWORD=${DB_PASSWORD:?.envを見直してください}"(変数が未定義か空ならエラーメッセージを表示する)
まとめ
$ docker で個々のコンテナの動作を確認し、
$ docker compose で複数のコンテナを起動させるのね

