タイトルのとおりですが、今までup
とかbuild
の違いをよく理解せず使用していたので、改めてまとめて見たいと思います。
個人的に似ているなと思っている以下のコマンドについて解説していきます。
image構築 | コンテナ構築 | コンテナ起動 | |
---|---|---|---|
build | ○ | × | × |
up | △ | ○ | ○ |
start | × | × | ○ |
run | ○ (単独) | ○ (単独) | ○ (単独) |
前提
構築するimageはdocker-compose.yml
ファイルに定義されているもの、またはDockerfileを参考にして構築します。
build
build
コマンドではimageを構築します。コンテナは作成しません。
$ docker-compose build
db uses an image, skipping
Building web ...
Successfully built XXXXXXXXX
Successfully tagged XXXX_web:latest
キャッシュがあればそちらを優先的に使ってビルドするので、Dockerfileを更新したなどの理由でキャッシュを使いたくない場合は docker-compose build --no-cache
とします。
キャッシュって何?
Dockerは一度ビルドするとキャッシュというのが作成されます。ご存知グーグルクロームとかのブラウザにも同じ機能がありますね。キャッシュがあると2回目以降にビルドするときに、速やかに処理をすることができるわけです。
ただ、キャッシュがあると不便なときもあって、それが例えばDockerfileを更新したときなどです。上に紹介したように --no-cache
オプションを付けないと、Dockerはキャッシュを使ってimageを構築してしまうので、更新したDockerfileを見てくれず新しいimageが作られません。
up
up
コマンドでは、キャッシュがある場合はそれを使って一発でイメージの構築から、コンテナの構築・起動までします。
キャッシュがない場合は --build
オプションをつけることで、イメージの構築から、コンテナの構築・起動までしてくれます。(ただし、 build
コマンドと同じでDockerfileを更新してても反映されません。)
新しいサービスを初めて立ち上げる場合はもちろんキャッシュはないので docker-compose up --build
コマンドを使いましょう!
-d
オプションを付けてバックグランドで実行することが多いです。
$ docker-compose up
Building web
...
Creating XXXX_db_1
Creating XXXX_web_1
Attaching to XXXX_db_1, XXXX_web_1
...
web_1 | Use Ctrl-C to stop
反対に、down
コマンドでコンテナの停止、削除を実行します。
start
start
コマンドでは既存のコンテナを起動します。
$ docker-compose start
Starting db ... done
Starting web ... done
もちろんコンテナが1つも存在しないと失敗します。
$ docker-compose start
Starting db ... failed
Starting web ... failed
ERROR: No containers to start
立ち上げたコンテナはstop
コマンドで停止することができます。
run
run
コマンドではimageの構築から、コンテナの構築・起動までしてくれますが、引数でサービスを指定しないと失敗します。
$ docker-compose run web
=> Booting Puma
=> Rails 5.1.7 application starting in development
=> Run `rails server -h` for more startup options
...
ちなみに、 run
コマンドを介して指定したサービスのコンテナ内でコマンドを実行できます。
$ docker-compose run web rails new
...
exec
run
のついでですが、 サービスのコンテナ内でコマンドを実行するならexec
コマンドも便利です。
docker exec
コマンドと同じで起動中のコンテナのシェルへ接続することができるので、run
よりもこちらで実行したほうが早いです。
$ docker-compose exec web /bin/bash
root@XXXXXXXXX:/app#
オススメ記事
こちらの記事を合わせてご確認いただくと、よりDockerについての知識が深まると思います。