맨땅에 헤딩하는 개바른자

Docker 사용 방법 본문

인프라 TIP

Docker 사용 방법

앵낄낄 2022. 4. 14. 15:01
반응형

[Docker]

1 Docker 이미지 만들기

1) docker build -t 이미지명 .

- Dockerfile을 만든 위치에서 빌드하는거라 맨 뒤에 . 점이 있다

파일 내용을 보면 아래와 같이 간략하게 설정되어있다

[carrier@localhost interceptor]$ cat Dockerfile

FROM java:openjdk-8-jdk //기본 베이스가 되는 구간 java

ADD asis /srv/app // 파일or폴더를 컨테이너 가상파일or경로에 매핑되며 컨테이너 경로는 자동으로 mkdir이 된다

EXPOSE 9001 //서비스 포트 설정

WORKDIR /srv/app/bin // CMD가 실행 될 컨테이너 속에 위치를 이동    cd /srv/app/bin이랑 동일하다

CMD ./start.sh // 실행할 명령어

 

2) docker images 

이미지 목록 확인

 

3) docker rmi 이미지ID 

이미지 삭제

 

2. Docker 프로세스 실행

TODO 이 글을 추후 수정이 필요할 수 있음..

1) 케리어 실행 프로세스 목록 

 - war 프로세스

  docker run -d -p 9001:9001 -v /home/carrier/srv/interceptor/asis:/srv/app --rm --name interceptor-asis --network carrier --ip 172.19.0.5 interceptor

  docker run -d -p 9002:9001 -v /home/carrier/srv/interceptor/tobe:/srv/app --rm --name interceptor-tobe --network carrier --ip 172.19.0.6 interceptor

  docker run -d -p 9003:9001 -v /home/carrier/srv/carrier/asis:/srv/app --rm --name carrier-asis --network carrier --ip 172.19.0.7 interceptor

  docker run -d -p 9004:9001 -v /home/carrier/srv/carrier/tobe:/srv/app --rm --name carrier-tobe --network carrier --ip 172.19.0.8 interceptor

 ... cruiser 등등 다른 war가 존재하겠죠 위 예시를 응용해서 다른 war도 뛰울 수 있습니다.

 > 실행 옵션에서 --network를 -net=네트워크ID로 줘도 된다.

 > 내가만든 네트워크를 써도되고 --ip설정은 빼면 자동으로 ip가 설정 된다. 

 > 자동ip로하면 ip가유동적이라 yml파일에 ip설정을 바꿔야하는 일이 생길 수 있어서 ip는 사전에 정해두면 편할 것 같다.

 

 - redis 프로세스

  docker run -d -p 6379:6379 --rm --name redis --network carrier --ip 172.19.0.2 redis

  > 필요에 따라 -v 볼륨을 config파일과 연결하여 사용

 

 - mongo 프로세스

  docker run -d -p 27017:27017 --rm --name mongo --network carrier --ip 172.19.0.3 mongo

  > 필요에 따라 -v 볼륨을 config파일과 연결하여 사용

 

 - nginx 프로세스

  docker run -d -p 80:80 -p 8080:8080 -v ~/srv/nginx:/etc/nginx --rm --name nginx --network carrier --ip 172.19.0.4 nginx

  > 필요에 따라 -v 볼륨을 config파일과 연결하여 사용

  > -p는 다중으로 넣을 수 있다!!

 - 옵션s

  > -d 백그라운드

  > -rm 컨테이너 프로세스 종료 시 ps목록에서 자동으로 삭제

  > -v 로컬파일or디렉토리와 컨테이너 파일or디렉토리를 마운트

  > -name 컨테이너 이름 지정

  > -network 컨테이너 네트워크 설정

> -p 외부유입 포트:로컬 컨테이너 연결 포트

 

3. Docker 네트워크

3.1. 네트워크 생성

docker network create --gateway 172.19.0.1 --subnet 172.19.0.0/24 carrier

게이트웨어와 서브넷은 임의로 지정 가능한거 같다.

 

3.2. 네트워크 리스트 보기 

docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

2836d8bd937c        bridge              bridge              local

3f9435490a84        carrier             bridge              local

f1022ff2db45        host                host                local

f12eab584d19        none                null                local

NAME을 보면 기본적으로 생성 된 것이 있고 carrier라고 새로 생성 된 네트워크 목록도 보인다.

3.3. 네트워크 별 사용 정보 확인

docker network inspect 네트워크ID

예) docker network inspect carrier

 > 해당 네트워크에 속한 docker process목록 확인이 가능하다.

 

4. Docker 배포 스크립트 

4.1. 스크립트 사용법

1. 첫번 째 스크립트

 > 첫번 째 스크립트는 asis와 tobe를 모두 서비스 되도록하는 내용입니다.

 > tobe를 기동해야하기 때문에 "사용포트"에는 tobe가 사용 할 포트를 param으로 넘겨줍니다.

 > tobe에 새롭게 적용한 기능 테스트를 진행 합니다.

 

 first.sh (TYPE) (PORT)

 예) first.sh interceptor 9002:9001

 

2. 두번 째 스크립트

 > 두번 째 스크립트는 tobe의 적용 된 사항을 asis에 반영하고 tobe서비스를 종료시키는 내용입니다.

 > asis를 재 기동해야하기 때문에 "사용포트"에는 asis가 사용 할 포트를 param으로 넘겨줍니다.

 

 second.sh (TYPE) (PORT)

 예) second.sh interceptor 9001:9001

4.2. 첫 번째 스크립트 내용

#!/bin/bash

 

TYPE=$1

PORT=$2

TOBEPATH=~/srv/$TYPE/tobe

DEPLOYPATH=~/srv/$TYPE/deploy

NGINXPATH=~/srv/nginx/sites-enabled

DOCKERTOBEID=`docker ps | grep interceptor-tobe | cut -d' ' -f1`

DOCKERNGINXID=`docker ps | grep nginx | cut -d' ' -f1`

 

if [ $TYPE = 'interceptor' ] || [ $TYPE = 'cruiser' ]

then

        # tobe 폴더 WAR 파일 삭제

        #rm -f $TOBEPATH/lib/$1.war

 

        # WAR 파일 tobe 폴더 복사

        #cp $DEPLOYPATH/$1.war $TOBEPATH/lib/

 

        # tobe 서비스 실행

        #docker run -d -p 9002:9001 -v $PATH:/srv/app --rm --name $TYPE-tobe --network carrier --ip 172.19.0.3 interceptor

        docker run -d -p $PORT -v $TOBEPATH:/srv/app --rm --name $TYPE-tobe --network bridge interceptor

        echo 'Please wait for 15 seconds.'

        sleep 15

 

        #TODO TOBE서버가 정상적으로 올라왔을 때 아래 로직을 수행

        # nginx site-enable에 모든 링크 삭제

        rm -f $NGINXPATH/$TYPE-*

 

        # nginx site-enable에 asis-tobe 링크 생성

        cd $NGINXPATH

        ln -s ../sites-available/$TYPE-asis $TYPE-asis

        ln -s ../sites-available/$TYPE-tobe $TYPE-tobe

 

        # nginx reload

        docker exec $DOCKERNGINXID nginx -s reload

else

        echo 'ERROR....'

        echo '  Invalid param...!! param1 TYPE(interceptor||cruiser) param2 PORT(9001:9001)'

        echo '  EX)) step1.sh interceptor 9001:9001'

fi

4.3. 두 번째 스크립트 내용

#!/bin/bash

 

TYPE=$1

PORT=$2

TOBEPATH=~/srv/$TYPE/tobe

ASISPATH=~/srv/$TYPE/asis

DEPLOYPATH=~/srv/$TYPE/deploy

NGINXPATH=~/srv/nginx/sites-enabled

DOCKERASISID=`docker ps | grep interceptor-asis | cut -d' ' -f1`

DOCKERTOBEID=`docker ps | grep interceptor-tobe | cut -d' ' -f1`

DOCKERNGINXID=`docker ps | grep nginx | cut -d' ' -f1`

 

if [ $TYPE = 'interceptor' ] || [ $TYPE = 'cruiser' ]

then

        # nginx sites-enabled에 모든 링크 삭제

        rm -f $NGINXPATH/$TYPE-*

 

        # nginx site-enable에 tobe를 운영80포트로 하기위해서 asis로 링크 생성

        cd $NGINXPATH

        ln -s ../sites-available/$TYPE-tobe $TYPE-asis

 

        # nginx reload

        docker exec $DOCKERNGINXID nginx -s reload

 

        # asis 서비스 중지

        docker kill $DOCKERASISID

 

        # 서비스 중지 간격주기

        sleep 1

 

        # asis 폴더 WAR 파일 삭제

        #mv -b $ASISPATH/lib/$TYPE.war $ASISPATH/lib/$TYPE.war.$(date +%Y%m%d)

 

        # WAR 파일 asis 폴더 복사

        #cp $TOBEPATH/lib/$TYPE.war $ASISPATH/lib/

 

        # asis 서비스실행

        docker run -d -p $PORT -v $ASISPATH:/srv/app --rm --name $TYPE-asis --network bridge interceptor

        echo 'Please wait for 15 seconds.'

        sleep 15

        #TODO: asis 정말 실행 되었는지 확인 로직 필요

 

        # nginx site-enable에 모든 링크 삭제

        rm -f $NGINXPATH/$TYPE-*

 

        # nginx site-enable에 tobe 링크 생성

        ln -s ../sites-available/$TYPE-asis $TYPE-asis

 

        # nginx reload

        docker exec $DOCKERNGINXID nginx -s reload

 

        # tobe 서비스 중지

        docker kill $DOCKERTOBEID

else

        echo 'ERROR....'

        echo '  Invalid param...!! param1 TYPE(interceptor||cruiser) param2 PORT(9001:9001)'

        echo '  EX)) step1.sh interceptor 9001:9001'

fi

 

반응형

'인프라 TIP' 카테고리의 다른 글

NGINX 사용을 해보았다  (0) 2022.04.14