본문 바로가기

Docker

[Docker] Jenkins + Docker 빌드/배포 자동화

이번 시간에는 Docker를 이용한 자동 빌드 배포를 알아보도록 하자

 

도커가 안 깔려 있으면 먼저 도커부터 설치 해주자

[Docker] ec2에 docker 설치

 

[Docker] ec2에 docker 설치

이번 시간에는 ec2에 docker를 설치해보자 docker 설치 필자는 젠킨스 서버에 docker를 설치하겠다 $ sudo yum update $ sudo yum install docker 이제 도커가 설치가 되었으면 잘 설치되었는지 확인을 해보자 $ d..

alsyean.tistory.com

 

먼저 Jenkins 자동 배포를 한 것으로 전제로 이루어진다.

[Jenkins] Jenkins 자동 배포

 

[Jenkins] Jenkins 자동 배포

Jenkins 서버와 베포 서버는 각각 다른 ec2이다. 이번 시간에는 Jenkins를 이용한 자동 배포에 대해서 알아보자 Publish Over SSH 플러그인 설치 Jenkins 관리 -> 플러그인 관리로 들어가 주자 이제 설치 가능을..

alsyean.tistory.com

주의점

  • 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를 눌러주면 조금 후 빌드 성공한 것을 볼 수 있다.

 

Jenkins 빌드 성공

 

DockerHub push 된거 확인

 

 

배포된 모습

위와 같이 Docker + Jenkins를 이용해서 자동 빌드 및 베포를 된 것을 볼 수 있다.

 

'Docker' 카테고리의 다른 글

[Docker] ec2에 docker 설치  (0) 2020.04.05