본문 바로가기

CS 스터디/도커

Docker

도커 등장 배경

1. 일반 서버

- OS를 공유하고 있기 때문에, 하나의 App에서 문제가 발생하면 다른 App에도 영향

 

 

2. 가상화

- 위 문제를 해결하기 위해, OS를 독립화

- Hypervisor라는 SW 기술을 가지고 가상화된 컴퓨터 위에 독립적으로 App을 운영

- 하지만

- 각 서비스별 독립성은 유지되지만, OS 위에 또 다른 OS가 설치되는 구조

- 불필요하게 많은 용량 사용

- 속도 저하

 

3. 컨테이너

- 최소한의 필요한 환경 요소만 묶어서 서비스 제공

- 독립성 유지

- 적은 용량으로 운영 가능 

- 컨테이너 플랫폼 중 하나가 Docker

 

Docker 사용 루트

- 어플리케이션을 한번만 도커 이미지로 빌드해놓으면

- 다음과 같은 클라우드 환경에서 일관되게 실행 가능

 

- 다음과 같은 도커 이미지 저장소에서 이미지 다운받아서 사용 가능

ex) docker pull nginx

ex) docker run -d -p 80:80 nginx

 

Docker란?

- 다양한 종류의 애플리케이션을 신속하게 구축, 테스트 및 배포 가능한 SW 플랫폼

- 하드웨어의 자원을 모두 가상화 하지 않고, 프로세스들만을 격리시킴 -> 빠르게 환경 구축 가능

- 서비스 환경을 Docker Image로 만든 뒤, 배포하고 컨테이너로 간단히 실행 가능

- 하드웨어의 모든 자원을 복제하는 VM(Virtual Machine)과는 용량과 속도 부분에서 차이가 존재

 

Image란?

- 개발 환경을 구축하기 위해 필요한 라이브러리 및 패키지를 모아 하나의 파일로 만든 것

- Base Image: Docker Hub를 통해 배포된 각 Application의 공식 이미지 (https://hub.docker.com/)

- Docker Image: 사용자가 Base Image를 사용하여, 그 위에 프로그램, 라이브러리, 소스를 설치 -> 하나의 파일로 만든 산출물

 

Docker Image 관련 명령어

Base Image 가져오기

- docker pull [Image Name]:[tag]

- docker pull ubuntu:18.04

 

현재 Host에 존재하는 Image 확인

- docker images

 

Image 삭제

- docker rmi [option] ImageName [ImageName,,,,,]

- 삭제하기 원하는 이미지를 사용하는 컨테이너 미리 삭제하기

 

미사용 Image 전부 삭제

- 어떤 컨테이너에도 연결되지 않은 이미지가 많다면, 아래 명령어로 한번에 삭제

- docker image prune -af

- -f 옵션은 삭제 수락을 물어보지 않음

 

 

Container란?

- 이미지가 실행된 형태

- 호스트와 이미지엔 아무런 영향을 주지 않고 Docker engin에서 독립적으로 실행

Container 관련 명령어

 

Docker Container 관련 명령어

Container 생성

- docker create [option] [ImageName]:[tag]

- docker create -it ubuntu:18.04

- -it(-i + -t): 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정

- -i, -iteractive: 표준입력(stdin) 활성화, 연결되어 있지 않더라도 표준입력 유지, 이 옵션을 사용하여 Bash에 명령 입력

- -t, --tty: Bash를 사용하려면 해당 옵션 설정해야 함, 옵션 설정하지 않으면, 입력은 가능하지만, 셸에 표시 X

- -d: detached 모드로 컨테이너를 실행, 컨테이너를 백그라운드에서 동작하는 애플리케이션으로 실행 설정

- option 내용은 워낙 많아서 밑에 링크 참조

 

Container 생성 후, 바로 실행

- docker run [option] [ImageName]:[tag] [Command(선택)]

- docker run -it ubuntu:18.04 /bin/bash

 

Container와 Host간 파일 복사

Host -> Container

- docker cp [host_filepath] [container_name]:[container_filepath]

Container -> Host

- docker cp [container_name]:[container_filepath] [host_filepath]

 

Container 목록 확인

- docker ps [option] -> 현재 진행중인 컨테이너 목록 확인

- -a option -> 정지된 컨테이너 목록까지 확인

 

Container log 확인

- docker logs [image name/image id]

- -f option으로 실시간으로 생성되는 로그 확인

- --tail option으로 로그의 마지막 10줄만 확인 가능

 

Container 쉘 얻기 -> 동작, 추가 명령어 실행

특정 컨테이너의 쉘을 얻고 동작

- docker exec -it [container name / container ID] /bin/bash

 

실행된 특정 컨테이너에 추가적 명령어 동작

- docker exec [container name / container ID] [command]

 

ex) docker 에서 구동중인 jenkins에 접속하여, bash를 통해 필요한 라이브러리 설치

 

Container 중지

- 실행 중인 컨테이너 중지

- docker stop [container name / container ID]

 

Container 삭제

- docker rm [container name / container ID]

- -f option: 삭제 삭제

- docker container prune : 모든 container 삭제

- 중지된 컨테이너 삭제

 

 

 

이슈 공유

사용중인 컨테이너를 이미지로 커밋하는 법

- Openvidu를 사용하려면 다수의 Port가 요구됨

- 8888 포트도 요구되는데, jenkins를 8888포트에서 사용중인 상태

- jenkins에 구성되어 있는 것들이 많기 때문에, 새롭게 컨테이너를 만들기에는 부담

- "commit" 명령어로 현재 사용중인 컨테이너를 이미지로 만들고, 포트 변경에서 run

- docker commit [container_name] [new_image_name]

https://tttsss77.tistory.com/230

 

 

Docker Option

- https://docs.docker.com/engine/reference/commandline/{명령어}

- ex) docker run에 대한 option 검색 링크
https://docs.docker.com/engine/reference/commandline/run/

 

 

docker run

docker run: The `docker run` command first `creates` a writeable container layer over the specified image, and then `starts` it using the specified command. That is, `docker run` is equivalent...

docs.docker.com

 

질문

 

docker란?

- 현재 가장 널리 사용되는 가상화 또는 컨테이너화 기술 중 하나입니다

- 컨테이너를 사용하여 애플리케이션을 구축, 배포 및 실행하면 전체 프로세스가 더 쉽고 비용도 효율적입니다.

 

docker를 사용해야하는 이유(장점)

- 독립된 개발 환경을 보장합니다. Container는 격리된 공간이므로, 그자 체에 특별한 권한을 주지 않은 한 내부에서 무엇을 하든 Host OS에 영향을 끼치지 않습니다.

 

- 개발및 운영 환경을 통합할 수 있습니다. Container 내부 작업을 배포하기 위해서는 해당 Container를 docker image라는 하나의 패키지로 만들어 운영 서버에 전달하기만 하면 됩니다. 서비스를 개발했을 때의 환경을 다른 서버에서도 똑같이 복제할 수 있기 때문에 각종 라이브러리 설치 등으로 인한 의존성을 걱정할 필요 없습니다.

 

- 배포 신속성 및 HW 효율에서 장점이 있습니다. Kernel을 포함하고 있지 않기 때문에 image크기가 작습니다. 따라서 Application의 배포 속도가 매우 빠르고 HW 용량도 적게 차지합니다.

 

docker 단점

- 개발 초기의 오버헤드

- Linux 친화적

 

docker container란?

- 이미지는 컨테이너 실행에 필요한 파일과 설정 값등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않습니다.

- 컨테이너는 애플리케이션을 환경에 구애받지 실행되는 기술입니다. 이미지를 실행하면 만들어지는 파일입니다.

 

 

 

 

마치며

- 도커에 대해 다룰 내용이 많다보니, 추후 위 내용보다 심화된 도커 내용을 다룰지 고민중 ex) dockerfile 구성요소, docker-compose

- 본인도 심화된 도커 내용을 공부하면서, 도커에 대한 어떤 질문도 답할 수 있도록 정리하는 것의 필요성 느낌