Docker Compose 설정이 변경 되었다!

Rookedsysc·2024년 2월 9일
0

개요 🤔

프로젝트를 시작한지 어느덧 2주차가 접어들고 있다. Spring Security 설정 공부하면서 하느라 생각보다 진도가 나가지 않고 있던 와중 Redirect 도메인을 설정하는 부분에서 문제가 생겼다.

Flutter 개발자님께서 Web View를 사용할 때 HTTPS를 사용하지 않으면 문제가 발생한다는 것이다. (iOS에서 네이티브에서 막았다고 함, Info.plist에 등록해서 우회할 수도 있다곤 하심)
어차피 어플리케이션 출시할 때도 Https가 아닌 도메인이 Redirect 설정이 되어있으면 심사가 되지 않으니 이번 기회에 Https를 적용해보고자 한다.
AWS를 쓰면 이런 고생을 할 이유도 없지만...😢

Server 설정 🖥️ & 사건의 발단

프로젝트를 처음 시작하던 시기에 설정한 내 docker-compose.yaml 파일을 다음과 같았다.

# 버전 명시 안해주면 빌드 안됨
version: '3'
services:
  dev:
    build:
      context: ./dev/
      dockerfile: Dockerfile
    ports:
      - "10022:22"
      - "18080:8080"

  prod:
    build:
      context: ./prod/
      dockerfile: Dockerfile
    ports:
      - "2222:22"

  # Docker 내부에서 접근할 때 : mysql://mysql:3306/your_database
  mysql:
    image: mysql:8.0
    container_name: mysql
    # ports:
    #   - 3306:3306 # HOST:CONTAINER
    environment:
      MYSQL_ROOT_PASSWORD: admin
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /dev/sdb

나는 이 글을 참조해서 HTTPS를 적용시킬려고 하고 있는데

Could not bind TCP port 80 because it is already in use by another process on
this system (such as a web server). Please stop the program in question and then
try again.

이런 에러가 발생했다. 아무래도 80 포트가 열려있지 않아서 발생하는 에러인 것 같았다.
prod 환경을 80 포트와 8080 포트, 443 포트를 열기 위해선

docker-compose down
docker-compose up --build -d

명령어를 사용하면 되지만 딱보니 Container 안에 설정해둔것들과 파일들이 전부 날아갈 것 같았다.
그래서 좀 더 구글링과 지피팅을 해본 결과 Image를 이용해서 docker-compose 파일을 작성하고 다시 실행하면 Image 안에 들어있던 정적 설정들이 그대로 복원이 된다는 것이다!!!

문제해결 🛠️

현재 실행 중인 Container 백업

sudo docker commit afe870fb486d prod:1.0.0

sha256:68950e14e12b17922cafdd1b03550caa6cf5cca631e63a449eafa943bde25d7c

docker-compose.yaml 파일 수정

아까 그 compose 파일에서 prod: 부분만 수정했다.

  prod:
    image: prod:1.0.0
    ports:
      - "2222:22"
      - "8080:8080"
      - "80:80"
      - "443:443"

실행중이던 Container 종료

prod 서비스만 빌드

sudo docker-compose up -d --no-deps --build prod

--no-deps : docker-compose up 명령을 실행할 때 지정된 서비스에 대해서만 작업을 수행하고, 해당 서비스가 의존하는 다른 서비스들은 시작하거나 재시작하지 않도록 하는데 사용된다.

👆 전에 내가 해줬던 설정이 그대로 적용된 채 시작된 prod 서버의 모습을 알 수 있다.

해치웠나? 🤔

prod 서버에서 mysql에 연결이 안됐다... 뭔가 안될거 같았는데 이게 돼? 역시 도커팀은 달라! 이러면서 해봤지만 역시 안됐다.
그래서 모든 Container를 Commit하고 docker-compose.yaml 파일을

# 버전 명시 안해주면 빌드 안됨
version: '3'
services:
  dev:
    build:
      context: ./dev/
      dockerfile: Dockerfile
    ports:
      - "10022:22"
      - "18080:8080"

  prod:
    image: prod:1.0.1
    ports:
      - "2222:22"
      - "8080:8080"
      - "80:80"
      - "443:443"
    depends_on:
      - mysql

  # Docker 내부에서 접근할 때 : mysql://mysql:3306/your_database
  mysql:
    image: mysql:1.0.0
    container_name: mysql
    # ports:
    #   - 3306:3306 # HOST:CONTAINER
    environment:
      MYSQL_ROOT_PASSWORD: admin
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /dev/sdb

다음과 같이 image를 지정하는 방식으로 변경하고 나서 급한 불을 껏다.

급한 불을 끄고 생각해보니까 '이 방법 밖에 없나? 왜 이렇게 비효율적이지?' 하는 생각이 들었다.

Docker Network 🐳

Docker를 Top-Down 방식이 아닌, 필요한 기능을 그 때 그 때 배우고 있던 나로써는 Docker Network 기능의 존재 여부를 몰랐다.

docker compose는 기본적으로 하나의 디폴트 네트워크를 설정하게 되는데 내가 만약에 docker-compose 파일을 'abc'라는 초콜릿에서 빌드했다면 abc_default라는 네트워크가 생성된다고 한다.

네트워크 확인 명령어

sudo docker network ls

네트워크 생성 명령어

sudo docker network create some_network

이미지에 network 추가

docker run --name [생성할 컨테이너명] --network [네트워크명] -d [빌드할 이미지]

yaml에 네트워크 추가

만약에 prod 서버에 networks 설정을 포함하고 싶었다면

  prod:
    image: prod:1.0.1
    ports:
      - "2222:22"
      - "8080:8080"
      - "80:80"
      - "443:443"
    depends_on:
      - mysql

이 부분을

  prod:
    image: prod:1.0.1
    ports:
      - "2222:22"
      - "8080:8080"
      - "80:80"
      - "443:443"
    depends_on:
      - mysql
    networks:
      - some_networks

networks:
  some_networks:
    driver: bridge

이렇게 수정해주면 된다.

Reference

0개의 댓글