-->

솔직히 도커는 고래이미지가 더 귀엽지 않나...쩝

[Docker] docker-compose 사용 (Compose V2)

 

Dockerfile로 image를 build 하고 run 하고 wildfly 웹서버까지 띄워봤다.

그러나 실행할 때 마다 긴 명령어를 입력해야 하는 것이 꽤나 번거로운 일이라는 걸 알게 된다.

docker run --privileged -itd -p 1003:8080 --name wildflyC -v /opt/docker/dockervolume/logs:/opt/jboss/wildfly/standalone/configuration/log:z wildfly_img:1.0

Volume까지 설정하면 이렇게 되는데 여기서 더 길어질 수도 있다 ㅜ

자동화와 유지보수를 위해 Dockerfile을 사용하는데 이를 실행하는 명령어가 어려우니 이것도 정의해야 할 필요성이 느껴진다.

이런 상황에서 docker run 할 때 옵션 값들이 많아지거나, 동시에 여러 컨테이너를 조작해야 한다거나, 컨테이너끼리 통신해야 할 경우 사용하는 훌륭한 툴이 있다.

그게 바로 docker-compose 이다.

한번 설치부터 실행까지 해보자.

 

1. docker-compose 설치 

docker compose에 대해 알아보니 구버전과 V2 가 있더라. 설치 방법은 2개다 올리고 나는 V2로 진행해보겠다.

 

1.1) Docker Compose 

설치는 보통 최신 버전을 curl로 가지고 온다. 

따끈따끈한 신상 버전으로 설치해보자.

$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.3.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

docker-compose에 권한을 줘야 한다.

$ sudo chmod +x /usr/local/bin/docker-compose

설치가 되었으면 버전 확인~!

$ docker --version
Docker version 20.10.14, build a224086

 

`docker-compose` 명령어를 실행했을 때, `bash: /usr/bin/docker-compose: 그런 파일이나 디렉터리가 없습니다`

와 같은 오류가 발생하면 아래처럼 심볼릭 링크를 설정해야 에러가 안 난다고 하는데 나는 에러가 안 났다

$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

명령어 수행은 'docker-compose'로 실행한다

 

 

1.2) Docker Compose V2

Docker Desktop과 호환성을 위한 것 같은데... 일단 도전!!

# 변수설정
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}

# 폴더 생성
$ mkdir -p $DOCKER_CONFIG/cli-plugins

# 설치
$ curl -SL https://github.com/docker/compose/releases/download/v2.3.4/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
 
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   664  100   664    0     0   1328      0 --:--:-- --:--:-- --:--:--  1330
100 25.2M  100 25.2M    0     0  4609k      0  0:00:05  0:00:05 --:--:-- 6451k

# 권한
$ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

$ 버전확인 
$ docker compose version
Docker Compose version v2.3.4

Home 폴더에 설치하는 것 말고는 뭐 크게 다르지 않은 것 같다.

V2는 docker-copose가 아니라 docker compose로 시작한다

 

2. docker-compose.yml 파일 작성

설치는 비교적 간단하고 사용법도 어렵지 않다. 

https://www.composerize.com/ 해당 사이트를 이용하면 docker run 명령어를 compose파일로 만들어준다.

 

Composerize

 

www.composerize.com

야믈파일은 버전, 서비스, 볼륨, 네트워크 4가지 항목으로 구성되어있다.

들여 쓰기를 통해 하위 항목을 구분한다.

샘플은 wildfly dockerfile로 만들어본다.

https://minggu92.tistory.com/79

 

[Docker] wildfly Dockerfile을 이용한 Container 생성

[Docker] wildfly Dockerfile을 이용한 Container 생성 docker로 작업할 때 가장 효율이 나는 것들 중 하나는 바로 웹서버이다. nginx 띄우는 예제는 많지만 wildfly를 더 많이 사용해왔기 때문에 wildfly contai..

minggu92.tistory.com

 

2.1) docker-compose.yml 예시

# docker-compose.yml

# docker-compose 버전명시
version: "3.8" # optional since v1.27.0

# 사용할 image들 즉, 생성할 컨테이너
services: 
  # 생성할 컨테이너 이름... 하지만 조금 다른 이름으로 생성됨
  <container-name>:
    # 컨테이너 생성에 사용할 이미지
    image: node:10
    # WORKDIR ( -w )
    working_dir: /usr/src/app
    # 포트포워딩 ( -p )
    ports:
      - 3000:3000
    # docker build
    build: 
      # 사용할 Dockerfile위치
      context: ./
      # 사용할 Dockerfile이름
      dockerfile: Dockerfile.dev
    # volume지정 ( -v )
    volumes: 
      # node_modules는 컨테이너의 workdir에서 사용
      - /usr/src/app/node_modules
      # 이외에 모든 파일 참조
      - ./:/usr/src/app

 

2.2) version

docker engine의 버전에 따라 docker-compose 버전도 달라지는데 

 

$ docker -v
Docker version 20.10.14, build a224086

현재 docker 버전이 20대이기 때문에 3.8로 설정하면 되겠다.

근데 선택사항이니 필수로 적을 필요는 없다~!

 

2.3) services

각 컨테이너에서 적용될 생성 옵션을 지정한다. 

서비스는 도커 컴포즈로 생성할 컨테이너 옵션을 정의한다. 이 항목에 쓰인 각 서비스는 컨테이너로 구현되며, 하나의 프로젝트로서 도커 컴포즈에 의해 관리된다. 서비스의 이름은 services의 하위 항목으로 정의하고 컨테이너의 옵션은 서비스 이름의 하위 항목에 정의한다.

  • image: 서비스의 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정.
    이미지 이름 포맷은 docker run의 [저장 소이름]/[이미지 이름]:[태그] 형태와 같으며, 존재하지 않을 경우 저장소에서 자동으로 내려받는다.
  • links: —link와 동일하며, 다른 서비스에 서비스명만으로 접근할 수 있도록 설정.
    [SERVICE:ALIAS]의 형식으로 별칭으로 서비스에 접근할 수도 있다.
  • environment: —env, -e 옵션과 동일하며, 컨테이너 내부에서 사용할 환경변수 설정.
  • command: run 명령어의 마지막에 붙는 커맨드와 같으며, 컨테이너가 실행될 때 수행할 명령어를 설정.
  • depends_on: 특정 컨테이너에 대한 의존 관계를 나타내며, 이 항목에 명시된 컨테이너가 먼저 실행되고 해당 컨테이너가 실행된다.
    cf> —no -deps: 특정 서비스의 컨테이너만 생성하고, 의존성이 없는 컨테이너 생성 ($ docker-compose up —no-deps web)
  • ports: -p와 같으며, 서비스의 컨테이너를 개방할 포트를 설정.
    단일 호스트 환경에서 80:80과 같이 호스트의 특정 포트를 서비스의 컨테이너에 연결하면 docker-compose scale 명령어로 서비스의 컨테이너의 수를 늘릴 수 없다
  • build: 도커 파일에서 이미지를 빌드해 서비스의 컨테이너를 생성하도록 설정.
  • extends: 다른 YAML 파일이나 현재 YAML 파일에서 서비스 속성을 상속 받음.

 

2.4) networks

  • driver: 서비스의 컨테이너가 브리지 네트워크가 아닌 다른 네트워크를 사용하도록 설정할 수 있다.
  • ipam: IPAM(IP Address Manager)를 위해 사용할 수 있는 옵션으로 subnet, ip 범위 등을 설정할 수 있다.
  • external: YAML 파일을 통해 프로젝트를 생성할 때마다 네트워크를 생성하는 것이 아닌 기존의 네트워크를 사용하도록 설정할 수 있다.

네트워크 항목을 정의하지 않으면, 도커 컴포즈는 프로젝트별로 브리지 타입의 네트워크를 생성한다.

생성된 네트워크의 이름은 [프로젝트 이름]_default

생성 docker-compose up / 삭제 docker-compose down

 

2.5) volumes

  • driver: 볼륨을 생성할 때 사용될 드라이버를 설정한다. 어떠한 설정도 하지 않으면 local로 설정되며 사용하는 드라이버에 따라 변경해야 한다.
  • external: 프로젝트를 생성할 때마다 볼륨을 매번 생성하지 않고 기존 볼륨을 사용할 수 있도록 설정한다.

 

2.6) 파일 검증하기

docker-compose config 명령어를 사용하여, 오타나 파일 포맷이 적절한지 등에 대한 검사를 진행할 수 있다.

기본적으로 현재 디렉터리의 파일을 검사 (docker-compose -f [yml파일 경로] config로 변경 가능)



출처: https://sohyun-lee.tistory.com/12 [sohyun's]

 

3. docker-compose.yml 최종

# docker-compose.yml

version: "3.8"

services: 
  wildflyC:
    build: 
      context: ./
      dockerfile: wildfly.Dockerfile  
    image: skylark-wildfly
    ports:
      - 1003:8080
    volumes:
      - '/opt/docker/volume/wildfly/logs:/opt/jboss/wildfly/standalone/log'
      - '/opt/docker/volume/wildfly/deployments:/opt/jboss/wildfly/standalone/deployments'

 

 

4. 실행

$ docker compose up --build

# 백그라운드에서 특정 yml 파일 실행
$ docker compose -f /opt/docker/docker-compose.yml up {myService} -d
  • --build: 실행할 때마다 새로 빌드하기 ( 변경사항 적용 )
  • -d : 백그라운드로 실행한다. 실제 서버는 -d로 띄우자 
  • -f : docker-compose.yml 파일명이 다를 때 파일 선택 옵션

특정 형식에 맞춰서 컨테이너 이름이 자동적으로 생성됨

 

docker compose up --build
[+] Building 63.1s (11/11) FINISHED
 => [internal] load build definition from wildfly.Dockerfile                                                                                                                     0.4s
 => => transferring dockerfile: 97B                                                                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                                                                0.5s
 => => transferring context: 2B                                                                                                                                                  0.0s
 => [internal] load metadata for docker.io/jboss/base-jdk:8                                                                                                                      0.0s
 => [internal] load build context                                                                                                                                                8.9s
 => => transferring context: 393.77MB                                                                                                                                            8.2s
 => CACHED [1/6] FROM docker.io/jboss/base-jdk:8                                                                                                                                 0.0s
 => [2/6] RUN cd $HOME     && curl -L -O https://github.com/wildfly/wildfly/releases/download/26.0.1.Final/wildfly-26.0.1.Final.tar.gz     && sha1sum wildfly-26.0.1.Final.tar  35.7s
 => [3/6] RUN mkdir -p /opt/jboss/wildfly/modules/system/layers/base/org/postgresql/main     && cd "$_"     && curl -sLO https://repo1.maven.org/maven2/org/postgresql/postgres  3.5s
 => [4/6] ADD resources/module.xml /opt/jboss/wildfly/modules/system/layers/base/org/postgresql/main/module.xml                                                                  0.9s
 => [5/6] ADD resources/standalone.xml /opt/jboss/wildfly/standalone/configuration/standalone.xml                                                                                0.7s
 => [6/6] ADD resources/skylark-vbn.war /opt/jboss/wildfly/standalone/deployments/                                                                                               7.7s
 => exporting to image                                                                                                                                                          13.6s
 => => exporting layers                                                                                                                                                         13.2s
 => => writing image sha256:825c5d90f46a9f505f103df186aba7ba535eb21cbad9f010237500c128aa8ac9                                                                                     0.0s
 => => naming to docker.io/library/skylark-wildfly                                                                                                                               0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 2/2
 ⠿ Network wildfly_default       Created                                                                                                                                         0.9s
 ⠿ Container wildfly-wildflyC-1  Created                                                                                                                                         0.6s
Attaching to wildfly-wildflyC-1
wildfly-wildflyC-1  | =========================================================================
...

체감상 Dockerfile 돌리는 것보다 훨씬 빨랐다!!! 그리고 캐시때문인지 다시 빌드할때도 엄청나게 빠르다 ! 심지어 테스트까지 해주다니 이것 참 좋은 녀석이군

 

볼륨 설정한 폴더에 정상적으로 로그가 쌓인다.

 

5. 실행 후

백그라운드에서 실행한 후 로그를 확인하기 위해선 logs 명령어를 사용한다.

# jenkins라는 service의 log를 실시간 확인
$ docker compose logs -f jenkins

 

해당 컨테이너에서 명령어를 던지기 위해 run 이나 exec를 사용한다

$ docker compose run wildfly uname -a
Linux 048f0dd6a456 3.10.0-1160.49.1.el7.x86_64 #1 SMP Tue Nov 30 15:51:32 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

 

 

 

사용한 Dockerfile

# Use latest jboss/base-jdk:8 image as the base
FROM jboss/base-jdk:8

#metadata
LABEL name="minggu"
LABEL email="minha1002@gmail.com"
LABEL description="wildfly test"
FROM jboss/base-jdk:8

# Set the WILDFLY_VERSION env variable
ENV WILDFLY_VERSION 26.0.1.Final
ENV WILDFLY_SHA1 08908faf9ae99e5fb6374979afbffea461aadc2c
ENV JBOSS_HOME /opt/jboss/wildfly

USER root

# Add the WildFly distribution to /opt, and make wildfly the owner of the extracted tar content
# Make sure the distribution is available from a well-known place
RUN cd $HOME \
    && curl -L -O https://github.com/wildfly/wildfly/releases/download/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz \
    && sha1sum wildfly-$WILDFLY_VERSION.tar.gz | grep $WILDFLY_SHA1 \
    && tar xf wildfly-$WILDFLY_VERSION.tar.gz \
    && mv $HOME/wildfly-$WILDFLY_VERSION $JBOSS_HOME \
    && rm wildfly-$WILDFLY_VERSION.tar.gz \
    && chown -R jboss:0 ${JBOSS_HOME} \
    && chmod -R g+rw ${JBOSS_HOME}

# Install postgreSQL Driver
RUN mkdir -p ${JBOSS_HOME}/modules/system/layers/base/org/postgresql/main \
    && cd "$_" \
    && curl -sLO https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.3/postgresql-42.3.3.jar	


# Change resources
ADD resources/module.xml ${JBOSS_HOME}/modules/system/layers/base/org/postgresql/main/module.xml
ADD resources/standalone.xml ${JBOSS_HOME}/standalone/configuration/standalone.xml

# Add war file
# volume ADD Crush
#ADD resources/skylark-vbn.war ${JBOSS_HOME}/standalone/deployments/


# Add wildfly admin account
USER jboss
#RUN bash -c "${JBOSS_HOME}/bin/add-user.sh admin minggu"
RUN /opt/jboss/wildfly/bin/add-user.sh -u admin -p minggu #admin --silent

# Make volume directory
# docker run -v is better than VOLUME
#VOLUME /opt/wildfly_docker/logs
#VOLUME ${JBOSS_HOME}/standalone/deployments

# Ensure signals are forwarded to the JVM process correctly for graceful shutdown
ENV LAUNCH_JBOSS_IN_BACKGROUND true

# Expose the ports in which we're interested
EXPOSE 8080 9990

# Set the default command to run on boot
# This will boot WildFly in standalone mode and bind to all interfaces
CMD /opt/jboss/wildfly/bin/standalone.sh -c standalone.xml -b 0.0.0.0 -bmanagement 0.0.0.0 --debug
#CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0"]

 

 

<참고>

https://github.com/docker/compose

 

GitHub - docker/compose: Define and run multi-container applications with Docker

Define and run multi-container applications with Docker - GitHub - docker/compose: Define and run multi-container applications with Docker

github.com

 

https://docs.docker.com/compose/

 

Overview of Docker Compose

 

docs.docker.com

https://meetup.toast.com/posts/277

 

Docker Compose와 버전별 특징 : NHN Cloud Meetup

도커는 이제 대부분의 개발자 노트북이나 PC에 하나씩은 설치되어있는 필수품이 되어가는데요 편하고 유용한 도커를 좀 더 유익하고 편하게 사용할 수 있는 도구인 Docker Compose에 대해서 알기 쉽

meetup.toast.com

https://sohyun-lee.tistory.com/12

 

[Docker] Docker compose 설치 및 사용방법

이 페이지는 도커 컴포즈의 설치 및 사용방법에 대해 설명하고 있다. 도커 컴포즈 (Docker Compose)란? 여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때, 이를 테스트하려면 각 컨테이너를

sohyun-lee.tistory.com

 

+ Recent posts