Docker compose
-> 자동화
run하면 자동으로 pull 까지 됨
voring-app ( 투표파일 ) 파이썬으로 만들기
-> 윈도우에서 vscode로 만들었음
| - | Dockerfile | docker-compose.yml |
|---|---|---|
| 목적 | 하나의 컨테이너 이미지를 정의하고 빌드 | 여러 컨테이너(서비스)를 동시에 실행하고 연결 |
| 이미지 빌드 | 이미지 빌드하는데 사용 | 기존 Dockerfile을 이용해 이미지를 빌드하거나 이미지를 불러와 컨테이너 실행 |
| 서비스 간 의존성 | 불가 | depends_on 등의 명령어로 다른 서비스와 연결가능 |
| 역할 | 컨테이너 내부에서 실행될 명령어 정의 | 여러 컨테이너를 동시의 실행하고 관리 |
| 포트 | EXPOSE - 내부 포트 | ports - 외부 포트 |
| 네트워크구성 | 명시적으로 정의하지 않음(기본 네트워크 사용) | 커스텀 네트워크를 정의하고 컨테이너 간 연결 가능 |
Dockerfile
이미지 빌드를 위해
이미지 초기 셋팅 빌드을 위한 애플리케이션 코드, 애플리케이션이 동작하기 위한 패키지 의존성, 실행 환경을 하나의 이미지로 패키징하는 역할
docker-compose.yml
컨테이너 환경 관리 및 실행
데이터베이스, 캐시, 웹 서버 같은 여러 서비스를 함께 동작(서비스 간 의존성)시키고 연결하는 작업에 유용
보통 Dockerfile과 함께 사용하며 Dockerfile로 만든 이미지들을 함께 구동 해줌 (수정 작업이 가능하긴 함)
CTF 대회 >> WEB, PWN 도커파일로 배포됨
Dockerfile 명령어
FROM : 이미지 다운 및 지정 ( 지시자)
Docker 이미지 만들 때, 기본이 되는 베이스 이미지를 설정
ex) FROM python:3.11-slim AS base
COPY (또는 ADD) : 로컬에서 컨테이너로 데이터 복사 (갱신, 검증용)
ex) COPY requirements.txt ./requirements.txt
EXPOSE : 포트를 선언하돼, 다른 컨테이너와의 연결되도록 지정
ex) EXPOSE 80
(실제로 외부로 포트를 열기 위해서는 docker run 명령에 포트 매핑을 추가해야함 ex) docker run -p 5000:80 voting-app)
RUN : 컨테이너 외부에서 명령어를 입력하여 컨테이너 내부로 전달(패키지를 설치하거나 애플리케이션을 빌드하는 명령)
ex) RUN pip install --no-cache-dir -r requirements.txt
WORKDIR : ( 작업경로 . 컨테이너 내부에서 작업경로 지정(절대값. workdir 선언되면 그 이후 작업은 모두 workdir에서 수행됨)
ex) WORKDIR /usr/local/app
ENV : 환경 변수, 변수 선언 및 저장
CMD : 컨테이너 시작 시 실행할 기본 명령어(파일) 설정
(컨테이너 내부에서 명령어 실행 ( 버전정보가 충돌나는 경우 많이 사용됨, 로컬과 도커내부python버전이 다른경우))
ex) CMD ["python", "app.py"]
ex) CMD ["gunicorn", "app:app", "-b", "0.0.0.0:80", "--log-file", "-", "--access-logfile", "-", "--workers", "4", "--keep-alive", "0"]
ENTRYPOINT : 컨테이너 시작 시 실행할 기본 명령어(파일) 설정
( 컨테이너 실행 시 항상 실행되는 명령어 )
------------------------<구조>--------------------------------
voting-app => redis =><= worker => db(postgres) => result-app
link link link
-------------------------------------------------------------

★중요 app.py, Dockerfile 실행 전 작성 필요 ★
build할 Dockerfile파일이 있는 곳에서 실행
cd vote
~~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 277dae4d77b9 9 seconds ago 154MB
voting-app latest 2b98423cd4fc 9 seconds ago 153MB
python 3.11-slim 9ab864898180 3 weeks ago 129MB
docker run -p 5000:80 voting-app
-> docker run -p 5000:80 [.app 이름]
-> -p 5000번 포트로 80번 포트를 연어서 5000번으로 접속하게 한다
-> -d 백그라운드로 redis실행
entrypoint
-> 명령어나 파일 모아놓은것
다시 수동 빌드하여 run하면 db연결이안됨
-> redis를 바라보는 옵션이 빠져있음
docker run -p 5000:80 --link redis:redis voting-app
-> --link redis:redis 컨테이너가 redis를 바라보게 함
redis : db 가기로 보내기 전 데이터 임시저장 역할
docker run -d --name db postgres:15-alpine
-> db postgres:15-alpine버전 찾아서 실행
docker run --name db postgres:15-alpine -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password
-e
=> 변수
이미지 이름은 제일끝에 넣을것 ( 그래야 변수를 해당 이미지에 넣음 )
docker run --name db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password postgres:15-alpine
docker run -d --name db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password postgres:15-alpine
-> server.js 에 있는 비번과 틀림
-> 비번 수정
cd ../worker
mousepad Dockerfile (Dockerfile ARG확인)
ARG 3개 순서 바꾸기, 빌드플랫폼을 가장 첫줄 배치
ARG BUILDPLATFORM=linux/amd64
FROM --platform=${BUILDPLATFORM} mcr.microsoft.com/dotnet/sdk:7.0 AS build
ARG TARGETPLATFORM=linux
ARG TARGETARCH=x64
~~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
* worker-app latest ada5d05a9236 34 seconds ago 194MB
<none> <none> 9a7c09557bc2 36 seconds ago 880MB
voting-app latest 2b98423cd4fc 5 minutes ago 153MB
<none> <none> 277dae4d77b9 5 minutes ago 154MB
* python 3.11-slim 9ab864898180 3 weeks ago 129MB
* mcr.microsoft.com/dotnet/sdk 7.0 ea4f5eec2095 7 months ago 819MB
* mcr.microsoft.com/dotnet/runtime 7.0 c95462acfb2e 7 months ago 190MB
* 표시한게 build해서 생성된 이미지임
docker run --name worker --link redis:redis --link db:db worker-app
-d
백그라운드 실행
cd ../result
docker build . -t result-app
~~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
* result-app latest 97d179eea666 20 seconds ago 219MB
worker-app latest ada5d05a9236 4 minutes ago 194MB
<none> <none> 9a7c09557bc2 4 minutes ago 880MB
voting-app latest 2b98423cd4fc 9 minutes ago 153MB
<none> <none> 277dae4d77b9 9 minutes ago 154MB
python 3.11-slim 9ab864898180 3 weeks ago 129MB
* node 18-slim c21af35f2961 5 weeks ago 192MB
mcr.microsoft.com/dotnet/sdk 7.0 ea4f5eec2095 7 months ago 819MB
mcr.microsoft.com/dotnet/runtime 7.0 c95462acfb2e 7 months ago 190MB
* 표시한게 build해서 생성된 이미지임
docker run --link db:db -p 5001:80 result-app
5000, 5001 둘다 파이어폭스로 열어서 확인
작업순서 중요
1-voting
2-redis
3-worker
4-db
5-result
mv docker-compose.yml doback1
mv docker-compose.images.yml doback2
-> compose 시 이름 충돌할까봐 변경
docker-compose 파일 새로 작성
mousepad docker-compose.yml
---------------- 첫줄부터 순차적으로 생성된다. * 순서 중요 *-----------------
------- 사용 핵심 옵션 image ports links -----
------- image : 컨테이너 생성을 위한 image 지정
------- ports : 사용할 포트
------- links : 연결
redis:
image: redis
db:
image: postgres:15-alpine
==> user, password 입력 안됨 5. 최적화에 수정예정
vote:
image: voting-app
ports:
- 5000:80
links:
- redis
worker:
image: worker-app
links:
- db
- redis
==> 명령어로 하면 이렇게 였음=> docker run -d [--name worker] --link db:db --link redis:redis worker-app
result:
image: result-app
ports:
- 5001:80
links:
- db
==> 이전에 명령어로 하던거 => docker run -d [--name result(컨테이너 이름)생략가능] -p 5001:80 --link db:db result-app
----------------------------------------------------------------
root@seonghawn-VMware-Virtual-Platform:/home/seonghawn/Desktop/voting-app# docker-compose
Command 'docker-compose' not found, but can be installed with:
snap install docker # version 27.2.0, or
apt install docker-compose # version 1.29.2-6
See 'snap info docker' for additional versions.
docker-compose 명령어 확인 실행 시 오류 발생
=> 명령어 사용을 위해 설치해야함
=> -y는 설치 y,n 물어보면 자동으로 y하겠다
설치 후 실행
=> 이름 비슷한것 출동 주의
버전정보 미입력시 버전 1로 기본 설정됨
여백 이 있어야 하위로 인식 -> 여백은 보통 짝수로 맞추는게 좋다
동시 줄 선택 tab 하면 여러줄이 한번에 여백설정 tab 키는 기본적으로 짝수 여백이다 ( 여기서는 tab os충돌나서 띄어쓰기로 진행 )
버전3부터는 link를 입력 안해도 된다 컨테이너 내에 자동으로 link를 찾아 연결해준다.
version: "3"
services:
redis:
image: redis
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
vote:
image: voting-app
ports:
- 5000:80
worker:
image: worker-app
result:
image: result-app
ports:
- 5001:80
만들었던 images 와 ps -a를 모두 삭제후 실행하면 오류없이 된다.
depends_on 구문을 넣으면 실행순서 최적화 가능 - 보통 healthcheck랑 같이 사용됨
image: redis:alpine(redis:alpine 이미지를 Docker Hub에서 가져오거나, 이미 로컬에 저장된 이미지를 사용)지시어를 사용하고build:
context: ./vote-> ./vote 디렉토리에서 Dockerfile을 찾아서 이미지를 빌드함클라우드에서도 docker나 kuber를 사용할 수 있는 환경을 제공함
ec2 <--- 반가상화 , 스냅샷이 있긴함 . 하지만 다시 재구축 하면서 네트워크 설정이 복잡함
=> 컨테이너 기술이 이 모든걸 해결함
docker = 유치원수준 , terraform
k8s = 가장 많이 사용하고 있고 더 어려움
컨테이너 지식은 기본.
!중요! docker , k8s
도커는 이미지 수정 시 이미지를 다지워야함.
이미지 수정 시 수정된 이미지가 새로 저장이된다.
메인이 돼는 호스트(지휘자) 가 있고
메인이 될 ip지정하면
토큰 이 발생되어 토큰 정보로 자식 노드를 만들수 있음(복제=레플리카)
메인의 정보가 바뀌면 자식 노드들도 싹다 바뀜
docker swarm은 많이 쓰이지 않고 보통 단일 노드로 링크걸어서 하는 경우가 많음
내일은 로그수집 운영에 대해 배움.
클라우드와치
스플렁크
dockerfile : 컨테이너 내부에 설정하는 작업 ( 이미지로 만드는 작업 )
docker-compose.yml : 컨테이너를 실행하고 연동 ( 이미지를 가져와서 실행하고 연동하는 작업 )


