当前位置:

首页 > 编程开发 > 在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
    相关文章 更多
    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    docker容器自动重启怎么解决 排查原因与修复方法
    docker容器自动重启怎么解决 排查原因与修复方法

    遇到Docker容器频繁自动重启?本文提供从查看容器日志、解读退出代码到配置Restart Policy的完整排查与修复方案,确保服务稳定性。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    rust下载安装教程详解及Windows环境配置方法
    rust下载安装教程详解及Windows环境配置方法

    详解Windows系统下Rust语言的安装步骤,重点解析rustup工具链管理机制,解决环境变量配置错误及MSVC链接器缺失问题,提供可复制的命令验证方法与常见报错的因果排查思路。

    查看更多
    精品专题 更多
    装机必备
    装机必备

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

    Windows
    Windows

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

    macOS软件
    macOS软件

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

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

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

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。