Docker와 친해지기

Road.1·2021년 9월 2일
1

Docker

목록 보기
1/2
post-thumbnail

Docker를 몰랐던 나😥

개발을 하다보면 다른 환경에서 나의 프로그램을 돌려야 할 때가 있다.

그 때마다 os 설치, 실행환경 세팅(java, python), 어플리케이션 코드(빌드) 다운로드, 라이브러리 설치 등 개발 과정에서 거치는 짜증나는 상황이 분명 온다.

나는 여태 Docker를 쓸줄 몰라서 Linux OS, CUDA, vscode, python, 라이브러리를 위해 anaconda를 설치하는 등등 몇시간을 날려버렸다....

특히 서버를 운영하는 경우, 중요시 하게 생각해야 하는 부분이 있는데,

  • 보안 결함이 없어야 함
  • 새로운 코드나, 라이브러리 추가가 가능해야한다.

위의 부분은 서비스가 커지고 서버가 늘어나면 어플리케이션들을 원하는 대로 실행하는 것이 꽤 어려워진다.

  • 각 상황에 따른 스크립트를 작성하고. 모든 서버에서 원하는 상태를 만들어주어야 하기 때문.
  • 만약 어플리케이션이 작동을 안하면, 그 문제를 찾는데 시간을 매우 투자할 것이고, 짜증지수 역시 급상승 할 것이다.

Docker가 문제를 해결🐋

문제는 원하는 프로그램을 실행하는 것이 어렵다는 것이다.

그래서 도커는 인프라 관리 와 어플리케이션 작성을 분리했다.

도커 이미지라는 형태로 실행환경, 실행하는 코드, 필요한 라이브러리, 설정 파일을 박제해서 저장한다.

서버는 그러면 간단하게 저 도커 이미지를 가지고 와서 실행만 시키면 된다.

도커의 좋은 기능을 사용하기 위해서는 이미지에 대해서 잘 알아야 할텐데

  • 이미지를 생성하는 법
    • 일관성 있게 이미지를 만들 수 있고, 어플리케이션을 실행하는 데 필요한 모든 것을 설정할 수 있는 이미지
  • 이미지를 공유하는 법
    • 이미지가 어디에서든 잘 전달할 수 있게 만들어 필요한 곳에서 사용할 수 있게 한다.
  • 이미지를 실행하는 법

이 세가지를 배울 것이다.

Docker가 문제를 해결(2)🐋

docker의 구성요소 (출처: https://docs.docker.com/get-started/overview/)
  • Docker image & container

    • "이미지"는 어플리케이션을 실행하기 위한 필요한 모든 것이 생성되어 있는 파일
    • 도커는 바로 컴퓨터에 설치하는 것이 아니라 "컨테이너"라 불리는 독립된 가상 공간을 만들어내서 복원한다.
    • 즉, "컨테이너"는 "이미지"를 사용하여 실행한 것이다.
    • 프로세스의 독립성을 보장하기 위해서 네트워크나 저장소가 분리되어 있다.
  • Docker registry

    • "도커 이미지"를 저장하는 공간을 말한다.
  • dockerd

    • docker API requests를 받아서 docker object(image, container등)를 관리
  • docker client

    • 사용자가 docker를 사용하기 위해서 사용하는 cli

기존에는 가상머신(VM)을 통해서 원하는 환경에서 어플리케이션을 실행 했다.

Virtual Machine과 docker의 차이
  • 가상머신은 하이퍼바이저를 사용해서 여러개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이다.
  • 그렇다면, 하나의 컴퓨팅 공간을 여러개로 할당해서, 가상화하기 때문에 성능이 당연히 좋지 않겠지? (내 방을 내어준셈)
  • 도커는 리눅스의 자체 기능인 chroot, namespace, cgroup기술을 사용해서 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다.
    • OS를 따로 가지고 있는 것이 아니라 이미지의 크기도 작다. (기존 이미지가 12G라면 도커는 1G도 안될 수 있다.)

Docker 이미지 실행해보기

docker run -d -p 80:80 docker/getting-started

명령 프롬포트를 켜서 위의 코드를 실행 해보고, localhost에 접근해보자.

위의 화면이 뜨면 된다.

docker run [options] {image_name} [command]
  • docker run은 docker image를 다운받아(없을 시에만) container를 실행하는 명령어이다. 필요에 따라 다양한 옵션들과 함께 사용할 수 있다.

  • -p host_port:container_port 옵션은 컨테이너의 포트와 호스트의 포트를 연결해준다.

  • -d의 옵션과 함께 실행할 경우 docker container가 백그라운드에서 실행된다는 의미를 가진다.

옵션설명
-d데몬으로 실행(뒤에서 - 안 보이는 곳(백그라운드)에서 알아서 돌라고 하기)
-it컨테이너로 들어갔을 때 bash로 CLI 입출력을 사용할 수 있도록 해 줌
--name {이름}컨테이너 이름 지정
-p {호스트의 포트 번호}:{컨테이너의 포트 번호}호스트와 컨테이너의 포트를 연결
--rm컨테이너가 종료되면{내부에서 돌아가는 작업이 끝나면} 컨테이너를 제거.
-v {호스트의 디렉토리}:{컨테이너의 디렉토리}호스트와 컨테이너의 디렉토리를 연결.

Docker 컨테이너 조작하기

Docker container 상태 확인하기

docker ps


  • CONTAINER_ID: container의 고유 ID
  • IMAGE: container를 띄우는데 사용한 image 이름
  • COMMAND: container에서 실행한 command
  • CREATED: conatiner가 생성된 시간
  • STATUS: container의 상태
  • PORT: port를 publish 하는 경우 어떻게 되어 있는지
  • NAMES: container의 이름

Docker container 멈추기

docker stop {container_id|conatinaer_name}
docker kill {container_id|conatinaer_name}

두개의 명령어는 비슷한 결과를 보이지만 조금 다르다.

  • stop은 SIGTERM이라는 신호를 보냄.
  • kill은 SIGKILL이라는 신호를 보냄.

Docker container 되살리기

docker restart {container_id|container_name}

실행중인 container에서 명령어 실행하기

docker exec [options] {container_id|container_name} [command]
  • 예시
$ docker exec my_cont pwd
/var/lib/my_cont

$ docker exec my_cont ls
config.development.json
config.production.json
content
content.orig
current
versions

컨테이너 환경에서 여러 명령어를 실행할 수 있다.

Docker container 삭제

docker rm {컨테이너 id 또는 이름}

# ⭐️ 모든 컨테이너 삭제
docker rm `docker ps -a -q`

더 자세한 것은 도커 명령어 Reference을 통해서 알 수 있다.

내 프로젝트 패키징하기

  • Dockerfile이란 docker image를 어떻게 생성할 것인지를 정의한 파일이다.
.
├── app.py
├── requirements.txt
└── templates
    └── index.html

실습 코드 구조가 저렇다고 치자.

도커 파일을 만들고 아래 형식대로 써보자.

FROM python:3.8

ADD requirements.txt .

RUN pip install -r requirements.txt

ADD templates templates

ADD app.py .

CMD ["python", "app.py"]
  • From 이란 Docker image를 생성할 때 기본으로 사용할 base image를 적는 부분이다.

  • ADD src dst 호스트 머신에 있는 파일이나 폴더를, dst라는 위치에 저장한다.

  • Run script는 script를 실행한다.

  • CMD는 생성된 Docker image를 실행할 때 자동으로 실행되는 커맨드이다.

이제 Dockerfile을 통해 이미지 생성에 대한 설계도를 그렸다.

다음은 빌드 build 할 차례

빌드

docker build [OPTIONS] PATH

ex.

docker build -t my_project:version1 .
  • -t를 사용하면 이미지에 원하는 이름을 붙일 수 있다.
  • {image_name}:{tag} 의 형태로 사용하며, {tag}를 붙이지 않을경우 자동으로 latest가 된다.
  • . 는 docker build를 어느 위치에서 실행할 것인지 정의한다.
  • 이 위치에 따라 ADD 커맨드에서 호스트의 파일 위치를 사용하는게 바뀔 수 있다.

image 목록 확인

docker images

image 삭제

docker rmi {옵션} {이미지 id}

정리

Docker가 왜 인기가 많은가, Docker의 역할은 무엇인가를 간단하게 보고

Docker로 간단하게 자신의 프로젝트를 이미지로 박제하고 빌드하여 컨테이너로 시작해 보았다.

Docker는 간편하게 해준다는 장점 하나로 세팅 시간도 줄여주고,
나에게 도커는 아주 만족스러운 시스템이다.

특히 나같이, 딥러닝(심층학습)에서의 프레임워크나 다양한 라이브러리를 이용하여 개발을 하는 경우, Docker를 사용하면 버전의 차이나 환경을 의식하지 않고 개발할 수 있다는 장점이 있다.

특히 nvidia-docker가 있다는 것에 너무 감사하다.

profile
AI 엔지니어가 되고싶은 대학생 입니다.

0개의 댓글