개발을 하다보면 다른 환경에서 나의 프로그램을 돌려야 할 때가 있다.
그 때마다 os 설치, 실행환경 세팅(java, python), 어플리케이션 코드(빌드) 다운로드, 라이브러리 설치 등 개발 과정에서 거치는 짜증나는 상황이 분명 온다.
나는 여태 Docker를 쓸줄 몰라서 Linux OS, CUDA, vscode, python, 라이브러리를 위해 anaconda를 설치하는 등등 몇시간을 날려버렸다....
특히 서버를 운영하는 경우, 중요시 하게 생각해야 하는 부분이 있는데,
위의 부분은 서비스가 커지고 서버가 늘어나면 어플리케이션들을 원하는 대로 실행하는 것이 꽤 어려워진다.
문제는 원하는 프로그램을 실행하는 것이 어렵다는 것이다.
그래서 도커는 인프라 관리 와 어플리케이션 작성을 분리했다.
도커 이미지
라는 형태로 실행환경, 실행하는 코드, 필요한 라이브러리, 설정 파일을 박제해서 저장한다.
서버는 그러면 간단하게 저 도커 이미지를 가지고 와서 실행만 시키면 된다.
도커의 좋은 기능을 사용하기 위해서는 이미지에 대해서 잘 알아야 할텐데
이 세가지를 배울 것이다.
Docker image & container
Docker registry
dockerd
docker client
기존에는 가상머신(VM)을 통해서 원하는 환경에서 어플리케이션을 실행 했다.
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 ps
docker stop {container_id|conatinaer_name}
docker kill {container_id|conatinaer_name}
두개의 명령어는 비슷한 결과를 보이지만 조금 다르다.
docker restart {container_id|container_name}
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 rm {컨테이너 id 또는 이름}
# ⭐️ 모든 컨테이너 삭제
docker rm `docker ps -a -q`
더 자세한 것은 도커 명령어 Reference을 통해서 알 수 있다.
.
├── 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를 어느 위치에서 실행할 것인지 정의한다. docker images
docker rmi {옵션} {이미지 id}
Docker가 왜 인기가 많은가, Docker의 역할은 무엇인가를 간단하게 보고
Docker로 간단하게 자신의 프로젝트를 이미지로 박제하고 빌드하여 컨테이너로 시작해 보았다.
Docker는 간편하게 해준다는 장점 하나로 세팅 시간도 줄여주고,
나에게 도커는 아주 만족스러운 시스템이다.
특히 나같이, 딥러닝(심층학습)에서의 프레임워크나 다양한 라이브러리를 이용하여 개발을 하는 경우, Docker를 사용하면 버전의 차이나 환경을 의식하지 않고 개발할 수 있다는 장점이 있다.
특히 nvidia-docker가 있다는 것에 너무 감사하다.