반응형
Docker
정의
- 컨테이너 환경에서 독립적으로 application을 실행할 수 있도록 컨테이너를 만들고 관리해주는 것을 도와주는 도구
- 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 container로 실행하고 관리할 수 있게 해주는 오픈 소스 프로젝트
특징
- application을 싱행하기 위한 모든 구성요소를 포함하고 있기 때문에 host OS에 관계없이 일관된 결과를 보장
- 아래의 그림과 같이 vm처럼 guest os를 사용하지 않기 때문에 Guest OS가 사용하는 리소스를 절약할 수 있기 때문에 이점을 가질 수 있습니다.
coninter와 vm 구조 그림
Docker Container와 Image
Image
- 정의
- application 실행과 운영에 필요한 모든 리소스 정보를담고 있는 패키지
- spring application 실행하기 위해서 java와 spring framework 코드 정보를 하나의 이미지에 넣을 수 있음
- 특징
- 상태값이 바뀌지 않는다: 하나의 이미지를 내부를 수정할 수 없고 이미지를 재 생성해서 덮어 씌우는 형태를 취하게 됩니다.
- docker hub나 server에 올리고 같이 공유할 수 있음
- Dockerfile을 통해서 이미지를 만들기 위한 설정 정보를 다 넣을 수 있습니다.
Container
- 정의
- 하나의 운영체제 커널에서 다른 프로세스에 영향을 받지 않고 독립적으로 실행 되는 프로세스 상태를 의미
- 이미지를 실행 시킨 상태를 의미
- 장점
- 논리적으로 호스트 OS의 자원을 격리 시켜 놓습니다.
- container는 guest os를 추가로 설치 하지 않아 guest os가 사용할 자원을 활용할 수 있습니다 -> 효율 적
Dockerfile
정의
- docker이미지를 만들기 위한 설정 정보를 담고 있는 파일
Spring Dockerfile 작성
- project 구조
- 여기서 module-api에 main문을 실행시켜 jar 파일을 얻고, 그 jar 파일을 가지고 application을 실행하는 구조 입니다.
- Dockerfile
FROM adoptopenjdk/openjdk11:alpine-slim AS BUILD
ENV HOME=/usr/app
WORKDIR $HOME
COPY . $HOME
RUN chmod +x ./gradlew
RUN ./gradlew clean :module-api:build
FROM adoptopenjdk/openjdk11:alpine-jre
ENV HOME=/usr/app
COPY --from=BUILD $HOME/module-api/build/libs/*.jar /app.jar
ENTRYPOINT ["java","-jar","app.jar"]
첫번 째 layer에서 jdk 11 버전을 먼저 가져옵니다. -> java 를 사용하기 때문에 해당 이미지가 없을 경우 설치하기 위해서 추가 하였습니다.
jar 파일을 얻기 위해서
RUN ./gradlew clean :module-api:build
명령어를 실행 시켜 build 를 해줍니다.FROM adoptopenjdk/openjdk11:alpine-jre
을 통해서 앞에서 설치한 java docker image를 read only 형태로 가져와 사용할 수 있게 합니다.copy를 통해 앞에서 만든 build 폴더안에 있는 jar 파일을 docker 컨테이너의
/usr/app
폴더로 이동시킵니다.ENTRYPOINT를 통해서
java -jar app.jar
명령어를 실행시켜 application을 실행 시키도록 하였습니다docker 실행 명령어
- profile dev 로 변경
- port 9000번으로 설정
docker run -p 9000:9000 -e \
"spring.profiles.active=dev" \
--name sharedfood-service \
clack2933/sharedfood-service:1.0
- cf) spring 에서 local에 설치된 mysql과 연결할 때 localhost로 연결하게 되면 에러가 나게 됩니다.
- 이유 : docker로 실행하게되면,
docker0
이라는 network bridge를 통해서 host와 다른 docker container끼리 통신을 할 수 있습니다. - 다른 container와 통신 방법 : conatiner이름(
--name
옵션으로 지정한 이름)사용 - host와 통신 방법 : docker는 host의 port를 접속하기 위해서
host.docker.internal
라는 namespace를 지원
- 이유 : docker로 실행하게되면,
- docker-compose.yml
- 정의 : 여러 개의 docker를 정의하고 실행하는 툴을
- 예시 : redis 설치 후 api application 실행
version: "3"
services:
redis:
image: redis:6.0.5
command: redis-server --requirepass changeme --port 6379
container_name: redis6379
hostname: redis6379
labels:
- "name=redis"
- "mode=standalone"
ports:
- 6379:6379
api:
build: .
ports:
- 8000:8000
command: java -jar app.jar
environment:
- "SPRING_PROFILES_ACTIVE=local"
depends_on:
- redis
- redis 가 api 보다 먼저 실행 되어야 하기 때문에 depends_on을 사용해 redis가 먼저 실행 되고, 그리고 api가실행 되도록 순서를 조작할 수 있습니다.
- api에서
build .
를 넣어 줬기 때무에 현재docker-compose.yml
와 동일한 위치에Dockerfile
를 탐색해서 api의 이미지를 만들어 줍니다. - redis.image : docker hub나 현재 local에 동일한 이미지가 존재하는지 확인 후 해당 이미지를 build 후 사용합니다.
반응형
'DevOps > docker' 카테고리의 다른 글
Docker Mac Container IP Network 접속 불가(172.xx.xx.xx) 대역 (1) | 2022.03.27 |
---|