예전에 학교에서 이론을 배웠지만 기억이 잘 안나는 관계로 공부 겸 정리 하여 작성해 보려고 합니다.
Docker란?
Go언어로 작성된 리눅스 컨테이너를 기반으로 하는 오픈소스 가상화 플랫폼입니다.
도커를 알기 위해선 가상머신(virtual machine)에 대해 알아야 합니다.
가상 머신은 Host OS 위에 하이퍼 바이저를 거쳐 각각의 게스트 OS를 실행합니다.
예시로 윈도우 운영체제 위에 VirtualBox같은 소프트웨어를 설치하여 우분투 운영체제를 구동하는 방식이 있습니다.
위와 같은 방식은 하나의 하드웨어 위에서 여러개의 운영체제를 운영할 수 있다는 장점이 있지만, 가상 머신으로 무엇인가를 하려면 하이퍼바이저를 거쳐야 하기 때문에 속도 저하가 필연적입니다. 또한 가상머신을 배포할 때의 프로그램(.iso 확장자)의 크기가 커지는 단점이 있습니다.
반면에 컨테이너는 하이퍼바이저를 거치지 않고 호스트 OS 위에 컨테이너를 생성하는 방식입니다.
단위가 운영체제가 아니라 컨테이너로 구성되기 때문에 배포할 때의 이미지 크기가 줄어드는 장점이 있습니다.
이미지란?
가상 머신이나 컨테이너에서 애플리케이션을 실행하는데 필요한 모든 것(소스 코드, 라이브러리, 도구 및 응용 프로그램)을 담고 있는 패키지 입니다.
이미지는 읽기 전용이며, 스냅샷이라고도 합니다. 이유는 불변성과 재현성을 제공하여 환경간 일관된 실행을 보장하기 위해서 입니다.
이미지는 여러 계층(layer)로 구성되는데, 각 계층은 이전 계층을 기반으로 변경된 내용을 담고 있습니다. 이러한 계층 구조는 이미지를 가볍고 효율적으로 만들어주고 변경 사항이 있는 부분만 업데이트 됩니다. 전체 내용을 다운 받지 않고 새로운 레이어만 다운 받아 경량화가 가능합니다.
또한 도커 허브(Docker Hub)같은 중앙 이미지 레지스트리에서 공유되거나 자체적으로 만들 수 있습니다.
컨테이너란?
애플리케이션을 실행하기 위한 환경을 하나의 독립된 단위로 캡슐화하는 것.
하이퍼바이저를 거치지 않고, 호스트OS 위에서 바로 구동되어 가볍게 프로세스를 구동할 수 있습니다.
즉, 운영체제가 아닌 하나의 프로세스를 돌리기 위한 캡슐화된 단위 입니다.
그리고 컨테이너는 이미지와 달리 수정이 가능합니다.
이미지와 컨테이너는 붕어빵과 붕어빵틀의 관계를 가집니다. 클래스와 인스턴스의 관계라고도 할 수 있습니다.
도커란?
컨테이너 기반 가상화 기술을 제공하는 플랫폼. 애플리케이션을 환경과 함께 하나의 독립된 단위로 캡슐화하여 효율적으로 배포 및 실행할 수 있게 해주는 도구입니다.
서버 1대에서 작동하지 않고 2대, 3대, 4대 ... 여러 개의 서버에서 동작할 때 예외 없이 모두 같은 동작을 수행하도록 보장합니다. 도커를 사용해 하나의 이미지를 배포하면 됩니다. 아주 간편하죠.
이미지 불러오기 or 생성,
도커 이미지 불러오기(pull)
docker pull 이미지_이름:태그
# 실제 예시
docker pull ubuntu:latest
도커 이미지 생성(build)
# 베이스 이미지 선택
FROM python:3.8-slim
# 작업 디렉토리 설정
WORKDIR /app
# 현재 디렉토리의 파일들을 이미지의 작업 디렉토리로 복사
COPY . /app
# 파이썬 스크립트 실행
CMD ["python", "script.py"]
script.py 파일 생성
print('Hello, World!')
Dockerfile이 있는 디렉토리에서 다음 명령어 실행
docker build -t 내_이미지_이름:태그 .
# -t : tag의 약자 생성된 이미지에 이름과 태그를 부여하는 역할
docker build -t my_python_app .
마지막에 .
를 꼭 입력해 주어야 합니다. .
은 현재 디렉토리를 의미하기 때문에 현재 디렉토리에서 실행하라는 의미가 됩니다.
도커 컨테이너 생성(run)
docker run -d --name 내_컨테이너_이름 생성할_이미지_이름
# -d : 컨테이너를 백그라운드에서 실행
# -name : 생성된 컨테이너에 이름을 부여
docker run my_python_app
실행시 백그라운드에서 동작되는 것이 기본값입니다.
docker run my_python_app 처럼 --name으로 컨테이너 이름을 지정해 주지 않으면 도커는 임의의 이름을 생성합니다. 또한 --name을 이용하여 이미 생성된 컨테이너와 같은 이름을 입력하려 한다면 도커에서 에러를 반환할 것 입니다.
docker run -it 이미지이름:태그 /bin/bash
# /bin/bash는 컨테이너 안에서 대화형으로 쉘을 실행하도록 하는 명령어
# -i : 대화형(interactive)모드로 실행하도록 하는 옵션
이렇게 실행하면 컨테이너 생성 후 vim을 이용하여 수정이 가능합니다.
도커 종료
exit
실행중인 컨테이너를 수정하고 싶을 때
docker exec -it 컨테이너ID /bin/bash
# 컨테이너ID 대신 컨테이너 이름도 가능합니다.
이미 실행 중인 컨테이너에 대해 대화형 모드로 쉘을 실행. 이 후에 vim 같은 편집기를 사용하여 파일 수정이 가능합니다.
'[Cloud] > [Docker]' 카테고리의 다른 글
[Docker] 도커 빌드 캐시 공유 가능한 명령어, 공유 불가 명령어 (2) | 2024.03.08 |
---|---|
[Docker] Docker cache 빠른 빌드 (0) | 2024.03.08 |
[Docker] 도커파일 기본설정 ubuntu, alpine, python:3.9-slim (0) | 2024.03.05 |
[Docker] 도커 기본 명령어 (2) | 2023.12.11 |