Help us understand the problem. What is going on with this article?

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

タイトルのとおりですが、今までupとかbuildの違いをよく理解せず使用していたので、改めてまとめて見たいと思います。
個人的に似ているなと思っている以下のコマンドについて解説していきます。

image構築 コンテナ構築 コンテナ起動
build × ×
up
start × ×
run ○ (単独) ○ (単独) ○ (単独)

※ 一部の記載内容に誤解を招く点があったので、情報を追記しました。(@chida09 さん ご指摘ありがとうございます!)

前提

構築する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コマンドでは、キャッシュがある場合はそれを使って一発でイメージの構築から、コンテナの構築・起動までします。imageがなくてもbuildから実行してくれます。( build コマンドと同じでDockerfileを更新してても反映されません。)

キャッシュがない場合は --build オプションをつけることで、イメージの構築から、コンテナの構築・起動までしてくれます。
新しいサービスを初めて立ち上げる場合はもちろんキャッシュはないので 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#

参考

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした