学習帳

Windows,Linux,Mac,AWS,VMware,ネットワークなどの検証

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アカウント認証や、登録するなら会社のメールアドレスで登録するのが良いでしょう。

okta developer アカウント登録

MFAの登録などが必要になるので、進めてください。

ユーザー登録

SAML認証を行うユーザーを登録します。
ディレクトリ > ユーザー > ユーザーを追加 ボタンをクリックします。

SAML認証するユーザーを追加

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

ユーザー登録

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

ユーザー登録成功

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

作成したユーザー名をクリック > 管理者ロール(タブ) > 個人の管理者権限を追加

管理者ロール

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

Organization管理者の割り当て

アプリ統合を作成

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

アプリ統合を作成

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

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のマネジメントコンソール「ブランディング > ドメイン」から確認します。

Conitoドメイン名

  • オーディエンスURI:
    urn:amazon:cognito:sp:ユーザープール ID
例:
urn:amazon:cognito:sp:ap-northeast-1_hNn2W28xx

※ユーザープールIDは、Cognitoのマネジメントコンソール「概要」にて確認します。

Cognito ユーザ―プール ID

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

シングルサインオンURLとオーディエンスURL

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

※Name: OktaとCognitoで共通に認識するキー
※Value: Oktaのユーザー情報に含まれる値

属性ステートメント(オプション)

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

フィードバック

ユーザーをアサイン

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

ユーザーに割り当て

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

ユーザーに割り当てる

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

ユーザーに割り当てる

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

ユーザー割り当て完了

メタデータを取得

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

サインオン タブを選択
IdPメタデータを表示

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

メタデータ

Amazon Cognito設定②

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

アイデンティティプロバイダーを追加

  • ●SAML を選択します。

    SAMLを選択

  • プロバイダー名:okta-saml (お好きな名前を入力してください)

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

    プロバイダー名と識別子

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

    メタデータドキュメント(XMLファイル)のアップロード

  • SAMLプロバイダーとユーザ―プールの間で属性をマッピング Oktaの「属性ステートメント(オプション)」で設定したユーザー属性とのマッピングを設定します。

ユーザ―プール属性:プルダウンから選択
SAML属性:Oktaの「属性ステートメント」の「値」で設定した値を入力。
入力がすんだら「アイデンティティプロバイダーを追加」ボタンをクリックします。

ユーザープール属性 SAML属性
email email
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に設定したユーザー名とパスワードを入力して「サインイン」ボタンをクリックします。

Oktaサインイン

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

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とvenvで仮想環境を構築する

環境

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ファイルにコピー

Ubuntu側の~/.ssh に公開鍵が転送されています。

$ 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.04

  • tar -> イメージ
    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 で複数のコンテナを起動させるのね