最近になってサーバー上でDockerを使うようになり,色々調べたのでメモ.
複数のコンテナをまとめて管理したい場合はdocker-compose
を使う.ここではPostgresとpgAdminコンテナをまとめて作成・起動する.
とりあえず以下が設定ファイルの例
docker-compose.yml
version: "3"
services:
postgres:
image: postgres:latest
container_name: "my_postgres"
restart: always
environment:
POSTGRES_USER: user_name
POSTGRES_PASSWORD: password
POSTGRES_DB: db_name
LANG: ja_JP.UTF-8
TZ: "Aisa/Tokyo"
ports:
- "5432:5432"
volumes:
- volume_postgres:/var/lib/postgresql/data
pgadmin:
image: dpage/pgadmin4
container_name: "my_pgadmin4"
restart: always
ports:
- 81:80
- 444:443
environment:
PGADMIN_DEFAULT_EMAIL: my_email
PGADMIN_DEFAULT_PASSWORD: password
volumes:
- volume_pgadmin:/var/lib/pgadming
depends_on:
- postgres
volumes:
volume_pg:
volume_pgadmin:
上記ファイルがあるディレクトリで以下のコマンドを打つことでimageのDL,コンテナのbuild,起動を全てやってくれる.-d
をつけないとデタッチせずにフォアグラウンドでコンテナが起動する.buildするときにキャッシュを使いたくない場合はdocker-compose build --no-cache
とするらしい.
別途ps
とexec
でコンテナの稼働状況を確認したり,コンテナに入ったりできる.
docker-compose up -d # imageのDL,コンテナのbuild,起動
docker-compose ps # docker-composeで起動したコンテナの稼働状況を確認
docker-compose exec service_name /bin/bash # コンテナ内に入る
学んだこと
- YMLファイルで
-
がついてるのは配列の値,ついてないのは文字列として処理される. - Postgresで日本語を使えるようにしたい場合,LANGにUTF-8を指定しておけば良い模様(コンテナ内でpsqlを使ってログインするとロケール設定のエラーが出る... ただしテーブルにデータを日本語で保存できた)
- トップレベルの
volumes
以下で指定されたVolumeはパブリック扱いになって外部のコンテナからもアクセスできるらしい.Webアプリからアクセスするならここで指定する必要がある. -
docker-compose exec service_name /bin/bash
でコンテナにアクセスできる.service_name
はトップレベルのservices
直下に書いた値(例ではpostgresかpgadmin).その下のcontainer_nameを書いてたから動かなくてはまった.
色々やってみてPostgresコンテナにはアクセスできて使えるようになった.pgAdminコンテナはまた後で使ってみたい.
ついでに確認したこと
- railsで本番環境のDBコンソールに入るには
rails dbconsole --environment=production
- railsで本番環境のDBテーブルにseedデータを入れるには
rails db:migrate RAILS_ENV=production
- psqlでデータベースを切り替えるには
\c database_name