MySQL 8.0을 Docker로 실행해보자
MySQL 8.0을 Docker로 실행해보기
먼저 Docker Engine이 실행된 것 확인하고 terminal 프로그램 실행
MySQL docker image를 다운로드
docker pull mysql/mysql-server:8.0
다운로드받은 이미지로 Docker container 실행
docker run --name=mysql_container mysql/mysql-server:8.0
--name 옵션으로 mysql_container라는 이름을 붙여주어 나중에 docker ps로 MySQL의 ID를 찾아야하는 과정을 Skip할 수 있게 해줍니다.
MySQL root 계정의 패스워드 찾기
docker logs mysql_container 2>&1 | grep GENERATED
MySQL이 root 유저 로그인에 필요한 임시로 만든 패스워드를 만들어 놓았습니다. 컨테이너 안의 stdout, stderr에 log로 만들어 두었는데 이 로그를 docker logs 컨테이너 ID(여기서는 mysql_container라는 별칭을 이미 주었음) 등의 명령어를 통해 읽어옵니다. 그리고 GENERATED 키워드로 라인을 검색해 패스워드를 찾아냅니다.
마지막으로 MySQL shell 실행하기
docker exec -it mysql_container mysql -uroot -p
찾아낸 패스워드를 이용해 root 유저로 interactive하게 로그인합니다.
다시 한번 말씀 드립니다.
docker run은 새로운 컨테이너를 실행하는 것이고 docker exec는 이미 실행된 컨테이너를 대상으로 작업을 수행하는 것입니다.
MySQL 8.0을 Docker로 실행 예 (1)
$ docker pull mysql/mysql-server:8.0
8.0: Pulling from mysql/mysql-server
...
38b3da6a86f7: Pull complete
Digest: sha256:5241f7de0483a70f5856da995fea98904cfce8f1c51734b7f3836c1663eead17
Status: Downloaded newer image for mysql/mysql-server:8.0
docker.io/mysql/mysql-server:8.0
docker pull로 MySQL 다운(pull)
$ docker run --name=mysql_container mysql/mysql-server:8.0
6137dc6ea2fe283dd007b2e55a1cc2c37b0c89dc45eaa3b58085bae7daa799ed
docker run을 --name 옵션으로 별칭 mysql_conatiner를 부여하며 실행
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
6137dc6ea2fe mysql/mysql-server:8.0 "/entrypoint.sh my…" 8 secs ago Up 7 secs (health: starting) 3306/tcp,
33060-33061/tcp mysql_container
앞서 run --name으로 별칭을 주었기 때문에 docker ps 명령으로 굳이 컨테이너 ID를 확인할 필요는 없습니다.
$ docker logs mysql_container 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: [PASSWORD]
GENERTAED 단어가 나오는 라인을 찾아 root 유저 패스워드를 확인합니다.
$ docker exec -it mysql_container mysql -uroot -p
Enter password:
root 유저로 interactive하게 찾은 패스워드를 이용해 로그인합니다.
MySQL 8.0에 root 유저로 로그인한 후
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.26
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
로그인 후 위와 같은 화면이 뜰 것입니다.
설치한 MySQL에 어떤 데이터 베이스들이 있는지 show databases; 명령을 입력하면
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> ALTER USER root@localhost IDENTIFIED BY 'MeadowoodDr9$';
에러가 뜰텐데 에러의 내용은 docker logs mysql_container 2>&1 | grep GENERATED 명령어로 알아낸 패스워드를 보안을 위해 적당한 패스워드로 바꾸라는 뜻입니다. (예시에서는 MeadowoodDr9$로 설정 했네요.)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> use mysql;
Database changed
mysql> show tables;
+------------------------------------------------------+
| Tables_in_mysql |
+------------------------------------------------------+
| columns_priv |
| component |
| db |
패스워드를 바꿔주니 정상적으로 DB들이 조회되고 DB 사용과 테이블 조회가 가능합니다.
여기서 사용해본 Docker 명령
docker run --name
기억하기 쉬운 이름을 docker ps로 찾은 Container ID 대신 사용 가능
docker logs
Container쪽에서 생성된 stdout, stderr단의 로그를 읽어옴
--follow 옵션을 사용하면 로그가 계속적으로 스트리밍이 됨
실습

적당한 곳에 mysql이라는 디렉토리를 만들어주세요.
그리고 터미널 상에서 그곳으로 이동합니다.
D:\Dev_KDT\mysql>docker pull mysql/mysql-server:8.0
8.0: Pulling from mysql/mysql-server
6a4a3ef82cdc: Pull complete
5518b09b1089: Pull complete
b6b576315b62: Pull complete
349b52643cc3: Pull complete
abe8d2406c31: Pull complete
c7668948e14a: Pull complete
c7e93886e496: Pull complete
Digest: sha256:d6c8301b7834c5b9c2b733b10b7e630f441af7bc917c74dba379f24eeeb6a313
Status: Downloaded newer image for mysql/mysql-server:8.0
docker.io/mysql/mysql-server:8.0
What's Next?
View a summary of image vulnerabilities and recommendations → docker scout quickview mysql/mysql-server:8.0
docker pull mysql/mysql-server:8.0
mysql이라는 어카운트 ID의 mysql-server라는 이미지의 8.0버전을 pull로 다운 받습니다.
D:\Dev_KDT\mysql>docker run --name=mysql_container mysql/mysql-server:8.0
[Entrypoint] MySQL Docker Image 8.0.32-1.2.11-server
[Entrypoint] Initializing database
[Entrypoint] No password option specified for new database.
[Entrypoint] A random onetime password will be generated.
(생략..)
docker run에서 --name 옵션으로 mysql_container라는 이름을 mysql/mysql-server:8.0 이미지에게 주어 더 이상 docker ps로 MySQL Container의 ID를 조회하고 사용할 수고를 덜어줍니다.
그리고 docker run으로 Container를 (첫)실행한 것이기 때문에 사용했던 터미널은 MySQL의 서버가 작동되기에 다른 터미널을 새로 하나 켜야합니다.
root 계정의 패스워드를 찾아야 합니다.
docker logs mysql_container 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: (패스워드)
참고로 grep은 unix기반, 즉 맥에서 사용 가능하고
PS D:\dev_KDT\mysql> docker logs mysql_container 2>&1 | Select-String "GENERATED"
[Entrypoint] A random onetime password will be generated.
[Entrypoint] GENERATED ROOT PASSWORD: (패스워드)
Select-String은 파워쉘(Power shell)에서 사용 가능합니다.
D:\Dev_KDT\mysql>docker logs mysql_container 2>&1 | findstr "GENERATED"
[Entrypoint] GENERATED ROOT PASSWORD: (패스워드)
Windows CMD를 사용하신다면 findstr을 사용하셔야 합니다.
PS D:\dev_KDT\mysql> docker exec -it mysql_container mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 8.0.32
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
docker run은 새로운 컨테이너를 실행합니다.
docker exec는 이미 실행이 된 컨테이너에게 명령을 보냅니다.
docker exec 명령을 사용합니다.
-it로 interactive하게 사용한다는 옵션을 주었습니다.
아까 MySQL Container ID대신 쓰기 위해 이름으로 정해준 mysql_container을 입력합니다.
sh(쉘) 대신 mysql을 쓰겠다고 적어주고
-uroot로 root 유저로 로그인한다 적습니다.
-p로 패스워드를 입력하겠다고 적습니다.
미리 복사해둔 패스워드를 붙여넣기하여 MySQL에 root 유저로 로그인했습니다.
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
알아낸 패스워드를 보안을 위해 바꾸지 않으면 MySQL이 명령을 수행하지 않습니다.
mysql> ALTER USER root@localhost IDENTIFIED BY '(비밀번호)';
Query OK, 0 rows affected (0.01 sec)
비밀번호를 바꿔주세요
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
다시 명령어를 입력하니 4개의 데이터 베이스들이 조회됩니다.
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------------------------------------------+
| Tables_in_mysql |
+------------------------------------------------------+
| columns_priv |
| component |
| db |
| default_roles |
| engine_cost |
| func |
| general_log |
| global_grants |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| password_history |
| plugin |
| procs_priv |
| proxies_priv |
| replication_asynchronous_connection_failover |
| replication_asynchronous_connection_failover_managed |
| replication_group_configuration_version |
| replication_group_member_actions |
| role_edges |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+------------------------------------------------------+
38 rows in set (0.00 sec)
DB 사용과 테이블 조회도 가능합니다.
MySQL Docker를 사용하는 실습을 이후에 한번 더 해보겠습니다.
'Docker & K8S' 카테고리의 다른 글
| Docker & K8S - Hangman을 Docker Image로 구성 개요 (0) | 2023.12.19 |
|---|---|
| Docker & K8S - 학습 목표 소개 (Docker로 웹 서비스 실행) (0) | 2023.12.19 |
| Docker & K8S - 우분투(Ubuntu) (0) | 2023.12.18 |
| 10주차 - 1 [Docker & K8S] (0) | 2023.12.18 |
| Docker & K8S - 데모 (0) | 2023.12.18 |