( 참고 : 알면 더 쉬운 도커 쿠버네티스 (곽영호, 황승준) )

2. 실무에 바로 쓰는 도커 (2)

Contents

  • 2-4. 도커를 사용한 테스트 환경 구축


2-4. 도커를 사용한 테스트 환경 구축

a) 간단한 테스트 환경

일반적으로 개발팀에서는 최소 2대의 서버는 있음

만약, 트래픽이 많아져서 서버 늘리고자 한다면….

서버가 늘어날 때마다 해야하는 반복적인 작업!

  • (도커 이전엔) 서버 엔지니어가 자동화 스크립트 통해서 실행

  • 도커 도입 시, 자동화 스크립트 만들 필요 X

    JUST 도커 이미지 만들기! & 컨테이너 숫자 늘려주기

    ( 물리적으로 늘어난 서버에 대응할 필요 X )


( GCP 가입 & VM 생성 과정 생략 )


브라우저 창에서 열기

  • SSH 사용하여 VM 인스턴스에 연결!

  • 리눅스 쉘에 접속한 뒤…


도커를 설치해야 한다.

( https://docs.docker.com/engine/install/debian/ )

[16]

 sudo apt-get update
 sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  • 그러기 위해, 우선 의존된 라이브러리 설치해야


[17] 패키지 매니저에, Docker repository 추가할 수 있도록 관련 부분 다운로드

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg


[18] 도커 설치할 수 있는 Repsoitry 추가

echo \
  "deb [arch=$$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


[19] 패키지 매니저 업데이트

sudo apt update -y


[20] (최신 버전 말고) 가장 안정적인 18.06 버전 사용하여 설치

sudo apt install -y docker-ce=18.06.3~ce~3-0~debian
  • docker 라고 입력함으로써 잘 설치됨을 확인!


[21] 일반 계정에 도커 사용 권한 부여

sudo usermod -aG docker $$USER
  • $$USER : “현재 사용자”에게 권한 부여


개발 환경으로 Docker 구성해보기

  • 개발 환경 : MySQL, Spring Boot로 구성
  • container를 사용하여 각각의 layer를 실행할 것


Docker Hub

  • docker hub 사이트에 official image 많이 있음

    ( https://hub.docker.com/ )

  • 가급적 Official image 써야하는 이유?

    • 해당 제품의 메인 회사가 업로드한게 가장 안ㅇ전!
  • docker hub 사이트의 이미지 페이지의 DESCRIPTION에 image 사용 관련된 부분 상세 설명


우선, MySQL 컨테이너 구동하기!

figure2


[22] MySQL 컨테이너 실행

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -d mysql:5.7.28
  • mysql:5.7.28 : version을 태깅해줌
  • 이 한줄로써 끝!


다음으로, Spring Boot 컨테이너 구동하기!

[23] ( 예제 따라 배포시킬 jar 파일 없으면, 저자의 github에서 클론 받은 뒤 실습 진행 )

  • 아래에 있는 Springboot의 jar 파일을 포함한 container 실행하기!
git clone https://github.com/ceo-nomadlab/docker.git


[24] 위에서 다운 받은 directory 위치에 dockerfile 생성

vi Dockerfile
  • dockerfile

    FROM openjdk:8-jdk-alpine
    ADD docker/target/docker-0.0.1-SNAPSHOT.jar app.jar
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom",
    "-Dspring.profiles.active=dev","-jar","/app.jar"]
    
    • (line 1) FROM ~ : 해당 image의 base ( 아래의 그림 참조 )


figure2

  • base : layer 아래에 read only로 마운트

    • 위의 ex) openjdk:8-jdk-alpine
  • 컨테이너에서 process로 쓰는 파일 시스템 : read write로 마운트

    • 위의 ex) ~.jar
  • point: 이미지 layer가 계층적으로 쌓인다는 사실!

    ( 이미 생성된 image를 잘 활용하여 추가할줄 알면 됨! 굳이 처음부터 직접 만들필요? )


[25] docker image가 잘 있는지

( openjdk가 잘 있다 )

docker images


[26] docker image 지우기 시도(?)

\(\rightarrow\) FAIL… Springboot 이미지가 openjdk:8-jdk-alpine을 base로 만든 image이므로!

docker rmi


[27] Container 생성하기 (빌드)

docker build -t springboot .


[28] Container 실행하기 ( container 이름 : app1 )

docker run --name app1 -d -p 80:8080 springboot


[29] 실행된 conatiner 에 대한 로그 확인

docker logs app1


(추가)

  • GCP > Compute Engine > VM인스턴스 > 외부 I에 적힌 ip를 주소창에 입력!
  • 만든 화면이 잘 나옴을 알 수 있다!


Docker의 장점 :

  • 위와 같이, “하나의 instance”에, 여러 프로그램의 container를 쉽게 설치 가능!


Container 로그

오류 발생 시를 대비하여 로그를 볼 수 있어야!

로그 파일이 저장되는 위치 지정 & 파일 열어 오류를 추적!


[30] Container 로그 확인

docker logs [option] container명

( 옵션 )

  • -f : 실행되는 로그를 계속 볼 수 있음
  • -tail 100 : 마지막 100 라인 확인


Container 배포

[31] 배포하려는 container 확인 ( 실행 여부 확인 )

  • 배포하려는 app1 container가 실행 중임을 확인
docker ps


[32] app1 컨테이너에, 새로 build된 파일 뭉치 배포 후 다시 실행!

  • step 1) 파일 뭉치를 실행중인 컨테이너에 복사

    docer cp 호스트 파일 컨테이너명 : 복사되는 위치/파일명 : 호스트 파일 -> 컨테이너

    docer cp 컨테이너명:파일위치/파일명 호스트서버 디렉토리 : 컨테이너 파일 -> 호스트

  • step 2) 컨테이너 restart

docker cp app1:app.jar
docker restart app1


컨테이너가 매우 많다면…..어떻게 일일히?

\(\rightarrow\) Docker registry ( 도커 레지스트리)


b) CI와 Docker registry를 이용한 배포

실제로 build 시, CI/CD 서버에서 docker image 생성 & 개발환경으로 배포

Docker image를 배포하는 방법은?


Docker registry

  • 로컬/특정 서버에 설치하여 운영
  • 일종의 소스 저장소
  • https://hub.docker.com
    • 회원 가입 후, repository 생성
      • repository 명 : custom-nginx
    • 무료 서비스 : 1개의 private repository
  • 로컬에서 만든 image를 이 곳에 업로드 할 것


[33] 로그인

docker login


[34] 로그인 후, 지정한 repository에 docker image 저장하기

  • with tag 명령어
  • docker tag 이미지명 도커hub아이디/repository명:태그
    • 도커hub 아이디 : seunghan
    • repository명 : custom-nginx
    • 태그 : mynginx2
docker tag mynginx2 seunghan96/custom-nginx:mynginx2


[35] registry에 업로드 된 것 확인하기

docker images


[36] docker hub로 push하기

docker push seunghan96/custom-nginx

사이트에 들어가보면 image가 잘 올라간 것 확인 가능!


테스트 환경 구축

CI 서버 ( 배포 시스템 )

  • 애플리케이션을 수작업으로 배포하기엔 너무 귀찮 + 실수 우려
  • 개발 잘해도, 배포 못하면 꽝! 그만큼 중요!
  • CI서 서버에서 도커 이미지 생성


(구) Docker file 만들고, 테스트 환경 자체에서 image 배포

(신) CI 서버가 이 작업을 대체해줌

  • CI 서버 사용 시, docker image의 위치 또한 달라지므로, docker registry 사용할 것!


( 다른 물리적 환경임에도 불구하고 ) CI 서버에서 어떻게 테스트 서버에 배포?

  • 방법 1) Docker registry ( ex. Docker Hub )
  • 방법 2) Private Registry ( 직접 Docker registry 운영 )


[방법 1] Docker registry

  • 무료판 : 1개의 private 저장소


[방법 2] Private Registry

  • 회사 보안 상, public registry에 운영하기 어려울 때 사용!
  • BUT 문제 발생 시 직접 해결해야하는 부담도!


직접 만드는 법은?

[37] 우선, docker registry 이미지 다운로드

docker pull registry


[38] docker registry 컨테이너 실행

docker run -d -p 5000:5000 --restart=always --name registry registry


[39] docker image 저장

  • ex) ubuntu
docker pull ubuntu


[40] docker image 태깅

docker image tag ubuntu localhost:5000/ubuntu


[41] 태깅한 이미지 확인하기

  • localhost:5000/ubuntu 이미지가 있음을 확인
docker images


[42] localhost:5000으로 image push하기

docker push localhost:5000/ubuntu


아직 끝이 아님!

GCP의 방화벽 규칙에서 5000번 포트 허용해야!


[43] 로컬에서 docker registry를 다운 받기 (pull)

  • IP : 34.84.118.224
  • BUT, 에러날 것!
    • docker registry가 HTTPS로 통신할 수 있어야!
    • OS 별 해결방법, 교재 참고하기 ( linux만 아래 참고 )
docker pull 34.84.118.224:5000/ubuntu


docker registry가 HTTPS로 통신할 수 있게끔! ( LINUX 버전 )

  • /etc/docker 안에 daemon.json 파일 생성
  • insecure-registries 추가해줘야
sudo vi /etc/docker/daemon.json
{
"insecure-registries" : ["34.84.118.224:5000"]
}


[44] 도커 재시작

sudo systemctl restart docker


[45] (다시) 로컬에서 docker registry를 다운 받기 (pull)

docker pull 34.84.118.224:5000/ubuntu


docker image를 저장할 수 있는 registry 구성 완료

( with Docker Hub & Private Registry )


배포 과정 요약

  • 1) CI 서버에서 docker image 빌드
  • 2) registry에 푸시
  • 3) 테스트 서버는, registry에서 이미지 다운로드 & 컨테이너로 실행


(c) Docker Registyr를 이용한 배포의 장점

[1] Roll back

  • 단지 물리적 공간이 달라서만은 아님!
  • 에러 발생 시, 신속히 롤백 가능
  • 이미지를 잘 태깅해놓기!


[2] 로컬에 test 시

  • release가 다른 경우?

    • ex) A는 신규 기능 개발, B는 이전 기능 패치된 부분 개발
  • test 서버 자체를 로컬 PC로도 구동 가능.

    PC에 서버 운영에 필요한 프로그램들이 없어도, container자체에 환경이 있으므로,

    registry에 release 버전 별로 image만 있다면 언제든 로컬 환경에서 구동 가능!