Docker 네트워크 놀이터

DockerBeginner
지금 연습하기

소개

Docker 네트워킹은 컨테이너 오케스트레이션의 핵심적인 요소로, 컨테이너가 서로 통신하거나 외부 네트워크와 연결될 수 있게 합니다. 이 챌린지에서는 네트워크 생성 및 관리부터 컨테이너 연결 및 해제에 이르기까지 Docker 네트워킹의 필수 개념들을 안내합니다.

이 챌린지를 완료하면 Docker 네트워크 명령어에 대한 실습 경험을 쌓고 컨테이너 간 통신을 설정하는 방법을 이해하게 됩니다. 이러한 기술은 Docker 환경에서 다중 컨테이너 애플리케이션을 개발하고 배포하는 데 매우 중요합니다.

이제 Docker 네트워킹의 세계로 뛰어들어 봅시다!

이것은 챌린지 과제입니다. 가이드가 제공되는 일반 실습과 달리, 학습 단계를 따라가는 것이 아니라 스스로 챌린지 작업을 완료해야 합니다. 챌린지는 보통 난이도가 조금 있습니다. 어려움을 느낀다면 Labby 와 상의하거나 솔루션을 확인할 수 있습니다. 통계 데이터에 따르면 이 챌린지는 초급 수준이며 99%의 통과율을 기록하고 있습니다. 학습자들로부터 99%의 긍정적인 평가를 받았습니다.

네트워크 생성

이 단계에서는 첫 번째 Docker 네트워크를 생성합니다. 이는 컨테이너를 연결하고 상호 통신을 가능하게 하는 기초가 됩니다.

작업 내용

  1. docker network create 명령어를 사용하여 my-network라는 이름의 새로운 브리지 네트워크를 생성하세요.
  2. 모든 Docker 네트워크 목록을 확인하여 네트워크가 생성되었는지 검증하세요.

요구 사항

  • 모든 작업은 /home/labex/project 디렉토리에서 수행하세요.
  • 네트워크 생성 시 기본 브리지 드라이버를 사용하세요.

예시

이 단계를 완료한 후 docker network ls를 실행하면 목록에 my-network가 표시되어야 합니다.

NETWORK ID     NAME         DRIVER    SCOPE
abcdef123456   my-network   bridge    local
✨ 솔루션 확인 및 연습

네트워크에서 컨테이너 실행

네트워크가 준비되었으므로 이제 컨테이너를 실행하고 해당 네트워크에 연결해 보겠습니다. 이 단계에서는 특정 네트워크 내에서 컨테이너를 시작하는 방법을 보여주며, 이는 Docker 네트워킹의 핵심 개념입니다.

작업 내용

  1. nginx 이미지를 사용하여 container1이라는 이름의 컨테이너를 시작하고 my-network에 연결하세요.
  2. httpd 이미지를 사용하여 container2라는 이름의 또 다른 컨테이너를 시작하고 my-network에 연결하세요.
  3. 두 컨테이너가 모두 실행 중이며 my-network에 연결되어 있는지 확인하세요.

요구 사항

  • 모든 작업은 /home/labex/project 디렉토리에서 수행하세요.
  • 컨테이너를 시작할 때 --network 플래그를 사용하여 my-network에 연결하세요.
  • 두 컨테이너 모두 백그라운드 모드 (detached mode) 로 실행하세요.

예시

이 단계를 완료한 후 docker ps를 사용하면 두 컨테이너가 실행 중인 것을 볼 수 있습니다.

CONTAINER ID   IMAGE   COMMAND   CREATED         STATUS         PORTS     NAMES
abcdef123456   nginx   "..."     2 minutes ago   Up 2 minutes   80/tcp    container1
fedcba654321   httpd   "..."     2 minutes ago   Up 2 minutes   80/tcp    container2
✨ 솔루션 확인 및 연습

연결성 테스트

이 단계에서는 생성한 네트워크를 통해 컨테이너들이 서로 통신할 수 있는지 확인합니다. 이는 네트워크 설정이 예상대로 작동하는지 확인하는 매우 중요한 테스트입니다.

작업 내용

  1. docker exec 명령어를 사용하여 container1에서 쉘을 실행하세요.
  2. container1 내부에서 curl 명령어를 사용하여 컨테이너 이름으로 container2에 접속하세요.

요구 사항

  • 모든 작업은 /home/labex/project 디렉토리에서 수행하세요.
  • curl 명령어에서 호스트 이름으로 container2를 사용하세요.
  • curl 명령어는 container2의 기본 HTTP 포트 (80) 에 접속해야 합니다.

예시

container1에서 curl 명령어를 실행한 후, 다음과 같은 기본 Apache HTTP Server 페이지 내용이 표시되어야 합니다.

<!DOCTYPE html>
<html><body><h1>It works!</h1></body></html>
✨ 솔루션 확인 및 연습

컨테이너를 여러 네트워크에 연결하기

이 단계에서는 단일 컨테이너를 여러 네트워크에 연결하는 방법을 배웁니다. 이는 복잡한 네트워크 토폴로지를 구성하거나 서비스를 네트워크 간에 점진적으로 이전할 때 유용한 고급 개념입니다.

작업 내용

  1. my-network2라는 이름의 새로운 브리지 네트워크를 생성하세요.
  2. container2my-network와의 연결을 유지한 채로 my-network2에도 연결하세요.
  3. container2가 현재 두 네트워크 모두에 연결되어 있는지 확인하세요.

요구 사항

  • 모든 작업은 /home/labex/project 디렉토리에서 수행하세요.
  • docker network connect 명령어를 사용하여 container2my-network2에 추가하세요.
  • docker inspect 명령어를 사용하여 네트워크 연결 상태를 확인하세요.

예시

container2my-network2에 연결한 후 컨테이너 정보를 조사 (inspect) 하면 두 네트워크가 모두 나열되어야 합니다.

"Networks": {
    "my-network": {
        ...
    },
    "my-network2": {
        ...
    }
}
✨ 솔루션 확인 및 연습

네트워크에서 컨테이너 연결 해제

이 단계에서는 컨테이너를 중지하지 않고 네트워크에서 제거하는 방법을 배웁니다. 이는 컨테이너를 격리해야 하거나 네트워크 아키텍처를 재구성할 때 유용합니다.

작업 내용

  1. docker network disconnect 명령어를 사용하여 container2my-network에서 연결 해제하세요.
  2. container2가 더 이상 my-network에 연결되어 있지 않은지 확인하세요.

요구 사항

  • 모든 작업은 /home/labex/project 디렉토리에서 수행하세요.
  • docker network disconnect 명령어를 사용하여 my-network에서 container2를 제거하세요.
  • docker network inspect 명령어를 사용하여 연결 해제 여부를 확인하세요.

예시

container2my-network에서 연결 해제한 후 my-network를 조사하면 container2가 목록에 없어야 합니다.

$ docker network inspect my-network
[
    {
        "Name": "my-network",
        ...
        "Containers": {
            "container1": {
                ...
            }
        },
        ...
    }
]
✨ 솔루션 확인 및 연습

네트워크 삭제

마지막 단계에서는 더 이상 필요하지 않은 Docker 네트워크를 삭제하는 방법을 배웁니다. 사용하지 않는 자원을 적절히 정리하는 것은 Docker 환경을 효율적으로 관리하는 중요한 부분입니다.

작업 내용

  1. container2가 여전히 my-network2에 연결되어 있다면 연결을 해제하세요.
  2. docker network rm 명령어를 사용하여 my-network2 네트워크를 삭제하세요.
  3. my-network2가 삭제되었는지 확인하세요.

요구 사항

  • 모든 작업은 /home/labex/project 디렉토리에서 수행하세요.
  • 네트워크를 삭제하기 전에 어떤 컨테이너도 my-network2에 연결되어 있지 않은지 확인하세요.
  • docker network ls 명령어를 사용하여 네트워크 삭제 여부를 확인하세요.

예시

my-network2를 삭제한 후 docker network ls를 실행하면 목록에 나타나지 않아야 합니다.

NETWORK ID     NAME         DRIVER    SCOPE
abcdef123456   my-network   bridge    local
ghijkl789012   bridge       bridge    local
mnopqr345678   host         host      local
stuvwx901234   none         null      local
✨ 솔루션 확인 및 연습

요약

Docker 네트워크 기초 챌린지를 완료하신 것을 축하합니다! 여러분은 다음과 같은 Docker 네트워킹의 핵심 개념들을 성공적으로 마스터했습니다.

  1. 사용자 정의 Docker 네트워크 생성
  2. 특정 네트워크 내에서 컨테이너 실행
  3. 컨테이너 간 연결성 테스트
  4. 컨테이너를 여러 네트워크에 연결
  5. 네트워크에서 컨테이너 연결 해제
  6. Docker 네트워크 삭제

이러한 기술은 효과적인 Docker 네트워크 관리의 기초가 되며, 더 복잡한 컨테이너화된 애플리케이션을 다룰 때 매우 유용할 것입니다. 적절한 네트워크 설정은 컨테이너 격리, 보안, 그리고 서비스 간의 효율적인 통신을 위해 필수적임을 기억하세요.

이 챌린지를 통해 컨테이너를 위한 격리된 환경을 만들고, 컨테이너 간 통신을 활성화하며, 네트워크 연결을 동적으로 관리하는 방법을 배웠습니다. 이러한 역량은 변화하는 요구사항에 적응할 수 있는 정교한 네트워크 아키텍처를 설계하는 데 도움이 될 것입니다.

Docker 여정을 계속하면서 다중 호스트 설정을 위한 오버레이 네트워크, 네트워크 플러그인, 그리고 Docker 네트워킹이 Kubernetes 와 같은 컨테이너 오케스트레이션 플랫폼과 어떻게 통합되는지 등 더 고급 주제들을 탐구해 보시기 바랍니다. 또한 네트워크 정책을 사용하여 컨테이너 간 트래픽 흐름을 제어하는 것과 같은 네트워크 보안 개념도 깊이 있게 살펴보는 것이 좋습니다.

이 기술들을 계속 연습하면 향후 프로젝트에서 정교한 컨테이너 네트워크 아키텍처를 설계하고 관리할 준비가 충분히 될 것입니다. 효율적인 네트워킹은 확장 가능하고 안전하며 효율적인 컨테이너 애플리케이션을 구축하는 핵심 열쇠입니다.