소개
도커는 애플리케이션 배포에 매우 유용한 도구이지만, 처음에는 복잡하게 느껴질 수 있습니다. 이번 챌린지는 도커 컨테이너를 연결하여 멀티 컨테이너 애플리케이션을 구성하는 과정을 안내합니다. 아주 기초적인 예제부터 시작해 복잡한 구조의 애플리케이션까지 단계별로 진행하므로, 도커 숙련도와 상관없이 쉽게 이해할 수 있습니다. 특히 도커로 견고한 애플리케이션을 구축할 때 핵심이 되는 컨테이너 간 통신 방법을 중점적으로 살펴보겠습니다.
도커는 애플리케이션 배포에 매우 유용한 도구이지만, 처음에는 복잡하게 느껴질 수 있습니다. 이번 챌린지는 도커 컨테이너를 연결하여 멀티 컨테이너 애플리케이션을 구성하는 과정을 안내합니다. 아주 기초적인 예제부터 시작해 복잡한 구조의 애플리케이션까지 단계별로 진행하므로, 도커 숙련도와 상관없이 쉽게 이해할 수 있습니다. 특히 도커로 견고한 애플리케이션을 구축할 때 핵심이 되는 컨테이너 간 통신 방법을 중점적으로 살펴보겠습니다.
컨테이너를 연결하기 전에 먼저 컨테이너화된 애플리케이션이 필요합니다. 이번 단계에서는 my-app 이미지를 만들기 위한 Dockerfile 을 작성합니다. 이 Dockerfile 은 컨테이너 내부에서 실행될 애플리케이션과 환경 설정을 정의합니다.
이번 단계의 목표는 my-app 이미지를 생성하기 위한 Dockerfile 을 작성하는 것입니다.
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.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
docker build 명령어를 사용하여 my-app 이미지를 빌드합니다.
labex:project/ $ docker images | grep my-app
my-app latest 266edf714faf 30 seconds ago 170MB
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
웹 브라우저를 열고 http://localhost:8080으로 접속하여 애플리케이션이 정상적으로 작동하는지 확인합니다.

애플리케이션 컨테이너가 준비되었으니 이제 컨테이너 간 연결을 시도해 보겠습니다. 이번 단계에서는 두 개의 도커 컨테이너를 연결하여 서로 통신할 수 있도록 설정하는 방법을 배웁니다. 이 과정은 도커에서 멀티 서비스 애플리케이션을 구축하는 핵심 기술입니다.
Apache 웹 서버 컨테이너와 MySQL 데이터베이스 컨테이너를 서로 연결하세요.
Apache 컨테이너에서 MySQL 에 접속하기:
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
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
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
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 모두에 접근할 수 있어야 합니다.
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_app2
curl을 사용하여 커스텀 애플리케이션에서 Apache 컨테이너로 접속을 시도합니다.
<html>
<body>
<h1>It works!</h1>
</body>
</html>
이번 챌린지에서는 도커 컨테이너를 서로 연결하여 멀티 컨테이너 애플리케이션을 구축하는 방법을 배웠습니다. 단일 컨테이너에서 시작하여 두 개의 컨테이너를 연결하고, 최종적으로 세 개의 컨테이너가 협업하는 환경까지 구성해 보았습니다. 이제 컨테이너 링크와 docker exec 명령어를 활용하여 서로 다른 서비스 간의 통신을 제어하고, 이를 통해 더욱 복잡한 애플리케이션 아키텍처를 설계할 수 있는 기초를 다졌습니다. 계속해서 다양한 실험을 즐겨보시기 바랍니다!