Open2

Docker備忘録

カイリーーカイリーー

DockerfileをS3バケットに格納し、EC2にダウンロードする場合

aws s3 cp s3://S3バケット名 ~/ディレクトリ名 --recursive

S3バケット内でプレフィックスを指定している場合は バケット名/プレフィックス と指定する

Dockerイメージのタグ付け

ECRにイメージをPushする場合

AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

docker image tag <ローカルのイメージ>:<タグ> ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/<イメージ名>:<タグ>

認証トークンを取得し、レジストリに対してDockerクライアントを認証

aws ecr --region ap-northeast-1 get-login-password | docker login --username AWS --password-stdin https://${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/<ECRリポジトリ名>

イメージのPush

docker image push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/<イメージ名>:<タグ>

イメージのBuild

# docker image build -t <イメージ名>:<タグ>
docker image build -t ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/<イメージ名>:<タグ> .

コンテナの起動

docker container run -d --name <任意のコンテナ名> ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/<イメージ名>:<タグ>

コンテナ内に接続

docker container exec -it <コンテナ名> bash

コンテナログを調べる

docker logs <コンテナ名>
カイリーーカイリーー

docker-compose.yamlの理解

docker-compose.yaml
networks:
  api-network:

volumes:
  db-data:

services:
  db:
    image: mysql:latest       
    container_name: db-container  
    environment:                  
      MYSQL_ROOT_PASSWORD: cloudtech
    volumes:
      - db-data:/var/lib/mysql    
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro 
    networks:                     
      - api-network
    healthcheck:                  
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pcloudtech"]
      interval: 10s               
      timeout: 5s                 
      retries: 3             

  api:
    build: 
      context: ./api              
      dockerfile: Dockerfile      
    container_name: api-container 
    depends_on:
      - db                        
    environment:                  
      - DB_USERNAME=root
      - DB_PASSWORD=cloudtech
      - DB_SERVERNAME=db-container
    ports:                        
      - "8080:8080"
    networks:                     
      - api-network
    healthcheck:                  
      test: ["CMD", "curl", "-f", "http://localhost:8080"]
      interval: 10s               
      timeout: 5s                 
      retries: 3                  

  front:
    build: 
      context: ./front
      dockerfile: Dockerfile
    container_name: front-container
    ports:
      - "8081:80"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80"]
      interval: 10s               
      timeout: 5s                 
      retries: 3                  

volumesセクション概要

Dockerコンテナは一度停止または削除してしまうと、コンテナ内で作成したデータは削除されてしまいます。
そのため、コンテナとは別の場所にデータを保存しておくことでデータの永続化を実現できます。
その方法がvolumesを使用することで可能です。

volumes:
  db-data:

上記のようにvolumesdb-dataと定義することで、永続的なストレージ領域を作ることができます。

以下のsevicesセクション内でvolumes以下に記載している

services:
  db:
    image: mysql:latest       
    container_name: db-container  
    environment:                  
      MYSQL_ROOT_PASSWORD: cloudtech
    volumes:
      - db-data:/var/lib/mysql    
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro 

  • db-data:/var/lib/mysql : db-dataという名前付きボリュームをMySQLコンテナ内のvar/lib/mysqlディレクトリにマウントしています。
  • MySQLのデータベースデータは(テーブル、インデックスなど)/var/lib/mysqlディレクトリに保存されます。
  • db-dataの実態はどこにあるのか?
    -> Dockerが管理するストレージ領域に保存されます。
    -> Docker Desktop(Windows)を使用している場合は、Linux VM内の/var/lib/docker/volumes/内に保存されます。
    -> ボリュームの実態を確認するには?
    以下コマンドでvolumeの存在確認をします。
docker  volume ls
DRIVER    VOLUME NAME
local     work_db-data

-> 確認したボリューム名で以下のコマンドを実行し、ボリュームの詳細を確認します。

docker volume inspect work_db-data
[
    {
        "CreatedAt": "2025-03-08T22:04:35Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "work",
            "com.docker.compose.version": "2.24.3",
            "com.docker.compose.volume": "db-data"
        },
        "Mountpoint": "/var/lib/docker/volumes/work_db-data/_data",
        "Name": "work_db-data",
        "Options": null,
        "Scope": "local"
    }
]

Mountpoint: /var/lib/docker/volumes/work_db-data/_data
上記がボリュームの実態が保存されているホストマシン上のパスです。
が、Docker Desktopを使用している場合、ボリュームはLinux VM内に保存されるため、直接ホストマシンのファイルシステムからアクセスすることができません。

  • ./db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro: ./db/init.sqlでホスト側にあるinit.sqlをMySQLコンテナ内の/docker-entrypoint-initdb.d/init.sqlへマウントしています。
    roとすることでread onlyを意味しており、読み取り専用であることを定義しています。
    上記の記載により、MySQLコンテナは初回起動時に、/docker-entrypoint-initdb.d/ディレクトリ内のSQLを実行します。

参考

https://qiita.com/ysd_marrrr/items/e8a50c43cff87951385c