본문 바로가기
DevOps/docker

01. Docker정의와 이미지

by clearinging 2021. 9. 12.
반응형

Docker

정의

  • 컨테이너 환경에서 독립적으로 application을 실행할 수 있도록 컨테이너를 만들고 관리해주는 것을 도와주는 도구
  • 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 container로 실행하고 관리할 수 있게 해주는 오픈 소스 프로젝트

특징

  • application을 싱행하기 위한 모든 구성요소를 포함하고 있기 때문에 host OS에 관계없이 일관된 결과를 보장
  • 아래의 그림과 같이 vm처럼 guest os를 사용하지 않기 때문에 Guest OS가 사용하는 리소스를 절약할 수 있기 때문에 이점을 가질 수 있습니다.
    coninter와 vm 구조 그림

Docker Container와 Image

Image

  1. 정의
  • application 실행과 운영에 필요한 모든 리소스 정보를담고 있는 패키지
  • spring application 실행하기 위해서 java와 spring framework 코드 정보를 하나의 이미지에 넣을 수 있음
  1. 특징
  • 상태값이 바뀌지 않는다: 하나의 이미지를 내부를 수정할 수 없고 이미지를 재 생성해서 덮어 씌우는 형태를 취하게 됩니다.
  • docker hub나 server에 올리고 같이 공유할 수 있음
  • Dockerfile을 통해서 이미지를 만들기 위한 설정 정보를 다 넣을 수 있습니다.

Container

  1. 정의
  • 하나의 운영체제 커널에서 다른 프로세스에 영향을 받지 않고 독립적으로 실행 되는 프로세스 상태를 의미
  • 이미지를 실행 시킨 상태를 의미
  1. 장점
  • 논리적으로 호스트 OS의 자원을 격리 시켜 놓습니다.
  • container는 guest os를 추가로 설치 하지 않아 guest os가 사용할 자원을 활용할 수 있습니다 -> 효율 적

Dockerfile

정의

  • docker이미지를 만들기 위한 설정 정보를 담고 있는 파일

Spring Dockerfile 작성

  1. project 구조

  • 여기서 module-api에 main문을 실행시켜 jar 파일을 얻고, 그 jar 파일을 가지고 application을 실행하는 구조 입니다.
  1. 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를 지원
  1. 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