작업 디렉토리 : ex06_docker_compose

 

도커 컴포즈는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구이다.

YAML파일을 사용하여 서비스를 구성한다.

  • 서비스 시작, 중지 및 다시 구축
  • 실행 중인 서비스 상태 보기
  • 실행 중인 서비스의 로그 출력 스트리밍
  • 서비스에서 일회성 명령 실행

기존 Dockerfile 방식

Dockerfile은 다중 컨테이너를 실행할 때 매우 번거롭다. 각각 컨테이너들 간의 요청 응답을 위해  IP, PORT 설정 다 잡아줘야하고 따로따로 Dockerfile 을 만들어 줘야한다.

 

도커 컴포즈를 사용하면 컨테이너간의 유기적 결합을 손쉽게 해결 할 수 있다.

이번 시간에는 1개의 컨테이너만 도커 컴포즈로 실행해본다.

 

1. docker-compose.yml 파일 생성

version: '3.8'
services:
  mysqldb:
    image: mysql:latest
    restart: always
    volumes:
      - mysql-compose-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_HOST: "%"
      MYSQL_ROOT_PASSWORD: root1234
      MYSQL_DATABASE: rootdb
    ports:
      - "3307:3306"
    networks:
      - docker_default
volumes:
  mysql-compose-volume:

 

2. docker-compose 실행하기

docker-compose up -d

위의 명령어로 실행하면 아래와 같은 오류발생! 이유는 버전이 안맞아서 그런거 같다. (최신 docker-compose는 명령어도 다름)

 

 

최신 문법은 아래와 같다.

 docker compose up -d

 

3. docker-compose로 실행된 컨테이너 확인하기

docker compose ps

 

4. DB 접속기로 접속해보기

문제발생! 접속기로 접속이 안된다. 확인해보니까 docker compose up -d 로 실행할 때 default-network가 자동으로 만들어지던데 그거 때문 인것 같다.

 

 

일단 docker compose down 으로 컨터이너와 network를 지워주자.

 

networks 부분을 추가해주자. (services, networks)

external: true 를 하면 기존에 있는 것을 사용하겠다는 의미. 해당 부분을 추가하지 않으면 계속 새로운 네트워크를 생성해댄다.

version: '3.8'
services:
  mysqldb:
    image: mysql:latest
    restart: always
    volumes:
      - mysql-compose-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_HOST: "%"
      MYSQL_ROOT_PASSWORD: root1234
      MYSQL_DATABASE: rootdb
    ports:
      - "3307:3306"
    networks:
      - docker_default
volumes:
  mysql-compose-volume:
networks:
  docker_default:
    external: true

 

하지만 네트워크를 default로 바꾸어봐도 호스트OS의 DB접속기에서는 여전히 접속이 불가능했다.

 

 

문제해결) 문제원인은 네트워크가 아니라 원격 유저 설정이 되지 않았기 때문이었다.

docker exec -it [CONTAINER ID] bash

컨테이너 OS 접속 후

mysql을 입력 하면 mysql로 접속되는데 접속 후 아래 명령어를 입력하여 원격 유저를 만들어 주면 된다.

mysql> create user 'root'@'%' identified by 'root1234';
Query OK, 0 rows affected (0.04 sec)

mysql> grant all on *.* TO root@'%';
Query OK, 0 rows affected (0.02 sec)

 

꼭 컨테이너에 접속해서 할 필요는 없었다..

docker-compose.yml 에서 environments에 MYSQL_ROOT_HOST를 "%" 로 설정해주면 된다.

이렇게 하면 이제 DB접속기에 문제없이 접속가능할 것이다.

 

아래와 같은 쿼리문을 입력하자.

USE rootdb;

CREATE TABLE person(
	id INT PRIMARY KEY, 
	NAME VARCHAR(100)
);

INSERT INTO person(id, NAME) VALUE(1, 'ssar');
INSERT INTO person(id, NAME) VALUE(2, 'ssar2');

SELECT * FROM person;

 

컨테이너를 종료(docker compose down) 하고 다시 실행(docker compose up -d) 해도 person 테이블의 데이터가 살아있는 것을 확인 하면 이번 실습은 끝!

 

컨테이너 환경변수(environments) 다른걸로 만들 때 볼륨까지 지워야하는거 잊지 말자..

docker volume lsdocker volume rm [VOLUME NAME]

+ Recent posts