展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > 在docker上如何安装运行mysql

在docker上如何安装运行mysql

ps:实验环境是:ubuntu14.04,64位1.获取mysql镜像从dockerhub的仓库中拉取mysql镜像sudodockerpullmysql查看镜像sudodockerimagesmysqllatest18f13d72f7f02weeksago383.4mb2.运行一个mysql容器运行一个mysql实例的命令如下:复制代码代码如下:sudodockerrun--namefirst-mysql-p3306:3306-emysql\_root\_password=123456-dmysql5b

ps:实验环境是:ubuntu 14.04, 64位

1.获取mysql镜像

从docker hub的仓库中拉取mysql镜像

sudo docker pull mysql

查看镜像

sudo docker images

mysql latest 18f13d72f7f0 2 weeks ago 383.4 mb

2.运行一个mysql容器

运行一个mysql实例的命令如下:

复制代码 代码如下:

sudo docker run --name first-mysql -p 3306:3306 -e mysql\_root\_password=123456 -d mysql

5b6bf6f629bfe46b4c8786b555d8db1947680138b2de1f268f310a15ced7247a

上述命令各个参数含义:

run            运行一个容器
--name         后面是这个镜像的名称
-p 3306:3306   表示在这个容器中使用3306端口(第二个)映射到本机的端口号也为3306(第一个)
-d             表示使用守护进程运行,即服务挂在后台

查看当前运行的容器状态:

复制代码 代码如下:

sudo docker ps

container id image command created status ports names5b6bf6f629bf

mysql "docker-entrypoint.sh" 32 hours ago up 5 hours 0.0.0.0:3306->3306/tcp first-mysql

想要访问mysql数据库,我的机器上需要装一个mysql-client。

sudo apt-get install mysql-client-core-5.6

下面我们使用mysql命令访问服务器,密码如刚才所示为123456,192.168.95.4为我这台机器的ip, 3306为刚才所示的占用本物理机的端口(不是在docker内部的端口)

mysql -h192.168.95.4 -p3306 -uroot -p123456

访问的结果如下:

mysql> show databases;

+--------------------+
| database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+

4 rows in set (0.00 sec)

3.运行第二个mysql实例

使用docker相对于虚拟机而言的原因是耗费很少的资源,可以"开辟"非常多的隔离的环境,所以我们继续运行第二个mysql实例,还用之前的镜像,名字为second-mysql。

复制代码 代码如下:

sudo docker run --name second-mysql -p 3306:3307 -e mysql\_root\_password=123456 -d

mysql2de4ddb5bfb9b9434af8e72368631e7f4c3f83ee354157328049d7d0
f5523661docker: error response from daemon: driver failed programming external connectivity on endpoint second-mysql (33aa29d891a1cb540de250bcbbbe9a0a41cd98f61a4e9f129a2ad5db69da4984): bind for 0.0.0.0:3306 failed: port is already allocated.

为了验证第一个是本机的端口号,就仍然使用了3306这个端口,那么创建如上所示,发生了错误,但是产生了一个容器id,当我们修改端口后还会报错,因为名字冲突了,也即这次失败的创建会占用这个名字:

复制代码 代码如下:

sudo docker run --name second-mysql -p 3307:3306 -e mysql\_root\_password=123456 -d

mysqldocker: error response from daemon: conflict. the name "/second-mysql" is already in use by container 2de4ddb5bfb9b9434af8e72368631e7f4c3f83ee354157328049d7d0f5523661.
you have to remove (or rename) that container to be able to reuse that name..

为了验证second-mysql这个容器还在docker的进程中,我们使用ps -a这个命令,我们可以观察到first-mysql的状态为up 34 minutes,说明已经工作了34分钟,而second-mysql只是刚刚创建的。

sudo docker ps -a

container id    image        command         created       status       ports          names
2de4ddb5bfb9    mysql        "docker-entrypoint.sh"  about a minute ago  created                   second-mysql
5b6bf6f629bf    mysql        "docker-entrypoint.sh"  34 minutes ago    up 34 minutes    0.0.0.0:3306->3306/tcp  first-mysql

我们用rm命令删除这个容器,如下面命令所示:

maintain@maintain-dev1:~$ sudo docker rm second-mysql

maintain@maintain-dev1:~$ sudo docker ps -a

container id image command created status ports names
5b6bf6f629bf mysql "docker-entrypoint.sh" 42 minutes ago up 42 minutes 0.0.0.0:3306->3306/tcp first-mysql

重新建立second-mysql这个容器,占用物理机的3307端口:

sudo docker run --name second-mysql -p 3307:3306 -e mysql\_root\_password=123456 -d mysql

5404fb11f29cba07b991f34056d6b40ed0888aa905a45e637e396d071bd7f331

sudo docker ps

container id    image        command         created       status       ports          names
5404fb11f29c    mysql        "docker-entrypoint.sh"  12 seconds ago   up 11 seconds    0.0.0.0:3307->3306/tcp  second-mysql
5b6bf6f629bf    mysql        "docker-entrypoint.sh"  43 minutes ago   up 43 minutes    0.0.0.0:3306->3306/tcp  first-mysql

如上图所示,两个实例都正常运行了,为了访问第二个容器,我们指定端口3307登录到这个mysql的client。

mysql -h192.168.95.4 -p3307 -uroot -p123456

warning: using a password on the command line interface can be insecure.
welcome to the mysql monitor. commands end with ; or \g.
your mysql connection id is 2
server version: 5.7.15 mysql community server (gpl)
copyright (c) 2000, 2016, 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.

4.jdbc测试(maven & spring boot)

例子来源:

使用java spring对数据库进行操作,使用了spring官网的例子,用jdbctemplate这个裸写sql的方法,没有用hibernate或者myibatis.

spring官网的例子使用h2一个内置的内存数据库,没有配置文件生成为对象的烦恼,

为了练习下yaml替代xml,使用了如下的mysql jdbc配置,application.yaml.

### application.yaml
### mysql config
spring:
 datasource:
  dbcp:
   driver-class-name: com.mysql.jdbc.driver
   url: jdbc:mysql://192.168.18.129:3306/test1
   username: root
   password: 123456

找了半天自动将依赖注入为一个jdbctemplate对象,也没有搞定,就只好像下面一样自己先生成datasource,再new一个jdbctemlate对象,最后使用jdbctemplate对数据库进行操作,这样写的很丑,希望各位可以指点一下。

@bean
@configurationproperties(prefix = "spring.datasource.dbcp")
public datasource mysqlsource() { 
  return datasourcebuilder.create().build();
}
@bean
public jdbctemplate mysqljdbctemplate() { 
  return new jdbctemplate(mysqlsource());
}

下面是对数据库的一些crud操作,使用jdk8的函数式编程:

jdbctemplate jdbctemplate = mysqljdbctemplate();
jdbctemplate.execute("drop table if exists customers");
jdbctemplate.execute("create table customers(" + "id serial, first_name varchar(255), last_name varchar(255))");
// split up the array of whole names into an array of first/last names
list splitupnames = arrays.aslist("john woo", "jeff dean", "josh bloch", "josh long")
 .stream() .map(name -> name.split(" ")) .collect(collectors.tolist());
// use a java 8 stream to print out each tuple of the list
splitupnames.foreach(name -> log.info(string.format("inserting customer record for %s %s", name[0], name[1])));
// uses jdbctemplate's batchupdate operation to bulk load data
jdbctemplate.batchupdate("insert into customers(first_name, last_name) values (?,?)", splitupnames);
log.info("querying for customer records where first_name = 'josh':");
jdbctemplate.query( 
  "select id, first_name, last_name from customers where first_name = ?", 
  new object[]{"josh"}, (rs, rownum) -> new customer(rs.getlong("id"), rs.getstring("first_name"), rs.getstring("last_name")))
  .foreach(customer -> log.info(customer.tostring()));

下面在mysql的客户端进行了验证:

mysql> select * from customers;
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
| 1 | john    | woo    |
| 2 | jeff    | dean   |
| 3 | josh    | bloch   |
| 4 | josh    | long   |
+----+------------+-----------+

4 rows in set (0.00 sec)

5. 遇到的一些坑

maven配置

使用了jdk8的lamda表达式,必须在maven中配置java.version

 
1.8

docker服务重启

docker这个服务挂了,容器也就跟着挂了,并没有重启,应该在运行容器的时候带上--restart=always这个参数

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 Docker MySQL
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。