kok202
도커 강의 정리 ( 1강 : 이미지 (Dockerfile) )

2019. 6. 7. 00:56[정리] 기능별 개념 정리/Docker

강의 출처 : 

https://www.youtube.com/watch?v=9tW0QSsrhwc&list=PLfI752FpVCS84hxOeCyI4SBPUwt4Itd0T&index=2&t=0s

공식 문서 : https://docs.docker.com/get-started/

 

Get Started, Part 1: Orientation and setup

1: Orientation 2: Containers 3: Services 4: Swarms 5: Stacks 6: Deploy your app Welcome! We are excited that you want to learn Docker. The Docker Get Started Tutorial teaches...

docs.docker.com

 

 

 

 

 

이미지 -> 컨테이너 -> 서비스 -> 스택

이미지 : 어플리케이션을 실행하는데 필요한 모든 패키지를 포함한 파일

컨테이너 : 이미지를 실행시킨 것

서비스 : 하나의 이미지를 프로덕션 레벨에서 어떻게 띄울 것인가를 정의한다.

스택 : 여러개의 서비스들의 집합, 어떻게 상호작용 할지 정의한다.

도커 클러스터 : Docker swarm

 

Dockerfile 으로 이미지를 정의한다.

docker-compose.yml 으로 스택을 정의한다.

docker-compose.yml 안에는 여러개의 서비스가 존재한다.

서비스는 이미지를 사용한다.

 

 

 

 

간단한 어플리케이션

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

 

 

 

 

 

이미지 (Dockerfile)

# 공식 파이썬 Runtime 이미지를 가져옴
FROM python:2.7-slim

# 작업 디렉토리로 /app 을 설정함
WORKDIR /app

# 현재 디렉토리에 존재하는 컨텐츠를 /app 밑으로 복사한다.
COPY . /app

# requirements.txt에 정의된 필요로 하는 패키지를 파이썬 패지키 관리툴인 pip install 으로 설치한다.
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# 80 번 포트를 컨테이너 밖에서 쓸 수있도록 열어준다.
EXPOSE 80

# 환경 변수 NAME 을 선언한다.
ENV NAME World

# app.py 를 실행한다.
CMD ["python", "app.py"]

Dockerfile 은 app.py 와 같은 경로에 위치해야한다.

여기서 정의한 Dockerfile 에서 requirements.txt를 사용하니까 Dockerfile 과 같은 경로에 requirements.txt가 필요하다.

 

requirements.txt

Flask
Redis

 

이제 Dockerfile이 있는 경로에서 아래 커맨드를 실행하여 이미지를 생성한다.

docker build -t myDocker .

-t 는 도커 이미지에 이름을 주는 옵션이다.

아래 커맨드로 제대로 도커이미지가 만들어졌는지 확인한다.

docker image ls

도커를 실행시킨다. (-d 옵션을 주면 백그라운드로 동작하게된다.)

docker run -p 4000:80 myDocker

아래 경로로 이동해서 제대로 도커 이미지가 컨테이너로서 동작하는지 확인해본다.

http://localhost:4000

* World 가 출력되어야한다. world (x)

* 레디스는 설치가 안되있기 때문에 visit count는 제대로 동작하지 않는다.

 

도커 허브에 생성한 이미지 배포

터미널에서 도커 허브에 로그인한다.

docker login

방금 만든 도커 이미지를 복사해서 포장해준다. (태그를 달아준다.)

docker tag myDocker kok202/myRepository:v0.0.1

복사된 도커 이미지가 제대로 생성됬는지 확인한다. (kok202/myRepository Repository 가 존재하는지)

docker image ls

복사한 도커 이미지를 도커 허브에 푸쉬한다.

docker push kok202/myRepository:v0.0.1

도커 허브에서 확인해본다.

도커 허브에 있는 도커 이미지를 싱행할 수 있다.

docker run -p 4000:80 kok202/myDocker:v0.0.1

 

 

 

 

 

커맨드 라인 정리

docker build -t friendlyhello .                  # 디렉토리안의 Dockerfile 을 통해 friendlyhello 라는 이미지를 만든다.
docker run -p 4000:80 friendlyhello              # friendlyhello 이미지를 실행시키고 포트 4000 을 friendlyhello 이미지의 80으로 맵핑시킨다.
docker run -d -p 4000:80 friendlyhello           # 위와 같다. 대신 백그라운드로 동작한다.

docker container ls                              # 모든 컨테이너 리스트를 출력한다.
docker container ls -a                           # 실행중이지 않는 컨테이너까지 포함하여 모든 컨테이너 리스트를 출력한다.
docker container stop <hash>                     # 특정 컨테이너를 안정적으로 중지시킨다.
docker container kill <hash>                     # 특정 컨테이너를 강제로 중지시킨다.
docker container rm <hash>                       # 특정 컨테이너를 삭제한다.
docker container rm $(docker container ls -a -q) # 모든 컨테이너를 삭제한다.

docker image ls -a                               # 모든 이미지 리스트를 출력한다.
docker image rm <image id>                       # 특정 이미지를 삭제한다.
docker image rm $(docker image ls -a -q)         # 모든 이미지를 삭제한다.

docker login                                     # 이 CLI 세션을 도커 허브에 접속시킨다.
docker tag <image> username/repository:tag       # 이미지에 도커 허브에 업로드하기위해 태그를 단다.
docker push username/repository:tag              # 태그가 달린 이미지를 도커 허브에 업로드한다.
docker run username/repository:tag               # 도커 허브에 존재하는 이지미를 실행시킨다.