ubuntu - docker 2일차

djEjgrpgksmsrjwl·2024년 12월 26일

SK shieldus Rookies 23기

목록 보기
11/24

Docker compose
-> 자동화

run하면 자동으로 pull 까지 됨

voring-app ( 투표파일 ) 파이썬으로 만들기

1. app.py //voting-app

-> 윈도우에서 vscode로 만들었음

2. Dockerfile //voting-app

  • Dockerfile vs docker-compose.yml
-Dockerfiledocker-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 : 컨테이너 시작 시 실행할 기본 명령어(파일) 설정
    ( 컨테이너 실행 시 항상 실행되는 명령어 )

3. 수동으로 도커빌드

------------------------<구조>--------------------------------

voting-app => redis =><= worker => db(postgres) => result-app
 link                     link                        link

-------------------------------------------------------------

docker build (이미지 생성) //

★중요 app.py, Dockerfile 실행 전 작성 필요 ★
build할 Dockerfile파일이 있는 곳에서 실행

cd vote

docker build . -t voting-app

~~# 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번으로 접속하게 한다


[db, redis run]DB, db redis 실행)

docker run -d --name=redis redis

-> -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 에 있는 비번과 틀림

docker run -d --name db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres postgres:15-alpine

-> 비번 수정


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 build . -t worker-app

~~# 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


4. docker-compose

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 명령어 확인 실행 시 오류 발생
=> 명령어 사용을 위해 설치해야함

apt install docker-compose -y

apt install python3-pip -y

=> -y는 설치 y,n 물어보면 자동으로 y하겠다

설치 후 실행

docker-compose up

=> 이름 비슷한것 출동 주의

5. docker-compose 최적화


버전정보 미입력시 버전 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랑 같이 사용됨

  • compose에서 이미지 구축
    1. 사전 빌드된 이미지를 사용 image: redis:alpine(redis:alpine 이미지를 Docker Hub에서 가져오거나, 이미 로컬에 저장된 이미지를 사용)지시어를 사용하고
    1. 사전에 빌드 없이 새로 이미지를 빌드하여 사용하려면 아래 지시어 사용
      build:
       context: ./vote
      -> ./vote 디렉토리에서 Dockerfile을 찾아서 이미지를 빌드함

6. 학습 조언

클라우드에서도 docker나 kuber를 사용할 수 있는 환경을 제공함
ec2 <--- 반가상화 , 스냅샷이 있긴함 . 하지만 다시 재구축 하면서 네트워크 설정이 복잡함
=> 컨테이너 기술이 이 모든걸 해결함

docker = 유치원수준 , terraform
k8s = 가장 많이 사용하고 있고 더 어려움
컨테이너 지식은 기본.
!중요! docker , k8s

도커는 이미지 수정 시 이미지를 다지워야함.
이미지 수정 시 수정된 이미지가 새로 저장이된다.

7. docker swarm 개념설명

메인이 돼는 호스트(지휘자) 가 있고
메인이 될 ip지정하면
토큰 이 발생되어 토큰 정보로 자식 노드를 만들수 있음(복제=레플리카)
메인의 정보가 바뀌면 자식 노드들도 싹다 바뀜

docker swarm은 많이 쓰이지 않고 보통 단일 노드로 링크걸어서 하는 경우가 많음

8.내일배울거

내일은 로그수집 운영에 대해 배움.
클라우드와치
스플렁크

9. docker-compose VS dockerfile

dockerfile : 컨테이너 내부에 설정하는 작업 ( 이미지로 만드는 작업 )
docker-compose.yml : 컨테이너를 실행하고 연동 ( 이미지를 가져와서 실행하고 연동하는 작업 )

10. vote wed 실행결과

profile
sunseonghwan

0개의 댓글