[Docker] MySQL 설치

2023. 3. 10. 17:30Tools/Docker

1. Dockerhub mysql

 

 

 

mysql - Official Image | Docker Hub

Quick reference Supported tags and respective Dockerfile links 8.0.32, 8.0, 8, latest, 8.0.32-oracle, 8.0-oracle, 8-oracle, oracle 8.0.32-debian, 8.0-debian, 8-debian, debian 5.7.41, 5.7, 5, 5.7.41-oracle, 5.7-oracle, 5-oracle 5.7.41-debian, 5.7-debian, 5-

hub.docker.com

 

node.js 수업이 mysql을 사용하게 되었다.

 

따라서 mysql을 Dockerfile에 추가하고 docker-compose.yml에도 추가해야 한다.

 

compose만 수행하면 바로 사용할 수 있도록 만들고 싶다.

 

  • docker-compose.yml에 mysql 추가하기.
  • docker-compose.yml에서 mysql 기본 설정하기
    • 사용할 포트 설정하기
    • root password 설정하기.
    • User 생성하고 권한 설정하기.
  • 수업에서 사용할 특정 데이터베이스 생성하기.

 


2. docker-compose.yml 분석

 

운 좋게도 compose를 공부하면서 mysql이 사용된 예시를 사용했다.

 

이것을 조금 참고해서 작성하면 되겠다.

 

# docker-compose.yml

version: "3.7"

services:
  db:
    image: mysql:5.7
    volumes:
      - ./db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: 123456

  app:
    depends_on: 
      - db
    image: wordpress:latestv
    volumes:
      - ./app_data:/var/www/html
    ports:
      - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: 123456

 


가. mysql image 가져오기

 

# docker-compose.yml

version: "3.7"

services:
  db:
    image: mysql:5.7 <- mysql:8.0.32로 변경
  • db : 생성할 컨테이너 이름
  • image : mysql:5.7 : mysql 5.7 버전 이미지를 사용한다. (23년 3월 기준 5.7 버전은 EOL - end of life. 우리는 8.0.32 버전을 사용할 것이다.)

 


나. bind mount 하기

 

    volumes:
      - ./db_data:/var/lib/mysql
    restart: always
  • volumes: - ./db_data:/var/lib/mysql : DB의 데이터를 바운드 마운트했다. 컨테이너가 삭제되어도 데이터를 살리고 싶다면 설정해야 겠지용?
  • restart: always : 재시동 설정

 


다. 환경설정

 

    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: 123456
  • MYSQL_ROOT_PASSWORD: 123456 : root의 password를 설정한다. 반드시 필요한 설정이다.
  • MYSQL_DATABASE: wordpress : wordpress라는 데이터베이스를 생성하고 사용한다.
  • MYSQL_USER: wordpress_user : wordpress_user라는 유저를 생성한다. 만약 MYSQL_USER + MYSQL_PASSWORDMYSQL_DATABASE 이후에 오면 생성된 유저는 해당 데이터베이스에 대하여 모든 권한을 획득한다.
  • MYSQL_PASSWORD: 123456 : 유저의 비밀번호를 설정했다.

 

그 외에도 …

 

  • MYSQL_ALLOW_EMPTY_PASSWORD: yes : 선택적으로 사용하면 된다. 어떤 값이라도 채워 넣으면 root 유저의 password를 별도로 설정하지 않고 비워둔다. 직관적으로 이해하기 위해서 yes를 사용하기를 추천한다.
  • MYSQL_RANDOM_ROOT_PASSWORD: yes : 이것도 선택적 사항이다. yes와 같은 비어 있지 않은 값으로 설정하여 임의의 root의 초기 password를 생성한다. (pwgen을 사용). 생성된 root password는 표준 출력에 인쇄된다. (GENERATED ROOT PASSWORD: .....).
  • MYSQL_ONETIME_PASSWORD: yes

 

init가 완료되면 root 사용자(MYSQL_USER에서 지정한 사용자가 아님!)를 만료시켜 첫 번째 로그인 시 암호를 변경하도록 합니다.

 

비어있지 않은 값이면 이 설정이 활성화됩니다. (참고: 이 기능은 MySQL 5.6 이상에서만 지원됩니다. MySQL 5.5에서 이 옵션을 사용하면 초기화 중에 적절한 오류가 발생합니다.)

 

  • MYSQL_INITDB_SKIP_TZINFO: yes

 

기본적으로 CONVERT_TZ() 함수에 필요한 시간대 데이터를 자동으로 로드한다. 하지만 필요하지 않다면, 비어있지 않은 값으로 설정하면 시간대 로딩을 비활성화한다.

 

이것도 부족하다면 필요한 환경변수는 여기서 찾자.

 

 

MySQL :: MySQL 5.7 Reference Manual :: 4.9 Environment Variables

4.9 Environment Variables This section lists environment variables that are used directly or indirectly by MySQL. Most of these can also be found in other places in this manual. Options on the command line take precedence over values specified in option f

dev.mysql.com

 

 

MySQL :: MySQL 8.0 Reference Manual :: 4.9 Environment Variables

4.9 Environment Variables This section lists environment variables that are used directly or indirectly by MySQL. Most of these can also be found in other places in this manual. Options on the command line take precedence over values specified in option f

dev.mysql.com


라. dockerhub mysql 공홈

 

# Use root/example as user/password credentials
version: '3.1'

services:

  db:
    image: mysql
    # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
    # (this is just an example, not intended to be a production configuration)
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

이제 다 이해할 수 있다. 단 하나만 빼고.

 

  • command: --default-authentication-plugin=mysql_native_password

 

 mysql_native_password는 저장되어 있는 HASH code를 탈취하면 취약점을 이용해서 비밀번호를 알아낼 수 있다.

 

그래서 실제 프로덕트에는 caching_sha2_password로 변경하길 권한다.

 

MySQL 5.7까지는 mysql_native_password이 default 값이었으며, sha2를 쓰기 위해서는 별도의 plugin 설치가 필요했다.

 

하지만 MySQL 8.0부터는 좀 더 고도화된 SHA2암호화 기법을 기반으로 RSA key를 이용한 salt 추가 방법으로 더욱 보안을 강화시켰다.

 

caching_sha2_password plugin을 default plugin으로 사용한다.

 

 

MySQL 8.0 - Authentication_plugin 의 변경

개요

minsql.com

 


라. 다른 컨테이너와의 의존성 표시

 

  app:
    depends_on: 
      - db

app라는 컨테이너는 db 컨테이너에 종속되어 있음을 표시했다.

 


3. docker-compose.yml 작성하기

 

배운 것을 바탕으로 작성해 보자.

 

version : '3.7'

services:
  mysql:
    image : mysql:8.0.32
    volumes:
      - ./db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: opentutorials
      MYSQL_USER: nodejs
      MYSQL_PASSWORD: 123456

  studynode: 
    depends_on:
      - mysql
    image : ghcr.io/ramen4598/studynode:2.0-multiarch
    volumes :
      - ./src/:/app/src/
    ports :
      - "3000:3000"
    restart : always

까먹지 말고 .gitignoredb_data 추가하기.

 


 

성공!


 

mysql8.0부터는 mysql2 docker image를 사용해야 한다.

 

 

[Node.js] npm install mysql2

Node.js - MySQL - 생활코딩 수업소개 이 수업은 Node.js와 MySQL을 이용해서 웹애플리케이션을 만드는 방법에 대한 수업입니다. 수업대상 예를들어 1억 개의 페이지로 이루어진 웹사이트에서 필요한 정

ramen4598.tistory.com

 

'Tools > Docker' 카테고리의 다른 글

[Docker] Multi-architecture build  (0) 2023.03.07
[Docker] Github와의 연동  (0) 2023.02.28
[Docker] 연습하기  (2) 2023.02.27
[Docker] Compose  (0) 2023.02.27
[Docker] 가상화된 Docker host에 접근하기  (0) 2023.02.27