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 서비스 컨테이너를 실행한 다음, 두 서비스에 연결되는 my_app 컨테이너를 시작하여 my_app 내부에서 MySQL 연결을 테스트합니다.

요구 사항

  • Apache를 실행하는 Docker 컨테이너와 MySQL을 실행하는 Docker 컨테이너가 필요합니다.
  • Apache 및 MySQL 컨테이너에 연결되는 my_app 컨테이너를 추가로 시작합니다.
  • 데이터베이스 연결을 테스트하기 전에 my_app 내부에 MySQL 클라이언트를 설치합니다.
  • 컴퓨터에 Docker가 설치되어 있어야 합니다.

힌트

  • 이전 컨테이너와 충돌하지 않도록 이 단계를 시작할 때 새 터미널을 엽니다.

실행 결과 예시

두 서비스에 연결한 후 my_app 컨테이너에서 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_ROOT_PASSWORD 환경 변수를 password로 설정하고 mysql 이미지를 사용하여 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. MySQL 및 Apache 컨테이너에 연결되는 my_app 컨테이너를 시작합니다.
    참고: 연결 정보는 컨테이너 구성에서 확인할 수 있습니다. docker inspect my_app으로 검사할 수 있습니다.

    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 명령줄 인터페이스에 액세스합니다. 연결 방식을 다르게 설정했다면 명령을 그에 맞게 수정해야 합니다.

    my_app 내부에 MySQL 클라이언트를 설치한 후 연결된 MySQL 서비스에 접속합니다.

    labex:project/ $ docker exec -it my_app bash
    root@859c201b7267:/app## apt-get update && apt install -y default-mysql-client
    root@859c201b7267:/app## mysql -h mysql -uroot -ppassword
    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단계에서는 연결된 컨테이너가 서로 접근할 수 있다는 사실만 확인했습니다. 이 단계에서는 두 --link 옵션과 MySQL 및 Apache 호스트를 나타내는 환경 변수를 모두 사용하여 my_app2를 시작해야 합니다.

작업

Apache를 실행하는 컨테이너, MySQL을 실행하는 컨테이너, 사용자 지정 애플리케이션을 실행하는 컨테이너 등 세 개의 컨테이너를 실행합니다. 사용자 지정 애플리케이션은 MySQL과 Apache에 모두 액세스할 수 있어야 합니다.

요구 사항

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

힌트

  • 2단계의 서비스 컨테이너를 다시 사용하고, 링크 또는 환경 변수를 확인해야 한다면 새 애플리케이션 컨테이너를 검사합니다.

실행 결과 예시

  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 명령을 활용하여 서로 다른 서비스 간 통신을 가능하게 하고 더 복잡한 애플리케이션을 구축하는 방법을 이해했습니다. 계속 실험하며 즐겁게 학습하세요!

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