Docker Get Started Part 2. Containers
1. 소개
- Docker 방식으로 Application을 제작한다.
- 컨테이너, 앱의 가장 아래 계층부터 시작한다.
2. 새로운 개발환경
- 과거에는 Python Application을 개발하기 위해서는 Python Runtime 부터 설치해야했다.
- Docker를 사용하면 이식 가능한 Python Runtime을 이미지로 가져올 수 있고 설치할 필요가 없다.
- 빌드는 소스코드와 기본 Python이미지를 함께 포함(Dockerfile)하면 가능하다.
3. Dockerfile을 활용한 컨테이너 정의
- Dockerfile을 사용하여 컨테이너를 정의하면 컨테이너 내부 환경을 정의할 수 있다.
- 이전에는 네트워킹 인터페이스나 디스크 드라이버 같은 리소스에 대한 액세스는 시스템과 격리된 환경에서 가상화되고 바깥 환경과 Port를 맞춰줘야 했었다.
- 또한 그 환경에서 원하는 파일이 무엇인지 구체화해야 하는 단점이 있었다.
- 하지만 Dockerfile 작업을 수행하면 앱의 빌드가 어디서나 똑같이 작동하게 할 수 있다.
- Dockerfile 순서
1) 빈 Directory 생성
2) Directory 안으로 이동(cd [폴더명])
3) Dockerfile 생성 -> 확장자는 없다.(vi Dockerfile)
4) 생성한 파일에 아래 내용을 복사하여 붙여넣기
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
4. 응용 프로그램
- requirements.txt와 app.py를 생성한다.
- 위에서 만든 Dockerfile이 이미지에 내장되면 Dockerfile의 COPY 명령어로 인해 위의 파일들이 복사되고 EXPOSE 명령어로 인해 HTTP를 통해 app.py 출력에 액세스 할 수 있다.
- Dockerfile 내에 정의되어 있는 pip install -r requirements.txt 명령어가 Python용 Flask, Redis 라이브러리를 설치하고 app.py 파일이 socket.gethostname() 함수에 대한 호출 결과와 함께 환경 변수 Name을 출력하는지 확인한다.
- 마지막으로 Redis가 실행되지 않기 때문에 오류가 발생한다. (Redis 자체가 아닌 Python 라이브러리만 설치했기 때문)
5. Application 빌드
1) ls
- 해당 폴더에 Dockerfile, app.py, requirements.txt가 있는지 확인
2) docker build --tag=friendlyhello .
- 빌드 명령어 입력 (--tag 대신 -t 도 가능)
3) docker iamge ls
- docker image가 제대로 생성되었는지 확인
6. Application 실행
1) docker run -p 4000:80 friendlyhello
- 컴퓨터의 Port 4000을 컨테이너에 게시된 Port 80과 매핑하여 프로그램을 실행한다. (터미널 종료 시 컨테이너도 종료)
2) http://localhost:4000 로 접속하여 확인
3) curl http://localhost:4000
- 해당 HTML의 소스 확인 가능
4) docker run -d -p 4000:80 friendlyhello
- 1) 의 명령어와는 다르게 컨테이너를 백그라운드에서 실행한다. (터미널 종료 시에도 컨테이너를 유지)
5) docker container stop [Container ID]
- 컨테이너 종료.
7. 내가 만든 이미지 배포하기
- 만든 이미지를 업로드하고 다른 곳에서 실행한다.
- Production에 컨테이너를 배포하는 경우, 레지스트리로 푸쉬하는 법을 알아야 한다.
- Registry = Repository의 모음
- Registry 계정은 많은 Repository 를 생성할 수 있다.
- Docker CLI는 기본적으로 Public Repository를 사용한다. (Docker Hub)
1) Docker Login
- Docker Login
- hub.docker.com에 로그인하는 명령어 (없다면, 사이트에서 회원가입)
2) 이미지 태그
- Local Image를 Registry의 Repository와 연관시키는 표기법은 [username]/[repository]:[tag]
- docker tag [image] [username]/[repository]:[tag] --> ex) docker tag friendlyhello ppk212/get-started:part2
- Tag 명령어
3) 이미지 게시(Publish)
- docker push [username]/[repository]:[tag]
- 이미지를 자신의 Repository에 게시하는 명령어
- Docker Hub site에 Login 하여 Repository에서 확인 가능
4) 이미지 Pull & Run
- docker run -d -p 4000:80 [username]/[repository]:[tag]
- repository의 이미지를 pull하고 실행하는 명령어
8. 결론
- 다음 장에서 이 컨테이너를 서비스에서 실행하여 Application을 확장하는 방법에 대해서 설명한다.
출처
- https://docs.docker.com/get-started/part2/