🐳

ミニマムdocker/ecr使用方法メモ

2023/02/11に公開

私がミニマムでdocker/docker-compose/ecrを使用した時のメモ

ECRとは

Amazon Elastic Container Registory. コンテナイメージをpush/pullできる。

インフラストラクチャをインストールやスケーリングをすることなくコンテナイメージを Amazon ECR にプッシュし、どの管理ツールを使用してもイメージをプルできます。

dockerを利用するには

コンテナを実際に作って動かすためには、コンテナイメージが必要となる。コンテナイメージをその場で作ることもできるが、一般には、コンテナイメージは"どこか"のリポジトリから取ってくる。

イメージのビルド

Dockerfileを作って、docker buildする。(必ずしもfileでなくても引数にわたすことはできるが、一般的にはDockerfileを作る)

なお、Dockerfileの差分が検出できないと、ビルド時にキャッシュを使ってしまい、まともにビルド処理が行われない場合がある。

タグ付け

単にビルドすると、イメージにタグが付かず、docker-compose等で扱いにくい状態になる。
イメージにタグをつけるには、
docker build -t namaedayo:tagdayo
などのようにするとよい。
namaedayoがイメージ名として扱われ、tagdayoが狭義のタグとして扱われる。

リポジトリ付きのタグ

タグには
repositorydayo/namaedayo:tagdayo
のパターンもある。repositorydayoはリポジトリ名を表す。ECRを指定して
xxxxyyyyzzzz..dkr.ecr.ap-northeast-1.amazonaws.com/namaedayo:tagdayo
などとする事もある。

複数のタグ付け

一つのイメージに複数のタグを付けることもできる。

コンテナの単独起動

コンテナを一つ動かすためには、docker runすればよい。

コンテナの協調動作

コンテナを協調動作させるためには、docker-composeを使う。
docker-compose.ymlというファイルを作り、その中にどのイメージがどう動作するかを定義する。詳細は後述。

webアプリコンテナとDBコンテナを協調動作させるためには、docker-composeを使えばよい。
docker-compose up -d
-dを渡さないと、同期で標準出力にログがでてくる。

コンテナの停止(docker-compose down)

docker-compose up -dで起動した場合は、docker-compose downで停止およびコンテナの削除ができる。Docker-Desktopの画面を見ていると、コンテナが削除されることを確認できる。

イメージのpull

DockerHub

mysqlのようにDockerHubから取ってこれるイメージの場合には、単に
docker pull mysql:8.0.32
とすることでイメージを取得できる。

ECRのIAM

ECRの場合には、awsクライアントツールを使って、ECRにログインする必要がある。
そのためには、適切なIAMを付ける必要がある。
リソースを指定する必要がない場合には、以下のようなポリシーをIAMに割り当てればよい。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetAuthorizationToken",
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        },
        {
            "Sid": "BatchGetImage",
            "Effect": "Allow",
            "Action": "ecr:BatchGetImage",
            "Resource": "*"
        },
        {
            "Sid": "GetDownloadUrlForLayer",
            "Effect": "Allow",
            "Action": "ecr:GetDownloadUrlForLayer",
            "Resource": "*"
        }
    ]
}

ECRから取得する一連のコマンド

aws configure
(適切に設定)
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxyyyyzzzz.dkr.ecr.ap-northeast-1.amazonaws.com

これでECRにログインできる。ログインしたらpullできるようになる。

docker xxxxyyyyzzzz.dkr.ecr.ap-northeast-1.amazonaws.com/namaedayo:tagdayo pull

イメージのpush(ECR)

ECRにpushするには、まずローカルでタグ付けをしている前提で、AWSにログインしてから次のようにすればよい。

docker push xxxxyyyyzzzz.dkr.ecr.ap-northeast-1.amazonaws.com/namaedayo:tagdayo

prune

不要なイメージのキャッシュが残っていたりするので、適宜削除する。

docker builder prune

docker-desktopを使う場合の注意点

PCの起動直後など、docker-desktopを起動しないとバックグラウンドサービスが立ち上がらず、コマンドがエラーになる場合がある。

docker-compose.ymlについて

ポート指定

docker-compose.ymlの中で、開放するポートを選べる。

ホストのIPを渡すのが少し大変

.envで環境変数を定義して、docker-compose.ymlの中などでその変数を参照するようにすればなんとかIPを渡せる。
たとえば、.envでHOST_IP=192.168.0.2などとしておくと、このHOST_IPをdocker-compose.ymlの中で参照できるので、起動コマンドに含めるなどの対応ができる。

docker-compose.ymlのサンプル

docker-compose.yml
version: "3.9"

services:
  app:
    image: namaedayo:tagdayo
    command: "nanka command dayo ${HOST_IP}"
    ports:
      - "80:80"
      - "443:443"
    working_dir: /app/root/dayo
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: passworddayo
      MYSQL_DB: dbdayo

  mysql:
    image: mysql:8.0.32
    volumes:
      - app-data:/var/lib/mysql
      - ./sql:/sql  # 初期化用SQLを配置したフォルダをマウント
    environment:
      MYSQL_ROOT_PASSWORD: passworddayo
      MYSQL_DATABASE: dbdayo

volumes:
  app-data:

Discussion