2023. 3. 10. 17:30ㆍTools/Docker
1. Dockerhub mysql
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()
함수에 필요한 시간대 데이터를 자동으로 로드한다. 하지만 필요하지 않다면, 비어있지 않은 값으로 설정하면 시간대 로딩을 비활성화한다.
이것도 부족하다면 필요한 환경변수는 여기서 찾자.
라. 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으로 사용한다.
라. 다른 컨테이너와의 의존성 표시
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를 사용해야 한다.
'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 |