dogo_ day

Docker 란? 본문

IT/DevOps_

Docker 란?

dogo_ 2023. 6. 15. 09:46

Docker 란?

2013년 3월 Docker, Inc에서 출시한 오픈 소스 컨테이너 프로젝트이다. 현재 전 세계적으로 큰 인기를 끌고 있으며 컨테이너 분야에서 사실상 표준으로 자리 잡았다.

로컬pc와 개발서버와의 인프라환경의 가변성에 대한 문제를 해결하기 위해, 개발환경 세팅에 대한 근본적인 여러 문제들해결 하기 위함도 있다. 그리고 리눅스/유닉스 환경에서 오랫동안 사용해왔던 쉘 스크립트로 설치 및 설정 자동화를 구현해도 되지만 이것도 한계(복잡한 설정 및 사소한 설정 하나가 운영체제와 서비스의 안정성에 큰 영향을 미침)가 있었고 이를 해결하기 위한 패러다임으로 도커가 탄생되었다.

https://pyrasis.com/jHLsAlwaysUpToDateDocker/Unit01
https://pyrasis.com/jHLsAlwaysUpToDateDocker/Unit01

즉, 컨테이너화된 소프트웨어 프로젝트에서는 모든 개발 작업이 Docker Container안에서 이루어진다.

개발자의 로컬pc에서 파이썬을 설치하거나 프로젝트에 필요한 패키지를 설치할 필요가 더 이상 없다.

다만, Docker Container 안에서 해당 애플리케이션이 돌아갈 수 있는 환경을 이미지로 만들어야한다.

 

가상머신(VirtualBox, VMware)들을 들어본 적이 있을 것 이다.
호스트OS를 기반으로 게스트OS를 만들어서 다양한 운영체제를 사용하는 방식이다.
시스템 자원을 가상화하고 독립된 공간을 생성하는 작업 -> 성능 손실이 큼
가상머신은 게스트OS를 사용하기 위한 라이브러리, 커널 등을 포함 -> 배포 용량 큼

도커 컨테이너는 가상화된 공간을 생성할 때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만듬 -> 성능 손실이 없음
가상머신과 달리 커널을 공유, 컨테이너에는 라이브러리와 실행파일만 존재 -> 용량이 작음, 배포하는 데 시간 빠름
출처 : https://seosh817.tistory.com/345

 

용어정리

도커 이미지와 컨테이너는 1:N 관계

 

Dockerfile : 도커 이미지를 생성할 때 사용(build)

Image : 도커 컨테이너를 생성할 때 사용(run), 가상머신에서 사용하는 iso와 비슷한 개념

Container : 도커 이미지의 실행 가능한 인스턴스

데이터베이스를 컨테이너로 띄워서 활용하는 방식 -> CDB(Container DataBase)

그 반대 방식 -> non-CDB

초반에는 직접 빌드하여 올려두고 사용하였으나 현재는 각종 공식 업체에서 기본 이미지를 생성하여 제공하고 있고, Dockerfile에 alpine버전으로 가져와서 필요한 것만 빌드하여 저용량으로 이미지를 수월하게 만들 수 있게 되었다.
이렇게 생성된 이미지를 가지고 실행하면 컨테이너가 생성되고 해당 공간은 내부에 전혀 영향 없는 독립적인 별개의 공간으로 활용 할 수 있다. docker-compose를 이용하면 더 쉽게 여러 개의 컨테이너를 실행 할 수 있습니다.
출처 : https://labs.brandi.co.kr//2021/01/20/hwangsg.html

 

명령어정리

기본명령어

docker version : 버전확인
docker ps -a : 생성된 전체 컨테이너 확인
docker ps : 생성된 컨테이너 중 실행 중인 컨테이너 확인
docker inspect <containerID> : 컨테이너 상세정보 출력
docker search <검색어> : dockerhub에 있는 이미지 검색
docker images : 도커에 존재하는 이미지 목록 출력
docker image inspect <tagName><veresion> : 이미지 상세정보 출력
docker network ls : 도커 네트워크 목록 출력

docker container cp <컨테이너 식별자>:<컨테이너 내부 파일 경로> <호스트 디렉토리 경로> : 컨테이너 -> 호스트 파일 복사
docker container cp <호스트 파일 경로> <컨테이너 식별자>:<컨테이너 내부 디렉토리 경로> : 호스트 -> 컨테이너 파일 복사
docker rmi -f $(docker images -f "dangling=true" -q) : <none> 이미지들 강제 일괄 삭제

컨테이너 내부 명령어
cat /etc/os-release : 컨테이너 정보 확인

 

Dockerfile build 하기 (image 생성)

docker build -t <tagName>:<version> .

-t 옵션을 이용하여 이름과 버전을 지정할 수 있으며, 버전 미 입력 시 latest로 자동 지정된다.

마지막 .은 현재 디렉토리를 의미한다. 즉 Dockerfile이 있는 디렉토리를 지정하는 것을 의미하며

풀이하면 'Docker는 현재 디렉토리에 있는 Dockerfile을 사용하여 이미지를 빌드한다'라는 뜻이다.

 

 

Docker image run 하기 (container 생성)

docker run -it -d -p 80:80 --name <containerName> <tagName>:<version>

-i : 컨테이너의 표준 입력(stdin) 유지

-t : 가상 터미널을 할당하여 터미널과 상호작용

일반적으로 -it 로 사용한다

-it : 도커 컨테이너를 익터랙티브하게 실행

-d : 컨테이너를 백그라운드로 실행

-p <host_port><container_port> : host의 x번 포트와 container x번 포트를 연결하고 외부에 노출한다. http://<host id>:80에 접속하면 container의 80번 포트로 접속

추가로 -v 옵션을 사용하면 저장소를 연결할 수 있다 : -v /root/data:/data 를 해결하면 host의 /root/data 디렉토리를 container의 /data 디렉토리에 연결한다는 의미이다.

 

컨테이너에 접속하기

docker attach VS docker exec -it

 

둘 다 도커 컨테이너에 접속하는 데 사용되는 명령어이다. 하지만 약간 다른 동작을 수행한다.

 

docker attach <containerName>

이미 실행 중인 컨테이너에 연결한다. 컨테이너가 실행 중인 터미널 세션에 연결되며, 컨테이너에서 나갈 때까지 터미널과 컨테이너 간의 입출력을 공유한다. 

- 컨테이너의 표준 입출력 및 오류 출력에 대한 제어권 획득

- 해당 컨테이너에서 터미널 세션이 하나만 존재해야하며 그렇지 않으면 예기치 않은 동작이 발생할 수 있음

 

docker exec -it <containerID>

이미 실행 중인 컨테이너 안에서 새로운 명령어를 실행한다. 기존 컨테이너의 터미널 세션과 분리된다.

- 여러 개의 터미널 세션을 동시에 실행 할 수 있음

- 실행 중인 컨테이너 내부에서 다양한 명령어를 실행, 작업 수행 가능

 

정리

'docker attach' 는 터미널 세션에 연결하여 입출력을 공유 (단일 세션)

'docker exec -it'는 새로운 터미널 세션을 생성하여 명령어를 실행, 작업 수행 가능 (멀티 세션)

 

 

 

 

 

 

 

 

 

 

'IT > DevOps_' 카테고리의 다른 글

REST API 란?  (0) 2023.06.16
Nginx 그리고 Gunicorn  (0) 2023.06.16
Nginx 란?  (0) 2023.06.15