프로그래밍/Golang

[Golang]Go, Docker 어플리케이션 배포

다다면체 2025. 2. 15. 10:00
728x90
반응형

현대 소프트웨어 개발에서 컨테이너 기술은 애플리케이션의 개발, 배포, 운영 방식을 혁신적으로 변화시키고 있습니다. 특히 Docker는 컨테이너 기술을 대중화하고 개발 워크플로우를 간소화하는 데 크게 기여했습니다. 본 가이드에서는 Docker를 사용하여 Go 언어로 작성된 애플리케이션을 컨테이너로 패키징하고, 이를 활용하여 효율적으로 배포 및 관리하는 방법을 상세히 학습합니다. Docker를 통해 애플리케이션의 이식성을 극대화하고, 다양한 환경에서 일관된 실행 환경을 보장하며, 확장성까지 확보할 수 있습니다. 🚀


🔹 컨테이너 기술, 왜 필수적일까요?

컨테이너는 애플리케이션과 애플리케이션이 실행되는 데 필요한 모든 구성 요소(라이브러리, 런타임, 시스템 도구, 설정 파일 등)를 하나의 패키지로 묶는 기술입니다. 마치 택배 상자처럼, 컨테이너는 어떤 환경에서든 일관되게 작동하도록 보장합니다. Docker는 이러한 컨테이너를 생성, 관리, 배포하기 위한 가장 널리 사용되는 플랫폼입니다. Docker를 도입함으로써 얻을 수 있는 주요 이점은 다음과 같습니다.

  • 뛰어난 이식성 (Portability): "한 번 빌드하면 어디든 실행된다" 컨테이너는 운영 체제 레벨에서 격리된 환경을 제공하여, 개발자의 로컬 환경, 테스트 서버, 스테이징 환경, 프로덕션 환경 등 어떤 환경에서든 동일하게 작동합니다. 개발 환경과 운영 환경의 불일치로 인해 발생하는 "내 컴퓨터에서는 잘 되는데..." 문제를 근본적으로 해결하고, 애플리케이션 배포 과정을 획기적으로 간소화합니다. 클라우드, 온프레미스, 하이브리드 환경 등 다양한 인프라 환경에 구애받지 않고 애플리케이션을 자유롭게 이동하고 배포할 수 있습니다.
  • 압도적인 확장성 (Scalability): 필요에 따라 자유롭게 확장하는 유연성 컨테이너는 가볍고 빠르게 시작되므로, 트래픽 증가에 따라 쉽게 스케일 아웃할 수 있습니다. Kubernetes와 같은 컨테이너 오케스트레이션 도구를 사용하면 컨테이너의 배포, 확장, 로드 밸런싱, 자동 복구 등을 자동화하여 애플리케이션의 확장성을 극대화하고, 고가용성을 확보할 수 있습니다. 마이크로서비스 아키텍처 (MSA) 환경에서 컨테이너는 각 서비스의 독립적인 배포와 확장을 가능하게 하는 핵심 기술입니다.
  • 놀라운 경량성 (Lightweight): 가상 머신을 압도하는 효율성 컨테이너는 운영 체제 커널을 공유하고, 필요한 라이브러리만 포함하기 때문에 가상 머신(VM)에 비해 훨씬 가볍고 자원 효율성이 뛰어납니다. 컨테이너는 몇 초 안에 빠르게 시작되며, 시스템 자원 점유율이 낮아 동일한 하드웨어에서 더 많은 컨테이너를 실행할 수 있습니다. 이는 인프라 비용 절감과 애플리케이션 성능 향상으로 이어집니다. 특히 마이크로서비스처럼 수많은 인스턴스를 운영해야 하는 환경에서 컨테이너의 경량성은 매우 중요한 장점입니다.
  • 일관된 배포 환경 (Consistent Deployment): 개발부터 운영까지, 환경 차이 최소화 Docker 컨테이너는 애플리케이션과 실행 환경을 이미지라는 형태로 캡슐화합니다. 이 이미지는 개발, 테스트, 스테이징, 프로덕션 등 모든 단계에서 동일하게 사용될 수 있습니다. 개발자는 개발 환경에서 컨테이너 이미지를 빌드하고 테스트한 후, 동일한 이미지를 운영 환경에 배포하기만 하면 됩니다. 이는 환경 설정 오류로 인한 배포 실패 위험을 줄이고, 배포 프로세스의 안정성과 예측 가능성을 높입니다.

🔹 Go 애플리케이션을 위한 Docker 환경 구축: Dockerfile 작성

Go 애플리케이션을 Docker 컨테이너에서 실행하기 위한 첫 번째 단계는 Dockerfile을 작성하는 것입니다. Dockerfile은 Docker 이미지를 빌드하기 위한 레시피 역할을 하며, 이미지 레이어, 작업 디렉토리, 파일 복사, 명령어 실행 등 이미지 빌드 과정을 정의합니다. 다음은 간단한 Go 웹 서버 애플리케이션을 Docker 컨테이너로 패키징하는 Dockerfile 예제입니다.

# ===== Step 1: 빌드 환경 설정 (builder 이미지) =====
# 베이스 이미지로 golang:1.22 버전을 사용 (Go 빌드 환경 제공)
FROM golang:1.22 AS builder

# 컨테이너 내 작업 디렉토리 설정 (/app)
WORKDIR /app

# 현재 디렉토리의 모든 파일 및 디렉토리를 컨테이너의 /app 디렉토리로 복사
COPY . .

# Go 모듈 의존성 다운로드 (go.mod 파일 기반)
RUN go mod download

# Go 애플리케이션 빌드 (main 실행 파일 생성)
# -ldflags="-s -w" : 빌드 최적화 (디버깅 정보 및 심볼 테이블 제거) -> 바이너리 크기 감소
RUN go build -ldflags="-s -w" -o main .


# ===== Step 2: 실행 환경 설정 (runner 이미지) =====
# 더 작고 가벼운 alpine:latest 이미지 사용 (최소한의 실행 환경 제공)
FROM alpine:latest

# 필요한 CA 인증서 복사 (HTTPS 통신을 위해 필요할 수 있음)
RUN apk --no-cache add ca-certificates

# 작업 디렉토리 설정 (/root/)
WORKDIR /root/

# 빌드 환경 (builder 이미지) 에서 빌드된 실행 파일 (main) 을 현재 이미지의 /root/ 디렉토리로 복사
COPY --from=builder /app/main .

# 컨테이너 외부로 노출할 포트 설정 (8080 포트)
EXPOSE 8080

# 컨테이너가 시작될 때 실행할 명령어 설정 (./main 실행 파일 실행)
CMD ["./main"]

Dockerfile 주요 내용 설명:

  • Multi-stage 빌드: Dockerfile은 Multi-stage 빌드 방식을 사용하여 이미지 크기를 최적화합니다.
    • builder stage (빌드 환경): golang:1.22 이미지를 기반으로 빌드 환경을 구성합니다. Go 애플리케이션 빌드에 필요한 Go 툴체인, 라이브러리 등을 포함합니다. 이 단계에서 Go 애플리케이션을 컴파일하여 실행 파일 (main) 을 생성합니다.
    • runner stage (실행 환경): alpine:latest 이미지를 기반으로 최소한의 실행 환경을 구성합니다. Alpine Linux는 매우 작고 가벼운 리눅스 배포판으로, 최종 이미지 크기를 줄이는 데 효과적입니다. runner stage에서는 builder stage에서 빌드된 실행 파일 (main) 만 복사하여 최종 이미지를 구성합니다. 불필요한 빌드 도구, 라이브러리 등을 제거하여 이미지 크기를 최소화합니다.
  • FROM: 베이스 이미지를 지정합니다. golang:1.22 AS builder는 빌드 환경을 위한 이미지, alpine:latest는 실행 환경을 위한 이미지를 정의합니다. AS builder는 builder stage의 이름을 지정합니다.
  • WORKDIR: 컨테이너 내 작업 디렉토리를 설정합니다. 이후 RUN, COPY, CMD 등의 명령어는 이 디렉토리를 기준으로 실행됩니다.
  • COPY: 호스트 시스템의 파일 또는 디렉토리를 컨테이너 이미지 내로 복사합니다. COPY . . 는 현재 Dockerfile이 위치한 디렉토리의 모든 내용을 컨테이너의 작업 디렉토리로 복사합니다. COPY --from=builder /app/main . 는 builder stage에서 빌드된 /app/main 파일을 현재 이미지의 /root/ 디렉토리로 복사합니다.
  • RUN: 컨테이너 이미지 빌드 과정에서 명령어를 실행합니다. RUN go mod tidy && go build -o main . 는 Go 모듈 의존성을 정리하고 애플리케이션을 빌드합니다. RUN apk --no-cache add ca-certificates 는 Alpine Linux 패키지 매니저를 사용하여 CA 인증서를 설치합니다. --no-cache 옵션은 패키지 캐시를 사용하지 않아 이미지 레이어 크기를 줄입니다.
  • EXPOSE: 컨테이너가 외부로 노출할 포트를 지정합니다. EXPOSE 8080 은 컨테이너의 8080 포트를 외부에 노출합니다. 실제로 포트를 연결하려면 docker run 명령어의 -p 옵션을 사용해야 합니다.
  • CMD: 컨테이너가 시작될 때 실행할 명령어를 지정합니다. CMD ["./main"] 는 컨테이너 시작 시 /root/main 실행 파일을 실행하도록 설정합니다.

Docker 이미지 빌드 및 컨테이너 실행:

Dockerfile이 작성된 디렉토리에서 다음 명령어를 실행하여 Docker 이미지를 빌드하고 컨테이너를 실행할 수 있습니다.

# Docker 이미지 빌드
# -t go-app: 이미지 이름 (go-app), 태그 (latest, 생략 시 latest 태그가 기본으로 적용) 지정
# . : Dockerfile이 위치한 빌드 컨텍스트 (현재 디렉토리) 지정
docker build -t go-app:latest .

# Docker 컨테이너 실행
# -d: 백그라운드 detached 모드로 실행
# -p 8080:8080: 호스트의 8080 포트와 컨테이너의 8080 포트 연결 (포트 포워딩)
# --name go-app-container: 컨테이너 이름 지정 (go-app-container)
# go-app:latest: 실행할 이미지 이름 및 태그 지정
docker run -d -p 8080:8080 --name go-app-container go-app:latest

컨테이너가 정상적으로 실행되면 웹 브라우저에서 http://localhost:8080 에 접속하여 Go 애플리케이션이 컨테이너 환경에서 실행되는 것을 확인할 수 있습니다. 🎯


반응형

🔹 Docker Compose를 활용한 멀티 컨테이너 애플리케이션 관리

실제 애플리케이션은 웹 서버, 데이터베이스, 메시지 큐, 캐시 서버 등 여러 개의 컨테이너로 구성되는 경우가 많습니다. Docker Compose는 이러한 멀티 컨테이너 애플리케이션을 정의하고 관리하기 위한 편리한 도구입니다. Docker Compose는 YAML 형식의 docker-compose.yml 파일을 사용하여 애플리케이션을 구성하는 서비스, 네트워크, 볼륨 등을 정의하고, docker-compose up 명령어로 정의된 모든 컨테이너를 한 번에 실행하고 관리할 수 있습니다.

 

Docker Compose 설정 예제 (docker-compose.yml): Go 애플리케이션 + PostgreSQL 데이터베이스

다음은 Go 웹 애플리케이션과 PostgreSQL 데이터베이스를 함께 실행하는 Docker Compose 설정 예제입니다.

version: '3.8' # Docker Compose 파일 버전 지정

services: # 서비스 정의 (컨테이너 단위)
  app: # 서비스 이름 (Go 애플리케이션 서비스)
    build: # 빌드 설정
      context: . # 빌드 컨텍스트 (Dockerfile 이 위치한 현재 디렉토리)
    ports: # 포트 매핑 설정
      - "8080:8080" # 호스트 8080 포트와 컨테이너 8080 포트 연결
    depends_on: # 서비스 의존성 설정 (db 서비스가 먼저 시작되어야 함)
      - db

  db: # 서비스 이름 (PostgreSQL 데이터베이스 서비스)
    image: postgres:latest # 사용할 Docker 이미지 (PostgreSQL 최신 버전)
    environment: # 환경 변수 설정 (PostgreSQL 초기 설정)
      POSTGRES_USER: user # PostgreSQL 사용자 이름
      POSTGRES_PASSWORD: password # PostgreSQL 비밀번호
      POSTGRES_DB: mydb # PostgreSQL 데이터베이스 이름
    ports: # 포트 매핑 설정
      - "5432:5432" # 호스트 5432 포트와 컨테이너 5432 포트 연결 (PostgreSQL 기본 포트)
    volumes: # 볼륨 마운트 설정 (데이터 영속성 확보)
      - db-data:/var/lib/postgresql/data # db-data 볼륨을 컨테이너의 /var/lib/postgresql/data 디렉토리에 마운트

volumes: # 볼륨 정의 (Docker Volume)
  db-data: # 볼륨 이름 (db-data)

🚩docker-compose.yml 주요 내용 설명:

version: Docker Compose 파일 버전을 지정합니다. 3.8 버전은 최신 기능과 호환성을 제공합니다.

services: 애플리케이션을 구성하는 서비스 (컨테이너) 들을 정의합니다. 각 서비스는 독립적인 컨테이너로 실행됩니다.

  • app 서비스: Go 웹 애플리케이션 서비스를 정의합니다.
    • build: Docker 이미지를 빌드하는 설정을 정의합니다. context: . 는 Dockerfile이 위치한 현재 디렉토리를 빌드 컨텍스트로 사용하도록 지정합니다. Docker Compose는 자동으로 Dockerfile을 찾아 이미지를 빌드합니다.
    • ports: 포트 매핑 설정을 정의합니다. "8080:8080" 은 호스트의 8080 포트와 컨테이너의 8080 포트를 연결합니다. 웹 브라우저에서 http://localhost:8080 으로 접속하면 Go 애플리케이션에 접근할 수 있습니다.
    • depends_on: 서비스 의존성을 설정합니다. depends_on: - db 는 app 서비스가 db 서비스에 의존함을 명시합니다. Docker Compose는 db 서비스를 먼저 시작한 후 app 서비스를 시작합니다. 데이터베이스 서비스가 먼저 실행되어야 애플리케이션이 정상적으로 데이터베이스에 연결할 수 있습니다.
  • db 서비스: PostgreSQL 데이터베이스 서비스를 정의합니다.
    • image: 사용할 Docker 이미지를 지정합니다. image: postgres:latest 는 Docker Hub에서 postgres 이미지의 최신 버전(latest 태그)을 가져와 사용하도록 설정합니다.
    • environment: 환경 변수를 설정합니다. environment 섹션에서는 PostgreSQL 데이터베이스의 초기 설정을 위한 환경 변수들을 정의합니다. POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB 는 각각 PostgreSQL 사용자 이름, 비밀번호, 데이터베이스 이름을 설정합니다.
    • ports: 포트 매핑 설정을 정의합니다. "5432:5432" 는 호스트의 5432 포트와 컨테이너의 5432 포트를 연결합니다. PostgreSQL 클라이언트 도구 (예: pgAdmin, DBeaver) 를 사용하여 호스트의 5432 포트로 접속하면 PostgreSQL 데이터베이스 서버에 접근할 수 있습니다.
    • volumes: 볼륨 마운트 설정을 정의합니다. volumes 섹션에서는 컨테이너의 특정 디렉토리를 호스트 시스템의 볼륨 또는 Docker Volume 에 마운트하여 데이터 영속성을 확보합니다. db-data:/var/lib/postgresql/data 는 db-data 라는 이름의 Docker Volume 을 컨테이너의 /var/lib/postgresql/data 디렉토리에 마운트합니다. PostgreSQL 데이터베이스는 /var/lib/postgresql/data 디렉토리에 데이터를 저장하므로, 볼륨 마운트를 통해 컨테이너가 삭제되어도 데이터는 db-data 볼륨에 안전하게 보존됩니다.
  • volumes: Docker Volume 을 정의합니다. db-data: 는 db-data 라는 이름의 Docker Volume 을 생성합니다. Docker Volume 은 컨테이너 간에 데이터를 공유하거나, 컨테이너가 삭제되어도 데이터를 영구적으로 보관하기 위해 사용됩니다.

Docker Compose 실행:

docker-compose.yml 파일이 위치한 디렉토리에서 다음 명령어를 실행하여 Docker Compose 에 정의된 모든 컨테이너를 한 번에 실행할 수 있습니다.

# Docker Compose 실행 (detached 모드)
# -d: 백그라운드 detached 모드로 실행 (터미널에서 분리되어 백그라운드에서 실행)
docker-compose up -d

# Docker Compose 실행 (foreground 모드)
# docker-compose up
# foreground 모드로 실행 (터미널에 로그 출력, Ctrl+C 로 종료)

# 실행 중인 Docker Compose 프로젝트 중지
# docker-compose down

docker-compose up -d 명령어를 실행하면 Docker Compose는 docker-compose.yml 파일에 정의된 순서대로 (의존성 고려) app 서비스와 db 서비스를 백그라운드에서 실행합니다. 웹 브라우저에서 http://localhost:8080 에 접속하여 Go 애플리케이션을, PostgreSQL 클라이언트 도구를 사용하여 localhost:5432 로 PostgreSQL 데이터베이스에 접속할 수 있습니다. 🚀


🔹 Docker 컨테이너 데이터 관리: Docker Volume

Docker Volume은 컨테이너에서 생성된 데이터를 영구적으로 보존하고, 컨테이너 간에 데이터를 공유하기 위한 중요한 메커니즘입니다. Docker Volume은 컨테이너의 수명주기와 독립적으로 관리되며, 컨테이너가 삭제되어도 데이터는 안전하게 보존됩니다. Docker Volume의 주요 특징과 활용 방법은 다음과 같습니다.

  • 데이터 영속성 확보: 컨테이너 내부에서 생성된 데이터는 컨테이너가 삭제되면 함께 사라집니다. Docker Volume을 사용하면 컨테이너의 특정 디렉토리를 호스트 시스템의 볼륨 또는 Docker Volume에 마운트하여 컨테이너가 삭제되어도 데이터를 영구적으로 보존할 수 있습니다. 데이터베이스 컨테이너의 데이터 디렉토리를 Docker Volume에 마운트하면 데이터베이스 컨테이너를 재시작하거나 삭제해도 데이터 손실 없이 데이터베이스를 유지할 수 있습니다.
  • 컨테이너 간 데이터 공유: Docker Volume은 여러 컨테이너에서 공유할 수 있습니다. 웹 애플리케이션 컨테이너와 Nginx 컨테이너가 Docker Volume을 공유하도록 설정하면, 웹 애플리케이션 컨테이너에서 생성한 정적 파일을 Nginx 컨테이너에서 서빙할 수 있습니다.
  • 데이터 백업 및 복원 용이성: Docker Volume은 호스트 파일 시스템 또는 클라우드 스토리지와 연동하여 데이터를 백업하고 복원하는 데 용이합니다. Docker Volume을 백업하면 컨테이너 환경을 쉽게 복제하거나 이전할 수 있습니다.

Docker Volume 종류:

  • Named Volume (이름 있는 볼륨): Docker가 관리하는 볼륨입니다. docker volume create 명령어로 생성하거나, docker-compose.yml 파일의 volumes 섹션에서 정의합니다. Docker는 Named Volume을 /var/lib/docker/volumes/ 디렉토리에 저장하고 관리합니다. Named Volume은 컨테이너 이름을 변경하거나 컨테이너를 재시작해도 동일한 볼륨을 유지할 수 있다는 장점이 있습니다. docker volume ls, docker volume inspect, docker volume rm 등의 명령어로 관리할 수 있습니다. docker-compose.yml 예제에서 db-data 가 Named Volume 에 해당합니다.
  • Bind Mount (바인드 마운트): 호스트 시스템의 특정 디렉토리 또는 파일을 컨테이너에 마운트합니다. -v 또는 --mount type=bind 옵션과 함께 호스트 경로를 지정하여 사용합니다. Bind Mount는 호스트 파일 시스템과 컨테이너가 직접 연결되므로, 파일 변경 사항이 즉시 반영됩니다. 개발 환경에서 코드 변경 사항을 컨테이너에 즉시 반영하면서 개발할 때 유용합니다. 하지만 Bind Mount는 호스트 시스템에 의존성이 생기고, Docker가 볼륨 생명주기를 관리하지 않으므로 주의해서 사용해야 합니다.
  • tmpfs Volume: 호스트 시스템의 메모리에 생성되는 임시 볼륨입니다. 컨테이너가 실행되는 동안만 데이터가 유지되며, 컨테이너가 종료되면 데이터가 삭제됩니다. /dev/shm 과 같이 성능이 중요한 임시 데이터를 저장하는 데 사용됩니다.

Docker Volume 명령어:

  • docker volume create <볼륨_이름>: Named Volume 생성
  • docker volume ls: Docker Volume 목록 확인
  • docker volume inspect <볼륨_이름>: Docker Volume 상세 정보 확인
  • docker volume rm <볼륨_이름>: Docker Volume 삭제
  • docker volume prune: 사용하지 않는 Docker Volume 일괄 삭제

🔹 Docker 컨테이너 네트워킹: 컨테이너 간 통신 및 외부 네트워크 연결

Docker 네트워킹은 컨테이너들이 서로 통신하고, 외부 네트워크와 연결될 수 있도록 지원하는 기능입니다. Docker는 다양한 네트워크 드라이버를 제공하며, 사용자는 애플리케이션의 요구 사항에 맞게 네트워크를 구성할 수 있습니다. Docker 네트워킹의 주요 개념과 활용 방법은 다음과 같습니다.

 

🎄Docker 네트워크 드라이버: Docker는 다양한 네트워크 드라이버를 제공하며, 각각 다른 네트워킹 기능을 제공합니다. 주요 네트워크 드라이버는 다음과 같습니다.

  • bridge (브리지 네트워크): 기본 네트워크 드라이버입니다. Docker 컨테이너는 기본적으로 bridge 네트워크에 연결됩니다. bridge 네트워크는 호스트 시스템 내부에 가상 네트워크를 생성하고, 컨테이너들은 이 가상 네트워크 안에서 서로 통신합니다. bridge 네트워크의 컨테이너는 IP 주소를 할당받고, 컨테이너 이름을 사용하여 서로를 찾을 수 있습니다. 외부 네트워크와 통신하려면 포트 포워딩 (port publishing) 을 사용해야 합니다. docker run -p <호스트_포트>:<컨테이너_포트> 옵션을 사용하여 호스트 포트와 컨테이너 포트를 연결하면, 호스트 IP 주소와 호스트 포트를 통해 컨테이너에 접근할 수 있습니다. Docker Compose 환경에서는 ports 섹션을 사용하여 포트 포워딩을 설정합니다.
  • host (호스트 네트워크): 컨테이너를 호스트 시스템의 네트워크와 직접 연결합니다. host 네트워크를 사용하는 컨테이너는 호스트 시스템의 IP 주소와 네트워크 인터페이스를 공유합니다. 포트 충돌을 피하기 위해 컨테이너마다 다른 포트를 사용해야 합니다. host 네트워크는 네트워크 성능이 중요한 경우에 유용하지만, 컨테이너 격리성이 약화될 수 있다는 단점이 있습니다.
  • overlay (오버레이 네트워크): Docker Swarm 또는 Kubernetes 와 같은 컨테이너 오케스트레이션 환경에서 사용되는 네트워크 드라이버입니다. 여러 Docker 호스트에 걸쳐 컨테이너들을 연결하는 가상 네트워크를 생성합니다. overlay 네트워크를 사용하면 여러 호스트에 분산된 컨테이너들이 마치 하나의 네트워크 안에 있는 것처럼 통신할 수 있습니다. 서비스 디스커버리, 로드 밸런싱 등의 기능을 제공하여 MSA 환경에 적합합니다.
  • macvlan (macvlan 네트워크): 컨테이너에 MAC 주소를 할당하고, 물리 네트워크에 직접 연결합니다. macvlan 네트워크를 사용하는 컨테이너는 마치 물리 네트워크에 직접 연결된 것처럼 작동하며, VLAN, 브로드캐스트 등의 네트워크 기능을 사용할 수 있습니다. 특수한 네트워크 환경 구성에 사용됩니다.
  • none (none 네트워크): 컨테이너를 어떤 네트워크에도 연결하지 않습니다. 네트워크 격리가 필요한 경우에 사용됩니다.

🎄 컨테이너 간 통신: 같은 Docker 네트워크에 연결된 컨테이너들은 서로 통신할 수 있습니다. bridge 네트워크에서는 컨테이너 이름 또는 서비스 이름을 사용하여 서로를 찾고 통신합니다. Docker DNS resolver 가 컨테이너 이름 또는 서비스 이름을 IP 주소로 변환해줍니다. Docker Compose 환경에서는 서비스 이름을 호스트 이름처럼 사용하여 컨테이너 간에 통신할 수 있습니다. docker-compose.yml 예제에서 app 서비스 컨테이너는 db 서비스 이름을 사용하여 PostgreSQL 데이터베이스 컨테이너에 접속할 수 있습니다.

 

🎄 외부 네트워크 연결: 컨테이너가 외부 네트워크 (인터넷 등) 와 통신하려면 호스트 시스템의 네트워크 인터페이스를 사용합니다. bridge 네트워크의 컨테이너는 포트 포워딩을 통해 외부 네트워크에 서비스를 노출할 수 있습니다. host 네트워크의 컨테이너는 호스트 시스템의 네트워크 인터페이스를 공유하므로, 별도의 포트 포워딩 없이 외부 네트워크와 통신할 수 있습니다.

 

🎄 Docker 네트워크 명령어:

  • docker network create <네트워크_이름>: Docker 네트워크 생성
  • docker network ls: Docker 네트워크 목록 확인
  • docker network inspect <네트워크_이름>: Docker 네트워크 상세 정보 확인
  • docker network rm <네트워크_이름>: Docker 네트워크 삭제
  • docker network connect <네트워크_이름> <컨테이너_이름>: 컨테이너를 Docker 네트워크에 연결
  • docker network disconnect <네트워크_이름> <컨테이너_이름>: 컨테이너를 Docker 네트워크에서 분리

🎯 마무리

이번 가이드에서는 Docker를 활용하여 Go 애플리케이션을 컨테이너화하고 배포 및 관리하는 핵심 방법을 학습했습니다. Dockerfile 작성, Docker 이미지 빌드 및 실행, Docker Compose를 활용한 멀티 컨테이너 관리, Docker Volume을 이용한 데이터 영속성 확보, Docker 네트워킹을 통한 컨테이너 간 통신 등 컨테이너 기술의 핵심 개념과 실습 예제를 통해 Docker 활용 능력을 향상시킬 수 있습니다.

✅ 핵심 요약:

  • 컨테이너 기술의 기본 개념 및 Docker의 이점 (이식성, 확장성, 경량성, 일관된 배포 환경).
  • Dockerfile을 활용한 Go 애플리케이션 컨테이너 이미지 생성 방법 (Multi-stage 빌드, 베이스 이미지, 명령어).
  • docker build, docker run 명령어를 이용한 Docker 이미지 빌드 및 컨테이너 실행 방법.
  • Docker Compose를 활용하여 Go 애플리케이션과 PostgreSQL 데이터베이스를 함께 실행하는 멀티 컨테이너 환경 구축 및 관리 방법 (docker-compose.yml, docker-compose up -d).
  • Docker Volume을 사용하여 컨테이너 데이터 영속성 확보 및 컨테이너 간 데이터 공유 방법.
  • Docker 네트워킹을 이해하고, 컨테이너 간 통신 및 외부 네트워크 연결 방법.

이제 Docker를 프로젝트에 적극적으로 활용하여 더욱 효율적이고 안정적인 개발 및 배포 환경을 구축하고, 클라우드 네이티브 애플리케이션 개발 역량을 강화해 보세요! 🚀

728x90
반응형