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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 在本文中,将来学习如何使用Docker CLI和Docker compose启动MySQL容器。

image.png

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

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

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

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

image.png

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登录凭据:

image.png

注意,你不能使用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 -pwebsecret
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 9
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates.
All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
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 ls
docker container ls -a

或更短的:

docker ps

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

CONTAINER ID  IMAGE    STATUS      PORTS           NAMES
ef3bab04fc8f  adminer  Up 16 mins  8080->8080/tcp  adminer
793003e459e6  mysql    Up 17 mins  3306->3306/tcp  mysql

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

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

docker container restart adminer mysql

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

docker container pause mysql
docker 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-failure
volumes:
  mysqldata:
networks:
  mysqlnet:

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

  • depends_on 启动依赖项:adminer 将在MySQL启动后启动
  • restarton-failure:容器以退出代码停止时会自动重新启动。

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

docker container stop adminer mysql
docker 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可能并非在每个系统上都可用。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
95 3
|
1月前
|
存储 移动开发 大数据
HTML5 Web IndexedDB 数据库详解
IndexedDB 是一种高效的浏览器存储方案,允许在本地存储大量结构化数据,支持索引和事务,适用于需要离线和大数据处理的应用。它由数据库、对象仓库等组成,通过键值对存储数据,确保数据一致性和完整性。本介绍展示了如何创建、读取、更新和删除数据,以及事务和错误处理的最佳实践。
|
13天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
96 44
|
28天前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
240 2
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
9天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
22 1
|
11天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
13天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
21 1
|
14天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
28 2
|
2月前
|
关系型数据库 MySQL 数据安全/隐私保护
docker应用部署---MySQL的部署配置
这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
docker应用部署---MySQL的部署配置
WK
|
14天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
17 0