目的
環境構築の備忘録です。
- UbuntuをインストールしたEC2インスタンスを準備し、Dockerを使えるようにする
- AWS CLIを導入してECRにプッシュ出来るようにする
参考
-
Docker Engine を Linux にインストール — Docker-docs-ja 1.13.RC ドキュメント
-
AWS CLI の最新バージョンをインストールまたは更新します。 - AWS Command Line Interface
2022/7時点の手順です。
EC2上にDocker環境を用意する
以下の手順で進める。
- UbuntuをインストールしたEC2インスタンスの準備
- セキュリティグループの設定 ( ここでは通信を許可するポートの設定のこと )
- EC2インスタンスへSSH接続
- DockerEngineインストール
- DockerComposeインストール
UbuntuをインストールしたEC2インスタンスの準備 + セキュリティグループの設定
- AWSのコンソールにアクセスし、サインインする
- 検索欄にEC2と入力し、EC2のダッシュボードを開く
- 画面左の「インスタンス」 > 「インスタンスを起動」を選択
- インスタンスの名前を入力
- アプリケーションおよび OS イメージ (Amazon マシンイメージ)でUbuntuのAMIを選択
- インスタンスタイプを選ぶ。今回は t2.micro を使用する。
- キーペアを選択する。初めてEC2を使う場合、「キーペアの作成」を選択して適当なキーペア名を入力する。
- インバウンドセキュリティグループのルールの「Add security group」を選択、必要な通信を通す。
設定例 : ssh, HTTP, HTTPS, テスト用のカスタムTCP(8080~8082
)を通した状態。
ソース欄ではインスタンスに到達できるトラフィックを単一のIPアドレス or CIDR表記で指定する。
- ストレージの設定。Dockerの学習目的の場合、デフォルトの8GBだと少ないため、20GBに変更する。
- インスタンスを起動する。数分するとインスタンスが実行中になる。
キーペアを作成すると自動的に キーペア名.pem
ファイルがダウンロードされる。
EC2インスタンスへのアクセスに必須なので、無くさないようにする。また、漏洩しないようにする。
インスタンスは起動時間に応じて課金されるため、使用していない時は停止する。
補足: CIDR表記
CIDR表記(Classless Inter-Domain Routing)とは、ネットワークアドレスとサブネットマスクのビット数を/
区切りで書く記法。
[ネットワークアドレス]/[サブネットマスクのビット数]
参考
- CIDR表記(プレフィックス表記)とは - 意味をわかりやすく - IT用語辞典 e-Words
- サブネットとCIDR表記について - ノリックジオグラフィック for Webエンジニア
- サブネット・チートシート: サブネットマスク 24、30、26、27、29、その他 IP アドレスと CIDR のネットワークリファレンス
EC2インスタンスへSSH接続
起動したEC2インスタンスの「インスタンスの詳細」にアクセスすると、様々な情報が表示される。
SSH接続にはパブリック IPv4 アドレス を使うため、控えておく。
なお、IPアドレスはインスタンスを起動するたびに変更される。
macOSの場合の手順
筆者はmacOSを使用しているため、macOSの場合の手順を記載する。
macOSの場合はシェルにデフォルトで備わっている ssh
コマンドを使う。
-
chmod
コマンドで鍵ファイルのパーミッションを読み取り専用に変更する。# 例 chmod 400 ~/Documents/docker_ec2.pem
-
ssh
コマンドで接続する。# ssh (user@)host [command] [option] # -i オプションでログインに使用する秘密鍵ファイルを指定する ssh ubuntu@xxx.xxx.xxx.xxx -i ~/Documents/docker_ec2.pem
AWSにSSH接続する時のユーザ名
ユーザ名は指定したAMIによって決まる。今回の場合は ubuntu
になる。
Amazon Linux インスタンスでのユーザーアカウントの管理 - Amazon Elastic Compute Cloud
各 Linux インスタンスは、デフォルトの Linux システムユーザーアカウントで起動されます。デフォルトのユーザー名は、インスタンスの起動時に指定した AMI によって決まります。
UbuntuにDockerEngineインストール
Docker Engine を Linux にインストール — Docker-docs-ja 1.13.RC ドキュメント
DockerEngineをインストールするには、主に2つの選択肢がある。
yum
やapt
でインストール
ディストリビューションに付属しているバージョン。
- メリットはインストールが簡単なこと。また、アップデートが容易なこと。
- デメリットはディストリビューションによってインストールされているDockerのバージョンがまちまちなこと。
保証やセキュリティアップデートなど運用上の問題点から、本番運用ではこちらを利用したほうが良い。
Docker社が提供しているDockerEngineのパッケージをインストール
- メリットは常に最新版を利用できること。ディストリビューションが違っても常にバージョンを統一出来る。
- デメリットは、ディストリビューションの一部ではないためアップデートを自分で追わなければならない点。
学習目的の場合はこちらを利用すると良い。
この記事ではDocker提供のパッケージを利用する。
公式の手順に沿ってUbuntuにDockerEngineをインストールする。
参考 : Install Docker Engine on Ubuntu | Docker Documentation
sudo apt-get update
# aptがHTTPS上のレポジトリを使用できるようにパッケージをインストール
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# Docker公式のGCPKey(ファイルが改ざんされていないことを確認するために使われる鍵のファイル)を入手
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# リポジトリのセットアップ
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# Docker Engine, containerd, Docker Composetyをインストール
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# デフォルトだとルートユーザしかDockerを利用出来ないため、Ubuntuユーザでも利用出来るようにする
sudo gpasswd -a ubuntu docker
# 一旦切断して再度ssh接続する
exit
# 確認
docker --version # => Docker version 20.10.17
Apacheが入ったDockerコンテナを動かしてみる
起動
# ApacheのDockerイメージ (dockerfile無し)
# https://hub.docker.com/_/httpd
$ docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
# 確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ce7a822748e httpd:2.4 "httpd-foreground" 15 hours ago Up 2 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp my-apache-app
ブラウザで確認
EC2インスタンスのIPアドレスにアクセスしてみると、 docker run
を実行した時点でのディレクトリの中身が表示される。
本番環境ではカレントディレクトリを公開しないこと。
公開専用のディレクトリを用意し、そこをWebサーバが公開するようにすべき。
vi
nano
等のエディタを使って index.html
を追加してみる。
$ vi index.html
$ cat index.html
<html>
<body>
<div>Hello Docker</div>
</body>
</html>
更新すると、 index.html
の内容が表示されている。
これで、EC2上にDocker環境を構築し、Webサーバを起動することが出来た。
DockerComposeの導入
Docker Compose のインストール — Docker-docs-ja 19.03 ドキュメント
コマンドライン補完 — Docker-docs-ja 20.10 ドキュメント
いくつかインストール方法がある。
バイナリをダウンロード
sudo curl -L https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# バイナリに実行権限を付与
sudo chmod +x /usr/local/bin/docker-compose
# 確認
$ docker-compose --version
pip
を利用
# pythonとpipをインストール
$ sudo apt install -y python3 python3-pip
# DockerComposeをインストール
$ sudo pip3 install docker-compose
# 確認
$ docker-compose --version
ECRを使えるようにする
Amazon ECRとは、プライベートなDockerレジストリサービスのこと。
適切な権限を持ったIAMユーザの登録とAWS CLIの導入が必要。
IAM
IAM (Identity and Access Management)は、誰がどのサービス・リソースにどのような条件でアクセスできるのか、といった権限を細かく指定することができる。
IAMユーザによりAWS CLIにアクセスする場合、
- ユーザ名に相当するアクセスキーID
- パスワードに相当するシークレットアクセスキー
を発行する必要がある。
IAMユーザの登録
以下の手順で登録出来る。
ユーザを作成した際に表示されるアクセスキーIDとシークレットアクセスキーを必ず控えておくこと。
- IAM Management Consoleを開く
- ユーザページを開く
- ユーザの追加を選択し、ユーザ名とアクセスの種類(AWS認証情報タイプ)を設定する
- アクセス権限を設定する
- タグを設定する
- ユーザを作成したらアクセスキーIDとシークレットアクセスキーを控える
アクセスの種類
- アクセスキー - プログラムによるアクセス
- AWS CLIからアクセスしたい場合はこちらを選択
- アクセスキーIDとシークレットアクセスキーが発行される
- パスワード - AWS マネジメントコンソールへのアクセス
- パスワードが発行される
アクセス権限の設定
ゼロから設定する場合は既存のポリシーを直接アタッチを選択し、関連するキーワード (サービス名など)を入力して検索する。
ECR関連の主な権限は以下。
- AmazonEC2ContainerRegistryFullAccess
- AmazonECRに対する全ての権限。リポジトリの作成や削除もできる。
- AmazonEC2ContainerRegistryPowerUser
- リポジトリに対するほぼ全ての権限。push操作などができる。
- AmazonEC2ContainerRegistryReadOnly
- リポジトリに対するpull操作のみができる。
タグ
メールアドレスや部署等。
AWS CLI
- AWS Command Line Interface とはどのようなものですか。 - AWS Command Line Interface
- AWS CLI の設定 - AWS Command Line Interface
AWS Command Line Interface (AWS CLI) は、コマンドによりAWSサービスとやり取りするためのツール。
AWS CLI の導入
公式の手順に沿って導入する。
AWS CLI の最新バージョンをインストールまたは更新します。 - AWS Command Line Interface
-
unzip
のインストール$ sudo apt install -y unzip
-
aws
コマンドのインストールcurl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install
-
確認
$ aws --version
-
ダウンロードに使ったファイルの削除
$ rm -rf aws awscliv2.zip
認証情報の設定
IAMユーザ登録時に発行したアクセスキーIDとシークレットアクセスキーを使う。
aws configure
コマンドを実行すると各項目の入力を求められるので、必要な情報を入力していく。
$ aws configure
AWS Access Key ID [None]: Access Key ID
AWS Secret Access Key [None]: Secret Access Key
Default region name [None]:
Default output format [None]:
- Access Key ID / Secret Access Key
- 登録したIAMユーザのアクセスキーIDとシークレットアクセスキーを設定。
- Default region name
- 規定のリージョン名。省略可能。
- Default output format
- 規定の出力フォーマット。テキスト形式やJSON形式等を選ぶことが出来る。省略可能。
確認には get-loing-password
コマンドを使う。
ecr
の箇所にはIAMユーザがアクセス権限を持つサービスを入力する。
$ aws ecr get-login-password
ECRの使用
IAMユーザの登録とAWS CLI の導入が済めば、コマンドラインからECRを扱えるようになっている。
push / pull どちらもログインが必要。
ログイン用のコマンドは後述のプッシュコマンドの表示から確認出来る。
以下のような手順で作成したプライベートリポジトリに対してイメージをpushすることが出来る。
- https://ap-northeast-1.console.aws.amazon.com/ecr にアクセスしてリポジトリ作成
- リポジトリの詳細ページにアクセスし、プッシュコマンドの表示を選択
- プッシュ用コマンドの確認
- 3で確認したプッシュ用コマンドを入力してpushする
pullの場合、ログイン状態でdocker pull の引数に適切な値を入力する。