링크를 이용한 컨테이너 연결

DockerBeginner
지금 연습하기

소개

도커는 애플리케이션 배포에 매우 유용한 도구이지만, 처음에는 복잡하게 느껴질 수 있습니다. 이번 챌린지는 도커 컨테이너를 연결하여 멀티 컨테이너 애플리케이션을 구성하는 과정을 안내합니다. 아주 기초적인 예제부터 시작해 복잡한 구조의 애플리케이션까지 단계별로 진행하므로, 도커 숙련도와 상관없이 쉽게 이해할 수 있습니다. 특히 도커로 견고한 애플리케이션을 구축할 때 핵심이 되는 컨테이너 간 통신 방법을 중점적으로 살펴보겠습니다.

이 콘텐츠는 챌린지 (Challenge) 입니다. 가이드에 따라 학습하는 실습 (Guided Lab) 과 달리, 제공된 과제를 스스로 해결해야 합니다. 챌린지는 난이도가 조금 높을 수 있으나, 해결이 어렵다면 Labby 와 상담하거나 정답 (Solution) 을 확인할 수 있습니다. 통계에 따르면 이 챌린지는 초급 수준이며, 통과율은 82%, 학습자 만족도는 87%입니다.

Dockerfile 을 이용한 이미지 생성

컨테이너를 연결하기 전에 먼저 컨테이너화된 애플리케이션이 필요합니다. 이번 단계에서는 my-app 이미지를 만들기 위한 Dockerfile 을 작성합니다. 이 Dockerfile 은 컨테이너 내부에서 실행될 애플리케이션과 환경 설정을 정의합니다.

과제

이번 단계의 목표는 my-app 이미지를 생성하기 위한 Dockerfile 을 작성하는 것입니다.

요구 사항

  • 시스템에 도커가 설치되어 있어야 합니다.
  • 컨테이너화할 my-app 애플리케이션 파일들이 준비되어야 합니다.

예시 결과

  1. 챌린지 수행에 필요한 파일들을 생성합니다.

    /home/labex/project/ 경로에 아래 내용을 포함하는 Dockerfile을 생성하세요.

    • 베이스 이미지는 python:3.7-slim을 사용합니다.
    • 작업 디렉토리를 /app으로 설정합니다.
    • 현재 디렉토리의 모든 내용을 컨테이너의 /app으로 복사합니다.
    • 필요한 패키지들을 설치합니다.
    • 외부로 80번 포트를 노출합니다.
    • 환경 변수를 정의합니다 (이 예제에서 직접 사용하지는 않더라도 지시어는 포함하세요).
    • 컨테이너 시작 시 app.py를 실행합니다.

    프로젝트 디렉토리 /home/labex/project/에 아래 내용으로 app.py 파일을 생성하세요.

    import os
    
    os.system("wssh --address='0.0.0.0' --port=80")

    프로젝트 디렉토리 /home/labex/project/에 아래 내용으로 requirements.txt 파일을 생성하세요.

    webssh==1.6.2
    labex:project/ $ pwd
    /home/labex/project
    labex:project/ $ ll
    total 12K
    -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py
    -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile
    -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt
  2. docker build 명령어를 사용하여 my-app 이미지를 빌드합니다.

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
  3. my-app 이미지를 사용하여 새 컨테이너를 시작하고 포트 매핑 상태를 확인합니다.

    labex:project/ $ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcp
  4. 웹 브라우저를 열고 http://localhost:8080으로 접속하여 애플리케이션이 정상적으로 작동하는지 확인합니다.

    브라우저에서 실행 중인 웹 앱
✨ 솔루션 확인 및 연습

두 개의 도커 컨테이너 연결하기

애플리케이션 컨테이너가 준비되었으니 이제 컨테이너 간 연결을 시도해 보겠습니다. 이번 단계에서는 두 개의 도커 컨테이너를 연결하여 서로 통신할 수 있도록 설정하는 방법을 배웁니다. 이 과정은 도커에서 멀티 서비스 애플리케이션을 구축하는 핵심 기술입니다.

과제

Apache 웹 서버 컨테이너와 MySQL 데이터베이스 컨테이너를 서로 연결하세요.

요구 사항

  • Apache 가 실행 중인 컨테이너와 MySQL 이 실행 중인 컨테이너, 총 두 개가 필요합니다.
  • 시스템에 도커가 설치되어 있어야 합니다.

힌트

  • 이전 단계의 컨테이너와 충돌하지 않도록 새로운 터미널을 열어서 진행하는 것이 좋습니다.

예시 결과

Apache 컨테이너에서 MySQL 에 접속하기:

  1. httpd 이미지를 기반으로 my_apache라는 이름의 컨테이너를 실행합니다. 이때 호스트의 80번 포트를 컨테이너의 80번 포트로 매핑합니다.

    labex:project/ $ docker ps | grep my_apache
    a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcp
  2. mysql 이미지를 사용하여 my_mysql이라는 이름의 컨테이너를 실행합니다. 이때 MYSQL_ROOT_PASSWORD 환경 변수를 password로 설정합니다.

    labex:project/ $ docker ps | grep mysql
    0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql
  3. Apache 컨테이너를 MySQL 컨테이너에 연결합니다.
    참고: 이 단계에서 즉각적인 명령어 출력 결과는 없으나, 컨테이너의 환경 변수를 통해 연결 상태를 확인할 수 있습니다. docker inspect my_apache 명령어로 상세 정보를 확인할 수 있습니다.

    labex:project/ $ docker ps | grep my_app
    859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_app
  4. docker exec 명령어를 사용하여 my_app 컨테이너 내부에서 MySQL 커맨드라인 인터페이스 (CLI) 에 접속합니다 (연결 방식에 따라 명령어를 적절히 수정해야 할 수 있습니다).

    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.3.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]>
✨ 솔루션 확인 및 연습

여러 도커 컨테이너 연결 및 환경 변수 활용

이전 단계에서 배운 내용을 바탕으로, 이제 여러 개의 컨테이너를 동시에 연결하고 환경 변수를 활용하여 설정을 관리하는 방법을 알아보겠습니다. 이 과정은 더 복잡하고 유연한 멀티 컨테이너 환경을 구축하는 방법을 보여줍니다.

과제

Apache, MySQL, 그리고 커스텀 애플리케이션까지 총 세 개의 컨테이너를 실행하세요. 커스텀 애플리케이션은 MySQL 과 Apache 모두에 접근할 수 있어야 합니다.

요구 사항

  • Apache, MySQL, 커스텀 애플리케이션을 위한 세 개의 도커 컨테이너가 필요합니다.
  • 시스템에 도커가 설치되어 있어야 합니다.

예시 결과

  1. 2 단계에서 설명한 대로 Apache 와 MySQL 컨테이너를 실행합니다.

  2. MySQL 과 Apache 모두에 접근 가능한 my_app2라는 이름의 커스텀 애플리케이션 컨테이너를 실행합니다.

    labex:project/ $ docker ps | grep app2
    8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2
  3. curl을 사용하여 커스텀 애플리케이션에서 Apache 컨테이너로 접속을 시도합니다.

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

요약

이번 챌린지에서는 도커 컨테이너를 서로 연결하여 멀티 컨테이너 애플리케이션을 구축하는 방법을 배웠습니다. 단일 컨테이너에서 시작하여 두 개의 컨테이너를 연결하고, 최종적으로 세 개의 컨테이너가 협업하는 환경까지 구성해 보았습니다. 이제 컨테이너 링크와 docker exec 명령어를 활용하여 서로 다른 서비스 간의 통신을 제어하고, 이를 통해 더욱 복잡한 애플리케이션 아키텍처를 설계할 수 있는 기초를 다졌습니다. 계속해서 다양한 실험을 즐겨보시기 바랍니다!