9-1. 빌드에서 운영까지

몽자비루 ㅣ 2024. 5. 8. 17:13

  1. 도커 컴포즈란?
    1. 여러 컨테이너 일괄적으로 정의하고 실행할 수 있는 툴
      • 하나의 서비스를 운영하기 위해서는 여러개의 애플리케이션이 동작해야 함.
      • 컨테이너화 된 애플리케이션들을 통합 관리할 수 있음.
    2. 도커 컴포즈 실행 방법
      • 도커를 실행할 때 추가한 옵션들을 docker command가 아닌, YAML형태로 만들음 (port, bolumes, name ..)
      • docker compose에게 요청하여 도커명령어로 해석하여 docker container 운영
    3. 도커 컴포즈 명령어
      • docker compse ps : 도커 컴포즈를 통해 실행한 컨테이너 실행 상태 확인 및 삭제/제거/로그 확인 가능
  2. 도커 컴포즈로 컨테이너를 실행할 수 있나요?
    1. 문법에 맞춰 도커 컴포즈가 이해할수있는 YAML파일을 만들어서 전달함.
    2. 참고 링크 : https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/wordpress/#quickstart-compose-and-wordpress
      • 아래 YAML를 docker command 실행문으로 변경

        docker run
        --name wordpress
        -v wp_data:/var/www/html
        -p 80:80
        --restart=always
        -e WORDPRESS_DB_HOST=db
        WORDPRESS_DB_USER=wordpress
        WORDPRESS_DB_PASSWORD=wordpress
        WORDPRESS_DB_NAME=wordpress
        wordpress:latest
    3. YAML파일 문법

      version compose 버전. 버전에 따라 지원 문법이 다름.
      version: "2"
      services 컴포즈를 이용해서 실행할 컨테이너 옵션을 정의
      service:
         webserver:
              image : nginx
          db:
              image: redis
      build 컨테이너 빌드
      weeapp:
          build: .
      image compose를 통해 실행할 이미지를 지정
      weeapp:
          image: centos:7
      command 컨테이너에서 실행될 명령어 지정
      app:
         image: node:12-alaine
          command: sh -c "yarn install && yarn run dev"
      port 컨테이너가 공개하는 포틀르 나열
      webapp:
          image: httpd:latest\
          port:
              - 80
              - 8443:443
      link 다른 컨테이너와 연계할 때 연계할 컨테이너 지정.
      webserver:
          image:wordpress:latest
          link:
              db:mysql
      expose 포트를 링크로 연계된 컨테이너에게만 공개할 포트
      webapp:
          build: .
      volumes 컨테이너에 볼륨 마운트
      webapp:
          image: httpd
          volumes:
              - /var/www/html
      environment 컨테이너에 적용할 환경변수를 정의
      database:
          image: mysql:5.7
          environment:
               MYSQL_ROOT_PASSROD: pass
      restart 컨테이너 종료될 때 적용할 restart 정책
      - no: 재시작 되지 않음
      - always:컨테이너를 수동으로 끄기 전까지 항상 재시작.
      - on-failure: 오류가 있을 시에 재시작.
      database:
          image: mysql:5.7
          restart: always
      depends_on 컨테이너 간의 종속성을 정의. 정의한 컨테이너가 먼저 동작되어야 한다.
      services:
          web:
               image: wordpress:latest
              depends_on:
                    - db
          db:
               image: mysql
      ㄴ db가 먼저 실행되어야 web이 실행됨을 의미함
    4. 도커 컴포즈로 동작시키는 웹 서버
      1단계 서비스 디렉토리 생성 2단계 docker-compose.yml 생성 3단계 docker-compose 명령어
      $ mkdir webserver 
      $ cd webserver
      $ cat > docker-compose.yml
      version: '3'
      services:
         web:
              image: httpd:latest
              ports:
                  - "80:80"
              links:
                  - mysql:db
              command: apachectl -DFOREGROUND
          mysql:
              image: mysql:latest
              command:mysqld
              environment:
                  MYSQL_ROOT_PASSWORD: pass
      $ docker-compose up -d
      $ docker-compose ps
      $ docker-compose scale mysql=2
      $ docker-compose ps
      $ docker-compose down

      docker-conpose ps 의 경우,
      docker-compose file을 기준으로 실행된 docker container 목록만 확인 가능.
    5. docker-compose 명령어
      docker-compose <command>
      config yaml파일의 문법 확인
      up 컨테이너 생성/시작
      ps 컨테이너 목록 표시
      logs 컨테이너 로그 출력
      run 컨테이너 실행
      start 컨테이너 시작
      stop 컨테이너 정지
      restart 컨테이너 재시작
      pause 컨테이너 일시 정지
      unpause 컨테이너 재개
      port 공개 포트 번호 표시
      config 구성 확인
      kill 실행 중인 컨테이너 강제 정지
      rm 컨테이너 삭제
      down 리소스 삭제
  3. 빌드에서 운영 방법
    1. 방문 횟수를 카운트하는 python 컨테이너 빌드와 운영 
      1단계
      서비스 디렉토리 생성
      2단계
      빌드를 위한 dockerfile 생성
      3단계
      docker-compose.yml 명령어
      4단계
      docker-compose 명령어
      $ mkdir composetest
      $ cd composetest
      $ cat > Dockerfile
      FROM python:3.7-alpine
      WORKDIR /code
      ENV FLASK_APP=app.py
      ENV FLASK_RUN_HOST=0.0.0.0
      RUN apk add –no-cache gcc musl-dev linux-headers
      COPY requirements.txt requirements.txt
      RUN pip install –requirements.txt
      EXPOSE 5000
      COPY
      CMD [“flask”, “run”]
      $ cat > docker-compose.yml
      version: “3”
      services:
         web:
            build: .
            ports:
               - “5000:5000”:
         redis:
            image: “redis:alpine”
      $ docker-compose up -d