#### 2.5.6.1 使用 Docker 部署 MySQL 服務器的基本步驟
> **警告**
>
> MySQL 團隊維護的 MySQL Docker 鏡像是專門為 Linux 平臺構建的. 不支持其他平臺, 使用這些 MySQL Docker 鏡像的用戶自行承擔風險. 有關在非 Linux 操作系統中運行這些容器的一些已知限制, 請參閱[此處的討論](https://dev.mysql.com/doc/refman/8.0/en/deploy-mysql-nonlinux-docker.html).
##### 接受許可協議并使用Docker Client登錄 (MySQL企業版)
_使用 MySQL 企業版的 Docker 鏡像需要訂閱._ 訂閱的工作原理是攜帶你自己的許可證模型; 參閱 [如何購買 MySQL 產品和服務](https://www.mysql.com/buy-mysql/) 獲取詳情. 在下載 MySQL 企業版鏡像之前, 你需要接受許可協議并登錄到容器庫.
從 Oracle 容器庫下載:
- 在 https://container-registry.oracle.com/ 瀏覽 Oracle 容器庫并選擇 MySQL.
- 在 MySQL 庫列表下, 選擇 `enterprise-server`.
- 如果你至今沒有登錄到 Oracle 容器庫, 點擊頁面右側的 `Sign in` 按鈕, 然后在提示時輸入你的 Oracle 賬戶憑證.
- 按照頁面右側的說明接受許可協議.
- 使用你的 Docker 客戶端 (`docker` 命令) 登錄 Oracle 容器源. 使用 `docker login` 命令:
```bash
# docker login container-registry.oracle.com
Username: Oracle-Account-ID
Password: password
Login successful.
```
從 Docker 商店下載:
- 在 https://store.docker.com/images/mysql-enterprise-server 瀏覽 MySQL 服務器企業版頁面.
- 如果你還沒登錄到 Docker 商店, 使用 **Log in** 鏈接和你的 Docker 證書進行登錄.
- 點擊出現的 **Proceed to Checkout** 按鈕.
- 按照頁面右側的說明接受許可協議.
- 使用 Docker 客戶端 (`docker` 命令) 登錄到 Docker 商店. 使用 `docker login` 命令:
```bash
# docker login
Username: Docker-ID
Password: password
Login successful.
```
##### 下載 MySQL 服務器 Docker 鏡像
嚴格來說, 在單獨的步驟中下載服務器鏡像不是必需的; 然而, 在創建容器之前執行此步驟可以確保本地鏡像是最新的. 下載 MySQL 社區版鏡像, 運行命令:
```bash
docker pull mysql/mysql-server:tag
```
`tag` 是你想拉取的鏡像版本的標簽 (例如, `5.5`, `5.6`, `5.7`, `8.0`, 或者 `latest`). 如果 `:tag` 被省略, 將使用 `latest` 標簽, 下載 MySQL 社區服務器的最新 GA 版本鏡像. 在 [Docker Hub 的 mysql/mysql-server 頁面](https://hub.docker.com/r/mysql/mysql-server/tags/) 參考可用版本的標簽列表.
列出已下載的 Docker 鏡像:
```bash
shell> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql/mysql-server latest 3157d7f55f8d 4 weeks ago 241MB
```
從 Docker 商店下載 MySQL 企業版鏡像:
```bash
docker pull store/oracle/mysql-enterprise-server:tag
```
從 Oracle 容器源下載 MySQL 企業版鏡像:
```bash
docker pull container-registry.oracle.com/mysql/enterprise-server:tag
```
`tag` 有不同的選擇, 對應 MySQL 團隊在 Oracle 提供的兩個版本的 MySQL 企業版 Docker 鏡像:
`8.0`, `8.0.x` (`x` 是 8.0 系列的最新版本號): MySQL 8.0 企業版,最新的GA
`5.7`, `5.7.y` (`y` 是 85.7 系列的最新版本號): MySQL 5.7 企業版
##### 啟動 MySQL 服務器實例
為 MySQL 社區版服務器啟動一個新的 Docker 容器:
```bash
docker run --name=mysql1 -d mysql/mysql-server:tag
```
使用此命令為 MySQL 企業版服務器啟動一個新的 Docker 容器, 如果 Docker 鏡像是從 Oracle 容器庫中下載的:
```bash
docker run --name=mysql1 -d container-registry.oracle.com/mysql/enterprise-server:tag
```
使用此命令為 MySQL 企業版服務器啟動一個新的 Docker 容器, 如果 Docker 鏡像是從 Docker 商店下載的:
```bash
docker run --name=mysql1 -d store/oracle/mysql-enterprise-server:tag
```
`--name` 選項, 用于為服務器容器提供自定義命令 (在本示例中是 `mysql1`), 可選; 如果沒有提供容器名稱, 會隨機生成一個. 如果指定名稱和 tag 的鏡像沒有在以前通過 `docker pull` 或者 `docker run` 命令下載, 則現在講下載該鏡像. 下載完成后, 開始初始化容器, 當你運行 `docker ps` 命令時, 容器會出現在正在運行的容器列表中; 例如:
```bash
shell> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a24888f0d6f4 mysql/mysql-server "/entrypoint.sh my..." 14 seconds ago Up 13 seconds (health: starting) 3306/tcp, 33060/tcp mysql1
```
容器初始化可能需要一些時間. 當服務器準備好使用時, 容器在狀態在 `docker ps` 命令的輸出中從 `(health: starting)` 到 `(healthy)`.
在 `docker run` 命令中使用 `-d` 選項使容器在后臺運行. 使用這個命令監視容器的輸出:
```bash
docker logs mysql1
```
初始化完成后, 命令輸出包含為 root 用戶生成的隨機密碼; 例如, 使用這個命令查詢密碼:
```bash
shell> docker logs mysql1 2>&1 | grep GENERATED
GENERATED ROOT PASSWORD: Axegh3kAJyDLaRuBemecis&EShOs
```
##### 從容器內連接到 MySQL 服務器
一旦服務器準備好了, 你可以在你剛啟動的 MySQL Server 容器中運行 [mysql](https://dev.mysql.com/doc/refman/8.0/en/mysql.html) 客戶端, 并連接到 MySQL Server. 使用 `docker exec -it` 命令在已運行的 Docker 容器內啟動 [mysql](https://dev.mysql.com/doc/refman/8.0/en/mysql.html) 客戶端, 如下所示:
```bash
docker exec -it mysql1 mysql -uroot -p
```
當詢問時, 輸入生成的 root 密碼 (有關如何查找密碼, 請參閱 [啟動 MySQL 服務器實例](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html#docker-starting-mysql-server) 的最后一步). 因為 [`MYSQL_ONETIME_PASSWORD`](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html#docker_var_mysql_onetime_password) 選項默認為 true, 當 [mysql](https://dev.mysql.com/doc/refman/8.0/en/mysql.html) 客戶端連接服務器之后, 你必須通過發出此語句重置服務器 root 密碼:
```bash
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
```
使用你選擇的密碼替換 `password`. 重置密碼后, 服務器就可以使用了.
##### 容器 Shell 訪問
讓 shell 訪問 MySQL 服務器容器, 使用 `docker exec -it` 命令在容器內啟動 bash shell:
```bash
shell> docker exec -it mysql1 bash
bash-4.2#
```
然后可以在容器中運行 Linux 命令. 例如, 查看容器內服務器數據目錄的內容, 使用此命令:
```bash
bash-4.2# ls /var/lib/mysql
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql mysql.sock.lock private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 mysql.sock performance_schema public_key.pem server-key.pem
```
##### 停止和刪除 MySQL 容器
停止我們創建的 MySQL 服務器容器, 使用這個命令:
```bash
docker stop mysql1
```
`docker stop` 發送 SIGTERM 信號到 [mysqld](https://dev.mysql.com/doc/refman/8.0/en/mysqld.html) 進程, 以便服務器正常關閉.
請注意, 當容器的主進程 (MySQL 服務器容器中的 [mysqld](https://dev.mysql.com/doc/refman/8.0/en/mysqld.html)) 停止時, Docker 容器也會自動停止.
再次啟動 MySQL 服務器容器:
```bash
docker start mysql1
```
重啟 MySQL 服務器容器:
```bash
docker restart mysql1
```
刪除 MySQL 容器, 先停止, 然后使用 `docker rm` 命令:
```bash
docker stop mysql1
```
```bash
docker rm mysql1
```
如果你想同時刪除 [服務器數據目錄的 Docker volume](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html#docker-persisting-data-configuration), 添加 `-v` 選項到 `docker rm` 命令.
##### 升級 MySQL 服務器容器
> **重要**
>
> - 在執行任何 MySQL 升級之前, 請仔細閱讀 [2.11節, “升級 MySQL”](https://dev.mysql.com/doc/refman/8.0/en/upgrading.html) 中的說明. 在這里討論的其他說明中, 在升級前備份你的數據尤為重要.
> - 本節要求在主機上保留服務器的數據和配置. 參閱 [保留數據和配置更改](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html#docker-persisting-data-configuration) 獲取詳情.
按照以下步驟 MySQL Docker 安裝從 5.7 升級到 8.0:
- 停止 MySQL 5.7 服務器 (在這個示例中容器名稱是 mysql57):
```bash
docker stop mysql57
```
- 下載 MySQL 8.0 服務器 Docker 鏡像. 請參閱[下載 MySQL 服務器 Docker 鏡像](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html#docker-download-image); 確保你對 MySQL 8.0 使用了正確的 tag.
- 使用在這個主機上持久化的 (在本例中使用 [bind-mounting](https://docs.docker.com/engine/reference/commandline/service_create/#add-bind-mounts-or-volumes)) 舊的服務器數據和配置 (如有需要可適當修改—參閱 [2.11節, “升級 MySQL”](https://dev.mysql.com/doc/refman/8.0/en/upgrading.html)) 啟動新的 MySQL 8.0 Docker 容器 (在這個示例中命名為 `mysql80`). MySQL 社區服務器, 運行命令:
```bash
docker run --name=mysql80 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d mysql/mysql-server:8.0
```
如果需要, 調整 `mysql/mysql-server` 為正確的庫名稱. 例如, 替換為 `store/oracle/mysql-enterprise-server` 是 Docker 商店的 MySQL 企業版鏡像, 或者 `container-registry.oracle.com/mysql/enterprise-server` 是 Oracle 容器庫的 MySQL 企業版鏡像.
- 等待服務器完成啟動. 你可以使用 `docker ps` 命令檢查服務器的狀態 (參閱 [啟動 MySQL 服務器實例](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html#docker-starting-mysql-server) 獲取如何操作).
- *對于 MySQL 8.0.15 和更早的*: 在 MySQL 8.0 服務器容器中運行 [mysql_upgrade](https://dev.mysql.com/doc/refman/8.0/en/mysql-upgrade.html) 工具 (不支持 MySQL 8.0.16 和更高版本):
```bash
docker exec -it mysql80 mysql_upgrade -uroot -p
```
當提示時, 輸入你的舊的 MySQL 5.7 服務器 root 密碼.
- 通過重啟 MySQL 8.0 服務器容器完成升級:
```bash
docker restart mysql80
```
##### 使用 Docker 部署 MySQL 服務器的更多主題
有關使用Docker部署MySQL服務器的更多主題, 例如服務器配置, 持久化數據和配置, 服務器錯誤日志, 和容器環境變量, 參閱 [2.5.6.2節, “使用 Docker 部署 MySQL 服務器的更多主題”](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html).
- 簡介
- 前言和法律條款
- 安裝和更新 MySQL
- 在 Linux 上安裝 MySQL
- 在 Linux 上使用 APT 庫安裝 MySQL
- 在 Linux 上使用 Docker 部署 MySQL
- 使用 Docker 部署 MySQL 服務器的基本步驟
- 使用 Docker 部署 MySQL 服務器的更多主題
- 教程
- 連接到服務器和從服務器斷開
- 輸入查詢
- 創建和使用數據庫
- 創建和選擇數據庫
- 創建表
- 將數據加載到表中
- 從表中檢索數據
- 選擇所有數據
- 選擇特定行
- 選擇指定列
- 行排序
- 日期計算
- 處理 NULL 值
- 模式匹配
- 計算行數
- 使用多個表
- 獲取數據庫和表的信息
- 在批處理模式使用 mysql
- 常見查詢示例
- 列的最大值
- 包含某一行最大值的記錄
- 每組中列的最大值
- 擁有某個字段的組間最大值的行
- 使用用戶自定義變量
- 使用外鍵
- 兩個鍵上搜索
- 計算每日訪問量
- 使用 AUTO_INCREMENT
- 在 Apache 中使用 MySQL
- MySQL 程序
- MySQL 客戶端程序
- mysql — MySQL 命令行客戶端
- 優化
- 優化概述
- 優化 SQL 語句
- 優化和索引
- 優化數據庫結構
- 優化 InnoDB 表
- 優化 MyISAM 表
- 優化 MEMORY 表
- 理解查詢執行計劃
- 控制查詢優化器
- 緩沖和緩存
- 優化鎖操作
- 優化 MySQL 服務器
- 測量性能 (Benchmarking)
- 檢查線程信息