Docker란?
Docker란 리눅스 컨테이너를 기반으로 하는 오픈소스 가상화 플랫폼이다.
컨테이너란?
컨테이너란 Host OS상에 어플리케이션을 작동시키기 위해 필요한 라이브러리나 설정등을 하나로 만들어, 별도의 서버인 것 처럼 사용할 수 있도록 하는 것이다.
사진과 같이 Host OS위에 Guest OS를 따로 올려서 사용하는 기존 가상화 방식과는 달리 Docker Engine위에 바로 컨테이너를 올리기 때문에 OS위에 OS를 올려두는 기존방식보다 훨씬 가볍고 그만큼 성능이 향상되고 이식성이 좋다는 장점이있다.
Docker 설치
1
sudo wget -qO- http://get.docker.com/ | sh
Dockerfile 설정
Dockerfile은 이미지를 구성하기 위한 명령어들을 작성하는 파일이다.
docker build를 할 시 Dockerfile이 실행된다.
- FROM: 베이스가 되는 이미지
- ARG: 변수명 지정
- RUN: 이미지 빌드에 필요한 커맨드를 실행
- WORKDIR: 이동 할 경로
- COPY: COPY 로컬경로 CONTAINER내부경로
- ENTRYPOINT: 이미지를 컨테이너로 띄울 때 항상 실행되야 하는 커맨드를 지정할 때 사용
1
2
3
4
5
6
7
8
9
10
11
FROM adoptopenjdk:11-jre-hotspot //Spring boot가 jdk11이기 떄문에 jdk11 이미지베이스로 실행
ARG WAR_FILE=/build/libs/배포할 파일명.war //배포할 파일지정
ARG APP_NAME=app //app.war라는 이름으로 Container로 옮길예쩡
RUN mkdir -p /home/project //war배포파일 경로 생성
WORKDIR /home/project //폴더이동
COPY ${WAR_FILE} /home/project/app.war //배포할 파일을 app.war로 Container내로 복사
ENTRYPOINT java -Duser.timezone=GMT+09:00 -jar /home/project/app.war //app.war 실행
Jenkins BuildStep 설정
이전 Jenkins자동배포 계시물에서는 폴더를 지정하여 war를 보내고 실행했지만 지금은 Docker Container로 파일을 옮길 예정이기 때문에 Send files or execute commands over SSH
과정을 지워버리고 Script만 실행하는 식으로 진행하였다.
- -v: Container에 마운트할 로컬 폴더경로:Container내에서 마운트할 폴더 경로
- -p: 포트지정
- -d: 빌드 백그라운드에서 Run
1
2
3
4
5
6
7
8
9
10
11
12
container_name="빌드 할 컨테이너의 명"
# 이미 빌드가 되어있는 동일한 컨테이너가 있는지 체크한다.
if docker ps -a --format '' | grep -q "^$container_name$"; then
docker stop $container_name
docker rm $container_name
echo "Stopped container: $container_name"
else
echo "No running container found with the name: $container_name"
fi
docker build --tag '빌드 할 이미지 태그명' .
docker run -v /var/log/project/jenkins-project:/var/log/project/jenkins-project -p 8080:8080 -d --name '컨테이너 명' '빌드 할 이미지 태그명'