Dockerについて記事にするには小さいネタが貯まっていたのでまとめて紹介します。
exitしたコンテナの中に入る
DockerFileを作っている時、本当に役に立ちます。
docker commit {docker psで見えるexitしたコンテナのイメージのID} {適当なコンテナ名}
docker run --rm -it {一つ前で使った適当なコンテナ名} sh
上のコマンドでexitしたコンテナと同じ中身のコンテナがshコマンドで走り出します。shで入った中でエラー原因の特定などをします。
今動いていないコンテナ、イメージ、ボリュームをまとめて削除するワンライナ
Docker環境が無暗に増えてきたと思った時に便利です。最近使っているコンテナを立ち上げた状態で次のコマンドを実行するとまとめて使ってないものが消えます。
docker system prune -a --volumes
container_nameをつけないことでコンテナを衝突させない
docker-composeではコンテナの名前をcontainer_nameでつけることができます。
version: "3"
services:
mysql:
# コンテナ名はmysql
container_name: mysql
build:
context: ./docker/mysql
args:
- MYSQL_VERSION=8.0
volumes:
- ./docker/log/mysql:/var/log/mysql
これをあえてつけないでおくとDockerは手持ちの情報から他コンテナと衝突しないコンテナ名をよしなにつけてくれます(おそらくカレントディレクトリ名 + サービス名 + 連番。例えば /php74_test_mysql_1)。
container_nameを汎用的な名前にする
container_nameを汎用的なもの(mysqlなど)にすることで別プロジェクトで同じコンテナを参照する前提の環境構築をしやすくできます。この時のvolumeのマウント領域が必要以上にプロジェクトに依存しない様注意しましょう。container_nameを汎用的なものにすると同じSQLサーバの違うデータベースで開発する、一つのmailhogで複数プロジェクトのメールを受け取る、などができてポートが占有されずに便利です。dozzleの様な一括管理サービスは特に複数同時に動く必要がないので、無駄に複数立ち上げない様にcontainer_nameを汎用的なものにしてしまうのがいいです(container_nameが同じコンテナが既に立ち上がってると、同名のコンテナを後から立ち上げられない)。
nodeの様な実行ファイルをコンテナにする
コンテナ上のnodeを用いることで誰でも同じバージョンのアプリケーションを使って開発していると信じられます。同じバージョンのアプリケーションで開発することが重要な時、開発者らが各々インストールを探る必要もなくなります。
version: "3"
services:
node:
image: node:12.13-alpine
# 誰もが同じバージョンのnodeを使います docker-compose exec node npm run hogehoge