Docker Installation and Setting Process Through WSL
들어가면서
- Situation
- 새로운 토이프로젝트를 진행함에 있어서 Docker를 사용해서 진행을 해보고자 합니다.
- Condition
- 상황에 따라 개인은 다른 PC에서 작업 가능(개인당 2대 이상의 컴퓨터에서 개발을 진행 가능성)
- 2명 이상의 팀원들과 개발을 진행
- 우선 local로 진행하기 때문에 EC2까지는 불필요 -> 공통으로 사용해야하는 DB만 RDS를 사용하기로 결정
- Consideration
- 나머지 개발 환경에 필요한 Tool 및 Library(Nginx, Kafka, Prometheus, Grafana)..은 PC마다 local download보다는 Docker를 이용하여 동일한 버전의 동일한 Tool을 사용하기로 결정
- Conclusion
- RDS(DB) + Git(Source) + docker-compose.yml을 통해서 서로 다른 모든 PC 같은 공유되는 DB 및 여러 가지 Tool을 이용하여 동일한 환경에서 공유하면서 개발을 가능하게 된다
-
Docker
- Docker : Container 기술을 사용하는 Platform/Tool
- Image 생성/실행/관리
- Image : 실행 가능한 코드와 환경/설정의 정적인 스냅샷
- 생성 :
docker pull
,docker build
- 생성 :
- Container : Docker가 실행하는 가상화된 실행 환경 instance(Image를 실행한 동적인 Instance)
- 생성 :
docker run
,docker compose up
(docker-compose.yml이 위치한 경로에서) - Image만 pull 해둔 상태에서 Container는 존재하지 않음
- 생성 :
- Docker : Container 기술을 사용하는 Platform/Tool
-
Process
- Docker Desktop 설정 및 사용(WLS or Hyper-V)
- Docker Desktop(GUI + Docker Engine) : 내부에서 WSL2 기반으로 실행
- WSL2 : Linux 배포한으로 Container 실행 환경
- Container에서 사용할 Image를 미리 pull
- docker-compose.yml 작성
- 사용할 image의 설정 파일(nginx.conf, prometheus.yml..)을 docker-compose.yml가 있는 경로에 미리 준비
- docker compose up-d 실행
- Docker Desktop 설정 및 사용(WLS or Hyper-V)
-
WSL2
- Windows 내에서 Linux Kunnel을 실행할 수 있는 Microsoft Official Hypervisor
- Docker는 Linux Kunnel 위에서 동작(Window에서는 WSL2 또는 Hyper-V 필요)
Docker Desktop + WSL2
- Window 버전에 따라 WLS or Hyper-V 사용(해당 환경은 Window 10 Home -> WSL2 기반 Docker Desktop 사용)
- PowerShell
wsl --install
-
Docker Desktop
- download :
https://www.docker.com/products/docker-desktop/
- “Use WLS 2 instead of Hyper-V” 활성화
-
Setting > Resources > WSL integration > Enable integration with my default WSL distro 활성화
-
Conception
- Docker Engine : WSL2 위에서 돌아가는 Container Runtime
- Docker CLI: PowerShell/WSL/CMD 어디서든 사용 가능(docker 명령어)
- Docker Compose : 여러 Container를 묶어서 실행하는 도구
- Dashboard : Image/Container 상태 시각화/log 보기
-
Check Installation
- WLS2 installation check
- 실행중 :
STATE : Running
/ WLS 사용 :VERSION : 2
wsl --list --verbose
- Docker installation check
docker info docker version
- download :
-
Image pull
-
Container 실행에 필요한 이미지를 직접 download
- image가 없을 경우에
docker-compose up
를 진행하게 되면 느리게 download -> Image를 미리 pull할 것을 권장 docker pull
: Docker Hub에서 Image를 download- bash
# Redis docker pull redis:alpine # Nginx docker pull nginx:latest # Prometheus docker pull prom/prometheus # Grafana docker pull grafana/grafana # Kafka docker pull bitnami/kafka docker pull bitnami/zookeeper
- result
- image가 없을 경우에
-
Container 생성 시 Image 일괄적으로 pull
-
docker-compose.yml
을 기반으로 Container에 필요한 이미지들을 설정된 정보에 따라 일괄적으로 download docker-compose.yml
작성version: '3.8' services: redis: image: redis:alpine container_name: redis ports: - "6379:6379" zookeeper: image: bitnami/zookeeper:latest container_name: zookeeper environment: - ALLOW_ANONYMOUS_LOGIN=yes ports: - "2181:2181" kafka: image: bitnami/kafka:latest container_name: kafka depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_CFG_LISTENERS: PLAINTEXT://:9092 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 ALLOW_PLAINTEXT_LISTENER: yes prometheus: image: prom/prometheus container_name: prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml grafana: image: grafana/grafana container_name: grafana ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana nginx: image: nginx:latest container_name: nginx depends_on: - redis ports: - "8080:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro volumes: grafana_data:
- result
-
-
-
Container
-
Command
- docker 실행/중지
docker compose up -d docker compose down
- docker 상태 확인(각 Container의 상태 Up, Exited, Restarting 확인)
docker compose ps docker ps
- docker 실행/중지
-
Process of
docker compose up -d
- docker-compose.yml 파싱
- services, image, ports, volumes, environment, depends_on.. 메모리에 구성
- network 생성
- Compose는 각 프로젝트에 대해 고유한 Network(Bridge 타입) 생성
- Container간
ContainerName:port
형태로 통신 가능하게 함(kafka -> zookeeper:2181) - bash
docker network create [DirectoryName]_default
- Docker Volume 생성
- Image Pull / Check Local Cache
- Local Image 존재 : 재사용
- Local Image 존재하지 않음 : DockerHub/Bitnami.. 에서 자동 pull
- Container 생성 순서 지정(
depends_on
)- 의존 대상 Container부터 생성(kafka : zookeeper 이후에 생성)
- Container Create + Start
- Port Binding
- 호스트(Windows/WSL2)의 port를 Container port에 bind
- 이미 사용 중일 경우 :
Ports are not available: bind: An attempt was made to access a socket...
Error 발생
- Mount 경로 검증
- docker-compose.yml에 명시된 경로의 존재 여부 확인
- 위의 docker-compose.yml 기준 docker > nginx.conf, prometheus.yml
- 백그라운드 모드(-d)로 실행
- 모든 Container는 Daemon mode로 background에서 실행
-
정상 실행 상태 확인
- docker-compose.yml 파싱
-
-
Docker <-> Window 네트워크 접근
- Window -> Docker :
localhost:<지정된 port>
사용 - Docker -> Window :
host.docker.internal
사용- WSL2에서 Windows Host에 접근할 때 사용하는 내부 DNS 주소
- Window -> Docker :
-
Windows에서 Docker Image에 접근하는 Port
- Nginx -> localhost:8080
- Prometheus -> localhost:9090
- Grafana -> localhost:3000
- Redis -> localhost:6379
- Kafka -> localhost:9092