We are Architect

15단계로 배우는 Docker와 쿠버네티스: 컨테이너 네트워크(9) 본문

Docker

15단계로 배우는 Docker와 쿠버네티스: 컨테이너 네트워크(9)

the best infra 2024. 12. 31. 02:00

 

* 컨테이너 네트워크와 포트 공개 방법

  • 실행 중인 컨테이너는 IP 주소를 할당받아 컨테이너 간 통신이 가능하다.
  • 또한 같은 컨테이너 네트워크를 통해서 애플리케이션과 DB를 연결하는 것도 가능하다.
    컨테이너 간 연동과 외부 공개

* 컨테이너 네트워크 

  • 도커 허브에 등록된 많은 애플리케이션들이 docker network를 사용해 컨테이너를 연동할 것을 안내하고 있다.
컨테이너 네트워크 커맨드 설명
docker network ls 컨테이너 네트워크를 리스트로 표시.
docker network inspect 네트워크명을 지정해서 자세한 내용을 표시.
docker network create 컨테이너 네트워크를 생성.
docker network rm 컨테이너 네트워크를 삭제.
docker network connect 컨테이너를 컨테이너 네트워크에 접속
docker network disconnect 컨테이너를 컨테이너 네트워크에서 분리

 

 

 

* 새로운 컨테이너 네트워크 만들어 보기

  • docker network create my-network 으로 생성.
  • 폐쇄된 네트워크에 컨테이너 실행
    • docker run -d --name webserver1 --network my-network nginx:latest 실행.
  • 또 하나의 다른 컨테이너를 같은 네트워크에 생성
    • docker run -it --rm --name net-tool --network my-network ubuntu:latest bash 실행
      같은 네트워크에 있기에 도메인 질의가 가능하다.


* 외부에 포트 공개하기 

  • docker run -d -p 8080:80 --name test-nginx-server nginx:latest 를 실행. 
    외부 포트를 개방하여 로컬 pc에서도 접근 가능

* 애플리케이션 컨테이너와 DB컨테이너 연동

  • 사실 두개 이상의 컨테이너를 올리려면 docker-compose나 다른 툴들을 쓰는 게 더 관리하기도 좋고 효율적이기 때문에 단순하게 dockerfile괴 docker-compse.yml을 만들어서 AP컨테이너와 DB컨테이너를 연동시켜서 한번 해보겠다.
  • index.php , dockerfile, docker-compose.yml 은 같은 폴더에 있어야 한다. 
  • index.php 파일 코드
    <html>
    <head><title>PHP CONNECTION TEST</title></head>
    <body>
    
    <?php
    $servername = "db";
    $database = "mysql";
    $database = getenv('MYSQL_DATABASE');
    $username = getenv('MYSQL_USER'); // 환경변수로 부터 유저 ID획득
    $password = getenv('MYSQL_PASSWORD'); // 동일하게 비밀번호 취득
    
    // MYSQL 서버에 접속하여 결과 표시
    try {
        $dsn = "mysql:host=$servername;dbname=$database";
        $conn = new PDO($dsn, $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        print("<p>접속에 성공했습니다!</p>");
    } catch(PDOException $e) {
        print("<p>접속에 실패했습니다ㅠㅠ</p>");
        echo $e->getMessage();
    }
    
    $conn = null;
    print('<p>종료합니다.</p>');
    
    ?>
    </body>
    </html>
  • dockerfile 코드
    # PHP 애플리케이션 컨테이너
    FROM php:8.2-apache
    
    # 필요한 PHP 확장 설치
    RUN apt-get update && apt-get install -y \
        libonig-dev \
        zlib1g-dev \
        && docker-php-ext-install \
        pdo_mysql \
        mbstring
    
    # 애플리케이션 파일 복사
    COPY index.php /var/www/html/
  • docker-compose.yml 코드(cmd 창에서 모든 파일이 준비 되었으면 docker-compose up으로 활성화)
    version: "3.8"
    
    services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
        container_name: php-app
        ports:
          - "8080:80"
        environment:
          MYSQL_USER: testuser
          MYSQL_PASSWORD: testpassword
          MYSQL_DATABASE: testdb
        depends_on:
          - db
        networks:
          - app-network
    
      db:
        image: mysql:latest
        container_name: mysql-db
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_USER: testuser
          MYSQL_PASSWORD: testpassword
          MYSQL_DATABASE: testdb
        ports:
          - "3306:3306"
        networks:
          - app-network
    
    networks:
      app-network:
        driver: bridge
  • 제대로 작동 되면 이렇게 뜬다. 

  • 같은 네트워크에 있기 때문에 두 컨테이너가 연동이 된 것이다.