前言: mysql
上篇文章介紹了Docker工具的安裝及經常使用命令使用。本篇文章咱們會介紹如何在Docker中運行MySQL實例,可能有的小夥伴會問:爲何要在Docker裏運行MySQL呢?由於在Docker裏部署MySQL實例操做簡單,不須要考慮操做系統等依賴差別,並且能夠多實例部署,好比說咱們原來服務器有安裝MySQL5.7,咱們想再運行MySQL8.0實例的話只須要用Docker啓動MySQL8.0鏡像便可。下面咱們就來介紹下如何用Docker啓動MySQL實例。sql
在上篇文章中咱們介紹過Docker中三個基本的概念:鏡像,容器,倉庫。要用在Docker中部署MySQL,第一步要作的是從官方倉庫中拉取MySQL鏡像,這裏咱們從Docker Hub中拉取MySQL鏡像。進入Docker Hub,搜索MySQL,能夠看到以下畫面,其中有不一樣版本的鏡像及使用介紹。docker
好比咱們想拉取MySQL5.7版本及8.0版本的鏡像,能夠作以下操做:vim
# 拉取5.7及8.0版本鏡像 稍等片刻便可拉取成功 docker pull mysql:5.7.23 docker pull mysql:8.0.18 # 查看鏡像 docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0.18 c8ee894bd2bd 2 weeks ago 456MB mysql 5.7.23 1b30b36ae96a 12 months ago 372MB
其實MySQL官方鏡像也存在一些缺陷,好比說時區不是北京時間,系統字符集問題等。下面以MySQL5.7.23版本鏡像爲基礎,展現下如何修改構建鏡像。bash
# 建立Dockerfile 主要做用是更改系統字符集及時區 內容以下: cat Dockerfile FROM mysql:5.7.23 MAINTAINER wang RUN echo "alias ls='ls --color=auto'" >> /root/.bashrc \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV LANG=C.UTF-8 # 構建鏡像 docker build -t my-mysql:5.7.23 . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM mysql:5.7.23 ---> 1b30b36ae96a Step 2/4 : MAINTAINER wang ---> Running in a7cc94f95cc7 Removing intermediate container a7cc94f95cc7 ---> d9590ed98de5 Step 3/4 : RUN echo "alias ls='ls --color=auto'" >> /root/.bashrc && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ---> Running in e698bfdb3817 Removing intermediate container e698bfdb3817 ---> 31c9ed9103c5 Step 4/4 : ENV LANG=C.UTF-8 ---> Running in eefa296fef94 Removing intermediate container eefa296fef94 ---> 10aa697936e9 Successfully built 10aa697936e9 Successfully tagged my-mysql:5.7.23 # 再次查看鏡像便可找到咱們新構建的鏡像 docker images REPOSITORY TAG IMAGE ID CREATED SIZE my-mysql 5.7.23 10aa697936e9 About a minute ago 372MB mysql 8.0.18 c8ee894bd2bd 2 weeks ago 456MB mysql 5.7.23 1b30b36ae96a 12 months ago 372MB
這裏爲你們介紹如何利用上面構建的鏡像來運行MySQL實例,MySQL容器化其實也須要映射端口,數據持久化,加載配置文件等操做,下面給你們演示下具體啓動操做。服務器
2.1 建立數據持久化路徑及配置文件網絡
# 建立配置文件目錄及數據目錄 mkdir -p /data/mysql57/{cnf,data} # 添加配置文件my.cnf cd /data/mysql57/cnf/ vim my.cnf # 配置文件內容以下,可自定義 [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql server-id = 33061 max_connections = 1000 sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION lower_case_table_names=1 innodb_file_per_table = 1 log_timestamps=SYSTEM character-set-server = utf8 max_allowed_packet = 32M sort_buffer_size = 4M read_buffer_size = 4M join_buffer_size = 4M binlog_cache_size = 4M tmp_table_size = 96M max_heap_table_size = 96M innodb_buffer_pool_size = 512M #logs slow_query_log = 1 slow_query_log_file = /var/lib/mysql/slow.log long_query_time = 3 log-bin = /var/lib/mysql/binlog binlog_format = row expire_logs_days = 15 log_bin_trust_function_creators = 1
2.2 docker run運行MySQL實例socket
# 一條命令啓動一個MySQL實例 docker run -itd -p 33061:3306 --name mysql57 --hostname=mysql57 -v /data/mysql57/cnf:/etc/mysql -v /data/mysql57/data:/var/lib/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=Asdf@123456 my-mysql:5.7.23 # 解釋下各個參數的含義 -d: 後臺運行容器,並返回容器ID -i: 以交互模式運行容器,一般與 -t 同時使用 -t: 爲容器從新分配一個僞輸入終端,一般與 -i 同時使用 -p: 指定端口映射,格式爲:主機(宿主)端口:容器端口 --name="mysql57": 爲容器指定一個名稱 --hostname=mysql57: 指定容器的hostname -v: 綁定一個卷 --privileged=true: 以特權方式啓動容器
2.3 檢查容器狀態tcp
# 查看容器狀態 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 04cd3d99d5cb my-mysql:5.7.23 "docker-entrypoint.s…" 13 seconds ago Up 11 seconds 33060/tcp, 0.0.0.0:33061->3306/tcp mysql57 # 進入容器內 docker exec -it mysql57 /bin/bash 或 docker exec -it [CONTAINER ID] /bin/bash
到此爲止,咱們已經在Docker中成功運行了MySQL實例,其實尚未結束,還有好多操做還沒講,好比如何備份恢復,怎麼更改配置等,下面簡單介紹下這類相關操做。ide
# 備份 docker exec mysql57 sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /tmp/all-databases.sql # 恢復 docker exec -i mysql57 sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /tmp/all-databases.sql
# 更改配置只須要修改宿主機 /data/mysql57/cnf/my.cnf 文件,而後重啓容器便可 docker restart mysql57
若是你想在本地經過工具鏈接容器內MySQL的話,可使用宿主機ip加映射端口來鏈接。好比咱們上面建立的MySQL實例就能夠經過宿主機ip+30661端口來鏈接,若沒法鏈接請檢查網絡及服務器防火牆。
總結:
本文主要介紹在Docker中部署MySQL的方法步驟,體驗下來你會發現很是簡單方便,並且能夠大規模多實例部署。假如你想體驗最新版本8.0.18的話,能夠本身部署下試試看,其實還能夠更簡單,好比說直接運行docker run mysql:5.7.23 便可啓動一個實例,可是爲了更加規範,仍是建議將配置文件及數據目錄都掛載到宿主機本地。
參考資料: