도커를 공부하며 헷갈리는 개념을 정리하는 공간입니다.
1. Docker build와 Docker run의 차이?
"Docker build"는 이미지를 생성하고 정의하는 데 사용되며, "Docker run"은 이미지를 실행하여 컨테이너를 생성하고 실행하는 데에 사용되는 명령어이다.
2. 컨테이너와 이미지 차이?
예를 들어, Python 어플리케이션을 도커 이미지로 빌드하려고 한다.
Python 코드와 필요한 종속성(라이브러리)을 포함하는 도커 이미지를 만든다.
이후 이 도커 이미지를 사용하여 Python 어플리케이션을 실행하려고 한다. 이미지를 기반으로 컨테이너를 생성하고 시작한다. 컨테이너는 이미지의 인스턴스이며 실행 중인 Python 어플리케이션을 나타낸다.
예를 들어 ubuntu라는 image가 있다. docker create ubuntu 명령어를 3번 부르면 ubuntu라는 이름의 컨테이너가 3개 생기게 되고, 해당 컨테이너들은 docker ps로 확인할 수 있다.
3. Dockerfile과 docker-compose.yml의 차이?
Dockerfile
- docker 이미지를 작성할 수 있는 기능
- Dockerfile 문법으로 이미지 생성을 위한 스크립트를 작성할 수 있음
- 배포를 위해서 많이 활용하는 기능임
- FROM, COPY, RUN 등 주로 대문자
- 경로는 주로 build context의 root 경로에 넣는다.
하지만 만약 다른 경로에 저장하고 싶다면 아래와 같이 build하면 된다.
docker build -f /path/to/a/Dockerfile .
- 주로 docker compose.yml에서 Dockerfile 경로를 지정한다.
services:
web:
build: .
docker-compose.yml
- 여러 컨테이너를 구성&관리하는 기능
- 주로 프로젝트의 최상위 디렉토리에 위치해 있다.
- YAML 파일은 크게 버전, 서비스, 볼륨, 네트워크 정의 4가지 항목으로 구성된다.
- 대략적인 구조
version: "3.5" #Docker Compose 규격 버전
services:
web:
# 웹 애플리케이션 설정
db:
# 데이터베이스 설정
networks:
# 네트워크 설정
volumes:
# 볼륨 설정
- 경로
기본적으로 현재 디렉토리 또는 상위 디렉토리에서 docker-compose.yml 파일을 찾아 컨테이너를 생성한다.
하지만 -f 옵션을 이용해서 위치와 이름을 지정할 수도 있다.
docker-compose -f [파일경로] up -d
- docker-compose up은 가장 많이 쓰이는 명령어이다.
Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 생성하고 실행할 수 있다.
4. Docker Container 통신 방법
Docker Network를 이용 - 같은 호스트 내 Container 간 연결
같은 호스트 내에서 실행 중인 컨테이너 A와 B가 있다고 하자. 이를 도커 네트워크에 연결하여 내부 IP 주소를 통해 통신할 수 있다.
1. Docker Network 생성
docker network create mynetwork
2. ContainerA와 ContainerB를 동일한 네트워크에 연결
docker run --network mynetwork --name containerA containerA_image
docker run --network mynetwork --name containerB containerB_image
Port Forwarding - Container 외부에서 Container 내부 접속
도코 사용시 포트 여는 것을 잊어버리는 원초적인 실수를 주의하자 !! 😥
docker run -p 8080:80 containerA
위의 명령어는 컨테이너A의 포트 80을 호스트의 포트 8080에 매핑(포트포워딩)하는 것을 의미한다. 위에서 볼 수 있는 nginx와 같은 HTTP 서버가 80 포트를 주로 쓴다.
그러면 192.168.65.1:8080 경로로 컨테이너A:80 에 외부에서도 접근할 수 있게 된다.
5. Docker Volume
도커 볼륨에 대한 개념 없이 회사에서 docker run 명령어를 함부로 실행했다가 안에 있던 모든 데이터가 다 날아가버려 가슴졸였던 기억이 있다..ㅠㅠㅠ 다행히 볼륨 설정이 docker-compose에 정리되어 있는데 해당 사실을 반영하지 않고 명령어를 돌렸던 거라 다시 바로 복구할 수 있었다.
볼륨 = 호스트 머신의 볼륨 (로컬 컴퓨터 폴더). 즉 도커가 인식하는 호스트 머신이다.
볼륨은 도커 컨테이너 내부의 폴더에 매핑된다. 이 과정을 마운트(mount)라고 말한다.
docker volume create 볼륨명
docker run –v <볼륨명>:<컨테이너 내 경로> <이미지> (명명볼륨)
6. container 속으로 들어가기
리눅스 서버를 host, docker 서버를 container라고 한다. 바로 위에 그림을 참고하자!
리눅스 서버 접근 시에는 ssh를 이용하여 들어갈 수 있었다. docker container에 들어갈 때에도 아래 명령어를 사용하여 접근할 수 있다. docker exec 명령어로 컨테이너 내부로 들어간 후 /bin/bash 명령어로 bash 셸 세션을 시작할 수 있다.
docker exec -it <container_id> /bin/bash
해당 명령어를 통해 컨테이너 내에 존재하는 여러 디렉토리 및 파일을 볼 수 있다.
7. crontab으로 scheduling 실행하기
리눅스 서버(Host) 내에서 crontab을 이용해 스케줄링 작업을 처리할 수 있다.
아래는 주피터 노트북 container에 들어가서 스케줄링 작업을 실행하는 내용이다.
* 07 * * * docker exec -i <container id> sh -c "/opt/notebooks/WhisperBatchScheduling.sh >> /opt/notebooks/Scheduler_Whisper_logfile.txt"
매일 아침 7시마다 해당 스케줄링 작업을 실행하며, 컨테이너 안에 들어가 shell 작업을 한다. /opt/notebooks 경로에 있는 WhisperBatchScheduling.sh 속 명령어를 실행하고 output은 /opt/notebooks/Scheduler_Whisper_logfile.txt 경로에 저장한다는 의미이다.
'INFRA' 카테고리의 다른 글
[API GATEWAY] KONG API Gateway -2 (0) | 2023.10.25 |
---|---|
[API GATEWAY] KONG API Gateway -1 (0) | 2023.10.23 |
[ELK] Elastic Search ILM 정책 (+추가 에러 핸들링) (2) | 2023.09.25 |
[ELK] GPU 성능 모니터링: Metricbeat와 ELK 스택 (2) | 2023.09.11 |
[ELK] Docker 성능 모니터링: Metricbeat와 ELK 스택 (2) | 2023.09.11 |