Docker 기반 MySQL 설치하기

Docker를 사용하여 MySQL을 설치하는 방법을 정리한다.

docker-compose.yml

YAML 파일의 기본 골격을 다음과 같이 작성한다.

version: "3"
services:
    db:
        image: mysql:8.0.20
        container_name: mysql_db
        restart: always
        ports:
            - "3306:3306"
        environment:
            MYSQL_DATABASE: "${MYSQL_DATABASE}"
            MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
            MYSQL_USER: "${DB_USER_ID}"
            MYSQL_PASSWORD: "${DB_USER_PASSWORD}"
        command:
            - --character-set-server=utf8mb4
            - --collation-server=utf8mb4_unicode_ci
        volumes:
            - ${MYSQL_HOME_DIR}/volumes/mysql/:/var/lib/mysql/

파일내 변수로 선언한 내용은

  1. 직접 yml 파일에 그대로 기록하거나,
  2. 외부 파일로 쓰되 embed 하거나
  3. 외부 conf 파일을 파라미터로 넘겨주게 하거나
  4. 환경 변수로 선언해 두고 실행되게 하거나
  5. .env에 등록해 두고 사용되게 하는
    등의 선택을 할 수 있다.

 

변수선언

앞으로 실행하려면, .env에 선언해 두는 것이 편할 것이므로 변수에 해당되는 내용을 .env 파일에 다음과 같이 작성한다.

MYSQL_DATABASE=db이름
DB_USER_ID=사용자계정
DB_USER_PASSWORD=사용자계정비밀번호
DB_ROOT_PASSWORD=root계정비밀번호
MYSQL_HOME_DIR=MySQL 설치디렉토리

정상적으로 반영되었는지는 실행전 다음의 명령어로 확인해 보자.

docker-compose config

변수가 제대로 치환되었는지 확인이 가능할 것이다. (잘못 치환되었다면 변수로 표기한 부분이 공백으로 나타남, 변수가 선언되지 않은 것으로 판단하므로)

 

 

실행

당장 정상적으로 뜨는지 편하게 보려면, 다음과 같이 실행한다.

docker-compose up

실행하니 다음과 같이 프로세스가 정상적으로 뜨는 것을 확인하였다.

Removing mysql_db
Recreating c8510841ebff_mysql_db ... done
Attaching to mysql_db
mysql_db | 2021-02-06 13:16:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.20-1debian10 started.
mysql_db | 2021-02-06 13:16:35+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql_db | 2021-02-06 13:16:35+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.20-1debian10 started.
mysql_db | 2021-02-06 13:16:35+00:00 [Note] [Entrypoint]: Initializing database files
mysql_db | 2021-02-06T13:16:35.756403Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
mysql_db | 2021-02-06T13:16:35.772364Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.20) initializing of server in progress as process 48
mysql_db | 2021-02-06T13:16:36.002769Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
mysql_db | 2021-02-06T13:16:36.539425Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_db | 2021-02-06T13:16:39.647629Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_db | 2021-02-06T13:16:41.818893Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
mysql_db | 2021-02-06 13:16:51+00:00 [Note] [Entrypoint]: Database files initialized
mysql_db | 2021-02-06 13:16:51+00:00 [Note] [Entrypoint]: Starting temporary server
mysql_db | 2021-02-06T13:16:51.853672Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
mysql_db | 2021-02-06T13:16:51.853773Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.20) starting as process 95
mysql_db | 2021-02-06T13:16:51.862406Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
mysql_db | 2021-02-06T13:16:51.887611Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_db | 2021-02-06T13:16:52.461887Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_db | 2021-02-06T13:16:52.607994Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock'
mysql_db | 2021-02-06T13:16:52.740385Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_db | 2021-02-06T13:16:52.747451Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_db | 2021-02-06T13:16:52.793979Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.20'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
mysql_db | 2021-02-06 13:16:52+00:00 [Note] [Entrypoint]: Temporary server started.
mysql_db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysql_db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
mysql_db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql_db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysql_db | 2021-02-06 13:16:56+00:00 [Note] [Entrypoint]: Creating database mydb
mysql_db | 2021-02-06 13:16:56+00:00 [Note] [Entrypoint]: Creating user dev
mysql_db | 2021-02-06 13:16:56+00:00 [Note] [Entrypoint]: Giving user dev access to schema mydb
mysql_db |
mysql_db | 2021-02-06 13:16:56+00:00 [Note] [Entrypoint]: Stopping temporary server
mysql_db | 2021-02-06T13:16:56.971679Z 14 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.20).
mysql_db | 2021-02-06T13:17:00.826675Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20)  MySQL Community Server - GPL.
mysql_db | 2021-02-06 13:17:01+00:00 [Note] [Entrypoint]: Temporary server stopped
mysql_db |
mysql_db | 2021-02-06 13:17:01+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
mysql_db |
mysql_db | 2021-02-06T13:17:01.952881Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
mysql_db | 2021-02-06T13:17:01.953008Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.20) starting as process 1
mysql_db | 2021-02-06T13:17:01.964558Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
mysql_db | 2021-02-06T13:17:01.996127Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_db | 2021-02-06T13:17:05.134310Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_db | 2021-02-06T13:17:05.312523Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060
mysql_db | 2021-02-06T13:17:05.456782Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_db | 2021-02-06T13:17:05.464997Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_db | 2021-02-06T13:17:05.527302Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.20'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

이후 실행에 문제가 없고, 정상 동작이 확인되었다면
-d 옵션을 넣어서 daemon으로 띄우자.

docker-compose up -d

 

접속 확인

다른 터미널 창을 열어, contianer 밖에서도 정상 접속되는지 확인하자.

$ telnet 127.0.0.1 3306

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
J
7;IWfq U��dFP`tq9esfuycaching_sha2_password^]
telnet> quit
Connection closed.

이제, SQL Client로 실제 접속까지 테스트해 본다. 앞서, .env에 적어뒀던 User ID/Password 조합을 사용해 접속해보자. 나의 경우는, DataGrip을 사용하였다.

이와 같이, Host, Port, User, Password 등 기본 정보를 입력하고 접속해 보자.

show databases;

환경설정 파일에 작성한 내 스키마(mydb)가 정상 조회되는 것을 확인할 수 있다.

use mydb;
show tables;

아직은 생성한 테이블이 없으므로, 테이블 내용은 조회할 수 있는 것은 없는 상태이다.

이제 기본적인 설정은 마쳤다. 로컬 개발을 하거나, 기본적인 테스트를 할 수 있는 준비는 되었다고 볼 수 있다.

 

참고

 

docker-compose 환경변수 사용 및 치환

docker-compose를 실행할 때, 반복되는 값 혹은 변경 가능한 값을 변수화 해놓으면 재사용성을 높일 수 있다. docker-compose 사용시 어떻게 변수화를 할 수 있는지 정리한다. 샘플 yml 파일 version: '3' servic

luran.me

 

댓글

Designed by JB FACTORY