網頁

2020/8/25

Docker 安裝MySQL

在Mac的Docker執行MySQL 8容器並連線。


範例環境:

  • macOS Catalina
  • Docker 19.03.12

MySQL的Docker Hub。在Tags頁籤可找到不同版本的tag,本範例以版本mysql:8為image。

在終端機執行docker pull mysql:8指令下載MySQL 8的image。冒號後面的是MySQL版本

$ docker pull mysql:8
8: Pulling from library/mysql
6ec7b7d162b2: Pull complete
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
9f2c4202ac29: Pull complete
a369b92bfc99: Pull complete
Digest: sha256:365e891b22abd3336d65baefc475b4a9a1e29a01a7b6b5be04367fcc9f373bb7
Status: Downloaded newer image for mysql:8
docker.io/library/mysql:8

MySQL image下載完後執行docker images檢視。

$ docker images
REPOSITORY         TAG         IMAGE ID            CREATED             SIZE
mysql              8           ab2f358b8612        8 days ago          545MB

在使用者目錄新增一資料夾mysql-docker-data,此用來保存MySQL container的資料。


使用docker run啟動

輸入
docker run -d -v ~/mysql-docker-data:/var/lib/mysql -it --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -e MYSQL_DATABASE=mydb mysql:8 --default-authentication-plugin=mysql_native_password

docker run參數說明:

  • -d:同--detach,以背景模式執行。
  • -v:同--volume,掛載host目錄到container目錄,也就是host的~/mysql-docker-data會保存container /var/lib/mysql的資料。
  • -it:同--interactive--tty,作用為運行container時可登入其bash操作。
  • --name mysql8,命名container名稱為mysql8
  • -p:同--publish。作用為將container的3306 port對映到"主機(host)"的3306 port
  • -e:同--env,設定環境變數。MYSQL_ROOT_PASSWORD設定MySQL root帳號的登入密碼為12345MYSQL_DATABASE設定資料庫名稱為mydb
  • mysql:8mysql為image名稱,8為image tag。所以運行的是mysql:8的image。
  • --default-authentication-plugin=mysql_native_password:把儲存密碼的方式改為MySQL 5的mysql_native_password,因為MySQL 8的儲存方式預設為caching_sha2_password,但一些免費的MySQL client圖形工具如Sequel Pro,Navicat等會無法連線,所以設定此參數。

$ docker run -d -v ~/mysql-docker-data:/var/lib/mysql -it --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -e MYSQL_DATABASE=mydb mysql:8 --default-authentication-plugin=mysql_native_password
9b3282f611a9c891d7a2c7a98e60fc0296c3863351f4ee6e31cd69949a0e24ea


使用Docker Compose啟動

除了用docker run啟動外,也可用Docker Compose的方式啟動。

在工作目錄新增一docker-compose.yml檔內容如下。

docker-compose.yml

version: "3.8"

services:
  mysql8: # 自訂的service
    image: mysql:8
    container_name: mysql8
    volumes:
      - ~/mysql-docker-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 12345
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"

docker-compose.yml設定說明:

  • version:設定檔使用的版本。
  • services:定義要啟動的container服務
  • services.mysql8:services下自訂的服務
  • services.mysql8.image:指定container的image
  • services.mysql8.volumes:設定container的掛載目錄
  • services.mysql8.environment:container的環境變數
  • services.mysql8.port:container對外暴露的port號。

可以看出docker-compose.yml中的設定效果同上面docker run的參數設定。

然後在docker-compose.yml所在目錄輸入docker-compose up -d指令便可啟動MySQL container。

$ docker-compose up -d
Starting mysql8 ... done


連線

輸入docker ps檢視運行中的container。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
9b3282f611a9        mysql:8             "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql8

然後利用docker exec mysql8 mysql -u root -p進入container的mysql command line。

docker exec指令的作用為在運行的container執行指令,所以意思就是在mysql8這個container執行mysql -u root -p的指令。

輸入的密碼為上面執行mysql image時設定的12345

$ docker exec -it mysql8 mysql -u root -p
Enter password:12345
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

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>

在mysql command line下輸入SHOW VARIABLES WHERE variable_name = 'default_storage_engine';查看預設的MySQL引擎

mysql> SHOW VARIABLES WHERE variable_name = 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.01 sec)

MySQL 8預設引擎為InnoDB。


在mysql command line下輸入SELECT @@character_set_database, @@collation_database;查看字元集編碼

mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4                  | utf8mb4_0900_ai_ci   |
+--------------------------+----------------------+
1 row in set (0.01 sec)

字元集編碼預設為utf8mb4


MySQL workbench連線設定如下。




停止container輸入docker stop mysql8

$ docker stop mysql8
mysql8

刪除container輸入docker rm mysql8

$ docker stop mysql8

沒有留言:

張貼留言