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/

'개발 > Docker' 카테고리의 다른 글

Docker 명령어 정리  (0) 2019.01.22
Docker Get Started Part 1. Orientation  (0) 2019.01.22
Docker 학습 계획  (0) 2019.01.22

+ Recent posts