소개
Docker는 애플리케이션 배포를 위한 강력한 도구이지만, 처음에는 복잡해 보일 수 있습니다. 이번 챌린지에서는 Docker 컨테이너들을 연결하여 멀티 컨테이너 애플리케이션을 만드는 과정을 안내합니다. 간단한 예제부터 시작하여 점차 복잡한 애플리케이션으로 나아갈 것입니다. Docker를 처음 접하더라도 쉽게 따라 할 수 있도록 구성되었습니다. 컨테이너 간의 통신 방법을 탐구하며, 이는 Docker로 견고한 애플리케이션을 구축하는 데 있어 핵심적인 요소입니다.
Dockerfile로 이미지 생성하기
컨테이너를 연결하기 전에 최소한 하나의 컨테이너화된 애플리케이션이 필요합니다. 이 단계에서는 my-app 이미지를 위한 Dockerfile을 생성합니다. 이 Dockerfile은 컨테이너 내부에서 실행될 환경과 애플리케이션을 정의합니다.
작업
이 단계의 목표는 my-app 이미지를 위한 Dockerfile을 생성하는 것입니다.
요구 사항
- 시스템에 Docker가 설치되어 있어야 합니다.
- 컨테이너화하려는 기존
my-app애플리케이션이 있어야 합니다.
예시 결과
챌린지에 필요한 파일을 생성합니다:
/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.2labex: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- 베이스 이미지로
docker build명령어를 사용하여my-app이미지를 빌드합니다.labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBmy-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웹 브라우저를 열고
http://localhost:8080으로 이동하여 애플리케이션이 올바르게 실행 중인지 확인합니다.
두 개의 Docker 컨테이너 연결하기
이제 컨테이너화된 애플리케이션이 준비되었으니, 컨테이너를 연결하는 단계로 넘어가겠습니다. 이 단계에서는 두 개의 Docker 컨테이너를 연결하여 서로 통신할 수 있게 만드는 방법을 배웁니다. 이 과정은 Docker 내에서 멀티 서비스 애플리케이션을 구축하는 데 핵심적인 부분입니다.
작업
Apache 웹 서버 컨테이너와 MySQL 데이터베이스 컨테이너를 연결합니다.
요구 사항
- Apache를 실행하는 컨테이너와 MySQL을 실행하는 컨테이너, 총 두 개의 Docker 컨테이너가 필요합니다.
- 시스템에 Docker가 설치되어 있어야 합니다.
힌트
- 이전 컨테이너와 충돌하지 않도록 새 터미널을 열어 이 단계를 시작하세요.
예시 결과
Apache 컨테이너에서 MySQL에 액세스하기:
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/tcpmysql이미지를 사용하여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_mysqlApache 컨테이너를 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_appdocker 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=apachemy-app이미지에는 기본적으로 포함되어 있지 않으므로, Apache 연결을 테스트하기 전에my_app2내부에curl을 설치하세요.- 시스템에 Docker가 설치되어 있어야 합니다.
예시 결과
2단계에서 설명한 대로 Apache와 MySQL 컨테이너를 실행합니다.
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_app2my_app2에 진입하여curl을 설치하고curl http://apache/를 실행하여 연결된 Apache 컨테이너에 도달할 수 있는지 확인합니다.<html> <body> <h1>It works!</h1> </body> </html>
요약
이번 챌린지에서는 Docker 컨테이너들을 연결하여 멀티 컨테이너 애플리케이션을 만드는 방법을 배웠습니다. 단일 컨테이너에서 시작하여 연결된 쌍, 그리고 최종적으로 세 개의 컨테이너 구성까지 진행했습니다. 이제 컨테이너 링크와 docker exec 명령어를 활용하여 서로 다른 서비스 간의 통신을 허용하고, 더 복잡한 애플리케이션을 구축하는 방법을 이해하게 되었습니다. 계속해서 실험해 보며 즐거운 학습 되시길 바랍니다!



