docker를 이용한 설정
다음 문서를 참고하면 MySQL 컨테이너를 설치하고 실행하는 방법과 그 과정에서 발생하는 문제점들을 해결하는 방법을 확인할 수 있다.
MySQL_container에_접속이_안_되는_문제_해결하기
docker compose를 이용한 설정
docker 명령만으로 MySQL 컨테이너를 만들면 명령행 아규먼트나 옵션을 많이 지정해야 하므로 번거롭다.
docker-compose.yml 파일을 만들고 docker compose 명령으로 실행한 다음, 접속하는 방법을 제시해본다.
version: "3"
services:
db:
image: mysql:8.0.32
environment:
MYSQL_HOST: localhost
MYSQL_ROOT_PASSWORD: myrootpassword
MYSQL_DATABASE: mydatabase
MYSQL_USER: myuser
MYSQL_PASSWORD: myuserpassword
TZ: Asia/Seoul
restart: unless-stopped
volumes:
- ./db/conf.d:/etc/mysql/conf.d
- ./db/data:/var/lib/mysql
- ./db/initdb.d:/docker-entrypoint-initdb.d
ports:
- 13306:3306
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_bin
networks:
- mynet
networks:
mynet:
driver: host
root 패스워드와 데이터베이스 이름, 사용자 이름, 사용자 패스워드를 지정해두면 권한 설정까지 잘 된다.
주의사항:
컨테이너를 생성하고 나면 볼륨에 write되기 때문에, mysql 클라이언트로 접속해서 변경하든가 아니면 볼륨을 삭제하고 다시 생성해야 한다.
주의해서 살펴봐야 할 설정은, port 매핑과 network 모드이다.
- port 매핑은 13306으로 접근하도록 했다.
- 내부에서 MySQL의 기본 포트인 3306으로 연결된다.
- network 모드는 host 모드로 설정했다.
- MySQL은 bridge 모드에서 소소한 문제가 있다고 하므로 host 모드로 지정했다.
- host 모드는 네트웍 상의 다른 호스트가 되는 게 아니라 같은 호스트 위에 서비스가 구축되는 것이므로 여러 컨테이너들끼리 포트가 겹치지 않도록 해야 한다.
- 혹시, bridge 모드로 설정할 경우 172.로 시작하는 private IP를 할당받게 되므로 docker inspect 명령을 이용해서 IP를 확인해둘 필요가 있다.
실행
설정이 끝났으면 다음과 같이 실행해본다. 우선은 어떤 에러가 발생하는지 확인하기 위해 daemon mode 옵션인 -d 옵션을 사용하지 않고 올려 본다.
docker compose up
mysql_fm-db-1 | 2023-03-13T01:39:21.539916Z 0 System MY-010931 Server /usr/sbin/mysqld: ready for connections. Version: '8.0.32' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
이와 비슷한 메시지가 화면에 출력된다면 정상적으로 실행된 것이다. 문제가 있다면 "[Error]" 메시지가 출력될 것이다.
접속 테스트
이 상태에서 다른 shell을 실행하여 MySQL 클라이언트로 접속해보자. "Enter password:" 프롬프트가 뜨면 패스워드를 입력한다.
mysql -h 127.0.0.1 -P 13301 -u myuser mydatabase -p
주의사항:
-h 옵션의 아규먼트로 localhost를 사용하면 Unix domain socket(파일)을 이용해서 접속하기 때문에 127.0.0.1 IP 주소를 사용해야 한다.
접속 테스트가 정상적으로 완료되었으므로 이제 daemon mode로 재실행하면 된다. Ctrl-C로 docker compose 명령을 중지시키고 다음 명령으로 재실행한다.
Daemon mode로 재실행
docker compose up -d