IT/기초 지식

[Docker] docker-compose 커맨드 정리

개발자 두더지 2022. 2. 2. 22:41
728x90

 docker-compose 커맨드 중 자주 사용하는 것만 정리하고자한다. 이번 포스팅에서 사용할 docker-compose.yml과 Dockerfile은 아래와 같다.

#### 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"]

 

 

build


서비스의 빌드를 실행한다. 서비스란 "web"이나 "db"를 의미한다. yml 파일에 image:가 적혀있는 경우 그 이미지명이 로컬에 없다면 리모트로부터 pull해 온다. 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에 적혀있는 내용이 표시된다. 이번에 예제로 사용하고 있는 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


 서비스의 이미지를 pull해 온다. 이번 포스팅에 예제로 사용하고 있는 내용의 경우 mysql만 기재되어 있으므로 mysql의 미지를 pull해온다.

$ docker-compose pull
Pulling db (mysql:5.6)...
5.6: Pulling from library/mysql

 

 

push


 서비시의 이미지를 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하고 있는 상태에서 복귀하는데 사용한다.

$ 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

 

 

그 외 기타


 up -d --build를 하면, 서비스의 컨테이너가 생성되어 서비스가 실행된다. 또한 docker-compose와 커맨드를 작성하는 것이 귀찮은 경우 에일리어스로 fig를 하는 것을 추천하다. 

alias fig='docker-compose'

 docker-compose는 이미지명과 컨테이너명을 자동적으로 생성해준다. 그러나, rails이나 Gem등을 관리할 때, 브랜치를 끊고 bundle을 실행하면, 이미지명의 차이가 없으므로 다시 새로운 이미지를 build해버리고 만다. 차분을 관리하는 운용법을 하고 싶다면 자동 생성은 오히려 불편하게 될 수 있다.

 


참고자료

https://qiita.com/wasanx25/items/d47caf37b79e855af95f

728x90