Docker 安装 MySQL

下载 MySQL Server Docker Image

#tag代表版本号,如5.5,5.6,5.7,8.0或者latest
docker pull mysql/mysql-server:tag

更多mysql镜像,请查看https://hub.docker.com/r/mysql/mysql-server/tags/

 #查看下载的镜像
 docker images

要下载MySQL Enterprise Edition 镜像,请运行如下命令:

 docker pull store/oracle/mysql-enterprise-server:tag

docker pull container-registry.oracle.com/mysql/enterprise-server:tag

开启MySQL Server 实例

使用以下命令为MySQL社区服务器启动一个新的Docker容器:

docker run --name=mysql1 -d mysql/mysql-server:tag

如果从Oracle容器注册表中下载了Docker镜像,那么就可以使用这个命令为MySQL企业服务器启动一个新的Docker容器:

docker run --name=mysql1 -d container-registry.oracle.com/mysql/enterprise-server:tag

如果Docker映像是从Docker商店下载的,那么就用这个命令为MySQL企业服务器启动一个新的Docker容器:

docker run --name=mysql1 -d store/oracle/mysql-enterprise-server:tag

--name 选项,为docker容器提供一个自定义的名称,如mysql1,这个操作是可选的。如果没有提供容器名称,则会生成一个随机的容器名。如果之前的Docker pull 或 Docker run命令没有下载指定名称和标签的Docker镜像,那么上面的命令会去下载最新的mysql镜像。下载完后,容器的初始化就开始执行。当您运行docker ps命令时,docker容器列表中会显示:

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 选项使容器在后台运行。使用这个命令监视容器的输出:

docker logs mysql1

一旦初始化完成,命令的输出就会包含为root用户生成的随机密码。例如,检查密码。

shell> docker logs mysql1 2>&1 | grep GENERATED
GENERATED ROOT PASSWORD:Axegh3kAJyDLaRuBemecis&EShOs

从容器内连接到MySQL服务器

一旦服务器准备好了,您就可以在刚刚启动的MySQL服务器容器中运行MySQL客户端,并将其连接到MySQL服务器。使用Docker exec -it 命令在您已经启动的Docker容器中启动一个mysql客户端,如下所列:

docker exec -it mysql1 mysql -uroot -p

当被询问时,输入生成的根密码(参见上面关于如何查找密码的MySQL服务器实例的最后一步)。因为mysql onetime password选项默认为true,在您将mysql客户端连接到服务器之后,您必须通过发出以下语句重置服务器根密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

用您选择的密码替换密码。一旦密码被重置,服务器就可以使用了。

容器Shell访问

要让shell访问MySQL服务器容器,请使用docker exec -it 命令在容器内启动一个bash shell:

shell> docker exec -it mysql1 bash 
bash-4.2#

然后您可以在容器内运行Linux命令。例如,要查看容器内服务器的数据目录中的内容,请使用以下命令:

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服务器容器,请使用以下命令:

docker stop mysql1

docker stop 向mysqld进程发送SIGTERM信号,这样服务器就会优雅地关闭。
还要注意的是,当容器的主进程(MySQL服务器容器中的mysqld)停止时,Docker容器会自动停止。
再次启动MySQL服务器容器:

docker start mysql1

重启容器

docker restart mysql1

删除mysql服务容器前先停止容器:

docker stop mysql1
docker rm mysql1
如果您想要同时删除服务器数据目录的Docker卷,则将 -v 选项添加到Docker rm命令中。

致此,以上操作已经完全满足docker安装mysql的方式。如下是针对Docker的优化MySQL安装 。

针对Docker的优化MySQL安装

MySQL的Docker镜像针对代码的大小进行了优化,这意味着它们只包含了那些在Docker容器中运行MySQL实例的大多数用户的关键组件。在以下方面,MySQL Docker安装与普通的、非Docker的安装不同:
包含的二进制文件仅限于:
/usr/bin/my_print_defaults
/usr/bin/mysql
/usr/bin/mysql_config
/usr/bin/mysql_install_db
/usr/bin/mysql_tzinfo_to_sql
/usr/bin/mysql_upgrade
/usr/bin/mysqladmin
/usr/bin/mysqlcheck
/usr/bin/mysqldump
/usr/bin/mysqlpump
/usr/sbin/mysqld
所有的二进制被剥落,不包含调试信息。

配置MySQL Server

当你启动mysql docker容器时,您可以通过Docker run命令将配置选项传递给服务器;例如:

docker run --name mysql1 -d mysql/mysql-server:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_col

命令以utf8mb4作为默认字符集和utf8mb4col作为您的数据库的默认排序启动MySQL服务器。
另一种配置MySQL服务器的方法是准备一个配置文件,并将其挂载到容器内的服务器配置文件的位置。有关详细信息,请参阅持久数据和配置更改。

持久数据和配置更改

Docker容器在原则上是临时的,如果容器被删除或损坏,任何数据或配置都将丢失(参见讨论)。然而,Docker卷提供了一种机制,可以在Docker容器中保存数据。在初始化时,MySQL服务器容器为服务器数据目录创建Docker卷。运行docker检查容器命令的JSON输出有一个挂载键,其值提供数据目录卷的信息:

shell> docker inspect mysql1 
...
 "Mounts": [
        {
            "Type": "volume",
            "Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652",
            "Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data",
            "Destination": "/var/lib/mysql",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],
...

输出显示源文件夹
/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data,将数据持久化到主机上的数据,已经安装在/var/lib/mysql中,容器内的服务器数据目录。

保存数据的另一种方法是在创建容器时使用 --mount 选项挂载主机目录。同样的技术可以用来持久化服务器的配置。下面的命令创建一个MySQL服务器容器,并将数据目录和服务器配置文件绑定在一起:

docker run --name=mysql1 \
--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:tag

配置文件path-on-host-machine/my.cnf必须存在,同时包含指定的用户:

[mysqld]
user=mysql

path-on-host-machine.datadir目录必须存在。要发生服务器初始化,目录必须是空的。您还可以安装一个带有数据的目录,并使用它启动服务器;但是,您必须确保启动Docker容器,其配置与创建数据的服务器具有相同的配置,并且启动容器时所需的任何主机文件或目录都被安装。

运行额外的初始化脚本

如果您想在创建后立即在数据库上运行任何.sh或.sql脚本,您可以将它们放入主机目录中,然后mount目录在/docker-entrypoint-initdb.d

docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/scripts/,dst=/docker-entrypoint-initdb.d/ \
-d mysql/mysql-server:tag

从另一个Docker容器中的应用程序连接到MySQL

通过建立一个Docker网络,你可以让多个Docker容器相互通信,这样,在另一个Docker容器中的客户端应用程序就可以在服务器容器中访问MySQL服务器。首先,创建一个Docker网络:

docker network create my-custom-net

然后,当您创建并启动服务器和客户端容器时,使用-网络选项将它们放在您创建的网络上。例如:

docker run --name=mysql1 --network=my-custom-net -d mysql/mysql-server

docker run --name=myapp1 --network=my-custom-net -d myapp

myapp1容器随后可以与mysql1主机连接到mysql1容器,反之亦然,因为Docker会自动为给定的容器名称设置一个DNS。在下面的例子中,我们从myapp1容器中运行mysql客户端,以便在自己的容器中连接主机mysql1:

docker exec -it myapp1 mysql --host=mysql1 --user=myuser --password

参考:https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容