작업 디렉토리 : 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]

환경변수 : OS에서 사용하는 변수

 

1. 목표

  • MySQL 컨테이너를 설치 (OS는 우분투)
  • MySQL 컨테이너가 설치된 OS에 환경변수를 설정
  • MySQL에서 설정된 환경변수를 사용

2. 작업 디렉토리 위치 (ex05)

/docker/docker_files/lecture/docker_lab/ex05

 

3. 도커파일 생성, 빌드 및 컨테이너 생성

FROM mysql

ENV MYSQL_USER=ssar
ENV MYSQL_PASSWORD=ssar1234
ENV MYSQL_ROOT_PASSWORD=root1234
ENV MYSQL_DATABASE=ssardb

CMD ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]

마지막의 CMD는 캐릭터셋을 UTF-8로 설정하기 위함.

 

도커파일 빌드하기

docker build -t mysql-images ./

 

MYSQL 컨테이너 생성

docker run -d -p 3307:3306 --name mysql-container mysql-images

mysql은 기본 3306포트를 사용하는데 3307로 요청이오면 3306으로 포트포워딩 해주자.

 

4. DB접속기로 검증하기(DBeaver, SQL yog, Mysql Bench 등)

컨테이너가 제대로 실행된 것을 확인했다면 DB 접속기로 잘 접속되는지 확인해보자.

나는 SQL Yog를 사용함~

IP와 Dockerfile에서 설정한 MYSQL_USER, MYSQL_PASSWORD에 입력한 부분을 입력하고 포트로 3307(3306으로 포워딩)을 입력 후 테스트 연결에 성공하면 끝!

 

UTF-8 설정이 제대로 되었는지 SQL yog에서 아래의 SQL문을 실행시켜보자.

 SHOW VARIABLES LIKE 'character_set_%';

value가 utf8mb3 가 나오면 된다.

 

5. 환경변수 확인하기

Dockerfile에서 ENV 로 설정한 OS 환경변수가 제대로 설정되었는지 알아보기 위해 mysql 컨테이너에 접속해보자.

docker exec -it [CONTAINER ID] bash

 

터미널에 정상적으로 접속 되었다면 아래의 명령어를 입력하여 Dockerfile에서 ENV 명령어로 설정한대로 값이 제대로 나오는지 확인하면 된다.

echo $MYSQL_USER
echo $MYSQL_PASSWORD

 

6. Mysql 볼륨

mysql 컨테이너는 자동으로 볼륨을 하나 사용한다. Mysql의 데이터가 해당 볼륨에 저장되는데 문제는 컨테이너가 재실행되면 같은 볼륨을 사용하는 것이 아니라 기존 볼륨을 삭제 후 새로운 볼륨이 생성되어버린다. 그래서 기존 데이터는 모두 지워지게 된다.

 

첫 번째 해결책

이 문제를 해결하기 위해서는 2가지 해결책이있는데 그 중 첫 번째는 HOST에 볼륨을 연결하면 된다.

이는 docker hub의 mysql 공식 사이트에도 있는 내용이다.

 

볼륨연결을 위한 호스트OS에 디렉토리 만들기

디렉토리명: mysql-volume

/docker/docker_files/lecture/docker_lab/ex05/mysql-volume

mkdir mysql-volume

 

 

볼륨 옵션으로 호스트 디렉토리 연결하여 실행

docker run -d -p 3307:3306 -v /home/docker/docker_files/lecture/docker_lab/ex05/mysql-volume:/var/lib/mysql --name mysql-container mysql-images

 

정상적으로 실행 되었다면 mysql-volume 디렉토리에 들어가보면 각종 데이터 파일들이 있는 것을 볼 수 있다.

 

두 번째 해결책

이름이 있는 볼륨 생성하여 실행하기 

위에서 실습했던 내용을 초기화 후 진행 (remove.sh)

 

이 방법은 귀찮게 따로 디렉토리를 만들어도 되지 않아도 되고 그냥 -v 옵션에서 이름만 설정해주면 된다!

docker run -d -p 3307:3306 -v mysql-test-volume:/var/lib/mysql --name mysql-container mysql-images

 

해당 방법으로 실행하면 볼륨을 보는 명령어로 보면 볼륨이 생성된 것을 확인할 수 있다.

docker volume ls

 

이름있는 볼륨 으로 만들었을 때 데이터가 제대로 보관되는지 검증하기

 USE ssardb;
 
 CREATE TABLE person(
	id INT PRIMARY KEY,
	NAME VARCHAR(100)
 );
 
 INSERT INTO person VALUES (1, 'ssar');
 
 SELECT * FROM person;

1. 이름 있는 볼륨으로 만들어진 컨테이너에 sql yog로 접속해서 위의 sql 문을 차례대로 실행한다.

2. 도커 컨테이너 중지 및 삭제(remove.sh)

3. 아래의 명령어로 다시 컨테이너를 생성

docker run -d -p 3307:3306 -v mysql-test-volume:/var/lib/mysql --name mysql-container mysql-images

4. 다시 sql yog로 새로 생성된 컨테이너에 접속하여 SELECT * FROM person; 실행 후 제대로 나오는지 확인!

18강에서 이어서 하는 내용.

 

1. nginx.conf 수정

lb에 설정한 nginx.conf 내용을 수정하자. IP를 찾는것이 비효율적이므로 서버 IP를 직접 설정하는게 아니라 게이트 웨이 주소로 설정하고 포트번호만 server1, server2 것으로 설정하면 좀 더 효율적이 된다.

upstream server1{
                server 172.17.0.1:8081;
}

upstream server2{
                server 172.17.0.1:8082;
}

server{
        listen 80;
        server_name localhost;

        #여기서 server1은 위의 upstream server1을 의미한다.
        location /server1{
                proxy_pass http://server1/;
        }

        #여기서 server2는 위의 upstream server2를 의미한다.
        location /server2{
                proxy_pass http://server2/;
        }

}

/ex04/lb/conf/nginx.conf

 

프록시를 사용한 로드밸런스는 원래라면 더 많은 설정을 만져야하지만 여기까지만 강의해주신다고 하신다.

또한, 이번에는 docker run을 사용해서 3가지 nginx container를 띄웠지만 docker compose를 배우면 한방에 컨테이너들을 유기적으로 결합해서 띄우는 방법을 배울 수 있다고 하심.

 

 

+ Recent posts