[Docker] MySQL 설치

 

1. Dockerhub mysql

mysql – Official Image | Docker Hub

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
Code language: PHP (php)

가. mysql image 가져오기

# docker-compose.yml

version: "3.7"

services:
  db:
    image: mysql:5.7 <- mysql:8.0.32로 변경
Code language: CSS (css)
  • 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
Code language: JavaScript (javascript)
  • 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() 함수에 필요한 시간대 데이터를 자동으로 로드한다. 하지만 필요하지 않다면, 비어있지 않은 값으로 설정하면 시간대 로딩을 비활성화한다.

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

https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html

https://dev.mysql.com/doc/refman/8.0/en/environment-variables.html


라. 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
Code language: PHP (php)

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

  • 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 의 변경

개요


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

  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
Code language: JavaScript (javascript)

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


성공!


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

댓글 남기기