도커 기본 사용법

도커(Docker)

가벼운 가상화 소프트웨어

핵심 개념: 컨테이너(Container) - 가상 컴퓨터, 이미지(Image) - 운영체제 설치용 CD/DVD

이미지를 기반으로 여러 컨테이너를 생성할 수 있으며, 이미지를 통해 운영체제가 포함된 가상 컴퓨터를 생성합니다.

1. 시작하기

1.1 이미지 실행 및 관리

프로세스: 이미지 --docker run -> 컨테이너

1
docker run 이미지이름 # 이미지 실행
2
docker images # 로컬에 있는 이미지 목록 확인
docker rmi 이미지이름 # 이미지 삭제
3
docker ps # 실행 중인 컨테이너 확인
docker ps -a # 모든 컨테이너 확인 (종료된 것 포함)
#CONTAINER ID   IMAGE     COMMAND     CREATED              STATUS                          PORTS     NAMES
#d1901a4540c2   alpine    "/bin/sh"   약 1분 전            Exited (0) 약 1분 전             beautiful_booth
#"name" 컬럼은 도커가 임의로 생성합니다.
docker rm 컨테이너ID 또는 NAMES (이미지 이름이 아님) # 컨테이너 삭제
#예: docker run hello-world 실행 시, 내부에 인자를 전달할 수 있습니다.
#docker run ubuntu echo 'hello world' 와 동일한 효과

이미지 레지스트리: 도커 이미지를 저장하는 공간으로, 기본적으로 공식 도커 허브를 사용합니다.

모든 이미지에는 태그가 있으며, 이는 버전과 유사합니다. 이미지 뒤에 태그를 추가하여 특정 버전을 지정할 수 있습니다: `docker run mysql:8.0`

  • 공식 이미지 형식: `:`
  • 개인 이미지 형식: `<도커ID>/:` 예: ImRoy/mysql, ImGroot/mysql

1.2 요약

1. 이미지 실행

docker run [옵션] <이미지 이름>|<ID> [명령어]
예: docker run -d hello-world # 백그라운드에서 실행, 출력 없음
예: docker run --name hello hello-world # 컨테이너에 이름 지정

2. 이미지 관리

docker <하위명령어> <이미지 이름>|<ID>
docker images
docker rmi ubuntu
docker pull ubuntu # 레지스트리에서 이미지 다운로드
docker push ubuntu # 레지스트리에 이미지 업로드

3. 컨테이너 관리

docker <하위명령어> <컨테이너 이름>|<ID>
docker rm 컨테이너이름
docker ps
docker logs/start/stop 컨테이너이름
# logs는 컨테이너 실행 시의 모든 로그를 확인할 수 있습니다.

2. MySQL 설치

2.1 이미지 실행 및 컨테이너 생성

docker run mysql:5.7
docker run -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7 # 환경 변수 설정
docker run -p 3306:3306 mysql:5.7 # 호스트 포트와 컨테이너 포트 매핑
docker run -d ... # 백그라운드 실행
docker run --name mysql ... # 컨테이너 이름 지정

2.2 데이터 지속성

컨테이너 외부의 데이터를 영구적으로 저장하는 방법: Bind Mounting, Data Volume

Bind Mounting: 호스트의 지정된 디렉토리를 컨테이너에 마운트

docker -v $PWD/data:/컨테이너경로 mysql:5.7

2.3 도커 전체 정보 확인

docker system info # 도커 애플리케이션 전체 정보 확인 (이미지, 컨테이너 등)
docker system df # 도커가 사용하는 디스크 공간 확인 (크기, 캐시 등)

docker container prune # 모든 종료된 컨테이너 삭제
docker volume prune # 사용되지 않는 볼륨 삭제
docker image prune # 사용되지 않는 이미지 삭제

3. Dockerfile 기본 사용법

자신만의 도커 이미지를 빌드합니다.

Dockerfile 내용: 사용할 운영체제, 사전 설치할 소프트웨어, 소프트웨어 시작 방법 등

docker build: 소스 코드, JAR 파일 등을 이미지로 컴파일

3.1 예시: Spring Boot 이미지 빌드

  1. 프로젝트를 `gradlew clean build`로 패키징합니다. 빌드된 JAR 파일은 `build/libs/xxx.jar`에 위치합니다.
  2. 프로젝트 디렉토리에 `Dockerfile`을 생성합니다.
# 사용할 JDK8 환경
FROM java:8
# JAR 파일을 컨테이너의 루트 디렉토리로 복사
COPY build/libs/xxx.jar app.jar
# 컨테이너 시작 시 실행할 명령어
ENTRYPOINT ["java", "-jar", "/app.jar"]
# 포트 노출 (포트 매핑에서 덮어쓸 수 있어 의미는 크지 않음)
EXPOSE 8080

프로젝트 디렉토리의 터미널에서:

  1. Dockerfile을 사용하여 이미지 빌드:
docker build -t 도커이미지이름:1.0 . #-t는 빌드된 이미지에 태그를 지정(여기서는 1.0)
# 마지막 점(.)은 현재 디렉토리에서 Dockerfile을 찾아 실행하라는 의미
  1. 빌드된 이미지로 컨테이너 생성:
docker run --name 컨테이너이름 -d -p 8080:8080 도커이미지이름:1.0

도커이미지이름이라는 이름의 이미지로 컨테이너이름이라는 이름의 컨테이너를 생성합니다.

`docker ps`로 실행 중인 컨테이너를 확인할 수 있습니다.

`docker logs 컨테이너이름`으로 로그를 확인할 수 있습니다 (예: Spring Boot 프로젝트의 터미널 로그).

`docker logs -f 컨테이너이름`로 실시간 로그를 확인할 수 있습니다.

컨테이너 삭제: `docker rm -f 컨테이너이름` (실행 중인 컨테이너 강제 삭제)

4. Docker Compose

개별적으로 시작된 여러 컨테이너는 독립적이며 데이터 상호 접근이 불가능합니다.

다중 컨테이너 애플리케이션: 프로젝트 패키징 후 여러 컨테이너로 프로젝트를 지원해야 할 경우, 프로젝트 패키징과 컨테이너 시작을 하나의 파일에 작성하고 해당 파일을 통해 시작/중지합니다.

전제 조건: 프로젝트가 `gradlew build`로 JAR 파일로 패키징되었으며, Dockerfile이 이미지 형식을 명시하고 있어야 합니다.

docker-compose up # 이미지 생성 & 컨테이너 생성
docker-compose down # 컨테이너 종료 & 컨테이너 삭제

# 코드 수정 후 단계:
docker-compose down # 컨테이너 종료 및 삭제
./gradlew clean build # 재패키징
docker rmi 앱:1.0 # 이전 이미지 삭제
docker-compose up # 새 이미지 및 컨테이너 생성

파일: `docker-compose.yml`:

version: '3' # yml 파일 구문 버전

services: # 이 도커 컨테이너에서 두 개의 구성 요소 시작
  app:
    build: . # 현재 프로젝트 디렉토리에서 빌드
    image: 앱:1.0 # 사용할 이미지 파일 지정 (프로젝트의 JAR 파일이 Dockerfile로 패키징됨)
    container_name: 앱 # 생성할 서브 컨테이너 이름 지정
    ports: # 포트 매핑 구성
      - '8080:8080'
    depends_on: # 앱이 mysql 컨테이너 시작 후 시작되도록 지정
      - mysql
  mysql: # Spring 설정에서 데이터베이스 접속 주소 수정 필요 (localhost -> mysql)
    image: mysql:5.7
    container_name: mysql
    environment: # 환경 변수 구성
      MYSQL_DATABASE: 'demo'
      MYSQL_PASSWORD: 'root'
    ports:
      - '3306:3306'
    volumes: # 지정된 영구 저장 위치 구성
      - '$PWD/data:/var/libs/mysql'
  • 네트워크 관리: docker-compose는 시작 시 네트워크를 생성하며, 내부의 애플리케이션(구성 요소 또는 서브 컨테이너)은 자신의 이름을 호스트 이름으로 사용합니다. compose 사용 시 Spring 설정을 수정해야 합니다. 예: 데이터베이스 구성 시 localhost/3306 대신 docker-compose에서 구성한 서비스 이름 mysql/3306을 사용해야 합니다.
  • 의존성 관리: depends_on은 컨테이너의 시작 순서만 보장합니다. 컨테이너 시작 후 컨테이너 내부 애플리케이션의 시작 시간은 보장할 수 없습니다 (app 컨테이너에는 app.jar 애플리케이션이, mysql 컨테이너에는 mysql 서비스가 있으며, 외부 컨테이너의 순서만 보장됩니다). 자체 스크립트를 사용하여 mysql의 3306 포트가 시작되었는지 확인할 수 있습니다.
  • docker-compose 이미지만 빌드: 이미지만 빌드하고 컨테이너는 생성하지 않으려면 `docker-compose build`를 사용합니다.

태그: 도커 컨테이너 가상화 Dockerfile docker-compose

8월 9일 11:08에 게시됨