docker-compose コマンドまとめ
開発環境としてDockerを使ってるのですが、なんとなくコマンドを打っていて、あまりちゃんとコマンドを理解していないので、覚え書きとしてまとめてみようと思います。
dockerコマンドというよりdocker-composeを紹介します。
今回は以下のようなdocker-compose.ymlを参考にします。
web:
build: .
environment:
DISABLE_SPRING: "1"
DB_USERNAME: "root"
DB_PASSWORD: "root"
DB_HOST: "db"
ports:
- "3000:3000"
volumes:
- ".:/var/local/rails5_product"
links:
- "db"
db:
image: mysql:5.6
environment:
MYSQL_ROOT_PASSWORD: "root"
Dockerfileも
# rails5_product
FROM ruby:2.3.0
ENV LANG C.UTF-8
# Install Packages
RUN apt-get update -y && apt-get upgrade -y
RUN apt-get install -y \
sudo \
nodejs \
build-essential \
mysql-client
# Application
ENV app rails5_product
ENV deploy /var/local/$app
ENV user prod_dev
# User
RUN useradd -d /home/$user -m -s /bin/bash $user
RUN echo "$user:$user" | chpasswd
RUN echo "$user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$user
USER $user
ENV HOME /home/$user
# Work Directory
RUN sudo mkdir -p $deploy
RUN sudo chown -R $user:$user $deploy
WORKDIR $deploy
# Bundle Install
RUN sudo gem install bundler
ADD Gemfile $deploy/
ADD Gemfile.lock $deploy/
RUN sudo chown $user:$user Gemfile
RUN sudo chown $user:$user Gemfile.lock
RUN bundle install
EXPOSE 3000
CMD ["./bin/rails", "server", "-b", "0.0.0.0"]
環境
・ Ruby 2.3.0 (ベースとなるDockerイメージを使用しております。)
・ Ruby on Rails 5.0.0
・ Mac OS X El Capitan 10.11.5
・ Docker 1.12.0-rc4
・ docker-compose version 1.8.0-rc2
(Docker for Mac Beta を使用しております。)
build
サービスのビルドを実行します。
サービスとは「web」や「db」のことを指します。ymlファイルにimage:
が書かれている場合はそのイメージ名がローカルになければ、リモートからプルしてきます。imageが書かれていない場合、buildに書かれているパスの(デフォルトは)Dockerfileを参考にしてイメージを構築します。
$ docker-compose build
db uses an image, skipping
Building web ......
また引数にサービス名を指定して、特定のサービスだけビルドすることも可能です。
bundle
DAB(Distributed Application Bundles)というのを作成します。これは事前に作成したイメージをdockerのregistryにpushしておく必要があります(ローカルにpushでも可)。
$ docker-compose bundle
WARNING: Unsupported key 'links' in services.web - ignoring
WARNING: Unsupported key 'volumes' in services.web - ignoring
Wrote bundle to rails5product.dab
作成されたファイルは以下のような内容です。
{
"Services": {
"db": {
"Env": [
"MYSQL_ROOT_PASSWORD=root"
],
"Image": "mysql@sha256:2897982d4c086b03586a1423d0cbf33688960ef7534b7bb51b9bcfdb6c3597e7",
"Networks": [
"default"
]
},
"web": {
"Args": [
"bash",
"-c",
"rm -f tmp/pids/server.pid; ./bin/rails server -b 0.0.0.0"
],
"Env": [
"DB_PASSWORD=root",
"DB_HOST=db",
"DB_USERNAME=root",
"DISABLE_SPRING=1"
],
"Image": "wataru0225/rails5_product@sha256:3fb6321b2c8edb2a3f74ca85574182802359a8d4106a9350406a6d5252a71a00",
"Networks": [
"default"
],
"Ports": [
{
"Port": 3000,
"Protocol": "tcp"
}
]
}
},
"Version": "0.1"
}
config
docker-compose.ymlで書かれてる内容が表示されます。今回は、networksやvolumesは書いてないので空で表示されてます。
$ docker-compose config
networks: {}
services:
db:
environment:
MYSQL_ROOT_PASSWORD: root
image: mysql:5.6
network_mode: bridge
web:
build:
context: ~/rails5_product
environment:
DB_HOST: db
DB_PASSWORD: root
DB_USERNAME: root
DISABLE_SPRING: '1'
links:
- db
network_mode: bridge
ports:
- 3000:3000
volumes:
- ~/rails5_product:/var/local/rails5_product:rw
version: '2.0'
volumes: {}
create
構築されたサービスを参考にそのコンテナを作ります。ここで作られたコンテナは起動している状態ではありません。
$ docker-compose create
Creating rails5product_db_1
Creating rails5product_web_1
これもまた引数にサービス名を指定して、特定のサービスだけのコンテナを作ることも可能です。
down
docker-compose.ymlに書かれているサービスを参考にコンテナを停止し、そのコンテナとネットワークを削除します。
オプションで--rmi all
をつけることでイメージも削除してくれます。
$ docker-compose down
Stopping rails5product_web_1 ... done
Stopping rails5product_db_1 ... done
Removing rails5product_web_1 ... done
Removing rails5product_db_1 ... done
events
コンテナからのイベントを受信します。コマンドを打つと、受信状態に入り特に動きはありません。別のタブでdockerコマンドを試すと動きが分かります。
$ docker-compose events
$ docker exec -it rails5product_web_1 /bin/bash
root@21896a731d87:/var/local/rails5_product#
$ docker-compose events
container exec_start: /bin/bash 21896a731d87e65c0725df989b8c2828d14850ece829897e057caa514e435f7f (image=rails5product_web, name=rails5product_web_1)
exec
docker exec
コマンドと同等のことができます。引数にサービス名と実行するコマンドを指定して、実行します。
$ docker-compose exec web /bin/bash
root@3a0319c17621:/var/local/rails5_product#
help
コマンドの一覧を表示します。基本はこちらを参考にすると良いでしょう。
images
対象のイメージの情報を表示します。
$ docker-compose images
Container Repository Tag Image Id Size
-------------------------------------------------------------------------
rails5product_db_1 mysql 5.6 cdfa8cc50c33 284 MB
rails5product_web_1 rails5product_web latest 42427affdec4 1.17 GB
kill
コンテナを強制停止します。
$ docker-compose kill
Killing rails5product_web_1 ... done
Killing rails5product_db_1 ... done
logs
サービスのログを出力します。
$ docker-compose logs
Attaching to rails5product_web_1, rails5product_db_1
.....
また引数でサービス名を指定できるので、そうするとサービスごとにログを出力してくれます。
pause
サービスを一旦停止します。(一時停止したサービスは強制削除、強制開始ができずunpauseをしてからでないと作業ができなくなるので注意してください。)
$ docker-compose pause
Pausing rails5product_db_1 ... done
Pausing rails5product_web_1 ... done
port
割り当てているポートを表示します。引数でサービス名とポート番号が必要になります。
$ docker-compose port web 3000
0.0.0.0:3000
ps
コンテナの一覧を表示します。
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
rails5product_db_1 docker-entrypoint.sh mysqld Paused 3306/tcp
rails5product_web_1 ./bin/rails server -b 0.0.0.0 Paused 0.0.0.0:3000->3000/tcp
ちなみにdocker ps
でもコンテナ一覧表示ができます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
430a9252b5ef rails5product_web "./bin/rails server -" 4 seconds ago Up 2 seconds 0.0.0.0:3000->3000/tcp rails5product_web_1
ace14a21fdca mysql:5.6 "docker-entrypoint.sh" 4 seconds ago Up 4 seconds 3306/tcp rails5product_db_1
pull
サービスのイメージをプルしてきます。今回書かれている内容だと、mysqlにしかimageが記載されてないので、mysqlのイメージのみpullしてきます。
$ docker-compose pull
Pulling db (mysql:5.6)...
5.6: Pulling from library/mysql
push
サービスのイメージをプッシュします。サービス名がwebの方ならpushができます。(dockerのregistryなどにpushする場合、事前に docker login
をしておく必要があります。)
$ docker-compose push web
Pushing web (wataru0225/rails5_product:latest)...
The push refers to a repository [docker.io/wataru0225/rails5_product]
dd109e1c2002: Preparing
9fb4d117f6f2: Preparing
17e7a11e646d: Preparing
d1223c4f56c0: Preparing
73b7de3ce7c8: Preparing
6e3fe9a92a13: Waiting
251e05a2e324: Waiting
1ad3dbeb7233: Waiting
..........
restart
コンテナを再起動します。
$ docker-compose restart
Restarting rails5product_web_1 ... done
Restarting rails5product_db_1 ... done
rm
停止中のコンテナを削除します。デフォルトだと[y/N]の確認があるのですが、-f
オプションをつけることで、確認なしでコンテナを削除します。
$ docker-compose rm
Removing rails5product_web_1 ... done
Removing rails5product_db_1 ... done
run
引数で指定したサービスのコンテナ内でコマンドを実行します。
$ docker-compose run web rails s
=> Booting Puma
=> Rails 5.0.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
..........
scale
サービスを実行するコンテナ数を指定します。サーバーの台数を増やしたりする時に使用します。
portsが被ると正常に実行できないので注意してください。
$ docker-compose scale web=2
Creating and starting rails5product_web_1 ... done
Creating and starting rails5product_web_2 ... done
start
サービスを開始します。これは既にコンテナがある状態でなければなりません。
$ docker-compose start
Starting db ... done
Starting web ... done
stop
サービスを停止します。
$ docker-compose stop
Stopping rails5product_web_1 ... done
Stopping rails5product_db_1 ... done
top
各コンテナのプロセス情報を表示します。
$ docker-compose top
rails5product_db_1
PID USER TIME COMMAND
-----------------------------
26399 999 0:00 mysqld
rails5product_web_1
PID USER TIME COMMAND
------------------------------------------------------------------------------------------
26690 dockrema 0:00 bash -c rm -f tmp/pids/server.pid; ./bin/rails server -b 0.0.0.0
26713 dockrema 0:03 {ruby} puma 3.4.0 (tcp://0.0.0.0:3000) [rails5_product]
unpause
サービスの再開をします。pauseしている状態から復帰するのですが、pauseしている状態から復帰するにはこのコマンドが必要です。
$ docker-compose unpause
Unpausing rails5product_web_1 ... done
Unpausing rails5product_db_1 ... done
up
コンテナを作成して、起動します。オプションで-d
をつけることでバックグラウンドで実行することができます。
またオプションで--build
をつけることで起動前にイメージも構築します。
$ docker-compose up
Creating rails5product_db_1
Creating rails5product_web_1
Attaching to rails5product_db_1, rails5product_web_1
.........
version
docker-composeのバージョンを表示します。
$ docker-compose version
docker-compose version 1.8.0-rc2, build c72c966
docker-py version: 1.9.0-rc2
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.2h 3 May 2016
(※これは 2016年7月16日現在のバージョンになります。)
その他
up -d --build
をすれば、サービスのコンテナが立ち上がりサービスを開始してくれます。
またdocker-compose
とコマンドを打つのが面倒な方は、エイリアスでfig
とするのもお勧めします。
元はfigというツールだったようなので。(2014年7月にDocker社は、figを買収したようです。)
alias fig='docker-compose'
docker-composeはイメージ名とコンテナ名を自動で生成してくれます。ですが、railsとかだとGemとかを管理する時、ブランチを切ってbundleを実行したりしてしまうと、イメージ名に差はないのでまた新しくイメージをbuildしようとしてしまいます。差分を管理したいとかの運用法になると、自動生成はかえって便利でなくなってしまう恐れがありますね。(ベストプラクティスが思いついてはいません。。。)
参考リンク
https://docs.docker.com/compose/reference/
http://qiita.com/skyriser/items/2cf98b747ed6577cc5ee
'Server > Docker' 카테고리의 다른 글
Docker container간 연동 확인 (0) | 2018.11.20 |
---|---|
Why docker container exits immediately (0) | 2018.11.14 |
docker-compose.yml 내부 명령어 (0) | 2018.11.14 |
docker-compose로 10분만에 gitlab,redmine,jenkins서버 만들기 (0) | 2018.11.09 |
docker커맨드를 sudo없이 실행하는 방법 (0) | 2018.11.09 |