Docker 네트워크

목표 도커 네트워크가 무엇인지 이해한다. 도커 네트워크 타입에 무엇이 있는지 이해한다. Docker Network Docker는 컨테이너 간, 호스트, 외부 네트워크와 통신을 하기위한 네트워크 시스템을 포함하고 있다. Docker Network 타입 bridge 컨테이너 끼리 서로 연결하고 외부 네트워크와 분리하는 네트워크 동일한 bridge 네트워크 내의 컨테이너는 IP 주소 또는 컨테이너 이름을 사용해서 통신할 수 있다. 컨테이너와 호스트 사이에 소프트웨어 기반의 bridge를 만들어준다. 기본적으로 아웃바운드 트래픽은 허용하지만, 인바운드 트래픽은 허용하지 않는다. port publish 를 통해서 특정 포트로의 인바운드 트래픽을 허용해준다....

2025-02-01 · 2 min · 394 words

Docker Stack 알아보기

목표 Docker Stack이 무엇인지 이해한다. Docker Stack의 사용법을 이해한다. Docker Stack 이란 Docker Swarm 은 Docker 컨테이너를 클러스터링하고 스케줄링하기 위한 컨테이너 오케스트레이션 툴이다. Docker Stack 은 기본적으로 Docker Swarm을 통해 실행된다. Docker Stack을 사용하면 Swarm에 분산된 컨테이너인 여러 서비스를 논리적으로 배포하고 그룹화할 수 있다. vs Docker Compose Docker Compose는 단일 노드에서 실행되는 컨테이너를 관리하기 위한 용도이고, Docker Stack은 Docker Swarm 모드로 실행되는 멀티 노드 환경에서 컨테이너를 관리하긴 위한 용도이다. 공통점 docker-compose....

2025-02-01 · 1 min · 158 words

Docker 빌드 캐시

목표 Docker 빌드 시 캐시가 사용되는 방법을 이해한다. 레이어 Docker가 빌드될 때 캐시가 동작하는 방법을 이해하기 전에 먼저 Docker 이미지의 레이어가 무엇인지 이해해야 된다. 하나의 이미지는 여러 개의 레이어로 구성된다. 각 레이어는 Dockerfile에 있는 각 명령어의 빌드 결과다. 각 레이어는 이전 레이어과의 차이값을 나타내고 있다. 아래 Dockerfile이 있으면 그림과 같이 각 명령어의 결과가 하나의 레이어가 된다고 볼 수 있다. # syntax=docker/dockerfile:1 FROM ubuntu:latest RUN apt-get update && apt-get install -y build-essentials COPY main....

2025-01-21 · 1 min · 192 words

파드에 환경 변수로 데이터 넘겨주기

목표 디플로이먼트를 이용해서 파드를 생성할 때, 파드에서 필요한 데이터를 환경 변수로 설정되도록 하여 넘겨주고자 한다. 파드에 넘겨줄 데이터를 클러스터에서 어떻게 관리할지도 고민해본다. ConfigMap 클러스터 내에 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트다. 파드는 ConfigMap을 환경 변수, 파라미터 볼류의 구성 파일로 사용할 수 있다. 아래와 같이 명령어로 바로 ConfigMap을 만들 수도 있고, yaml 파일을 이요해서 만들 수도 있다. kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2022-02-18T19:14:38Z name: special-config namespace: default resourceVersion: "651" uid: dadce046-d673-11e5-8cd0-68f728db1985 data: special....

2024-09-15 · 2 min · 299 words

특정 파드 로그 확인하기

목표 특정 파드에 발생하는 로그를 실시간으로 확인한다. 특정 파드가 재시작 되었을 때 이전 인스턴스의 로그를 확인한다. 방법 기본적으로 kubectl logs <파드 id> 로 파드의 로그를 확인할 수 있다. -f 옵션은 follow의 약자로 로그가 스트리밍 되는 옵션이다. kubectl logs -f <파드 id> 에러 등으로 인해 파드가 재시작되었다면, 재시작 원인을 분석하기 위해 이전 인스턴스의 로그를 확인할 필요도 있다. -p: previous의 약자 kubectl logs -p <파드 id> 참고 자료 https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs https://stackoverflow.com/questions/39454962/kubectl-logs-continuously https://www.digitalocean.com/community/questions/how-to-check-the-logs-of-running-and-crashed-pods-in-kubernetes

2024-09-15 · 1 min · 69 words

쿠버네티스로 클러스터 구성하기

쿠버네티스 구성 방법 퍼블릭 클라우드 업체에서 제공하는 관리형 쿠버네티스 EKS(Amazon Elastic Kubernetes), AKS(Azure Kubernetes Services), GKE(Google Kubernetes Engine) 등이 있다. 구성이 이미 다 갖춰져 있고 마스터 노드를 클라우드 업체에서 관리하기 떄문에 학습용으로는 적합하지 않다. 설치형 쿠버네티스 Rancher, OpenShift 등이 있다. 하지만 유료라는 단점이 있다. 구성형 쿠버네티스 kubeadm, kops(Kubernetes Operations), KRIB(Kubernetes Rebar Integrated Bootstrap), kubespray 등이 있다. 사용하는 시스템에 쿠버네티스 클러스터를 자동으로 구성해준다. kubeadm이 가장 널리 알려져 있다. kubeadm은 사용자가 변경하기도 쉽고, 온프레미스와 클라우드를 모두 지원하며, 배우기도 쉽다....

2024-09-15 · 3 min · 441 words

컨테이터 IP 확인하기

docker위에서 돌아가고 있는 WAS가 docker 위에 올라가 있는 DB에게 연결을 계속 실패하는 문제가 있었다. 분명 docker inspect 명령어로 확인한 IP 주소 값인데 왜 연결에 실패하는지 이해가 되지 않았다. docker를 사용하면 docker0라는 네트워크 인터페이스가 생긴다. docker에서는 이 네트워크 인터페이스에 bridge라는 네트워크 드라이버를 제공하고있다. 그래서 docker를 설치한 직후에 docker network ls 명렁어를 입력하면 아래와 같이 bridge 드라이버를 사용중인 네트워크를 볼 수 있다. 또한 아무 설정없이 컨테이너를 만들면 이 기본 bridge 네트워크에 연결하게 된다....

2024-09-15 · 1 min · 134 words

컨테이너로 이미지 만들기 및 Docker hub에 업로드

컨테이너로 이미지 만들기 docker commit [ContainerID] 이미지에 태그 붙이기 docker tag SOURCE_IMAGE[:TAG] TARcoGET_IMAGE[:TAG] 이미지 docker hub에 업로드 및 다운로드 docker push [OPTIONS] NAME[:TAG] docker pull [OPTIONS] NAME[:TAG] 참고 자료 https://galid1.tistory.com/324

2024-09-15 · 1 min · 30 words

실행 중인 컨테이너가 있을 경우 삭제(sh)

if [ "$(docker ps -q -f name=<name>)" ]; then docker stop <name> docker rm <name> fi

2024-09-15 · 1 min · 16 words

디플로이먼트 파드 전체 재시작

목표 디플로이먼트에 속한 파드 전체를 재시작한다. 방법 kubectl rollout restart <resource> 예시 kubectl rollout restart deployment/nginx 참고 자료 https://kubernetes.io/docs/reference/kubectl/generated/kubectl_rollout/kubectl_rollout_restart/

2024-09-15 · 1 min · 19 words

도커 스웜을 이용한 스케일 아웃

기존에 내가 진행하던 프로젝트는 WAS가 한 대 뿐이었다. 이번에 성능 향상을 목적으로 스케일 아웃을 진행하기로 결정했다. 스케일 아웃을 진행하면서 처리해야될 작업들에는 다음이 있었다. 서버가 여러 대인 점을 이용한 무중단 배포 WAS가 늘어나면서 NGINX에서 요청을 전달한 WAS 선택 방법 (로드 밸런싱) 이를 해결하기 위해서 나는 도커 스웜을 사용해보기로 결정했다. 그 이유는 다음과 같다. 도커 스웜은 자체적으로 롤링 업데이트를 지원하며, 매우 간단하게 사용할 수 있다. ingress 네트워크를 통해 NGINX에 추가적인 설정을 하지않아도, ingress의 로드 밸런서가 라운드 로빈 방식을 사용해서 WAS의 트래픽을 분산시킬 수 있다....

2024-09-15 · 3 min · 620 words

Spring Boot 개발 환경에서 TestContainers 사용하기

목표 TestContainers를 통해 개발 환경에서 Spring 애플리케이션 실행 시 mariaDB 컨테이너를 실행하도록 한다. TestContainers를 통해 이미 mariaDB 컨테이너가 실행 중이라면 재사용하도록 한다. 의존성 추가 일반적으로 TestContainers는 테스트 환경에 사용하지만, Spring 애플리케이션이 dev 프로파일로 실행될 때 사용하는 것이 목표여서 아래와 같이 의존성을 추가한다. mariaDB를 사용하기 위한 JDBC Driver도 함께 의존성 추가한다. dependencies { //... implementation("org.mariadb.jdbc:mariadb-java-client") implementation("org.springframework.boot:spring-boot-testcontainers") implementation("org.testcontainers:mariadb") //... } 컨테이너 자동 실행 Spring Boot 3.1부터 Container 클래스를 Bean 등록하면, 자동으로 컨테이너를 실행해준다....

2024-09-15 · 1 min · 131 words

Dockerfile multi-stage

목표 Dockerfile에서 multi-stage 가 무엇인지 이해한다. multi-stage 란 단일 Dockerfile에서 여러 개의 이미지를 빌드 할 수 있는 기능이다. Dockerfile에서 여러 개의 FROM 절을 사용하면 multi-stage가 된다. FROM golang:1.21 WORKDIR /src COPY <<EOF ./main.go package main import "fmt" func main() { fmt.Println("hello, world") } EOF RUN go build -o /bin/hello ./main.go FROM scratch COPY --from=0 /bin/hello /bin/hello CMD ["/bin/hello"] multi-stage 장점 빌드시 필요한 환경과 실행시 필요한 환경이 다를 수 있다. 위의 예시에서도 go를 빌드 하기위해서 FROM golang:1....

2024-09-15 · 1 min · 97 words

Docker 이해하기

지금까지 도커를 사용하여 배포 환경을 구축해왔지만 사실 도커에대한 이해가 있는 것은 아니다. 최근에 도커를 건드릴 일이 많아졌기 때문에 이 기회에 도커에대해서 학습해보고자 한다. 컨테이너 도커를 사용하면서 가장 많이 언급되는 단어가 컨테이너다. 컨테이너는 하나의 운영 체제 커널에서 다른 프로세스에 영향을 받지않고 독립적으로 실행되는 프로세스의 상태를 말한다. 독립적인 환경을 가지기 때문에 각 컨테이너마다 프로세스 ID도 격리되어 관리된다. 이 컨테이너 덕분에 우리는 배포 환경에 의존적이지 않도록 구성할 수 있다는 장점이 있다. 예전부터 유닉스나 리눅스는 하나의 운영 체제 안에서 자원을 분리해 할당하고, 실행되는 프로세스를 격리하는 방법이 존재했다....

2024-09-15 · 7 min · 1379 words