소개
Docker 는 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행하는 강력한 플랫폼입니다. 이 튜토리얼에서는 Docker 컨테이너 내에서 사용자 정의 애플리케이션을 실행하고 외부 접근을 위해 사용자 정의 포트를 노출하는 방법을 배웁니다. 이 가이드를 마치면 Docker 를 활용하여 애플리케이션을 더욱 유연하고 효과적으로 배포하는 방법에 대한 확실한 이해를 얻게 될 것입니다.
Docker 및 컨테이너 소개
Docker 는 컨테이너를 사용하여 애플리케이션 개발, 배포 및 관리를 가능하게 하는 인기 있는 오픈소스 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 모든 것을 포함하는, 가볍고 독립적이며 실행 가능한 소프트웨어 패키지입니다. 이에는 코드, 런타임, 시스템 도구 및 라이브러리가 포함됩니다.
Docker 란 무엇인가요?
Docker 는 컨테이너를 사용하여 애플리케이션을 더 쉽게 생성, 배포 및 실행하도록 설계된 도구입니다. 컨테이너를 통해 개발자는 라이브러리 및 기타 종속성과 같은 애플리케이션에 필요한 모든 부분을 패키징하여 하나의 패키지로 배포할 수 있습니다.
Docker 사용의 장점
- 일관성: 컨테이너는 애플리케이션이 배포되는 환경에 관계없이 동일한 방식으로 실행되도록 보장합니다.
- 확장성: 컨테이너는 애플리케이션의 요구 사항에 따라 쉽게 확장하거나 축소할 수 있습니다.
- 이식성: Docker 가 설치된 모든 시스템에서 컨테이너를 실행할 수 있으므로 애플리케이션을 다른 환경으로 쉽게 이동할 수 있습니다.
- 효율성: 컨테이너는 가볍고 가상 머신보다 적은 리소스를 사용하므로 실행 효율이 높습니다.
Docker 아키텍처
Docker 는 Docker 클라이언트가 Docker 데몬과 통신하는 클라이언트 - 서버 아키텍처를 사용합니다. Docker 데몬은 Docker 컨테이너를 구축, 실행 및 배포하는 역할을 합니다.
graph LR
subgraph Docker 아키텍처
client((Docker 클라이언트))
daemon((Docker 데몬))
registry((Docker 레지스트리))
client --> daemon
daemon --> registry
end
Docker 컨테이너
Docker 컨테이너는 Docker 의 기본 구성 요소입니다. 컨테이너는 코드와 모든 종속성을 패키징하는 표준 소프트웨어 단위이므로 애플리케이션이 한 컴퓨팅 환경에서 다른 환경으로 빠르고 안정적으로 실행될 수 있습니다.
graph LR
subgraph Docker 컨테이너
app((애플리케이션))
runtime((런타임))
libs((라이브러리))
bin((바이너리))
end
Docker 이미지
Docker 이미지는 컨테이너의 기반입니다. 이미지는 애플리케이션 실행에 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지입니다. 코드, 런타임, 라이브러리, 환경 변수 및 구성 파일이 포함됩니다.
Docker 에서 사용자 애플리케이션 실행
사용자 Docker 이미지 생성
Docker 컨테이너에서 사용자 애플리케이션을 실행하려면 먼저 애플리케이션에 대한 Docker 이미지를 생성해야 합니다. 이는 Dockerfile 을 사용하여 수행할 수 있습니다. Dockerfile 은 이미지를 조립하기 위해 사용자가 명령줄에서 호출할 수 있는 모든 명령어를 포함하는 텍스트 문서입니다.
다음은 간단한 Flask 웹 애플리케이션을 위한 예시 Dockerfile 입니다.
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
이 Dockerfile 은 다음과 같이 작동합니다.
python:3.9-slim기본 이미지에서 시작합니다.- 작업 디렉터리를
/app으로 설정합니다. requirements.txt파일을 복사하고 필요한 Python 패키지를 설치합니다.- 애플리케이션 코드를 컨테이너에 복사합니다.
- 애플리케이션을 실행할 명령 (
python app.py) 을 지정합니다.
Docker 이미지 생성 및 실행
Dockerfile 이 준비되면 docker build 명령을 사용하여 Docker 이미지를 생성할 수 있습니다.
docker build -t my-flask-app .
이렇게 하면 태그가 my-flask-app인 새로운 Docker 이미지가 생성됩니다.
Docker 컨테이너에서 애플리케이션을 실행하려면 docker run 명령을 사용합니다.
docker run -p 5000:5000 my-flask-app
이렇게 하면 my-flask-app 이미지를 기반으로 새 컨테이너가 시작되고 호스트의 포트 5000 이 컨테이너의 포트 5000 으로 매핑됩니다.
애플리케이션 확인
이제 웹 브라우저에서 http://localhost:5000을 방문하여 실행 중인 애플리케이션에 접근할 수 있습니다. Flask 애플리케이션의 출력을 볼 수 있어야 합니다.
사용자 지정 포트 노출
Docker 컨테이너를 실행하면 기본적으로 호스트 시스템 및 네트워크와 분리됩니다. 컨테이너 내에서 특정 포트에서 애플리케이션이 실행 중인 경우, 컨테이너 외부에서 애플리케이션에 액세스할 수 있도록 해당 포트를 호스트 시스템에 노출해야 합니다.
포트 노출
Docker 컨테이너에서 포트를 노출하려면 docker run 명령을 실행할 때 -p 또는 --publish 플래그를 사용할 수 있습니다. 구문은 다음과 같습니다.
docker run -p <호스트_포트>:<컨테이너_포트> <이미지_이름>
예를 들어, 컨테이너 내에서 애플리케이션이 포트 8000 에서 실행되고 있다면, 호스트 시스템의 포트 80 에 노출할 수 있습니다.
docker run -p 80:8000 my-app
이렇게 하면 호스트 시스템의 포트 80 이 컨테이너 내의 포트 8000 으로 매핑됩니다.
노출된 포트 확인
포트가 올바르게 노출되었는지 확인하려면 docker run 명령의 출력을 확인할 수 있습니다. 매핑된 포트가 표시되어야 합니다.
$ docker run -p 80:8000 my-app
* Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
또는 실행 중인 컨테이너의 매핑된 포트 목록을 보려면 docker port 명령을 사용할 수 있습니다.
$ docker port <컨테이너_ID>
8000/tcp -> 0.0.0.0:80
이렇게 하면 컨테이너 내의 포트 8000 이 호스트 시스템의 포트 80 으로 매핑되었음을 보여줍니다.
이제 웹 브라우저에서 http://localhost (또는 호스트 시스템의 IP 주소) 를 방문하여 애플리케이션에 액세스할 수 있습니다.
요약
이 튜토리얼에서는 Docker 컨테이너에서 사용자 애플리케이션을 실행하고 외부 액세스를 위해 사용자 지정 포트를 노출하는 방법을 배웠습니다. 애플리케이션을 컨테이너화함으로써 일관되고 안정적인 배포를 보장하고 애플리케이션을 더 효율적으로 확장 및 관리할 수 있습니다. Docker 의 컨테이너화 기술은 개발자가 애플리케이션을 더 간소하고 효율적으로 구축, 배포 및 실행할 수 있는 강력한 플랫폼을 제공합니다.



