소개
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 서비스 컨테이너를 실행한 다음, 두 서비스에 연결되는 my_app 컨테이너를 시작하여 my_app 내부에서 MySQL 연결을 테스트합니다.
요구 사항
- Apache를 실행하는 Docker 컨테이너와 MySQL을 실행하는 Docker 컨테이너가 필요합니다.
- Apache 및 MySQL 컨테이너에 연결되는
my_app컨테이너를 추가로 시작합니다. - 데이터베이스 연결을 테스트하기 전에
my_app내부에 MySQL 클라이언트를 설치합니다. - 컴퓨터에 Docker가 설치되어 있어야 합니다.
힌트
- 이전 컨테이너와 충돌하지 않도록 이 단계를 시작할 때 새 터미널을 엽니다.
실행 결과 예시
두 서비스에 연결한 후 my_app 컨테이너에서 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_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_mysqlMySQL 및 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_appdocker 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단계의 서비스 컨테이너를 다시 사용하고, 링크 또는 환경 변수를 확인해야 한다면 새 애플리케이션 컨테이너를 검사합니다.
실행 결과 예시
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 명령을 활용하여 서로 다른 서비스 간 통신을 가능하게 하고 더 복잡한 애플리케이션을 구축하는 방법을 이해했습니다. 계속 실험하며 즐겁게 학습하세요!



