写点什么

面向 WEB 开发的 Docker(四):启动 MySQL 数据库

用户头像
devpoint
关注
发布于: 2021 年 05 月 26 日
面向WEB开发的Docker(四):启动MySQL数据库

在本文中,将来学习如何使用Docker CLIDocker compose启动MySQL容器。


如果你正在开发需要数据存储的应用程序,则MySQL是一种流行的 SQL 数据库。以前从未使用过 MySQL 或数据库都没关系-本教程将学习并熟悉启动 Docker 容器的过程。这些概念可以应用于应用程序所需的任何依赖项。

1、在 Docker Hub 上找到合适的 MySQL 映像

访问Docker Hub,然后在搜索框中输入以找到包含官方图像的页面: MySQL



Docker 存储库提供一个或多个受支持的标签,它们是映像的变体。通常,如果发行版使用语义版本控制,则标记将与应用程序的MAJOR.MINOR.PATCH编号匹配。


对于 MySQL,可以从各种版本的5.65.78.0中进行选择:


如果你选择了一个精确的版本,比如8.0.22,MySQL 的那个版本将永远被安装。


选择主版本和副版本,比如8.0,将安装副版本的最新版本。现在可能是8.0.22,明天变成8.0.23


只选择主版本,例如8,将安装最新的主版本。现在可能是8.0.22,但下周可能变成8.1.0


选择latest(或不指定标签)将安装最新的版本,而不管版本是什么。现在可能是8.0.22,但下个月可能是9.0.0或更高版本。


对于本例,latest是一个很好的选择,但是应该尝试匹配生产服务器上的版本,或者选择一个精确的版本,以便每个开发人员都使用相同的依赖项。Docker 使得在任何时候测试数据库升级都很容易。

2、启动 MySQL 容器

通过在终端中输入以下命令来启动MySQL容器(Windows 用户:请删除反斜杠和换行符):

docker run   -it --rm --name mysql   -p 3306:3306   --mount "src=mysqldata,target=/var/lib/mysql"   -e MYSQL_ROOT_PASSWORD=websecret   mysql
复制代码

所有的Docker CLI命令都以 Docker 和一个指令开始,比如 run 后面跟着选项。docker run从一个指定的映像(mysql)创建一个容器并启动它。如果该映像在主机上不可用,则下载该映像。


下载映像、启动容器并在第一次运行时初始化 MySQL 可能需要几分钟的时间。随后的运行几乎是即时的。当看到以下内容时,即可使用该数据库了:

[System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections.
复制代码

docker run 提供了许多选项(请参阅附录A),但是将使用的主要选项是:


  • -d:运行一个容器作为后台进程(在应用程序结束时退出)

  • -it:保持容器在前台运行(即使在应用程序结束后),并显示活动日志

  • --rm :停止后取出容器

  • --name:命名容器(否则使用随机 GUID)

  • -p:将主机端口映射到容器端口

  • --mount:创建一个持久的 docker 管理卷来保存数据。字符串指定一个src卷名和一个target,在容器的文件系统中装入卷名

  • -v:使用符号挂载主机文件夹:

  • -e:定义环境变量

  • --env-file:从文件中读取环境变量,其中每行定义一个VAR=value

  • --net:连接到特定的 Docker 网络

  • --entrypoint :覆盖默认的启动应用程序


如果不指定--rm,则容器即使停止后仍将保持可用。尽管重启它是可能的,但几乎没有任何好处,因为再次执行docker run命令会更简单。


MySQL 的凭证

创建一个 MySQL 用户是一个很好的做法,它被授予特定数据库的有限权限,即它可以访问数据,但不能改变表结构或检查其他数据库。这可以通过设置环境变量来实现(请参阅MySQL映像文档)。

生产环境可以启动自己的 MySQL 容器,因此使用具有所有权限的根用户似乎不那么危险。然而,容器不是沙箱应用程序。被锁定的用户总是更安全。

为了简洁起见,下面的示例使用root,但是在开发和部署期间建议使用更安全的凭证。

3、使用 MySQL 客户端连接到数据库

一旦数据库容器启动,就可以使用安装在主机上的任何 MySQL 客户端应用程序以用户 ID root 和密码websecret 连接到 localhost:3306


如果你手头没有 MySQL 客户端,Admineris是一个轻量级的基于 php 的选项。它也可以作为 Docker image ,在另一个终端中运行以下命令:


docker run   -it --rm --name adminer   -p 8080:8080   adminer
复制代码

启动后,在浏览器中打开 http://localhost:8080 并输入 MySQL 登录凭据:



注意,你不能使用localhost作为服务器名,因为 Adminer 将解析到它自己的容器!相反,可以:


  1. 输入host.docker.internal

    Docker Desktop 将此域路由到你的 PC 的网络 IP 地址,但它可能不是在所有系统上都可用。

  2. 使用实际的网络 IP 地址。

    这可以通过macOSLinux上的ifconfig命令或Windows上的ipconfig命令获得。

  3. 或者使用 Docker 分配的容器的 IP 地址。


Docker 创建了自己的虚拟网络。docker inspect mysql返回 JSON 格式的容器信息。你可以找到IPAddress值使用-f格式选项:


docker inspect   -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'   mysql
复制代码

4、连接到容器外壳


每个 Docker 容器都运行一个隔离的 Linux 环境。可以连接到其外壳以运行命令,检查日志或执行任何其他活动。


记住容器是无状态的!只要重新启动容器,所做的任何更改都会丢失。


假设 MySQL 容器仍在运行,请打开另一个终端并输入:

docker exec -it mysql bash
复制代码


一些使用 Alpine Linux 的轻量级映像不提供bash shell。如果此命令失败,尝试使用docker exec -it mysql sh代替。


例如,可以访问 MySQL 命令行并列出数据库:

> mysql -u root -pwebsecretWelcome to the MySQL monitor.  Commands end with ; or g.Your MySQL connection id is 9Server version: 8.0.19 MySQL Community Server - GPLCopyright (c) 2000, 2020, Oracle and/or its affiliates.All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or 'h' for help.Type 'c' to clear the current input statement.mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sys                |+--------------------+5 rows in set (0.00 sec)mysql>
复制代码

输入 exit 退出

5、查看、停止、重启容器


容器运行在交互模式(开始与-it开关)通常可以停止按 Ctrl | Cmd + C


输入以下内容可以查看正在运行的容器的列表:

docker container lsdocker container ls -a 
复制代码

或更短的:

docker ps
复制代码

显示活动容器的列表。这可能很宽-此处显示了截短的版本:

CONTAINER ID  IMAGE    STATUS      PORTS           NAMESef3bab04fc8f  adminer  Up 16 mins  8080->8080/tcp  adminer793003e459e6  mysql    Up 17 mins  3306->3306/tcp  mysql
复制代码

每个容器都被分配了一个十六进制 ID,可以在 Docker 命令中用作引用。但是,指定容器--name可以大大简化管理。


可以通过提供一个或多个名称列表来重启容器 docker container restart 。如果要删除浏览器会话或临时数据,这可能很有用:


docker container restart adminer mysql
复制代码


你也可以 pause 和 unpause 例如,如果要测试应用程序对数据库故障的反应,请运行容器:


docker container pause mysqldocker container unpause mysql
复制代码


同样,容器可以通过 docker container stop :


docker container stop adminer mysql
复制代码


这些容器使用-rm选项启动,因此在停止时将删除它们。如果你不使用该选项(或遇到 Docker 问题),列出所有的容器:docker ps -a 停止的容器删除可以使用:docker container prune

6、定义 Docker 网络


使用 IP 地址在容器之间进行通信可能很困难。启动容器后,会在默认的 Docker 网络上为其分配 IP 地址,但是在以后的启动中可以更改。


docker run--ip--ip6选项,所以你可以定义一个固定的 ip,但通常使用 --name 引用另一个容器更容易。这可以通过创建自己的 Docker 网络来实现。


停止所有正在运行的容器,然后创建一个新的网络,例如在这里命名为mysqlnet


docker network create --driver bridge mysqlnet
复制代码


启动时,任何容器都可以使用--net选项连接到该网络。 MySQL 示例:


docker run   -d --rm --name mysql   -p 3306:3306   --mount "src=mysqldata,target=/var/lib/mysql"   -e MYSQL_ROOT_PASSWORD=websecret   --net mysqlnet   mysql
复制代码


Adminer:


docker run   -d --rm --name adminer   -p 8080:8080   --net mysqlnet   adminer
复制代码


现在,每个容器的名称都在 Docker mysqlnet 网络上解析。因此,可以在 Adminer 登录屏幕上输入mysql作为服务器名称。

7、清理

Docker 会占用大量磁盘空间!可通过输入以下信息获得可怕的使用情况统计信息


docker system df
复制代码


要查看所有正在运行和已停止的容器,请输入:


docker container ls -a
复制代码


请注意,容器通常很小,因为它们是无状态的并且从特定映像启动。


要查看所有活动图像和悬空映像(与容器无关的映像),请输入:


docker image ls -a
复制代码


要查看所有 Docker 管理的磁盘卷,请输入:


docker volume ls
复制代码


要查看所有 Docker 网络,请输入:


docker network ls
复制代码


仅使用 MySQL 和 Adminer,将使用近 1GB 的空间。随着开始使用其他依赖项并创建自己的映像,这一点将进一步提高。


通过将容器名称添加到命令来停止容器: stop


docker container stop adminer mysql
复制代码


可以使用以下方法删除所有停止的容器,未使用的网络和悬挂的映像:


docker system prune
复制代码


这是安全的,并且经常运行可能是一个好主意。


以下命令将执行相同的操作,并擦除与运行中的容器无关的任何映像:


docker system prune -a
复制代码

7.1 删除磁盘卷

删除 Docker 卷将永久擦除其数据!就没有回头路了。


如果要开发数据库驱动的应用程序,通常可以保留一个或多个数据转储,这些数据转储可用于在各种状态下重新创建数据库。大多数 MySQL 客户端工具都提供转储或导出功能,例如 Adminer 中的 Export 链接。


另外,随 MySQL 提供的 mysqldump 实用程序可以通过附加到容器 shell 或使用 docker exec 命令来运行。

使用root将名为mydb的数据库备份到名为backup.sql文件。


Linux 或 macOS 上的 MySQL 凭证,请使用:


docker exec mysql /usr/bin/mysqldump -u root -pwebsecret mydb   > backup.sql
复制代码


Windows PowerShell:


docker exec mysql /usr/bin/mysqldump -u root -pwebsecret -r mydb |   Set-Content backup.sql
复制代码


假设愿意继续,可以使用以下方法查看 Docker 卷:


docker volume ls
复制代码


然后按 ID 或名称删除任何内容:


docker volume rm 
复制代码


可以使用以下方法删除未使用的 Docker 卷-当前未连接到正在运行的容器的那些卷:


docker volume prune
复制代码

7.2 完全干净的启动

可以使用以下方法擦除每个未使用的容器,图像,卷和网络:

docker system prune -a --volumes
复制代码

如果您想在没有确认提示的情况下强制擦除,请添加-f

8、使用 Docker Compose 启动多个容器

单独启动 Docker 容器并不有趣——尤其是当命令很长且难以记忆时。幸运的是,Docker Compose 提供了一种从名为docker-compose.yml单个配置文件构建和启动容器、网络和卷的方法。


YAML 不是标记语言:是一种常用的、紧凑的数据格式,通常用于配置目的。它使用了新的行和制表符,而不是 JSON 喜欢的引号和括号。


Docker Compose 提供了许多配置选项([参见附录C],但一个示例是说明常见设置的最佳方式。下面是一个示例:docker-compose.yml

version: '3'services:  mysql:    image: mysql    container_name: mysql    environment:      - MYSQL_ROOT_PASSWORD=websecret    volumes:      - mysqldata:/var/lib/mysql    ports:      - "3306:3306"    networks:      - mysqlnet    restart: on-failure  adminer:    image: adminer    container_name: adminer    depends_on:      - mysql    ports:      - "8080:8080"    networks:      - mysqlnet    restart: on-failurevolumes:  mysqldata:networks:  mysqlnet:
复制代码


这将创建与上面使用的docker run命令相同的容器,并在底部列出 volumes 和 networks。它还定义了两个新设置:


  • depends_on 启动依赖项:adminer 将在 MySQL 启动后启动

  • restart on-failure:容器以退出代码停止时会自动重新启动。


如果尚未停止现有容器,请立即执行以下操作:


docker container stop adminer mysqldocker system prune
复制代码


在使用以下命令从与docker-compose.yml文件相同的目录中启动 Docker Compose:


docker-compose up
复制代码


如有必要,将下载 mysql 和 adminer 映像并启动两个容器。默认情况下,docker-compose 作为前台任务运行,并显示所有容器活动的日志。当您看到以下内容时,即可使用 MySQL:


mysql | ... [Server] X Plugin ready for connections.
复制代码


现在可以在http://localhost:8080/上启动 Adminer 并使用用户 ID root和密码 websecret连接到 MySQL 服务器。


指定单个端口值仅会暴露网络中的端口,例如


ports:      - "3306"
复制代码


在这种情况下,尽管 Adminer 仍可以与内部网络上的 mysql:3306 通信,但主机无法访问 MySQL。


可以像以前一样使用服务并连接到它们的外壳。容器将继续运行,直到您在启动docker-compose的终端中按 Ctrl | Cmd + C 为止。


从现在开始,将尽可能使用 docker-compose。很少需要输入单独的 docker 命令,但是知道它们可用是很有用的,尤其是因为 Docker Compose 可能并非在每个系统上都可用。

 

发布于: 2021 年 05 月 26 日阅读数: 17
用户头像

devpoint

关注

细节的追求者 2011.11.12 加入

专注前端开发,用技术创造价值!

评论

发布
暂无评论
面向WEB开发的Docker(四):启动MySQL数据库