용어 정리
- 도커 이미지 : 프로그램, 라이브러리, 소스 등을 설치한뒤에 이를 파일로 만든 것.
- 도커 컨테이너 : 이미지가 실행된 상태. 이미지를 여러 번 실행시키면 여러개의 컨테이너가 만들어진다. OS로 보면 이미지는 일종의 실행파일, 컨테이너는 프로세스와 유사한 개념이다.
1. Dockerfile 생성
Docker 이미지가 어떤 단계를 거쳐 빌드되야 하는지를 담고있는 파일입니다. Docker는 이 Dockerfile을 차례대로 수행하여 이미지를 생성합니다
FROM
: base이미지를 지정해줍니다. openjdk java 8 버전의 환경을 구성한다. (base 이미지는 일반적으로 Docker Hub와 같은 Docker repository에 올려놓은 공개 이미지인 경우가 많습니다)ARG
:docker build
커맨드로 이민지를 빌드할때, 빌드 시점에--build-arg
옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용합니다. 여기서는 JAR_FILE이라는 변수에 target/*.jar 표현식을 담았습니다.COPY
: 호스트 컴퓨터에 있는 디렉토리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해서 사용합니다.ENTRYPOINT
: 이미지를 컨테이너로 띄울 때 항상 실행되야 하는 커맨드를 지정할 때 사용합니다. Docker 이미지를 마치 하나의 실행 파일 처럼 사용하게 됩니다.
2. Maven Build(Packaging)로 배포 패키지 .jar 생성하기
- 프로젝트 우클릭 → maven build
- Base directory에 Workspace를 눌러 배포할 프로젝트 선택
- Goals : package 입력
- 다음과 같이 target폴더 아래에 jar 파일이 생성되어야 성공입니다.
3. Docker Repository 생성하기
4. Dockerfile 빌드 → 도커 이미지 생성
$ docker build -t {도커허브아이디}/도커허브Repository명 .
위와 같은 Maven명령어로 생성한 Dockerfile 빌드를 통해 도커 이미지를 생성하였습니다.
5. Docker Hub에 이미지 push 하기
위의 명령어를 실행하면 도커허브에서 이미지가 올라간것을 확인할 수 있습니다.
6. Docker에 EC2 서버 설치하고 EC2에 도커 이미지 올리기
key를 읽기 권한으로만 설정하여 인스턴스에 연결하면 됩니다. 계속해서 권한 에러가 났는데, chmod 400으로 설정했음에도 계속 이런 에러가 발생하였습니다. 문제는 key가 아닌 dns를 잘못입력하여 생긴것입니다. AWS에 알려주는 명령어를 사용하면 됩니다!
위와 같은 Amazon Linux 화면이 나온다면 리눅스 인스턴스에 접속 성공한것입니다!
1. sudo yum install docker : 도커 설치하기
2. sudo service docker start : 도커 서비스 시작하기
3. sudo doker pull 아이디/레포지토리명 : 도커 허브에 올린 spring boot 이미지 받기
4. sudo docker run -d -p 80:80 아이디/레포지토리명 : 도커 이미지로 컨테이너 실행시키기. (80번 포트에 스프링 부트 실행)
결과물
spring boot를 도커를 사용하여 성공적으로 배포하였습니다!
느낀점
- AWS EC2와 Docker를 사용하여 내가 개발한 웹 프로젝트를 쉽게 배포할 수 있음을 배웠다.
- 도커에 Nginx, Jenkins, packging된 source 파일 을 모두 각각 이미지화하였는데 다음에는 DB까지 포함하여 배포해보자.
- 하나의 컨테이너에 여러개의 프로그램을 넣어야하는지, 아니면 DB는 컨테이너 하나를 모두 다 차지하는지 아키텍쳐를 어떻게 잡아줘야할까..
References.
https://www.daleseo.com/dockerfile/
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/java-package-eclipse.html
https://spring.io/guides/topicals/spring-boot-docker
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/docker-basics.html