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:
上記のようにvolumes
でdb-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を実行します。
参考