Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행할 수 있게 해주는 오픈 소스 플랫폼이다.
M1 Macbook 기준
curl -Lo docker.tgz https://download.docker.com/mac/static/stable/aarch64/docker-24.0.6.tgz
tar xzvf docker.tgz
sudo cp docker/* /usr/local/bin/
docker-compose는 아래의 명령어를 통해 설치할 수 있다.
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-darwin-aarch64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
sudo mv $DOCKER_CONFIG/cli-plugins/docker-compose /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
⚠️ v2.27.0에서 v가 반드시 붙어 있어야 한다!!!
개발자는 자신의 컴퓨터 환경에서 코드를 작성하고 서버에 올린다.
하지만, 자신의 컴퓨터 환경과 서버의 환경은 다르다. 따라서, 종속성 문제가 발생할 수 있다.
Docker는 이를 해결하기 위해 완전히 독립된 환경을 제공한다.
동료가 Dockerfile과 docker-compose.yml을 작성해서 보내주면, 다음과 같이 실행하면 된다.
전제: Docker와 docker-compose가 깔려있어야 한다.
docker-compose build
: docker-compose.yml 파일을 구성 정보로 빌드docker-compose up -d
: docker-compose.yml 파일에서 정의된 서비스들에 대한 컨테이너를 빌드처음 실행하는 경우, Root에서 docker-compose build
와 docker-compose up -d
를 차례대로 입력한다.
이후에 실행할 때는 docker-compose up -d
만 입력해서 실행시키면 된다.
Docker 이미지를 빌드하기 위한 명령어들을 작성한 파일이다.
Docker 컨테이너를 실행하는 데 필요한 모든 파일과 설정을 포함한 패키지
이미지를 빌드하기 위해서는, Dockerfile이 존재하는 디렉토리에서 다음 명령을 실행하면 된다.
docker build -t [이미지 이름]:[태그] .
빌드한 이미지로 컨테이너를 실행할 수 있다.
docker run -d -p 4000:80 --name mycontainer myimage:tag
// -p 4000:80: 호스트의 4000 포트와 컨테이너의 80 포트를 연결.
// 이는 외부에서 컨테이너의 80 포트에 접근할 때 사용한다.
Docker Compose는 여러 컨테이너를 동시에 구성하는데 사용되는 도구로, docker-compose.yml 파일을 통해 서비스, 네트워크, 볼륨 등을 정의한다.
다음은 현재 개발중인 프로젝트의 docker-compose.yml
파일이다.
services: # 실행할 모든 컨테이너 서비스를 정의한다.
postgres: # 첫번째 서비스의 이름
image: postgres:16 # 이 서비스가 사용할 도커 이미지, Docker Hub에서 제공한다.
container_name: postgres
environment: # 컨테이너 내에서 사용할 환경변수
POSTGRES_USER: cluster23
POSTGRES_PASSWORD: cluster23
POSTGRES_DB: quant-helper
ports: # 호스트 머신(이 컨테이너를 담고 있는 PC) - 컨테이너간의 포트 매핑
- "5432:5432"
volumes: # 데이터를 영구적으로 저장하기 위한 볼륨
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
api: # 두번째 서비스의 이름
build: # Docker 이미지를 빌드하기 위한 설정
context: .
dockerfile: ./docker/api/Dockerfile
container_name: api
ports:
- "8080:8080"
depends_on: # api 서비스가 실행되기 이전에 postgres 서비스가 먼저 실행되어야 한다.
- postgres
networks: # backend 네트워크에 연결한다.
- backend
networks: # backend network는 driver로 bridge를 사용한다.
backend:
driver: bridge
volumes: # postgres_data 볼륨 정의
postgres_data:
volumes
docker는 가상화 환경인 컨테이너에서 작업을 진행한다.
따라서, 모든 데이터는 컨테이너 내부에만 존재하게 된다.
➜ 컨테이너를 삭제하면 작업한 모든 데이터가 날라간다.
컨테이너가 삭제되어도 데이터를 유지하고 싶은 경우에 사용하는 것이 volume이다.
volume은 데이터를 외부로 링크하는 기능이다.
위의 경우, postgres 서비스의 데이터는/var/lib/postgresql/data
에 저장된다.
network
도커의 네트워크란 Docker 컨테이너 간의 통신을 관리하고 격리하기 위한 기능이다.