ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker][따배도] 9. 빌드에서 운영까지
    Docker 2024. 4. 16. 15:04
    이 포스팅은 따배도 유투브 시리즈를 기반으로 작성되어있습니다.

    Docker Compose

    여러 컨테이너를 일괄적으로 정의하고 실행할 수 있는 툴

    • 하나의 서비스를 운영하기 위해서는 여러개의 어플리케이션이 동작해야 함
    • 컨테이너화 된 애플리케이션들을 통합 관리할 수 있음

    YAML 파일을 docker-compose에게 전달하면 작성된대로 실행해 줌

    Docker Compose로 컨테이너 실행하기

    Docker Compose yaml 문

    version compose 버전
    버전에 따른 지원 문법이 다름
    - version: “2”
    link 다른 컨테이너와 연계할 때 연계할 컨테이너 지정

    webserver:
      image: wordpress
      link:
        db:mysql
    services 컴포즈를 이용해 실행할 컨테이너 옵션을 정의

    service:
      webserver:
        image: nginx
      db:
        image: redis
    expose 포트를 링크로 연계된 컨테이너에게만 공개할 포트

    webapp:
      expose:
        - 3306
        - 33060
    bulid 컨테이너 빌드

    webapp:
      build: .
    volumes 컨테이너 볼륨을 마운트

    webapp:
      image: httpd
      volumes:
        - /var/www/html
    image compose를 통해 실행할 이미지를 지정

    webapp:
      image: centos: 7
    environment 컨테이너에 적용할 환경변수를 정의

    database:
      image: mysql:5.7
      environment:
        MYSQL_ROOT_PASSWORD: pass
    command 컨테이너에서 실행될 명령어 지정

    app:
      image: node:12-alpine
      command: sh -c “yarn install && yarn run dev”
    restart 컨테이너가 종료될 때 적용할 restart 정책
      no: 재시작 되지 않음
      always: 컨테이너를 수동으로 끄기 전까지 항상 재시작
      on-failure: 오류가 있을 시에 재시작

    database:
      image: mysql:5.7
      restart: always
    port 컨테이너가 공개하는 포트를 나열

    webapp:
      image: httpd:latest
      port:
        - 80 or - 8443:443
    depends_on 컨테이너 간의 종속성을 정의
    정의한 컨테이너가 먼저 동작되어야 함

    services:
      web:
        image: wordpress:latest
        depends_on:
          - db
      dp:
        image: mysql

     

    docker-compose.yml 예시

    Docker Compose로 컨테이너 실행

    • Docker Compose로 동작시키는 웹서버
    1 서비스 디렉토리 생성
    2 docker-compose.yml 생성

    3 docker-compose 명령어

    docker-compose 명령어

    docker-compose <command>

    up 컨테이너 생성/시작 pause 컨테이너 일시 정지
    ps 컨테이너 목록 표시 unpause 컨테이너 재개
    logs 컨테이너 로그 출력 port 공개 포트 번호 표시
    run 컨테이너 실행 config 구성 확인
    start 컨테이너 시작 kill 실행 중인 컨테이너 강제 정지
    stop 컨테이너 정지 rm 컨테이너 삭제
    restart 컨테이너 재시작 down 리소스 삭제

    빌드에서 운영까지

    컨테이너 빌드부터 배포까지

    1 서비스 디렉토리 생성
    2 빌드를 위한 dockerfile 생성
    3 docker-compose.yaml 생성
    4 docker-compose 명령어

    실습

    도커 컴포즈 설치하기

    docker docs에 OS별 설치 방법을 따라 진행

    docker desktop는 docker-compose를 포함하고 있어 설치 생략

    컨테이너 빌드에서 운영까지

    도커 공식에서 제공하는 예제를 따름

    $ mkdir composetest
    $ cd composetest
    

     

    app.py

    import time
    
    import redis
    from flask import Flask
    
    app = Flask(__name__)
    cache = redis.Redis(host='redis', port=6379)
    
    def get_hit_count():
        retries = 5
        while True:
            try:
                return cache.incr('hits')
            except redis.exceptions.ConnectionError as exc:
                if retries == 0:
                    raise exc
                retries -= 1
                time.sleep(0.5)
    
    @app.route('/')
    def hello():
        count = get_hit_count()
        return 'Hello World! I have been seen {} times.\\n'.format(count)
    

     

    requirements.txt

    flask
    redis
    

     

    Dockerfile

    # syntax=docker/dockerfile:1
    FROM python:3.10-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 -r requirements.txt
    EXPOSE 5000
    COPY . .
    CMD ["flask", "run", "--debug"]
    

     

    docker-compose.yaml

    services:
      web:
        build: .
        ports:
          - "8000:5000"
      redis:
        image: "redis:alpine"
    
    $ docker-compose up
    $ docker images
    $ docker-compose down
    
    $ vi docker-compose.yaml
    $ docker-compose up -d
    $ docker-compose watch
    $ vi app.py
    $ docker-compose down --volumes
    
    1, 2 파일 생성
    이동
    3 app.py 생성
    4 requirements.txt 생성
    5 Dockerfile 생성
    6 docker-compose.yaml 생성


    의도한 대로 동작하는것을 확인
    7 컨테이너 생성 및 시작

    의도한대로 동작함을 확인(방문한 횟수만큼 카운트 업)
    8 생성된 이미지들 확인
    9 리소스 제거
    10 docker-compose.yaml 수정
    11 백그라운드로 실행

    동작확인
    12 파일에 변경 사항 생길 시 자동으로 반영되도록 watch 켜기
    13 app.py 수정

    업데이트가 감지됨을 확인

    서비스에 반영됨을 확인
    14 볼륨까지 내리기

    MYSQL 데이터베이스를 사용하는 wordpress 운영하기

    도커 공식에서 제공하는 예제를 따름

    $ mkdir my_wordpress
    $ cd my_wordpress
    

    docker-compose.yaml

    services:
      db:
        # We use a mariadb image which supports both amd64 & arm64 architecture
        image: mariadb:10.6.4-focal
        # If you really want to use MySQL, uncomment the following line
        #image: mysql:8.0.27
        command: '--default-authentication-plugin=mysql_native_password'
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          - MYSQL_ROOT_PASSWORD=somewordpress
          - MYSQL_DATABASE=wordpress
          - MYSQL_USER=wordpress
          - MYSQL_PASSWORD=wordpress
        expose:
          - 3306
          - 33060
      wordpress:
        image: wordpress:latest
        volumes:
          - wp_data:/var/www/html
        ports:
          - 80:80
        restart: always
        environment:
          - WORDPRESS_DB_HOST=db
          - WORDPRESS_DB_USER=wordpress
          - WORDPRESS_DB_PASSWORD=wordpress
          - WORDPRESS_DB_NAME=wordpress
    volumes:
      db_data:
      wp_data:
    
    $ docker-compose up -d
    
    1 my_wordpress 폴더 생성 및 이동
    2, 3 docker-compose.yaml 작성
    컨테이너 생성 및 실행

    80포트에서 실행 확인

    볼륨 마운트 확인

    4 실행 종료 및 볼륨 삭제
Designed by Tistory.