SMALL
Docker
아키텍처

- Client : 도커에 대한 조작을 할 수 있는 소프트웨어, docker-cli, docker desktop(GUI)가 있다. CLI 환경을 통해 명령어로 도커 이미지를 빌드하거나 컨테이너를 구동하는 등 작업이 가능하다
- DOCKER_HOST : Docker daemon은 client로 부터 API 요청을 수신, 명령을 처리한다. 명령에 따라 컨테이너나 이미지에 대한 조작이 가능하다
- Registry : 레지스트리는 도커 이미지 저장소로, Github와 유사한 Docker hub가 공식 레지스트리로 알려져있다. 이외에 AWS, Azure, Google 등 타사의 Public cloud 또한 존재한다. 로컬 이미지가 존재하지 않을 경우 도커 허브 공식 레지스트리에서 자동으로 Pull 하게 된다.
docker search mysql
docker pull mysql:8
이미지와 컨테이너

- Docker File : 도커 이미지를 생성하기 위한 Dockerfile을 통해 생성할 수 있다. 기반이 되는 이미지를 선택하여 최초 상태로 사용할 이미지를 레지스트리로부터 불러올 수 있고 패키지 설치, 파일 복사, 환경 변수 설정, 작업 디렉토리 설정 등 이미지의 초기 작업을 설정할 수 있다. 즉, 파이썬을 구동하고자 한다면 레지스트리로부터 파이썬 개발환경 이미지를 지정하여 초기 가상머신 상태를 지정하고 pip를 통해 특정 패키지를 설치하는 동작을 정의할 수 있다.
FROM openjdk:21
WORKDIR /app
COPY build/libs/myproject-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
- Docker Image : 컨테이너를 생성하기 위한 파일 시스템, 실행할 앱의 소스 코드, 라이브러리, 환경 등을 포함하는 템플릿이다. 여러 레이어로 구성되어 있으며 각 레이어는 배포 환경에 맞는 각각의 설정 파일 등을 포함한 읽기 전용 실행 환경이다. Docker File을 빌드 하게 되면 생성되는 것이며 이미지의 이점은 DockerFile 정의를 통해 어디서든 “같은” 환경으로 실행할 수 있도록 환경을 통일한다는 것이다. 필요한 어플리케이션 만을 실행하기 위해 대부분 경량화된 리눅스 운영체제 기반이다.
docker build -t my-spring Dockerfile
docker rmi my-spring //이미지 삭제
- Docker Container : 실제로 어플리케이션이 테스트, 실행, 배포가 되는 정적인 패키지이다. 가상화 된 패키지 환경으로 다른 환경과 격리되어 파일시스템, 네트워크, 환경 등이 독립적으로 구성된다. 컨테이너 실행 시 호스트 OS의 커널을 사용하긴 하지만 그 외의 모든 것이 독립된다. 실행 환경을 종료하거나 재시작, 삭제할 수 있으며 종료를 하더라도 volume으로 상태가 유지되며 여러 컨테이너가 동시에 작동할 수 있다. 호스트의 포트를 맵핑할 수 있으며 도커 네트워크를 생성하고 실행 시 네트워크를 지정하면 각각의 컨테이너들을 같은 네트워크 상에서 구동할 수도 있다.
docker network create app-net
docker run -d -p 8080:8080 --name my-spring --network app-net my-spring
docker ps -a
docker stop [Container ID]
docker rm [Container ID]
Compose
- Dockerfile로 하나하나 이미지 빌드하고 컨테이너 Run 하는 방식이 아닌 docker-compose.yml 파일에 한꺼번에 빌드 및 컨테이너 생성 및 실행할 수 있음
- docker-compose.yml
version: '3.8' #yml 파일 포맷 버전
services:
my-spring:
build:
context: ./spring
dockerfile: Dockerfile
ports:
- "8080:8080"
networks:
- my-net
container_name: my-spring
restart: unless-stopped
depends_on:
- my-mysql
- my-redis
my-mysql:
image: mysql:8.0
container_name: my-mysql
restart: unless-stopped
ports:
- "3306:3306"
networks:
- my-net
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
volumes:
- my-mysql-data:/var/lib/mysql
- ./my_mysql:/docker-entrypoint-initdb.d
my-redis:
image: redis:7-alpine
container_name: my-redis
restart: unless-stopped
ports:
- "6379:6379"
networks:
- my-net
volumes:
- my-redis-data:/data
my-flask:
build:
context: ./flask # flask_app.py가 있는 경로로 변경
dockerfile: Dockerfile # Dockerfile 이름 변경하지 않았다면 생략 가능
container_name: my-flask
restart: unless-stopped
ports:
- "5000:5000"
networks:
- my-net
networks:
my-net:
external: true
volumes:
my-mysql-data:
my-redis-data:
- .env
MYSQL_ROOT_PASSWORD=password123
Docker Hub
- 도커 이미지를 저장하기 위한 레지스트리, 깃허브와 유사하게 개인 레지스트리를 만들 수 있으나 private 레포지토리는 유료이다
- 로그인 및 push, pull 예제
//도커 로그인
docker login -u <username>
//새 이미지를 Push
docker build -t [id]/app:1.0 .
docker push [id]/app:1.0
docker pull [id]/app:1.0 .
//기존 로컬 이미지(some-spring)를 Push
docker tag some-spring someid123/some-spring:1.0
docker push someid123/some-spring:1.0LIST