Link을 사용하여 컨테이너 연결하기

DockerBeginner
지금 연습하기

소개

Docker는 애플리케이션 배포를 위한 강력한 도구이지만, 처음에는 복잡해 보일 수 있습니다. 이번 챌린지에서는 Docker 컨테이너들을 연결하여 멀티 컨테이너 애플리케이션을 만드는 과정을 안내합니다. 간단한 예제부터 시작하여 점차 복잡한 애플리케이션으로 나아갈 것입니다. Docker를 처음 접하더라도 쉽게 따라 할 수 있도록 구성되었습니다. 컨테이너 간의 통신 방법을 탐구하며, 이는 Docker로 견고한 애플리케이션을 구축하는 데 있어 핵심적인 요소입니다.

Dockerfile로 이미지 생성하기

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

작업

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

요구 사항

  • 시스템에 Docker가 설치되어 있어야 합니다.
  • 컨테이너화하려는 기존 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으로 이동하여 애플리케이션이 올바르게 실행 중인지 확인합니다.

    브라우저에서 실행 중인 웹 앱

두 개의 Docker 컨테이너 연결하기

이제 컨테이너화된 애플리케이션이 준비되었으니, 컨테이너를 연결하는 단계로 넘어가겠습니다. 이 단계에서는 두 개의 Docker 컨테이너를 연결하여 서로 통신할 수 있게 만드는 방법을 배웁니다. 이 과정은 Docker 내에서 멀티 서비스 애플리케이션을 구축하는 데 핵심적인 부분입니다.

작업

Apache 웹 서버 컨테이너와 MySQL 데이터베이스 컨테이너를 연결합니다.

요구 사항

  • Apache를 실행하는 컨테이너와 MySQL을 실행하는 컨테이너, 총 두 개의 Docker 컨테이너가 필요합니다.
  • 시스템에 Docker가 설치되어 있어야 합니다.

힌트

  • 이전 컨테이너와 충돌하지 않도록 새 터미널을 열어 이 단계를 시작하세요.

예시 결과

Apache 컨테이너에서 MySQL에 액세스하기:

  1. httpd 이미지를 기반으로 my_apache라는 이름의 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 이미지를 사용하여 MYSQL_ROOT_PASSWORD 환경 변수를 password로 설정하고 my_mysql이라는 이름의 MySQL 컨테이너를 실행합니다.

    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 명령줄 인터페이스에 액세스합니다(연결 방식에 따라 명령어를 조정해야 할 수 있습니다).

    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)]>
    

여러 Docker 컨테이너 연결 및 환경 변수 사용하기

이전 단계에 이어, 이번에는 두 가지 새로운 개념을 추가합니다. 하나의 애플리케이션 컨테이너가 두 서비스 모두에 연결되고, 컨테이너가 환경 변수를 통해 연결 설정을 전달받는 방식입니다. 2단계에서는 연결된 컨테이너들이 서로 통신할 수 있음을 확인했습니다. 이 단계에서는 my_app2를 두 개의 --link 옵션과 MySQL 및 Apache 호스트를 설명하는 환경 변수와 함께 시작해야 합니다.

작업

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

요구 사항

  • Apache, MySQL, 커스텀 애플리케이션 컨테이너, 총 세 개의 Docker 컨테이너가 필요합니다.
  • my_app2를 두 개의 링크와 다음 환경 변수들과 함께 시작하세요: DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password, APACHE_HOST=apache
  • my-app 이미지에는 기본적으로 포함되어 있지 않으므로, Apache 연결을 테스트하기 전에 my_app2 내부에 curl을 설치하세요.
  • 시스템에 Docker가 설치되어 있어야 합니다.

예시 결과

  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. my_app2에 진입하여 curl을 설치하고 curl http://apache/를 실행하여 연결된 Apache 컨테이너에 도달할 수 있는지 확인합니다.

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
    

요약

이번 챌린지에서는 Docker 컨테이너들을 연결하여 멀티 컨테이너 애플리케이션을 만드는 방법을 배웠습니다. 단일 컨테이너에서 시작하여 연결된 쌍, 그리고 최종적으로 세 개의 컨테이너 구성까지 진행했습니다. 이제 컨테이너 링크와 docker exec 명령어를 활용하여 서로 다른 서비스 간의 통신을 허용하고, 더 복잡한 애플리케이션을 구축하는 방법을 이해하게 되었습니다. 계속해서 실험해 보며 즐거운 학습 되시길 바랍니다!

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습