( 참고 : 알면 더 쉬운 도커 쿠버네티스 (곽영호, 황승준) )
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 컨테이너 구동하기!
[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 ( 아래의 그림 참조 )
-
base : layer 아래에 read only로 마운트
- 위의 ex)
openjdk:8-jdk-alpine
- 위의 ex)
-
컨테이너에서 process로 쓰는 파일 시스템 : read write로 마운트
- 위의 ex)
~.jar
- 위의 ex)
-
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
- repository 명 :
- 무료 서비스 : 1개의 private repository
- 회원 가입 후, 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만 있다면 언제든 로컬 환경에서 구동 가능!