본문 바로가기
Tools/Docker

[Docker] 도커 설명

by mssong92 2022. 9. 29.

1. 도커란?

Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. 

컨테이너 기반의 오픈소스 가상화 플랫폼

도커 컨테이너
   > 프로세스가 동작하는 독립된 가상공간
   > 다른 컨테이너나 호스트의 환경과 상관없이 실행
 

2. 도커의 장점

개발환경의 동기화가 용이하다.
이미지라는 것을 통해 컨테이너를 생성하면 로컬 환경과 독립적으로 구동
따라서 호스트의 환경에 관계없이 동일한 개발환경을 간편하게 안정적으로 구축할 수 있음
가상머신에 비해 자원적,성능적 우위
기존 가상머신은환경마다 os가 존재하여 무겁고 느림                    
   > 도커는 호스트의 os자원을 사용하고 프로세스만을 격리해서 가벼움 (별도의 os, 하이퍼바이저 필요x, 따라서 성능저하 거의 x)
가상머신은 각 환경에 할당되는 자원이 고정되지만 도커는 각 환경에 할당되는 자원이 유동적이라서 자원활용이 효율적임
가상머신 이미지보다 도커이미지가 훨씬 작음

Docker 구조

 

3. 도커 이미지란?

도커는 도커 이미지 통해 컨테이너를 생성
이미지 : 컨테이너 생성에 필요한 파일,설정 등을 저장해 놓은 파일
현재 docker hub 등 을 통해 다양한 이미지들이 공유되고 있으며, 이를 활용하면 목적에 맞는 환경을 간편하게 구축할 수 있음
 
예를 들어 TensorFlow 공식 도커 이미지를 통해 추가 설정없이 TensorFlow를 사용할 수 있는 환경(컨테이너)생성 및 실행

도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image라한다. 다시 말해, 특정 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일을 의미한다. 예를 들어 Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle 이미지는 Oracle을 실행하는데 필요한 파일과 실행명령어, port 정보 등을 모두 가지고 있다.

도커 이미지 예시

 

4. 도커 파일 (Dockerfile)

기존의 특정 이미지를 통해 컨테이너를 생성한 이후, 컨테이너에서 추가적인 설정이 필요한 경우

(추가 패키지 설치, 환경변수 설정, 포트 설정 등)

 

컨테이너를 생성할 때 마다 이러한 추가설정하는 것이 번거로움.

기존 이미지에 추가적으로 필요한 설정을 포함한 이미지를 만들고 싶음.

) tensorflow이미지로 컨테이너를 만들었는데 Mecab이라는 패키지 등이 필요해 설치함

이 후, 이러한 컨테이너를 또 생성하고 싶은데 추가설정사항도 같이 포함된 이미지가 있으면 편할 것 같다.

-> 이 때, 사용하는 것이 도커파일(Dockerfile)

 

도커파일 예시

 

5. 도커 이미지 관련 명령어

 

1. pull: 이미지 다운로드
# docker pull [이미지 이름](:[태그명])  (버전,태그 정보는 각 이미지 제공 사이드 참고)

# docker pull python:3.7.9  (파이썬 3.7.9버전이 포함된 이미지 다운)

2.images
# docker images   (다운로드된 이미지들을 출력)

3. rmi: 이미지 삭제

# docker rmi [이미지 id]  (이미지 삭제)

4.build: 도커파일로부터 이미지 생성
# docker image build (–t) [이미지명](:[태그명]) [도커파일경로]  (-t옵션 있어야 태그명을 붙일 수 있음)

5. Commit: 컨테이너로부터 이미지 생성

# docker commit [컨테이너이름] [생성할이미지이름]

 

6. 도커 컨테이너 관련 명령어

1. ps: 컨테이너 목록 출력

# docker ps  (현재 동작중인 컨테이너 목록)

# docker ps –a  (-a 옵션: 동작중이지 않은 컨테이너 포함 모든 컨테이너 목록)

 

2. rm

# docker rm [컨테이너id 또는 name]   (컨테이너 삭제)

# docker rm helloworld

 

3. start/restart/stop

# docker start [컨테이너id 또는 name]  (컨테이너 시작)

# docker restart [컨테이너id 또는 name]   (컨테이너 재시작)

# docker stop [컨테이너id 또는 name]     (컨테이너 정지)

# docker start helloworld

 

4. run: 컨테이너 생성 및 접속

# docker run [options] [이미지] [커맨드]  (이미지로부터 컨테이너를 생성후 커맨드를 실행)

-d 옵션: 백그라운드 모드로 실행

-p 옵션: 포트포워딩

-v 옵션: 호스트 디렉토리, 혹은 도커 Volume과 컨테이너의 디렉토리 연결(마운트)

-e 옵션: 환경변수 설정

--name 옵션: 컨테이너 이름 설정

-it 옵션: 컨테이너의 표준입력과 로컬의 키보드 입력 연결(터미널 입력을 위한 옵션)

# docker run -v /root/data:/data -it --name helloworld python:3.7.9 /bin/bash

: python3.7.9 이미지로부터 터미널 입력이 가능하고(-it 옵션), 호스트의 /root/data디렉토리에 마운트된 /data라는 디렉토리를 가지고 있으며(-v 옵션), 이름이 helloworld(--name 옵션)인 컨테이너를 생성 후 bash로 접속(/bin/bash 커맨드)

 

5. attach: 컨테이너 접속

# docker attach [컨테이너 id 또는 name]

 

6. exec: 컨테이너 내부 명령어 실행

# docker exec [options] [컨테이너] [명령어] [명령어 매개변수]

# docker exec –it helloworld python

# docker exec helloworld python helloworld.py

# docker exec helloworld apt-get update

 

7. 쉘에서 빠져나오기

-컨테이너 내에서 exit, Ctrl+D 입력: 컨테이너 정지후 빠져나옴
-컨테이너 내에서 Ctrl+P+Q 입력: 컨테이너 정지없이 빠져나옴

8. cp: 호스트와 컨테이너간의 파일/디렉토리 복사

# docker cp [컨테이너이름]:[컨테이너내경로] [호스트경로]  (컨테이너->호스트)

# docker cp [호스트경로] [컨테이너이름]:[컨테이너내경로]  (호스트->컨테이너)

 

'Tools > Docker' 카테고리의 다른 글

[Docker] Docker에서 Jupyter Notebook 사용  (0) 2022.12.23
[Docker] Error response from daemon 해결  (1) 2022.09.30

댓글