531
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

docker-compose `up` とか `build` とか `start` とかの違いを理解できていなかったのでまとめてみた

タイトルのとおりですが、今まで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についての知識が深まると思います。
- Docker利用時のソースコードの変更反映 - Qiita

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
531
Help us understand the problem. What are the problem?