⚠️ 이 블로그는 다른 사람이 보고 따라하라고 적은 게 아닌 작성자의 복기만을 위한 블로그입니다
한달 전에는 이론적인것만 배웠다면 이번에는 실전에서 쓸만한 지식들을 정리해보겠습니다.
기본 개념
- 호스트 : Docker 데몬(dockerd)이 실행되어 컨테이너를 관리하는 물리/가상 머신 (내 컴퓨터)
- 컨테이너 : 이미지를 기반으로 격리된 프로세스로 실행된 애플리케이션 인스턴스
- 네트워크 : 컨테이너 간 및 컨테이너↔호스트 통신을 위한 가상 네트워크
- 외부포트/내부포트 : 호스트포트:컨테이너포트 형태로 호스트와 컨테이너 포트를 연결
- 도커 컴포스 : YAML 파일 하나로 다중 컨테이너(서비스)를 정의·실행하는 도구
- 커밋 : 실행 중인 컨테이너의 파일 변경사항을 새 이미지로 저장하는 명령
- 이미지 : 컨테이너 실행에 필요한 파일·라이브러리·설정을 패키징한 읽기 전용 템플릿
- 도커파일 : 이미지 빌드 스크립트
- 볼륨 / 바인드 마운트 : 데이터 영구화를 위한 호스트-컨테이너 파일시스템 연결
- 레포지토리 : 이미지 저장/공유 장소
- 태그 : 이미지의 버전·변형을 식별하는 레이블
- 레이어 : 이미지가 나누어 저장되는 계층 구조
docker 기본 명령어
- docker ps: 실행 중인 컨테이너 목록을 표시
- docker ps -a: 모든 컨테이너(중지된 것 포함)를 표시
- docker images: 로컬에 있는 모든 이미지를 나열
- docker image pull [NAME[:TAG]]: 레지스트리에서 이미지를 다운로드
- docker image push [NAME[:TAG]]: 로컬 이미지를 레지스트리에 업로드
- docker build [OPTIONS] PATH: Dockerfile로부터 이미지를 빌드
- docker run [OPTIONS] IMAGE: 새 컨테이너를 생성·실행
- docker exec -it CONTAINER CMD: 실행 중인 컨테이너 안에서 명령 실행
- docker stop [OPTIONS] CONTAINER: 실행 중인 컨테이너를 정상 중지
- docker rm [OPTIONS] CONTAINER: 하나 이상의 컨테이너를 제거
- docker volume ls: Docker 볼륨 목록을 표시
- docker compose up:
docker-compose.yml기반으로 모든 서비스(컨테이너) 일괄 실행 - docker compose down: Compose로 띄운 모든 컨테이너·네트워크·볼륨 정리 및 중지
도커를 쓰는 목적에 대한 생각
- 가상환경을 간편하게 만들 수 있다
- 이미 올라온 이미지로 환경설정을 간편하게 할 수 있다
- 내가 이미지를 올려서 다른 컴퓨터에서도 똑같은 환경으로 프로그램을 구동시킬 수 있다
- Docker compose로 환경설정 딸깍이 가능하다
Docker compose - YAML 작성법
기본 구조
- services : 서비스 이름 아래에 image, build, ports, environment, volumes, networks 등을 지정합니다
- networks : 브리지 기본 네트워크 외에 커스텀 네트워크를 설정하고, 각 서비스에서 연결할 네트워크를 지정할 수 있습니다
- volumes : 서비스 아래 volumes 키로 호스트 디렉토리 혹은 named volume을 마운트하거나, 최상위 volumes 섹션에서 외부(external) 볼륨을 참조할 수 있습니다
- environment : 리스트(- VAR=value) 또는 매핑(VAR: "value") 문법을 지원합니다
- env_file : 단일 문자열 또는 리스트로 여러 파일을 병합할 수 있습니다
- ports : 호스트포트:컨테이너포트 형식으로 외부포트를 내부포트에 매핑해, 외부 접근을 가능하게 합니다
- build : build 섹션에 Dockerfile 경로(context, dockerfile) 및 빌드 인자(args)를 지정해 이미지를 자동 생성할 수 있습니다
예시 yaml 파일
version: '3.8'
services:
web:
build:
context: ./web
dockerfile: Dockerfile
image: example/web:latest
depends_on:
- db
ports:
- "8080:80"
environment:
- DEBUG=true
env_file:
- .env
volumes:
- web_data:/var/www/html
networks:
- frontend
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
networks:
- backend
volumes:
web_data:
db_data:
networks:
frontend:
backend: