본문 바로가기

DevOps/도커(Docker)

(11)
깃허브 액션으로 도커 이미지 build, push 해보기 1. github repo 생성 2. docker 파일 작성 FROM python:3.9-alpine WORKDIR /root ADD hello.py . CMD ["python3", "hello.py"] 3. 파이썬 스크립트 작성(hello.py) #!/usr/bin/python3 print("Hello world~!~!~!") 4. github action yaml 파일 작성 name: Docker Image CI on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v..
쿠버네티스에서 도커 이미지 구동하기 쿠버네티스에서 직접 만든 컨테이너 사용하기 지금까지 도커를 이용해 컨테이너를 다루고 새로운 컨테이너 이미지를 빌드해보았다. 컨테이너 이미지 빌드방법을 다양하게 알아본 이유는 직접 만든 컨테이너 이미지를 쿠버네티스에서 사용하는것이다. 쿠버네티스에서 이미지를 사용하려면 쿠버네티스가 이미지를 불러올 수 있는 공간에 이미지를 넣어두어야 한다. # 쿠버네티스에서 도커 이미지 구동하기 쿠버네티스는 컨테이너를 효과적으로 다루기 위해서 만들어졌고 컨테이너인 파드도 쉽게 부를 수 있다. 따라서 직접 만든 컨테이너 이미지도 kubectl 명령으로 쿠버네티스 클러스터에서 바로 구동할 수 있다. 도커를 빌드해서 만든 multistage-img 이미지를 쿠버네티스에서 구동해보자. 1. 이미지 확인 $ docker images ..
도커 컨테이너 이미지 만들기 4 - 멀티 스테이지 빌드 # 최적화해 컨테이너 빌드하기(멀티 스테이지 빌드) 지금까지의 빌드 방법은 이미지 용량이 커지거나 빌드과정이 번거로운 등의 단점이 있었다. 멀티 스테이지 빌드(Multi-Stage Build) 방법은 최종 이미지의 용량을 줄일 수 있고 호스트에 어떠한 빌드 도구도 설치할 필요가 없다. 도커파일 작성 > 도커파일 빌드 > 빌드완료 멀티 스테이지는 docker-ce 17.06 버전부터 지원된다. 1. 파일 살펴보기 2. Dockerfile 확인 # 1단계: 자바 소스를 빌드해 JAR로 만듦 FROM openjdk:8 AS int-build # openjdk 이미지에 int-build라는 별칭을 붙임 LABEL description="Java Application builder" RUN git clone WO..
도커 컨테이너 이미지 만들기 3 - 컨테이너 내부에서 컨테이너 빌드하기 # 컨테이너 내부에서 컨테이너 빌드하기 번거로운 과정없이 바로 자바 소스를 컨테이너 이미지에서 빌드해보자. 도커파일 작성 > 도커파일 빌드 > 빌드완료 1. 파일 살펴보기 FROM openjdk:8 LABEL description="Echo IP Java Application" EXPOSE 60433 RUN git clone WORKDIR inbuilder RUN chmod 700 mvnw RUN ./mvnw clean package RUN mv target/app-in-host.jar /opt/app-in-image.jar WORKDIR /opt ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ] FROM openjdk:8 자바 개발 도구가 포함된 이미지 EXPOS..
도커 컨테이너 이미지 만들기 2 - 컨테이너 용량 줄여 빌드하기 # 컨테이너 용량 줄여 빌드하기 불필요한 공간을 점유하는 건 비용 낭비이기도 하지만, 성능에 영향을 미칠 수 있다. 이번에는 컨테이너 이미지의 용량을 줄여 빌드하는 방법을 알아보자. # 컨테이너 용량을 줄여 빌드하는 과정 도커파일 작성 > 도커파일 빌드 > 빌드 완료 기본 방법보다 1단계가 줄고, 기초 이미지가 openjdk에서 GCR(Google Container Registery)에서 제공하는 distroless로 변경된다. 1. 디렉터리 살펴보기 기존 방법과 비교하면 build-in-host.sh 라는 추가된 파일이 있다. 2. build-in-host.sh 확인 #!/usr/bin/env bash sudo apt install -y openjdk-8-jdk ./mvnw clean package d..
도커 컨테이너 이미지 만들기 1 - 기본 방법으로 빌드하기 직접 컨테이너 이미지를 만들어 쿠버네티스에서 사용하는 방법 컨테이너 인프라 환경을 구성할 때 이미 제공된 이미지를 사용하는 경우도 있지만, 직접 만든 애플리캐이션으로 컨테이너를 만들 수 있다. 책에서 제공하는 소스코드로 자바 실행파일을 빌드하고 이를 다시 도커빌드를 사용해 컨테이너 이미지를 만든다. 기본적인 빌드 > 용량 줄이기 > 컨테이너 내부 빌드 > 멀티 스테이지 # 기본 방법으로 빌드하기 컨테이너 이미지를 만드는 방법은 다양하지만, 가장 간단한 방법부터 살펴보자. 스프링 부트(Spring Boot)를 이용해 만든 자바 소스 코드로 이미지를 빌드한다. 해당 소스 코드는 요청을 전달하면 출발지와 목적지를 반환하는 간단한 기능만 제공한다. # 컨테이너 이미지 빌드 과정 자바 소스 빌드 > 도커파일 작성..
도커 컨테이너/이미지 정지하고 삭제하기 사용하지 않는 컨테이너 정리하기 # 컨테이너 정지하기 컨테이너나 이미지를 삭제하기 전에 먼저 컨테이너를 정지해야한다. 삭제할때 말고도 동일한 호스트의 포트를 사용하는 컨테이너를 배포하거나 작동중인 컨테이너의 사용 자체를 종료할 때도 먼저 컨테이너를 정지해야 한다. 1. nginx이미지를 기반으로 생성된 컨테이너 조회 $ docker ps -f ancestor=nginx ancestor 키는 컨테이너를 생성하는 데 사용한 이미지를 기준으로 필터링한다. 2. 컨테이너 정지 $ docker stop $ docker stop 3. 모든 컨테이너 정지 $ docker stop $(docker ps -q -f ancestor=nginx) nginx 이미지를 사용하는 모든 ..
도커 바인드 마운트(Bind mount)와 볼륨(Volume) # 바인드 마운트로 호스트와 컨테이너 연결하기 현재 정상적으로 노출된 nginx 컨테이너의 구조를 살펴보면 처음 접속할 때 노출되는 페이지는 /usr/share/nginx/html/index.html 이다. 따라서 수정해야하는 파일이 index.html이며, 이러한 경로 설정은 /etc/nginx/nginx.conf에 존재한다. 1. 컨테이너의 /usr/share/nginx/html/ 디렉터리와 호스트의 /root/html/ 디렉터리를 연결 $ sudo mkdir -p /root/html $ docker run -d -p 8081:80 -v /root/html:/usr/share/nginx/html --restart always --name nginx-bind-mounts nginx 컨테이너 내부에 연결..
도커 컨테이너 실행하기 # 도커 컨테이너 단순히 실행하기 1. 새로운 컨테이너 실행 $ docker run -d --restart always nginx docker run 으로 컨테이너를 생성하면 결과값으로 14d58aacc.. 같은 16진수 문자열이 나온다. 이런 문자열은 컨테이너를 식별할 수 있는 고유한 ID이다. -d(—detach) 컨테이너를 백그라운드에서 구동한다는 의미이다. 옵션을 생략하면 컨테이너 내부에서 실행되는 애플리케이션의 상태가 화면에 계속 표시된다. 이 상태에서 빠져 나오려고 ctrl+c 를 누르면 애플리케이션뿐만 아니라 컨테이너도 함께 중단된다. 따라서 계속 작동해야하는 서버나 데이터베이스 같은 프로그램은 -d 옵션을 붙여 백그라운드에서 작동하게 된다. —restart always 컨테이너의 재시작과 ..
도커 컨테이너 이미지 도커 이미지를 내려받아 컨테이너로 실행하고 도커 이미지와 컨테이너를 삭제하는 법 이미지 찾기 > 실행하기 > 디렉터리와 연결하기 > 삭제하기 먼저 컨테이너 이미지와 컨테이너의 관계를 정리해보자. 컨테이너 이미지는 베이그런트 이미지와 유사하다. 베이그런트 이미지는 이미지 자체로는 사용할 수 없고 베이그런트를 실행할 때 추가해야만 사용할 수 있다. 이와 마찬가지로 컨테이너 이미지도 그대로는 사용할 수 없고 도커와 같은 CRI로 불러들어야 컨테이너가 실제로 작동한다. 이는 실행파일과 실행된 파일 관계로 볼 수 있다. 따라서 컨테이너를 삭제할 때는 내려받은 이미지와 이미 실행된 컨테이너를 모두 삭제해야만 디스크의 용량을 온전히 확보할 수 있다. 컨테이너 런타임 인터페이스(CRI)는 클러스터 컴포넌트를 다시 컴파..