Docker学习

Docker 安装 MySQL

2018-07-30  本文已影响183人  nerowu

下载 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

上一篇下一篇

猜你喜欢

热点阅读