2023. 3. 10. 17:30ㆍTools/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_PASSWORD
가MYSQL_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
까먹지 말고 .gitignore
에 db_data
추가하기.
성공!
mysql8.0부터는 mysql2 docker image를 사용해야 한다.
[Node.js] npm install mysql2
Node.js - MySQL - 생활코딩 수업소개 이 수업은 Node.js와 MySQL을 이용해서 웹애플리케이션을 만드는 방법에 대한 수업입니다. 수업대상 예를들어 1억 개의 페이지로 이루어진 웹사이트에서 필요한 정
ramen4598.tistory.com
'Tools > Docker' 카테고리의 다른 글
[Docker] 예제 (1) | 2024.12.09 |
---|---|
[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 |