タイトルのとおりですが、今まで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についての知識が深まると思います。