Docker

rang-dev·2020년 3월 24일
0

Docker

Docker는 현재 산업에서 가장 유명한 container platform이다.

Docker Concepts

Docker Engine

Docker Engine is an application that consists of a daemon, an API, and a client.

  • Docker daemon은 images, containers, networks, volumns를 관리하는 서버이다.
  • Docker client는 Docker의 user interface이다. 클라이언트는 CLI이고 Docker를 통해서 당신이 하는 대부분의 일들이 commnad line에서 수행 될 것이다.

Client는 command line API를 통해서 daemon과 상호작용한다.

컨테이너를 만들거나 실행시키기 위해서 Docker Engine을 사용하게 될 것이다. Docker 플랫폼에서 당신이 interact하게 될 것에는 image, contianer, registry가 있다.

Docker Image

Docker Image는 container를 생성하기 위한 instruction들의 집합이다. image는 전형적으로 file system과 container에 사용될 parameters를 포함한다.

Standardized parent image부터 시작하여 multiple image layers를 사용하여 application의 custom images를 만들 수 있다. Parent image에는 종종 Ubuntu 18:04와 같은 특정 운영 체제의 파일 시스템이 포함되어 있다. Application의 image를 만들기위해 application 파일을 addtional image layers로 추가 할 수 있다.

The Docker Container

앞서 컨테이너에 대한 소개는 했고, Docker 컨테이너는 그 컨셉을 Docker에 구체적으로 구현한 것이다(Docker-specific implementation). 실제로 Docker 컨테이너는 Docker image에서 만들어진다. 하나의 컨테이너는 실행 가능한 이미지의 인스턴스이다. image는 컨테이너를 만들기위한 일련의 지침이므로 동일한 이미지에서 여러 컨테이너를 만들 수 있다.

Docker Registry

Docker image들은 Docker registry를 통해서 저장되고 배포(distributed)될 수 있다. DockerHub는 당신이 사용할 수 있는 많은 image들의 free registry이다.

DockerHub

DockerHub는 100,000 개가 넘는 이미지를 사용할 수있는 세계 최대의 Docker 이미지 registry이다. DockerHub는 Docker의 default registry이며 다양한 application들을 실행할 수 있는 이미지들 포함되어 있다.

Practice with The Postgres Docker image

  • on cmd
# On the command line tell docker to download the image to your machine
docker pull postgres:latest

# Run the image using the docker run command, supplying a password for Postgres
docker run --name psql -e POSTGRES_PASSWORD=password! -p 5432:5432 -d postgres:latest

# running container 보기
docker ps 

실행되고 있는 Postgres와 interact 하기위해 Postgres client를 사용할 수 있다.

psql -h 0.0.0.0 -p 5432 -U postgres

Postgres client를 이용하여 컨테이너에 오픈한 것과 동일한 포트를 사용하여 Postgres에 액세스하고 있다는 점을 명심하라.

위에서 설정해 둔 패스워드(password!)를 입력하면 Postgres에 접속 하게 된다.

In the command above:

  • --name: 나중에 컨테이너를 참조하기 위한 컨테이너의 이름을 명시하도록 한다. 만약 이름을 명시하지 않으면 random string name이 할당된다.
  • -e stands for "environment". 환경 변수 같은 것을 설정한다.
  • -p stands for "publish". 이를 통해 로컬 머신의 포트 5432를 컨테이너 포트 5432에 바인딩할 수 있음.
  • -d stands for "detach". This tells Docker run the indicated image in the background and print the container ID. When you use this command, you will still be able to use the terminal to run other commands, otherwise you would need to open a new terminal.

Docker container를 정지하기 위해서는 먼저 해당 컨테이너를 찾아야 한다. docker ps 이용하여 running containers list를 확인하고 postgres continer의 id를 복사한다. 그리고 docker stop <container_id>로 컨테이너를 정지한다.

Dockerfiles

Dockerfiles는 도커 이미지를 정의하는 데 사용되는 텍스트 파일이다. source image 또는 parent image를 정의하고, 파일을 image에 복사하고, image에 소프트웨어를 설치하고, image가 호출될 때 실행할 application을 정의하는 데 사용되는 명령을 포함하고 있다.

Dockerfiles는 Docker image를 정의한다. Dockerfile은 일반적으로 custom image를 만들기 위해 레이어를 추가할 수 있는 source image로 시작한다. 아래의 예시에서도 Dockerfile은 python:3.7.2-slim source image로 시작했다.

FROM python:3.7.2-slim

COPY . /app
WORKDIR /app

RUN pip install --upgrade pip
RUN pip install flask


ENTRYPOINT [“python”, “app.py”]

Dockerfile에서 추가 레이어들은 위의 Dockerfile의 flask와 같이 dependencies를 설치하는데에 사용될 수 있다. 또한 working directory를 설정하고 container의 entrypoint(진입점)을 정의하는 데 사용할 수 있다. 위의 예시에서 실행 파일은 app.py이며, 컨테이너가 시작될 때 실행될 것이다.

Dockerfile Command Glossary

  • Dockerfile comments start with #.
  • FROM defines source image upon which the image will be based.
  • COPY copies files to the image.
  • WORKDIR defines the working directory for other commands.
  • RUN is used to run commands other than the main executable(주요 실행파일).
  • ENTERYPOINT is used to define the main executable(주요 실행파일).

Dockerfile Exercises

EXERCISE 1

  • 새로운 디렉토리에서 Dockerfile이라는 파일을 만든다. Mac은 touch dockerfile이지만 윈도우는 echo >> dockerfile로 대체하였다.
  • Dockerfile 내에서(notepad dockerfile로 수정) 다음과 같은 라인을 추가한다.
FROM python:3.7.2-slim

ENTRYPOINT ["echo", "hello world"]
  • 다음의 커맨드를 이용하여 같은 디렉토리에 이미지를 빌드한다.
docker build --tag test .

Note that the full stop . tells the docker build command using the Dockerfile found in the current directory.

  • image가 빌드되면 아래와 같이 container를 실행할 수 있다.
docker run test -rm

-rm은 실행이 끝나면 이것을 삭제하는 것이다. 이 테스트와 같이 임시적으로 빌드할때 유용하다.


EXERCIESE 2: Flask Example

  • here에서 파일들을 새로운 디렉토리에 내려받는다.
# app.py
from flask import Flask
APP = Flask(__name__)


@APP.route('/')
def hello_world():
    return 'Hello, World from Flask!\n'



if __name__ == '__main__':
    APP.run(host='0.0.0.0', port=8080, debug=True)
# dockerfile

FROM python:3.7.2-slim

COPY . /app
WORKDIR /app

RUN pip install --upgrade pip
RUN pip install flask


ENTRYPOINT ["python", "app.py"]
  • image를 빌드한다.
docker build -t test .

-t--tag의 다른 표현이다.

  • Run the container
docker run -p 80:8080 test

이 command에서 당신은 컨테이너의 포트 8080을 로컬 컴퓨터의 포트 80에 바인딩하고 있다.

  • Curl the endpoint
curl http://0.0.0.0/
  • when you are finished, get the id of the running container
docker ps
  • You can then use the id to stop the container
docker stop <Container id>

-docker build는 Dockerfile에 근거해서 image를 빌드한다.
---tag flag는 이미지 이름을 지정하고 선택적으로 name:tag 형식으로 이미지를 태그하는 데 사용된다.
-docker run 커맨드는 이미지에 근거하여 container를 실행할 때 사용된다.
--p flag는 container ports를 host machine ports에 연결할때 사용된다.

profile
지금 있는 곳에서, 내가 가진 것으로, 할 수 있는 일을 하기 🐢

0개의 댓글