안녕하세요 이번 포스팅에서는 Docker
에 관련된 모든 실습을 해보고 정리하는 시간을 가지려고 합니다 👨💻
이번 포스팅을 이해하기 위해서는 docker
에 대한 개념적인 이해가 필요합니다.
필요하다면 [서버]도커에 대해 을 참고 부탁드립니다 ❗️
실습해 볼 항목들에 대해 살펴보겠습니다.
step 1.
docker
기본 명령어 알아보기
Step 2.
Dockerfile
에 대한 명령어를 살펴보고 내가 만든 이미지를 빌드하여 실행시켜보고Dockerhub
에 푸쉬해보기
Step 3.
Docker-Compose
에 대한 명령어를 살펴보고 독립적인 여러 컨테이너를 구동 및 관리해보기
본격적으로 실습에 들어가기 전 필요한 준비을 해보겠습니다.
먼저 도커 홈페이지 에 접속하여 도커를 다운받아줍니다.
여기서 Docker Desktop
을 설치해주는 것을 추천드립니다 ❗️
Docker Desktop
은 Docker
을 사용하는 개발자의 편의를 위해 GUI
를 제공하여 컨테이너, 애플리케이션, 이미지를 좀 더 효율적으로 관리하도록 도와줍니다.
Docker Desktop
을 이용하면 Docker
기본 명령어를 몰라도 문제 없이 Docker
을 사용할 수 있지만, 앞으로 배울 Docker
기본 명령어를 알고 있으면 CLI
환경에서 좀 더 효율적으로 Docker
을 활용할 수 있습니다 ❗️
docker --version
=> Docker version 20.10.03, build 7155243
해당 명령어를 통해 설치한 Docker
의 버전이 나온다면 정상적으로 설치가 완료되었습니다.
Docker Hub
란 Docker
이미지를 저장하고 관리하기 위한 공식적인 온라인 플랫폼입니다.
Docker
이미지는 애플리케이션 즉 컨테이너를 실행하는 데 필요한 모든 것을 포함하는 가볍고 효율적인 패키지인데, Docker Hub
을 통해 사용자는 이미 만들어진 공개 이미지를 찾아보고 다운로드 할 수 있으며, 자신이 작성한 이미지를 업로드하고 관리할 수도 있습니다.
개발자의 필수 플랫폼인 Git Hub
처럼 사람들이 자유롭게 Docker
이미지를 올리고 다운받을 수 있는 플랫폼이라고 생각하면 됩니다 🧑🔧
docker hub 사이트 에 들어가서 가입을 하면 다른 사용자들이 push 해 놓은 다양한 이미지를 검색하고 다운받을 수 있습니다 🔥
이제 본격적인 실습을 해보겠습니다 ❗️
docker search [옵션] <이미지 이름>
Dockerfile
은 도커의 이미지를 생성하기 위한 스크립트입니다.
처음 Docker
을 활용해본 이라면 Docker hub
에 존재하는 다른 개발자가 만들어놓은 이미지를 pull 해서 사용해봅니다.
예를 들어, 로컬에서 Spring boot
을 이용해서 개발을 진행 중일 때, Mysql
과 Redis
서버가 필요하다고 가정해봅시다.
개발자가 직접 로컬에 둘을 설치해도 되지만 Docker
의 컨테이너 기술을 이용한다면 단 몇줄의 명령어로 편하게 해당 서버를 구축할 수 있습니다 👍
mysql container 을 로컬에 띄우는 명령어입니다 ❗️
// mysql container
docker run -it -d --name mysql-container \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=test_db \
-p 3306:3306 \
mysql:latest
다음으로 redis container 을 로컬에 띄우는 명령어입니다 ❗️
// redis container
docker run -d --name redis-container \
-p 6379:6379 \
redis:latest
여기서 예시로 든 docker run
명령어는 존재하는 이미지를 해당 설정을 토대로 컨테이너화 하는 명령어 인데, 만약 로컬에 해당하는 이미지가 없다면 자동으로 docker hub
에서 이미지를 pull 합니다.
명시적으로 docker pull <이미지 이름>
을 통해 docker hub
로 부터 이미지를 로컬로 pull 할 수도 있습니다 🐳
하지만, Dockerfile
을 개발자가 직접 작성하므로써, 아예 새로운 이미지를 생성하기도 하고 존재하는 이미지를 바탕으로 여러가지 기능을 추가하여 새로운 이미지를 생성하기도 합니다.
앞서 배운 Docker
의 컨테이너 가상화 기술은 개발자의 인프라 구축에 대한 수고를 덜어주며 할당된 컴퓨팅 리소스를 효율적으로 활용가능합니다.
그렇다면 하나의 어플리케이션을 완성하기 위해 여러 컨테이너의 동시적인 구동이 필요하다고 생각해봅시다.
일반적인 어플리케이션은 2개 이상의 컨테이너를 필요로 하며 서로 의존성을 가지고 있는 경우도 많습니다.
예를 들어, 내가 만든 Spring application 을 컨테이너로 구동시키기 위해 이미지로 만들고 이에 필요한 MySql
서버와 Redis
서버 그리고 Message Queue
에 관련된 서버 등 다양한 도커 컨테이너가 필요하다고 가정해봅시다.
각각의 인프라에 관련된 이미지를 가지고 run
명령어에 옵션을 설정해 CLI(Command Line Interface)
을 통해 컨테이너화 할 수 있지만, 개발자 입장에서는 매우 번거롭고, 일괄적인 실행,종료 및 삭제가 힘듭니다🤔
이러한 개발자의 번거로움을 덜어주고 하나의 어플리케이션과 관련된 여러 컨테이너를 효과적으로 구동,정지 및 삭제 할 수 있는 소프트웨어가 바로 Docker Compose
입니다 ❗️
Docker Compose
는 컨테이너 여럿을 띄우는 도커 어플리케이션을 정의하고 실행하는 도구입니다.
Docker Compose
는 여러개의 도커 컨테이너의 옵션과 환경을 정의한 파일을 읽어 컨테이너를 순차적으로 생성하는 방식으로 동작합니다.
Docker Compose
의 설정 파일은 run
명령어의 옵션을 그대로 사용할 수 있으며, 각 컨테이너의 의존성
,네트워크
,볼륨
등을 함께 정의할 수 있습니다 ❗️
Docker Compoase
을 사용하려면 호스트 컴퓨터에 폴더를 만들고 이 폴더에 정의파일(=YML
) 을 배치합니다.
정의 파일의 이름은 미리 정해진 docker-compose.yml
이라는 이름을 사용해야 하며, 파일은 호스트 컴퓨터에 배치되지만 명령어는 똑같이 도커 엔진에 전달됩니다.
즉, 만들어진 컨테이너들은 도커 엔진 위에서 동작합니다.
정리하자면, 개발자가 하나하나 입력하던 명령어를
Docker Compose
가 대신 입력해주는 역할을 하는 구조입니다.
또한, 정의 파일은 한 폴더에 하나만 존재해야 하며, 만약 여러개의 정의 파일을 사용하려면 폴더를 그만큼 생성해서 각 하나씩 배치해야 합니다.
도커에 대해 익숙치 않은 상태에서 도커와 관련된 것들을 배우다 보면 도커 카테고리에 속하는 여러 소프트웨어의 각 역할이 헷갈릴 수 있을 것입니다.
DockerFile
은 단지 도커 이미지를 생성하기 위한 파일
이며, 주변환경(Volume
,Network
) 등은 설정할 수 없습니다.Docker Compose
는 시스템 구축과 관련된 명령어를 하나의 정의 파일에 기재해, 명령어 한번에 시스템 전체를 실행하고 종료와 삭제 까지 한번에 처리할 수 있는 소프트웨어
입니다. Kubernates
는 여러 컨테이너를 관리하는 도구입니다.docker run 커맨드 사용법
[Docker] Docker run 옵션 종류
도커 컴포즈(Docker Compose)
Docker-compose 란