⛳️ 도커의 개념과 장점 그리고 간단한 사용방법에 대해 알아보자.
Docker란?
Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있도록 도와주는 오픈 소스 플랫폼입니다. Docker는 컨테이너라는 가벼운 가상화를 사용하여 애플리케이션과 그 종속성을 패키징하고 실행합니다.
컨테이너는 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 독립적인 환경입니다. 이는 호스트 운영체제와 분리되어 있으며, 동일한 컨테이너가 어디서든 동일한 방식으로 실행될 수 있습니다.
Docker의 주요 구성 요소
🏷️ Docker 이미지: 코드, 런타임, 시스템 도구, 라이브러리 등을 포함한 패키지. 한 번 빌드된 이미지는 여러 컨테이너에서 재사용할 수 있습니다.
🏷️ Docker 컨테이너: 이미지를 기반으로 생성된 실행 가능한 인스턴스. 컨테이너는 격리된 환경에서 애플리케이션을 실행합니다.
✔️ 가상머신 vs 컨테이너
가상 머신
Hypervisor를 이용해 하나의 Host에서 여러 개의 OS를 생성 (컨테이너에 비해 무거운 이유 1)해 사용하는 방식입니다. 이들 각 OS를 Guest OS라고 하며, 서로 간에 완전히 독립된 공간을 할당받습니다. 이 공간을 Virtual Machine이라고 합니다.
그러나, 이러한 방식의 작업은 Hypervisor를 반드시 거쳐야 하기 때문에 성능이 저하됩니다. 또한 각 Virtual Machine은 Guest OS를 위한 Library, Kernel 등을 모두 포함(컨테이너에 비해 무거운 이유 2)해야 하므로 배포를 위한 image 생성 시 그 크기가 커집니다.
컨테이너
각 Container 안에는 Application 구동을 위해 필요한 파일만 존재하며 필요한 Kernel은 Host의 Kernel을 공유받아 사용하므로 image 생성 시의 그 크기가 대폭 줄어듭니다.
🏷️ Dockerfile: 이미지를 빌드하는 데 사용되는 설정 파일. Dockerfile에는 애플리케이션을 어떻게 설정하고 빌드할지에 대한 명령어가 포함되어 있습니다. (docker compose와 헷갈리는 경우가 있는데 이는 나중에 포스팅할 예정)
🏷️ Docker Hub: Docker 이미지를 저장하고 공유할 수 있는 저장소. 사용자는 자신의 이미지를 Docker Hub에 업로드하거나 다른 사용자의 이미지를 다운로드할 수 있습니다.
Docker를 왜 쓰나요?
개념은 그렇다 치고 그래서 왜 모두가 이걸 쓸까? 무슨 장점이 있을까? 를 알아야 한다. 이런 장점들을 반드시 알아야 늘 어떤 프로젝트에 어떤 조건이 있을때 이 기술이 필요한가? 에 이러이러해서 좋다!라는 답변을 할 수 있게 된다.
일관된 환경 제공
Docker는 컨테이너 격리와 이미지 기반 배포를 통해 "어디서나 실행 가능"한 환경을 제공합니다. 개발 환경, 테스트 환경, 프로덕션 환경 간의 일관성을 유지할 수 있어 "내 컴퓨터에서는 잘 되는데..."라는 문제를 줄여줍니다.
빠른 배포
Docker 컨테이너는 운영체제 커널을 공유하며, 가상 머신보다 훨씬 가볍게 실행할 수 있다. 그리고 이미지 또한 캐싱하기 때문에 애플리케이션의 배포 시간을 단축시키고, 개발 및 테스트 프로세스를 효율적으로 만듭니다.
→ Docker는 레이어드 파일 시스템을 사용하여 이미지를 캐싱합니다. 이는 변경된 부분만 다시 빌드하고 나머지는 재사용할 수 있게 해줍니다.
효율적인 자원 사용
컨테이너는 운영체제를 공유하기 때문에 각 컨테이너가 별도의 운영체제를 실행하는 가상 머신보다 자원을 적게 사용합니다. 가상 머신보다 가벼우며, 시스템 자원을 효율적으로 사용할 수 있습니다. 이는 더 많은 애플리케이션을 동일한 하드웨어에서 실행할 수 있게 합니다. Docker는 필요한 부분만 메모리에 로드하는 방식(레이지 로딩)을 사용하여 자원 사용을 최적화합니다.
확장성
Docker는 마이크로서비스 아키텍처와 잘 어울립니다. 각 서비스는 독립적인 컨테이너로 실행되며, 필요에 따라 개별적으로 확장할 수 있습니다.
❓ 도커 덕분에 MSA를 하게 되면 뭐가 좋나요?
한 서비스의 장애가 전체의 장애로 이어지지 않는다. 는게 중요하다.
예를 들면 웹 서비스를 DB Container와 웹 서버 Container로 분리하면 유지 보수가 용이해진다. 만약 웹 서비스에 부하가 발생할 경우, 전체 구조에서 웹 서버 Container만을 동적으로 늘려 부하를 분산시킬 수 있다. → `Load Balancing`
이동성
Docker 이미지는 어디서든 실행할 수 있습니다. 로컬 개발 환경, 클라우드 서비스, 온프레미스 데이터 센터 등 어디서든 동일한 이미지를 사용할 수 있어 이동성이 뛰어납니다.
커뮤니티 및 생태계
Docker는 큰 커뮤니티와 풍부한 생태계를 가지고 있습니다. 수많은 오픈 소스 도구와 확장이 존재하며, 이를 통해 다양한 기능을 쉽게 통합할 수 있습니다. (이거 절대 무시 못한다.. 커뮤니티 없었으면 난 .... 👀)
[Docker 사용 예시]
개발 환경 설정
개발자는 Docker를 사용하여 일관된 개발 환경을 설정할 수 있습니다. Dockerfile을 작성하여 필요한 개발 도구와 라이브러리를 설치하고, 이를 기반으로 컨테이너를 실행하여 개발을 진행합니다.
CI/CD 파이프라인
Docker는 지속적 통합 및 지속적 배포(CI/CD) 파이프라인에서 자주 사용됩니다. 코드를 빌드하고 테스트하는 과정에서 Docker 이미지를 생성하고, 이를 배포하여 프로덕션 환경에서도 동일한 이미지를 사용할 수 있습니다.
마이크로서비스 아키텍처 (MSA)
Docker는 마이크로서비스 아키텍처를 구현하는 데 이상적입니다. 각 서비스는 독립적인 컨테이너로 실행되며, 필요에 따라 개별적으로 업데이트하거나 확장할 수 있습니다.
도커 사용 방법 (기초)
⚙️ 도커 설치
도커 공식 홈페이지에서 다운을 받고 설치하는 것은 굉장히 쉽다.
설치가 끝난 후 제대로 설치되었는지 아래 커맨드로 확인해보자.
docker images
📨 이미지 사용하기
도커에서 실행시키고 싶은 이미지를 설치해보자.
pull : 이미지 다운받기
예시로 nginx 이미지를 다운 받는다.
docker pull nginx
images : 다운한 이미지 확인
설치가 잘되었는지 확인해보자. docker에 다운 받은 모든 이미지 목록을 볼 수 있다.
docker images
rmi : 이미지 삭제
docker rmi [이미지이름(REPOSITORY)|| 이미지 아이디(IMAGE ID)]
🏃♂️ 컨테이너 사용하기
run : 새 컨테이너 생성하기
새 컨테이너를 생성하고, 이미지를 기반으로 해당 컨테이너를 실행하자.
docker run --name nginx -p 8000:80 -d nginx
docker run 명령어를 통해 실행한다
- --name 이라는 옵션으로 컨테이너 이름을 지정한다.
- -p 옵션으로 도커에서 실행되는 port와 현재 호스트가 되는 내 PC의 port를 연결시켜준다.
- 위 설정은 내 PC 8000번 포트에 도커 컨테이너 80 포트를 포트 포워딩을 한 예이다.
- -d 옵션으로 detached mode 즉 백그라운드로 실행을 시킨다.
- 마지막 nginx는 도커 이미지의 이름이다
📔 run 옵션
docker run -it--restart unless-stopped --name nginx -p 8000:80 -d nginx
- --restart : 컨테이너의 프로세스 종료시 재시작 정책을 설정 하는 옵션
- 어떤 값을 주느냐에 따라서 재시작 설정을 할 수 있다.
- --restart unless-stopped : 도커 서비스 재시작시 컨테이너도 재시작
- --restart no : 컨테이너 재시작 안함
- --restart on-failure : 프로세스의 exit code 0 이 아닐 때 재시작
- --restart always : 무조건 재시작 (프로세스 exit code 영향을 받지 않음)
ps : 컨테이너 실행 확인
도커에 실행되고 있는 프로세스(?)를 보자. 우리 명령어 대로 잘 되는걸 볼 수 있다.
docker ps [-a(all)]
stop : 컨테이너 실행 정지
컨테이너 실행을 정지하는 것이지 컨테이너를 삭제하는 것은 아니다.
docker stop nginx
ps로 확인을 해보니 정지된 상태를 볼 수 있다.
start : 컨테이너 시작
이미 생성된 컨테이너를 재시작합니다.
docker start nginx
rm : 컨테이터 삭제
컨테이너를 정지 시키는 것이 아니라 아예 도커에서 삭제해보자.
docker rm nginx
exec : 컨테이너 접속
❓ 컨테이너 접속은 왜 하죠? 할 수 있는 일이 뭐가 있죠?
애플리케이션이 제대로 작동하지 않거나 에러가 발생했을 때, 로그 파일을 확인하여 문제의 원인을 파악할 수 있습니다
1. 로그 확인
애플리케이션이 제대로 작동하지 않거나 에러가 발생했을 때, 로그 파일을 확인하여 문제의 원인을 파악할 수 있습니다.
docker exec -it <컨테이너_ID> /bin/bash
# 컨테이너 내부로 들어간 후
cat /path/to/log/file.log
2. 설정 파일 수정
애플리케이션의 설정 파일을 수정해야 할 때, 컨테이너 내부로 접속하여 직접 파일을 편집할 수 있습니다.
docker exec -it <컨테이너_ID> /bin/bash
# 컨테이너 내부로 들어간 후
vi /path/to/config/file.conf
3. 디버깅
애플리케이션의 특정 부분이 제대로 작동하지 않을 때, 컨테이너 내부에서 직접 명령어를 실행하여 디버깅할 수 있습니다.
docker exec -it <컨테이너_ID> /bin/bash
# 컨테이너 내부로 들어간 후
python manage.py shell # Django 예시
4. 패키지 설치 및 업데이트
애플리케이션이 필요로 하는 패키지나 라이브러리를 설치하거나 업데이트할 수 있습니다.
docker exec -it <컨테이너_ID> /bin/bash
# 컨테이너 내부로 들어간 후
apt-get update && apt-get install -y <package_name>
5. 데이터베이스 접근
데이터베이스와 연동된 애플리케이션의 경우, 데이터베이스에 직접 접속하여 쿼리를 실행하거나 데이터를 확인할 수 있습니다.
docker exec -it <컨테이너_ID> /bin/bash
# 컨테이너 내부로 들어간 후
mysql -u root -p
공식
출처
같이 읽으면 좋을 사이트