FROM python:2.7-slim
#베이스 이미지를 설정
WORKDIR /app
#작업 디렉토리 지정
COPY . /app
#복사할 파일 지정
RUN pip install --trusted-host pypi.python.orf -r requirements.txt
#설치할 패키지 지정
EXPOSE 80
#컨테이너에서 외부로 오픈할 포트 지정
ENV NAME World
#환경변수 지정
CMD ["python","app.py"]
#실행되는 커맨드 지정
위 도커 파일을 작성한 후, 실행할 app.py와 requirements.txt 도 작성.
이때 requirements.txt는 웹 서비스 구동에 필요한 추가 라이브러리와 프레임워크를 적는다. _ 종속성
host='0.0.0.0’ - 외부에서 접근 가능하게 모든 IP 주소에 대해 열어줌 (도커 컨테이너에서 필수)
port=80 - 서버를 80번 포트에서 실행함 (HTTP 기본 포트)
설정 위치 의미 실제로 포트를 여나?
EXPOSE <포트>
도커 이미지에 기록만 하는 메타데이터 (설명서 느낌)
❌ 안 열림
app.run(port=XX)
애플리케이션이 컨테이너 내부에서 실제로 리스닝하는 포트
✅ 열림
docker run -p 호스트포트:컨테이너포트
호스트 ↔ 컨테이너 통신을 위해 포트를 연결
✅ 열림 (외부와 연결됨)
docker build --tag=freindlyhello .
현재 디렉토리에 있는 Dockerfile과 그 안에서 참조하는 파일들을 기준으로 Docker 이미지를 빌드하고, 이름은 freindlyhello로 붙이는 것
docker run -p 4000:80 freindlyhello
-p 는 옵션 중 포워딩을 의미
컨테이너 외부에서 외부포트로 접속하는 요청을 내부포트로 전달하는 것임.
Flask가 컨테이너 안에서 80번 포트에서 실행되고 있음.
컨테이너: 0.0.0.0:80에서 Flask 서버 동작 중
호스트(로컬): localhost:4000 → 내부 컨테이너의 80포트로 트래픽 전달됨
도커 이미지 공유하기
리포지터리에 업로드하기 전 이미지 태깅이 필요함!
docker tag [기존_이미지명] [새로운_이름(:태그)]
도커 허브(Docker Hub) 또는 레지스트리 에 푸시(push) 하기 위해 이미지에 정해진 네이밍 규칙에 따라 "이름:태그"를 지정하는 것!
Docker Compose
Docker Compose는 단일 서버에서 다수의 컨테이너를 하나의 서비스로 정의하고 묶음으로 관리하는 도구다.
서비스를 구성하는 여러 컨테이너를
하나의 설정 파일과 하나의 명령으로
생성/실행/종료/삭제까지 제어할 수 있다.
이를 위해 docker-compose.yml(compose file) 설정 파일을 사용한다.
simplified control
하나의 설정 파일을 통해 다수의 컨테이너를 설정하고 관리하고 제어할 수 있다.
efficient collaboration
설정 파일은 관리와 공유가 쉬워, 팀 내부의 효과적 협업을 용이하게 한다.
rapid application development
도커 컴포즈는 configuration cache 가 가능하며, 이를 통해 신속한 서비스 재시작이 가능하다.
portabillity across enviroment
도커 컴포즈는 설정 파일에서 변수를 사용할 수 있어, 이를 통해 다양한 환경 사용자등에게 동적으로 특화된 환경을 구성할 수 있다.
extensive community and support
도커 컴포즈 커뮤니티가 활성화 되어 있어, 폭 넓은 사용자로부터 다양한 지원을 받을 수 있다.
compose.yml 실행하는 방법
services:
web: # Flask 애플리케이션을 위한 서비스
build: . #현재 디렉토리에 있는 Dockerfile을 기준으로 Flask용 이미지 빌드
ports:
- "8000:5000"
#호스트의 8000번 포트 → 컨테이너의 5000번 포트에 연결
#브라우저에서 http://localhost:8000으로 접근 가능
develop:
watch:
- action: sync
path: .
target: /code
redis: # Redis 서버를 위한 서비스
image: "redis:alpine" #redis:alpine 이미지를 사용해서 Redis 서버 실행
#별도로 빌드 안 하고 도커 허브에서 가져옴
컨테이너가 2개 생성된 것을 볼 수 있음.
web: 직접 build: . 로 이미지 생성함 → 이미지 1개 생성
redis:alpine 이미 도커 허브에 있는 이미지고,만든 게 아니니까 맨 밑에 뜨는게 보임