[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파일로 만들어준다.
야믈파일은 버전, 서비스, 볼륨, 네트워크 4가지 항목으로 구성되어있다.
들여 쓰기를 통해 하위 항목을 구분한다.
샘플은 wildfly dockerfile로 만들어본다.
https://minggu92.tistory.com/79
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
https://docs.docker.com/compose/
https://meetup.toast.com/posts/277
https://sohyun-lee.tistory.com/12
'Server & Infra' 카테고리의 다른 글
[Jenkins] Jenkins - SVN 연동 (0) | 2022.04.05 |
---|---|
[Jenkins] Docker로 Jenkins 빌드 및 설치 (0) | 2022.04.04 |
[Docker] wildfly Dockerfile을 이용한 Container 생성 (+Admin) (0) | 2022.03.25 |
[Docker] Failed to get D-Bus connection: Operation not permitted (systemctl 명령어 사용실패) (0) | 2022.03.22 |
[Docker] Dockerfile생성, 그리고 build 하기 (ssh컨테이너용) (0) | 2022.03.22 |