도커 개념
⇒ 다양한 종류의 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다. 하드웨어의 자원을 모두 가상화 하지 않고 프로세스들만을 격리시켜 빠르게 환경을 구축할 수 있다.
⇒ 서비스 환경을 갖춘 뒤 그것을 Docker Image로 만들어 배포하고 컨테이너로 간단히 실행 가능하다.
⇒ 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말한다
⇒ 쉽게 말하자면 여러 소프트웨어 등을 동일한 규격으로 묶어 실제 사용자가 최대한 신경을 덜 쓰고 사용할 수 있도록 만든 것
⇒ 이미지가 실행된 형태
⇒ 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것 (소프트웨어 구동에 필요한 의존(Dependency)과 명세를 담고 있다.)
⇒ 컨테이너는 이미지를 통해 만들어지고 이를 실행한 상태 !
비유하자면 ,
Docker Image -> 책을 찍어내기 위해 글자를 파낸 목판
Container -> 목판을 사용하여 만든 책
즉, Dockerfile은 Image를 만들기 위한 명세이고, Image는 Container를 만들기 위한 본
⇒ 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백 MB에 이른다.
그래서 매 배포 때마다 이미지를 추가하는 것은 매우 비효율적 !
이 문제를 해결하기 위한 개념이 Docker Layer !!
Docker Layer 는 기존 이미지에 추가적인 파일이 필요할 때 다시 다운도르 받는 방법이 아닌 해당 파일을 추가하기 위한 개념.
그림에서 보면 Docker Image에 있는 각각의 Layer 는 읽기 전용(Read Only) Layer 로 구성되고, 파일이 추가되면 새로운 Layer가 생성됨
그리고 Docker 는 여러개의 Layer를 묶어서 하나의 파일시스템으로 사용할 수 있게 해준다.
⇒ 그래서 Image 와 Layer 는 같은 의미로도 사용된다 !
위 그림을 1차(ubuntu Image), 2차(nginx Image), 3차(web app Image), 최종(Docker Container)으로 나눠보면
1차 : Layer A + Layer B + Layer C 로 구성
2차 : 1차 Image + nginx
3차 : 2차 Image + source(version1)
=== 만약 3차에서 source(v1) Layer를 수정했다면 하위 Layer 들은 제외하고 새로 수정한 source(v2)만 다운받으면 됨 ! ===
최종 : 3차 Image 에서 Container 를 생성할 때 R/W Layer (Read/Write) 를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은R/W Layer에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용합니다.
@RestController
public static classHelloController{
@RequestMapping("/hello")
publicStringhello() {
return "hello docker world";
}
}
2)프로젝트 우클릭 → New → File → Dockerfile 생성 (이름 중요)```
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
```
위 코드 작성
**FROM 키워드**
Docker에게 주어진 이미지를(태그 포함) 빌드 시 기반으로 사용하도록 지시합니다.
**ARG 키워드**
빌드 시 사용할 환경 변수를 선언, Spring Jar 파일이 생성되는 위치를 변수로 선언해서 거기 있는 파일을 대상으로 하겠다는 의미
**COPY 키워드**
ARG 키워드에서 변수로 선언한 JAR_FILE을 app.jar 이름으로 복사한다는 의미,
**ENTRYPOINT 키워드**
이미지를 Container로 띄울 때 Jar 파일이 실행되어 Spring 서버가 구동되도록 Command를 설정
3) 회원가입 후 Create Repository를 클릭하여 Repository를 생성
4) Dockerfile 빌드
형식 : docker build --build-arg DEPENDENCY=build/dependency -t 도커허브아이디/도커허브 Repository 명 .
docker build --build-arg DEPENDENCY=build/dependency -t tjsrua02/simple-spring-boot . (마지막 . 까지 써줘야 됨)
⇒ 도커파일 빌드 및 이미지 생성
단, 인텔리제이 터미널 창에서 해야되나 봄 git bash에서는 안 먹힘
=======================================
여기까지 인텔리제이 및 Docker 에서의 작업
=======================================
5) Docker 를 ec2 서버에 설치
$ **sudo yum install docker**
- 위 명령어를 통해 도커를 설치해주시고 중간에 y를 눌러줍니다.
아래 오류뜨면
sudo: yum: command not found
해결
1.sudo apt-get install yum
or
2. sudo apt-get install docker
저는 1 방법으로 해결이 안 돼서 2번으로 해결 !
$ **sudo systemctl start docker**
- 위 명령어를 통해 도커를 실행시킵니다.
Failed to start docker.service: Unit docker.service not found. 에러가 뜨면
curl -sSL [https://get.docker.com/](https://get.docker.com/) | sh 입력으로 해결 !
$ **sudo docker pull tjsrua02/simple-spring-boot**
- 위 명령어를 통해 도커허브에 올라간 스프링부트 도커 이미지를 pull 받습니다.
$ **sudo sudo docker run -p 8081:8080 tjsrua02/simple-spring-boot**
- 해당 명령어로 8081번 포트에 스프링부트를 실행합니다.
<참고자료>
-Docker 설치법과 간단한 사용법
https://www.notion.so/Doker-b540cc61b3d24d3abf732f370a1be9c2#7f8e4ea5fbe1486b9df68a88fc636b7c
https://www.notion.so/Doker-b540cc61b3d24d3abf732f370a1be9c2#a7400b46f87d4b7fb0648a25c285316e
-Docker 이미지 생성 / Docker-compose 사용법
https://www.notion.so/Doker-b540cc61b3d24d3abf732f370a1be9c2#fa5712ab94f143ff82d4de2460048b64
https://www.notion.so/Doker-b540cc61b3d24d3abf732f370a1be9c2#98a3f058cfbb4119b16d61e55a3f3df8