docker cli vs Dockerfile vs docker-compose
1. Docker
docker cli는 단일 컨테이너를 위한 명령어들을 제공합니다.
예를들어 이미지를 생성하려면, $ docker pull [IMAGE]
컨테이너를 생성하려면 $docker create [OPTIONS] IMAGE [COMMAND]
즉, 단일 컨테이너에 대해서 만들거나, 실행하거나 하는 용도로 사용되는 명령어입니다.
2. Dockerfile
도커 파일은 이미지를 생성할 때, 해당 이미지 안에 기본적으로 어떤 소프트웨어를 설치할지 결정하는 도구입니다.
예를들어 $ docker pull ubuntu 를 사용하여 이미지를 받으면 우분투만 들어있는 깡통 이미지만 받아와 집니다.
해당 이미지에 저희는 컨테이너를 만들고 접속하여 원하는 소프트웨어를 설치하는 작업을 거쳐야 합니다.
하지만 Dockerfile을 사용하면, 이미지 안에 어떤것들을 설치할지 결정할 수 있으며 사용자가 작성한 대로 이미지가 만들어 집니다. 즉, 이미지를 커스터마이징 할 수 있게 도와줍니다.
예를들어,
FROM ubuntu:20.04
ARG=DEBIAN_FRONTEND=noninteractive
EXPOSE 80
WORKDIR /
RUN apt update
RUN apt upgrade -y
RUN apt install apache
RUN apt install curl && \
curl -OL https://github.com/google/protobuf
3. docker-compose
docker-compose는 컨테이너가 여러개일 때 이를 한번에 실행하고자 할 때 사용하는 툴입니다.
docker가 단일 컨테이너를 실행한다면, docker-compose는 여러개의 컨테이너를 실행할 수 있습니다.
docker-compose 를 정의할 때는 .yaml 파일로 정의가 되며 다음과 같습니다.
version: '3.4'
services:
webmvc:
image: eshop/webmvc
environment:
- CatalogUrl=http://catalog-api
- OrderingUrl=http://ordering-api
- BasketUrl=http://basket-api
ports:
- "5100:80"
depends_on:
- catalog-api
- ordering-api
- basket-api
catalog-api:
image: eshop/catalog-api
environment:
- ConnectionString=Server=sqldata;Initial Catalog=CatalogData;User Id=sa;Password=[PLACEHOLDER]
expose:
- "80"
ports:
- "5101:80"
#extra hosts can be used for standalone SQL Server or services at the dev PC
extra_hosts:
- "CESARDLSURFBOOK:10.0.75.1"
depends_on:
- sqldata
ordering-api:
image: eshop/ordering-api
environment:
- ConnectionString=Server=sqldata;Database=Services.OrderingDb;User Id=sa;Password=[PLACEHOLDER]
ports:
- "5102:80"
#extra hosts can be used for standalone SQL Server or services at the dev PC
extra_hosts:
- "CESARDLSURFBOOK:10.0.75.1"
depends_on:
- sqldata
basket-api:
image: eshop/basket-api
environment:
- ConnectionString=sqldata
ports:
- "5103:80"
depends_on:
- sqldata
sqldata:
environment:
- SA_PASSWORD=[PLACEHOLDER]
- ACCEPT_EULA=Y
ports:
- "5434:1433"
basketdata:
image: redis
이렇게 여러개의 이미지로 컨테이너 여러개를 동시에 띄울 수 있으며, 포트 연결과 volumes 설정을 동시에 여러개를 할 수 있습니다.
즉, 여러 어플리케이션을 스택 형태로 정의가 가능한 것입니다.