이번 시간에는 Docker를 이용한 자동 빌드 배포를 알아보도록 하자
도커가 안 깔려 있으면 먼저 도커부터 설치 해주자
먼저 Jenkins 자동 배포를 한 것으로 전제로 이루어진다.
주의점
- docker를 이용하여 jenkins를 사용할 수 있다 (젠킨스+도커 이미지)
- jenkins docker를 별개로 사용 할 수 있다. (이번 시간에 할 것이다.)
Dockerfile 생성
git project에 Dockerfile을 하나 만들어주자
Dockerfile에 내용은 다음과 같다
FROM java:8
VOLUME /tmp
ARG JAR_FILE=./target/BootSns-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} MyDiary.jar
ENTRYPOINT ["java","-jar","/MyDiary.jar"]
FROM <이미지>
VOLUME <컨테이너 디렉터리>
ARG <Dockerfile의 변수>
ADD <복사할 파일 경로> <이미지에서 파일이 위치할 경로>
ENV <환경 변수><값>
ENTRYPOINT <명령어>
Docker Repository 생성
Docker도 Git처럼 Repository를 만들 수 있다.
Repostiory를 만들기 위해서는 먼저 Docker Hub에 가입을 해야 한다.
https://hub.docker.com/repository/create <- 들어가면 생성할 수 있다.
위와 같이 Name에 본인이 원하는 이름을 적으면 된다. 또 Visibility에서 Public은 다른 사람도 볼 수 있고 Private는 권한이 있는 사람만 볼 수 있다. 필자는 Public으로 하겠다.
이제 아래에 있는 Create를 눌러 생성 해주자
생성을 하면 아래와 같이 Repository가 생성된 것을 볼 수 있다.
Jenkins 권한 주기
필자의 경우 Jenkins에서 Docker를 빌드시켜야 하므로 Jenkins에게 권한을 줘야 한다.
$ sudo vi /etc/sudoers
명령어를 입력 해주자
그리고 아래와 같이 적어주자
jenkins ALL=(ALL) NOPASSWD: ALL
만약 저장이 안 된다면 w!로 강제 저장해주고 나오자
Build
이제 Jenkins를 설정을 해보자
먼저 지난번에 만든 Jenkins의 item으로 와서 구성으로 들어 가주자
Build에 Add build step을 누른 후 Execute shell을 선택 해주자
이제 위와 같이 sh파일을 만들어서 실행시킬 것이다. 경로랑 이름은 본인이 마음대로 정하면 된다
필자는 /home/ec2-user/를 경로 잡고 docker_build_file.sh로 이름을 지었다.
이제 docker_build_file.sh을 작성해보자
먼저 Jenkins + Docker가 설치되어 있는 EC2로 오자
#필자 기준의 경로로 sh 파일을 만들었다.
$ vi./docker_build_file.sh
위와 같이 명령어를 줘서 파일을 생성해주고 편집해주자
#bin/bash
#docker hub에 push 하기 위해 login
sudo docker login -u <docker id> -p <docker password>
#docker image의 latest tag를 읽고 다음 버전의 image를 생성
sudo docker build -t <docker id>/<docker Repository>:latest.
#docker hub에 push sudo
docker push <docker id>/<docker Repository>:$(docker images | awk '($1 == <docker id>/<docker Repository>) {print $2; exit}')
#tag가 latest인 image를 최신 버전을 통해 생성
sudo docker tag <docker id>/<docker Repository>:$(docker images | awk '($1 == <docker id>/<docker Repository>) {print $2; exit}') alsyean/mydiarydocker
#latest를 docker hub에 push
sudo docker push <docker id>/<docker Repository>:latest
#버전 관리에 문제가 있어 latest를 삭제
sudo docker rmi <docker id>/<docker Repository>:latest
위에 처럼 본인에 맞게 바꿔서 넣어주면. sh파일이 완성되었다.
빌드 후 조치
이번에는 빌드 후 조치에 와서 바꾸자
위와 같이 설정을 바꿔주자
Source files 및 Exec command는 본인에 맞게 바꿔주면 된다.
이제 베포 서버의 ec2로 와서. sh 파일을 작성 해주자 필자는 이름을 deploy.sh로 해주겠다.
#bin/bash
#docker hup에서 pull 하기 위해 login
sudo docker login -u <docker id> -p <docker password>
#tag를 지정하지 않고 pull 하여 docker hub에서 latest를 가져온다.
sudo docker pull <docker id>/<docker Repository>
#이전에 사용 중이던 서버를 종료
#MyDiary.jar은 Dockfile에 ADD의 이름을 넣어주면 도니다.
kill -9 $(ps aux | grep java | grep MyDiary.jar| awk '{print $2}')
#docker run을 통해 image를 실행
#-d : 백그라운드 실행, --rm : 컨테이너 안의 프로세스가 종료되면 컨테이너를 자동>으로 삭제, -p 80번 포트 열기
sudo docker run -d --rm -p 8080:8080 <docker id>/<docker Repository>
이제 여기까지 했으면 저장을 해주자
확인
저장하고 나왔으면 Build Now를 눌러주자
Build Now를 눌러주면 조금 후 빌드 성공한 것을 볼 수 있다.
위와 같이 Docker + Jenkins를 이용해서 자동 빌드 및 베포를 된 것을 볼 수 있다.
'Docker' 카테고리의 다른 글
[Docker] ec2에 docker 설치 (0) | 2020.04.05 |
---|