도커 실무 정리
docker
1. docker 란?
2. docker 기초
3. docker-compose
4. 컨테이너 포트 포워딩 설정하기
5. volume을 사용해 데이터 보존하기
6. 이미지 직접 빌드하기
7. entrypoint 활용
8. 컨테이너를 두 개 이상 활용
1. docker 란?
- django, db, web server 등 다양한 어플리케이션을 컨테이너 환경에서 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다.
- 컨테이너 환경은 가상 머신(Virtual machine)에서 사용되는 가상 환경과 비슷하지만 다른 구조를 가지고 있습니다.
- docker 를 사용하는 이유
- docker를 사용할 경우 다양한 어플리케이션을 쉽고 빠르게 배포할 수 있습니다.
- 컨테이너는 각각 독립적인 환경에서 구동되기 때문에 안정적인 운영이 가능합니다.
- docker 이미지를 통해 동일한 환경을 가진 컨테이너를 쉽게 생성하고 관리할 수 있습니다.
- docker 이미지란?
- 가상 머신에서 윈도우를 설치할 때, 윈도우 ISO를 사용해 설치하는 것처럼 docker 컨테이너는 docker 이미지를 기반으로 생성됩니다.
- 이미지는 docker 컨테이너가 생성될 때 실행되는 실행파일, 설정 등을 가지고 있습니다. 예를 들어, docker postgresql 이미지는 컨테이너가 실행됐을 때 postgresql을 실행시키기 위한 패키지들이 기본적으로 설치되어 있습니다.
2. docker 기초
- docker 패키지 설치
- sudo apt install docker.io -y
- # 만약 아래와 같은 에러가 발생한다면
- # E: Package 'docker.io' has no installation candidate
- # sudo apt update 명령어 실행 후 docker 패키지를 다시 설치해주세요
- sudo apt install docker.io -y
- docker 설치 확인
- sudo docker --version
- # 만약 아래와 같은 에러가 발생한다면
- # E: Package 'docker.io' has no installation candidate
- # sudo apt update 명령어 실행 후 docker 패키지를 다시 설치해주세요
- sudo docker --version
- docker 컨테이너 생성하기
- sudo docker run -d -p 80:80 httpd:latest
- # run : 이미지를 사용해 컨테이너를 실행시킵니다.
- # -d : 컨테이너를 데몬(백그라운드)으로 실행시킵니다.
- # 80:80 : 80번 포트로 접속했을 때 컨테이너에 접근할 수 있도록 포트포워딩 설정을 해줍니다.
- # httpd:latest : httpd의 가장 최신 이미지를 사용해 컨테이너를 생성합니다.
- sudo docker run -d -p 80:80 httpd:latest
- 실행중인 컨테이너 확인하기
- sudo docker ps
- # CONTAINER ID : 컨테이너가 가지고 있는 고유한 id
- # IMAGE : 컨테이너가 생성될 때 사용된 이미지
- # COMMAND : 컨테이너가 생성될 때 실행되는 명령어
- # CREATED : 생성 후 경과 시간 # STATUS : 컨테이너 상태
- # PORTS : 사용중인 포트
- sudo docker ps -a # -a : 중지된 컨테이너 목록까지 포함해서 모두 확인하기
- # -a : 중지된 컨테이너 목록까지 포함해서 모두 확인하기
- sudo docker ps
- 다운받은 이미지 확인하기
- sudo docker images
- # REPOSITORY : 이미지 저장소 이름
- # TAG : 이미지 버전 # IMAGE ID : 이미지의 고유한 id
- # CREATED : 이미지 생성일(마지막 업데이트 일)
- # SIZE : 이미지 용량
- sudo docker images
- 컨테이너 내부로 들어가보기
- sudo docker exec -it $container_id /bin/bash
- # $containser_id : sudo docker ps를 쳤을 때 확인되는 container_id를 입력합니다.
- # /bin/bash : 컨테이너에 접속할 때 사용되는 쉘을 입력합니다.
- # 이미지에 따라 /bin/bash라는 쉘이 존재하지 않을 수 있는데, 이 경우에는 /bin/sh를 사용해 접속합니다.
- sudo docker exec -it $container_id /bin/bash
3. docker-compose
docker-compose란?
docker-compose는 docker 2개 이상의 컨테이너를 더욱 간편하게 관리하기 위해 사용되는 툴입니다.
docker-compose를 사용할 때에는 docker-compose.yml (혹은 .yaml)이라는 파일에 컨테이너에서 사용 될 이미지, 옵션 등을 작성한 후 사용하게 됩니다.
이를 통해 docker 명령어만 사용할 때보다 여러 컨테이너를 더 간편하고 직관적으로 컨테이너를 관리할 수 있습니다.
docker-compose 설치하기
sudo mkdir -p /usr/lib/docker/cli-plugins
# /usr/lib/docker 경로에 cli-plugins라는 디렉토리를 생성합니다.
# -p : 만약 상위 디렉토리가 없다면 함께 생성합니다.
sudo curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o /usr/lib/docker/cli-plugins/docker-compose
# github에 release 된 docker-compose 파일을 /usr/lib/docker/cli-plugins/ 경로에 다운로드 받습니다.
# v2.11.2는 docker-compose의 버전이며, 최신 버전은 여기서 확인 가능합니다.
sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose
# 다운받은 docker-compose 파일에 실행 권한을 부여해 줍니다.
sudo docker compose version
# docker-compose가 정상적으로 설치되었는지 확인합니다.
# Docker Compose version v2.11.2 정상적으로 설치 된 경우 버전이 출력됩니다.
docker-compose로 컨테이너 생성하기
- docker 컨테이너 삭제하기
- sudo docker ps -a
- # docker에 존재하는 컨테이너 목록을 확인합니다.
- # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- # 54445308314d httpd:latest "httpd-foreground" 23 hours ago Up 23 hours 0.0.0.0:80->80/tcp, :::80->80/tcp sweet_engelbart
- sudo docker rm -f $container_id # 컨테이너의 실행중 여부와 관계 없이 강제로 삭제합니다.
- sudo docker ps -a
- docker-compose.yml 작성해보기
- version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.
- services: example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
- container_name: example # 컨테이너 이름을 지정합니다.
- image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다. restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
- 컨테이너 실행시켜보기
- # docker compose 명령어는 docker-compose.yml 파일이 존재하는 자리에서 실행해야 합니다.
- sudo docker compose up -d
- # up : docker-compose.yml 파일을 읽어 정의된 서비스들을 실행시킵니다.
- # -d : 컨테이너를 데몬(백그라운드)으로 실행시킵니다.
- 컨테이너 중지시키기
- sudo docker compose stop
- docker compose start # 다시 실행 가능
- sudo docker ps -a 로 중지상태에 컨테이너 확인 가능
- sudo docker compose down
- docker compose up # 다시 실행시 id값 변경
- sudo docker ps -a 로 중지상태에 컨테이너 확인 불가(삭제)
- sudo docker compose stop
4. 컨테이너 포트 포워딩 설정하기
포트 포워딩(port forwarding)이란?
- db, web, ssh 등 다양한 서비스는 기본적으로 가지고 있는 포트 번호가 존재합니다.
- 포트 번호 예시
- http : 80
- https : 443
- postgresql : 5432
- django : 8000
- ssh : 22
- docker-compose.yml
version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.
services:
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
ports: # 포트포워딩을 설정해줍니다.
- 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결해줍니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
sudo docker compose up -d
# 컨테이너 실행
sudo docker compose logs
# 컨테이너 로그 확인
sudo docker compose logs -f
# 컨테이너 실시간 로그 확인
5. volume을 사용해 데이터 보존하기
volume 역할
volume은 컨테이너에 저장되는 데이터의 일부를 host와 공유해 주는 역할을 합니다.
host에 저장 된 데이터는 사용자가 직접 삭제하지 않는 이상 계속해서 유지되며, 때문에 컨테이너가 종료된다 하더라도 데이터는 유실되지 않습니다.
이와 같은 특성 덕분에, volume은 컨테이너 내부에서 변경되는 내용들을 유지해야 할 때 주로 사용됩니다.
docker volume 종류
docker volume의 종류는 docker volume, bind mount, tmpfs mount방식이 있으며 docker volume 방식이 주로 사용됩니다.
docker volume
- docker 엔진이 관리하는 volume을 생성하는 방식입니다.
- docker volume 방식을 사용해 생성된 volume은 host의 /var/lib/docker/volumes/ 경로에 저장됩니다.
- docker에서 가장 권장하는 방식입니다.
bind mount
- docker volume 방식과 매우 유사합니다.
- docker container를 생성할 때 사용자가 지정한 경로에 데이터가 저장됩니다.
- docker 엔진의 관리를 받지 않는 영역이기 때문에 사용자가 직접 파일을 추가/수정/삭제 할 수 있다는 특징이 있습니다. docker 공식 문서에서는 이러한 특징으로 인해 운영에 영향을 미칠 수 있기 때문에 유사한 기능인 docker volume 방식을 사용하는 것을 권장하고 있습니다.
tmpfs mount
- 기존의 방식들이 ssd 혹은 hdd와 같은 저장장치에 데이터를 저장한다면, tmpfs mount 방식은 휘발성 메모리인 RAM에 데이터를 저장합니다.
- 파일로 저장하면 안 되는 민감한 정보를 다룰 때 사용됩니다.
언제 어떤 방식의 volume을 사용해야 할까?
- 각각의 방식들은 장/단점이 있기 때문에 필요에 맞게 사용해야 합니다.
- docker volume은 주로 컨테이너간 파일을 공유하거나 중요도가 높은 파일들을 사용자가 쉽게 수정/삭제 하지 못하도록 할 때 주로 사용합니다.
- bind mount는 설정파일 혹은 소스코드를 프로젝트와 서버가 공유할 때 주로 사용됩니다.
- tmpfs mount는 많은 양의 데이터를 임시로 저장할 때, 혹은 보안적으로 중요한 데이터를 저장할 때 주로 사용됩니다.
- 자세한 내용은 docker 공식 문서에서 확인할 수 있습니다.
- docker-compose.yml (bind mount)
version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.
services:
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
ports: # 포트포워딩을 설정해줍니다.
- 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결해줍니다.
volumes: # volume을 성정해줍니다.
- ./example_http_code/:/usr/local/apache2/htdocs/ # 정의한 volume의 mount할 경로를 지정합니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
- docker-compose.yml (docker volume)
version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.
volumes:
example_http_code: {} # docker volume을 정의합니다.
services:
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
ports: # 포트포워딩을 설정해줍니다.
- 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결해줍니다.
volumes: # volume을 성정해줍니다.
- example_http_code:/usr/local/apache2/htdocs/ # 정의한 volume의 mount할 경로를 지정합니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
sudo docker volume ls
# volume 목록 보기
sudo docker volume inspect $volume_name
# volume의 이름으로 설정 정보 확인하기
sudo docker volume prune
# volume 일괄 삭제
6. 이미지 직접 빌드하기
Dockerfile 작성하기
# 빌드할 때 사용할 이미지를 지정해줍니다.
FROM httpd:latest
# 현재 경로에 존재하는 index.html 파일을 컨테이너 내부로 복사합니다.
COPY ./index.html /usr/local/apache2/htdocs/index.html
docker-compose.yml
version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.
services:
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
build: . # 현재 경로에 있는 Dockerfile을 사용해 이미지를 생성합니다.
ports: # 포트포워딩을 설정해줍니다.
- 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결해줍니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
Dockerfile을 작성할 때 ./index.html 파일을 복사하도록 지정해 줬기 때문에, 동일한 이름으로 해당 파일을 생성하고 편집합니다.
vi index.html # 내용 추가
sudo docker compose up --build -d
# Dockerfile로 빌드된 이미지가 없을 경우, --build 옵션을 추가하지 않더라도 이미지를 빌드 하게 됩니다. 하지만, 기존에 빌드된 이미지가 있을 경우에는 새로 빌드하지 않고 기존에 빌드 된 이미지를 사용합니다. 때문에, Dockerfile을 수정하고 이미지를 새로 빌드해야 할 때는 --build 옵션을 추가해서 사용해야 합니다.
7. entrypoint 활용
entrypoint란?
예를 들어, 데이터베이스를 실행시키기 위해 만든 이미지는, 컨테이너가 생성될 때 데이터베이스 서비스를 실행시켜야 합니다. 이 때 사용되는 옵션이 entrypoint입니다.
entrypoint는 Dockerfile과 docker-compose.yml 모두 작성할 수 있습니다.
만약 Dockerfile, docker-compose.yml 모두 entrypoint가 작성되어 있다면 Dockerfile의 entrypoint는 무시되고 docker-compose.yml의 명령어가 우선적으로 수행됩니다.
Dockerfile 작성하기
FROM python:3.9.15
# .pyc 파일을 생성하지 않도록 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1
# 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다.
ENV PYTHONUNBUFFERED 1
# /app/ 디렉토리를 생성합니다.
RUN mkdir /app/
# /app/ 경로를 작업 디렉토리로 설정합니다.
WORKDIR /app/
# main.py 파일을 /app/ 경로로 복사합니다.
COPY ./main.py /app/
docker-compose.yml
version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.
services:
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
build: . # 현재 경로에 있는 Dockerfile을 사용해 이미지를 생성합니다.
entrypoint: sh -c "python3 main.py" # 작업 디렉토리에 존재하는 main.py 파일을 실행시킵니다.
restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.
vi main.py
from time import sleep
for i in range(100):
print(f"print number : {i}")
sleep(1)
sudo docker compose logs -f
# 실시간 로그확인으로 실행 확인해보자.
8. 컨테이너를 두 개 이상 활용
주의사항
컨테이너가 1개일 때와 2개 이상일 때 docker-compose.yml을 작성하는 방법은 기존과 크게 다르지 않습니다.
다만, ports 혹은 서비스 이름 등 중복되면 안되는 몇몇 옵션이 존재하기 때문에 중복되는 값이 있는지 확인해야 하며 만약 특정 값이 중복되어 들어간다면 컨테이너가 정상적으로 생성되지 않거나 생성하는 과정에서 에러가 발생할 수 있다.
아래 예제에서는 이전에 강의에서 생성했던 Dockerfile을 사용합니다.
docker-compose.yml
version: '3.8'
services:
example1:
container_name: example1
image: 'httpd:latest'
ports:
- 80:80
restart: always
example2: # 서비스 이름이 동일하면 컨테이너가 정상적으로 생성되지 않을 수 있습니다.
container_name: example2 # 컨테이너 이름이 동일하면 컨테이너 생성 시 에러가 발생합니다.
build: .
entrypoint: sh -c "python3 main.py"
restart: always
depends_on을 사용해 컨테이너 실행 순서 바꿔보기
docker-compose.yml에 두 개 이상의 컨테이너를 생성하도록 작성한 경우, 기본적으로는 작성 한 순서대로 컨테이너가 실행됩니다.
하지만 경우에 따라 특정 컨테이너가 먼저 실행되어야 하는 경우가 있습니다.
예를 들어, django 컨테이너와 데이터베이스 컨테이너를 같이 띄우는 경우에는 데이터베이스 컨테이너가 먼저 생성되어야 django 컨테이너에서 데이터베이스에 연결할 수 있습니다.
이 때, depends_on 옵션을 사용해 컨테이너간 실행 순서를 컨트롤 할 수 있습니다.
docker-compose.yml
version: '3.8'
services:
example1:
container_name: example1
image: 'httpd:latest'
ports:
- 80:80
depends_on:
- example2 # 해당 컨테이너보다 먼저 실행되어야 하는 컨테이너를 지정합니다.
restart: always
example2: # 서비스 이름이 동일하면 컨테이너가 정상적으로 생성되지 않을 수 있습니다.
container_name: example2 # 컨테이너 이름이 동일하면 컨테이너 생성 시 에러가 발생합니다.
build: .
entrypoint: sh -c "python3 main.py"
restart: always
< 참고 자료 >
Docker란 무엇인가?
Docker 컨테이너는 애플리케이션의 모든 코드 및 종속성을 표준 형식으로 패키징할 수 있게 해주는 컨테이너입니다. 이를 통해 애플리케이션이 컴퓨팅 환경 전반에서 빠르고 안정적으로 실행될 수 있죠. Docker 컨테이너는 라이브러리, 시스템 도구, 코드, 런타임 등 애플리케이션 실행에 필요한 모든 것을 담고 있는 인기 있는 경량의 독립형 실행 컨테이너입니다. Docker는 개발자가 컨테이너화된 애플리케이션을 빠르게 빌드, 테스트 및 배포할 수 있게 해주는 소프트웨어 플랫폼이기도 합니다.
CaaS(서비스형 컨테이너)라고도 불리는 컨테이너 서비스는 컨테이너의 수명 주기를 관리하는 관리형 클라우드 서비스입니다. 컨테이너 서비스는 컨테이너 런타임의 통합관리(시작, 중지, 확장)를 지원합니다. 컨테이너 서비스를 사용하면 애플리케이션 개발 및 배포 수명 주기를 단순화, 자동화 및 가속화할 수 있습니다.
지난 수년간 Docker 및 컨테이너 서비스는 빠르게 채택되었고, 동시에 엄청난 성공을 거두었습니다. 2013년까지만 해도 거의 알려지지 않았던, 다소 전문적인 오픈 소스 기술이었던 Docker는 표준화된 런타임 환경으로 진화했고, 이제 많은 Oracle 기업용 제품에서 Docker를 공식적으로 지원하고 있습니다.
Docker 용어 정의
Docker:
컨테이너 기술을 활용하는 앱의 개발, 제공 및 실행을 위해 설계된 소프트웨어 컨테이너 플랫폼입니다. Docker는 엔터프라이즈 에디션과 커뮤니티 에디션 이렇게 두 가진 버전으로 제공됩니다.
컨테이너:
하드웨어 가상화를 제공하는 VM과 달리 컨테이너는 '사용자 공간'을 추상화함으로써 경량의 운영체제 수준의 가상화를 제공합니다. 컨테이너는 호스트 시스템의 커널을 다른 컨테이너와 공유합니다. 호스트 운영체제에서 실행되는 컨테이너는 코드와 모든 종속성을 패키지화하여 애플리케이션이 한 환경에서 다른 환경으로 빠르고 안정적으로 실행될 수 있게 해주는 표준 소프트웨어 장치입니다. 컨테이너는 영구적이지 않으며 이미지로부터 생성됩니다.
Docker 엔진:
컨테이너를 구축 및 실행하는 오픈 소스 호스트 소프트웨어입니다. Docker 엔진은 Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE, Ubuntu 등 다양한 Windows 서버 및 Linux 운영체제에서 컨테이너를 지원하는 클라이언트 서버 애플리케이션의 역할을 합니다.
Docker 이미지:
컨테이너로 실행될 소프트웨어 모음입니다. 여기에는 Docker 플랫폼에서 실행할 수 있는 컨테이너 생성 지침이 포함되어 있습니다. 이미지는 변경할 수 없으며, 이미지를 변경하려면 새로운 이미지를 생성해야 합니다.
Docker 레지스트리:
이미지를 저장 및 다운로드할 수 있는 공간입니다. 레지스트리는 무상태성을 갖춘 확장 가능한 서버측 애플리케이션으로 Docker 이미지를 저장 및 배포합니다.
출처 : https://www.oracle.com/kr/cloud/cloud-native/container-registry/what-is-docker/
Docker-compose란?
여러개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여 관리를 간단하게 하는 것으로, 여러개의 컨테이너 설정 내용을 하나의 yaml 파일에 모아서 사용한다. compose 파일을 준비해서 커맨드를 1번 실행하는 것만으로 그 파일로부터 설정을 읽어들여 모든 컨테이너 서비스를 실행시킬 수 있다.
Docker-compose 기본 명령
실행 : docker-compose up
중지 : docker-compose stop
실행하면서 빌드(서비스 시작 전 이미지를 새로 만든다) : docker-compose up --build
Docker-compose 사용 방법
- 각각의 컨테이너의 Dockerfile을 작성한다.
- docker-compose.yml을 작성하고, 각각 독립된 컨테이너의 실행 정의를 실시한다.
- docker-compose up 커맨드를 실행해서 docker-compose.yml으로 정의한 컨테이너를 개시한다.
Docker-compose.yml 파일
version: '3.5'
services:
mockserver:
build: mockserver
# mockerserver 폴더 안에 사용할 Dockerfile이 있음
ports: ['8001:8000']
# 호스트 OS 8001 <= mockserver 컨테이너 포트 8000
volumes:
- './mockserver/public:/home/public'
- './mockserver/server.py:/home/server.py'
web:
build:
context: .
dockerfile: web/Dockerfile
# web 폴더 안에 사용할 Dockerfile이 있음
cache_from:
- eu.gcr.io/tmrow-152415/electricitymap_web:production
- eu.gcr.io/tmrow-152415/electricitymap_web:staging
- eu.gcr.io/tmrow-152415/electricitymap_web:latest
image: eu.gcr.io/tmrow-152415/electricitymap_web:latest
# 베이스 이미지
command: npm run server-dev
# 이 서비스가 올라올 때 dockerfile의 CMD를 무시하고 npm run server-dev가 실행됨
depends_on: ['mockserver']
# web이 올라오기 전에 mockserver가 먼저 올라와야 함
environment:
- NODE_ENV=development
ports: ['8000:8000']
# 호스트 OS 8000 <= web 컨테이너 포트 8000
volumes:
- './config:/home/config'
- build
해당 서비스의 이미지를 빌드하기 위한 Dockerfile이 위치하는 경로를 저장한다.
- ports
호스트 OS와 컨테이너의 포트를 바인딩시켜준다.
따옴표와 함께 문자열로 지정해야 한다.
형식은 “host:container” 또는 “container”
외부로 노출시킬 포트의 맵핑을 명시하는 부분
바인드(bind)가 필요한 호스트 외부 포트와 컨테이너 내부 포트를 지정
- image
docker-compose 안에서 베이스 이미지를 지정한다.
- command
해당 서비스가 올라올 때 Dockerfile의 CMD 명령문을 무시하고 실행할 명령어를 설정한다.
- depends_on
서비스 간의 종속성 순서대로 서비스를 시작한다.
A: depends_on: -B A 애플리케이션이 올라오기 전에 B가 먼저 올라와야 한다.
- environment
컨테이너의 환경 변수를 지정한다.
Dockerfile 파일
FROM python:3.8-alpine
WORKDIR /home
EXPOSE 8000
ADD server.py server.py
CMD cd public && python ../server.py
- EXPOSE
호스트 OS에 포트를 공개하지 않고, 컨테이너에서만 포트를 공개한다.
- ADD
파일을 이미지에 추가한다.
- CMD
컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행한다.
'Sparta Coding Club > Today I Learned [TIL]' 카테고리의 다른 글
[TIL] #DAY - 053 - M1 맥북 tensorflow, opencv, dlib 사용하기! (내일배움캠프AI 3기) (0) | 2022.11.17 |
---|---|
[TIL] #DAY - 052 - (3) 도커 실무 정리 : 배포 서비스 (내일배움캠프AI 3기) (0) | 2022.11.16 |
[TIL] #DAY - 050 - (1) 도커 실무 정리 : 리눅스(내일배움캠프AI 3기) (1) | 2022.11.15 |
[TIL] #DAY - 049 - 데이터셋 사이트 모음 (내일배움캠프AI 3기) (0) | 2022.11.15 |