서비스 운영에 필요한 OS, 서버 프로그램, 소스코드, 설정 파일 등 필요한 모든 파일들을 묶는 형태, ISO와 동일
Immutable한 상태
Dockerhub을 통해 공유되는 것들이 이미지
Dockerhub에서 pull하면 이미지를 받아올 수 있고, push하면 이미지를 버전 관리하여 올릴 수 있음
Dockerfile에 적어놓은 대로 이미지를 생성/빌드(Dockerfile : 이미지 제작 레시피)
컨테이너
이미지를 실행시킨 상태, VM와 동일
당연히 컨테이너 상에서 작업한 내용은 이미지랑 상관이 없음
Dockerfile, docker-compose.yml 내용 정리
Dockerfile
1 2
FROM ubuntu:20.04 => 새로운 이미지의 기반이 될 이미지(base 이미지) ENTRYPOINT ["echo", "hello"] => 컨테이너를 시작할 때 실행할 명령어
Dockerfile로 이미지 빌드
1 2
$ docker build --tag myimage:1.0 . # 현재 디렉토리(Dockerfile 있는)에 myimage라는 이름으로 도커 이미지를 생성/빌드 $ docker images # 내 컴퓨터에 갖고 있는(어디서 받아왔거나 내가 만들었거나) 이미지 목록 출력
생성된 이미지로 컨테이너 생성, 실행
1 2 3 4 5 6 7 8 9 10 11 12 13
$ docker create & docker start # 이미지로부터 컨테이너 생성 & 컨테이너 시작 == run $ docker run --rm myimage:1.0 # run 명령어는 이미지를 기반으로 컨테이너를 생성 후 실행하는 명령어, --rm : 컨테이너 종료될 때 컨테이너 자동 삭제 $ docker run -d --name web -p 8080:80 -e MYSQL_PASS=root nginx:latest # -d : 백그라운드 실행, --name : 컨테이너 이름 지정, -e : 환경변수 전달 $ docker container ls# 실행중인 컨테이너 목록 $ docker ps # 실행중인 컨테이너 목록 $ docker ps -a # 모든 컨테이너 목록(실행 중 아니어도) $ docker stop web(or ID) # 컨테이너 실행 중지 $ docker rm web # 컨테이너 삭제 $ docker exec -it web /bin/bash # 실행 중인 컨테이너에 bash로 접속 $ docker run -d --name web --rm \ > --mount type=bind,src=/home/vagrant/html,dst=/usr/share/nginx/html \ # mount : 로컬 디렉토리와 컨테이너 디렉토리를 연결 > -p 8080:80 \ > nginx:latest
Dockerfile 예제 - 2
1 2 3 4 5 6 7 8 9 10
#!/bin/sh # entrypoint.sh => 스프링 어플리케이션을 실행시키기 위한 스크립트
FROM openjdk:8-jdk-alpine => 이미지를 받아와서 RUN apk --no-cache add tzdata && cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime => 실행할 명령어 1(패키지 설치)
WORKDIR /app => 작업 디렉토리 지정(없으면 새로 생성) COPY hello.jar hello.jar => Dockerfile 있는 디렉토리에 있는 파일을 이미지로 복사 COPY entrypoint.sh run.sh => Dockerfile 있는 디렉토리에 있는 파일을 이미지로 복사 2(다른 이름으로 저장) RUNchmod 774 run.sh => 실행할 명령어 2(sh 파일 실행권한)
ENV PROFILE=local => 이미지에서 사용할 환경변수 값 지정, 여기까지 이미지 빌드 내용
ENTRYPOINT ["./run.sh"] => 이 이미지로 컨테이너를 생성할 때 실행할 명령어
1 2
$ docker build --tag myspring:1.0 . $ docker run -rm -p 80:9090 myspring:1.0 => host 포트 : 컨테이터 포트 매칭
도커 볼륨
mount의 bind와 달리 도커에서 직접 관리하는 파일 시스템
여러 컨테이너에서 공유 가능
1 2 3 4 5 6
$ docker vulume create --driver local myvol # --drivder : 볼륨 생성시 사용할 스토리지 드라이버 $ docker run -d --name web --rm \ > --mount type=volume,src=myvol,dst=/usr/share/nginx/html \ # 도커 볼륨과 컨테이너 디렉토리를 연결 > -p 8080:80 \ > nginx:latest $ docker volume prune # 사용 중이지 않은 볼륨 모두 삭제
도커 네트워크
1
$ docker network ls# 도커가 제공 중인 네트워크 목록
docker-compose.yml
도커 명령어를 yml 파일로 관리해서 좀 더 간단하게 만들기 위해 사용(각종 옵션 너무 길어짐..)
특히 여러 도커 컨테이너끼리 연동시켜야 하는 경우(여러 컨테이너 사용하는 경우) 더 효과적임