当前位置:

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

在docker上如何安装运行mysql

Docker Desktop macOS版
Docker Desktop macOS版

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

立即下载
Mac 2026-10-13
数据库 编程开发 Desktop 开发工具 服务器管理

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这个参数

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Docker MySQL
    相关文章 更多
    navicat导入数据库步骤详解及常见问题处理教程
    navicat导入数据库步骤详解及常见问题处理教程

    详解Navicat导入数据库的标准步骤,涵盖SQL脚本执行与CSV数据导入两种核心场景。针对导入过程中常见的字符集乱码、主键冲突及外键约束错误,提供具体的设置方法与修复建议,确保数据迁移准确无误。

    SQL主键约束和唯一约束有什么区别
    SQL主键约束和唯一约束有什么区别

    深入理解SQL PRIMARY KEY与UNIQUE约束的区别。文章从行标识与重复限制的目标出发,详解主键的非空特性、外键引用角色以及多数据库对NULL值的处理差异。结合users表实战示例,指导开发者如何根据字段稳定性与业务语义合理选择约束类型,避免设计误区。

    SQL约束有哪些类型及作用
    SQL约束有哪些类型及作用

    刚开始设计关系型数据库?了解PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK、DEFAULT等约束的作用、语法和排错方法。本文以PostgreSQL语法为主,结合用户订单场景,清晰展示如何防止脏数据并处理常见约束冲突。

    SQL游标常见错误排查:死锁与资源未释放问题
    SQL游标常见错误排查:死锁与资源未释放问题

    深入解析SQL游标导致的死锁与资源未释放问题。通过PostgreSQL与MySQL语法对比,展示如何识别长事务持锁、分析锁等待链,并提供短事务提交、异常清理及批量处理的最佳实践,确保数据库连接与锁资源及时释放。

    SQL中怎么创建和删除约束
    SQL中怎么创建和删除约束

    后端开发者在维护数据库时,常需对现有表添加主键、唯一或外键约束。若直接执行ADD CONSTRAINT,往往因存量数据不合规导致报错。本文详解操作前的数据清洗步骤、标准SQL语法及MySQL等特殊写法,帮助你在生产环境安全完成结构变更。

    docker创建容器后无法启动的排查与解决方法
    docker创建容器后无法启动的排查与解决方法

    Docker容器创建后无法启动或立即退出?本文详解如何通过docker logs查看报错、检查端口占用及修正配置文件,助你快速解决容器启动难题。

    SQL分组统计查询:GROUP BY与HAVING子句用法示例
    SQL分组统计查询:GROUP BY与HAVING子句用法示例

    针对 SQL 初学者的分组统计实战指南。深入解析 GROUP BY 分组机制、WHERE 与 HAVING 的执行时机差异,以及 COUNT 函数对 NULL 值的处理逻辑。通过具体代码示例演示如何正确筛选聚合结果,并排查因 JOIN 连接导致的统计数据异常,提升报表准确性。

    SQL Server与MySQL游标基本语法及完整代码示例
    SQL Server与MySQL游标基本语法及完整代码示例

    本文详细对比SQL Server和MySQL中游标的基本用法。从DECLARE声明到FETCH遍历,再到CLOSE关闭与DEALLOCATE/Handler清理,解析两者在语法结构、变量接收及异常处理上的核心差异。通过标准代码示例展示如何安全使用游标,避免资源泄漏,适用于需要进行数据库存储过程开发或跨平台迁移的开发者。

    SQL多表连接区别:INNER JOIN与LEFT JOIN的使用场景
    SQL多表连接区别:INNER JOIN与LEFT JOIN的使用场景

    深入解析SQL中INNER JOIN与LEFT JOIN的核心区别。通过users和orders表实例,展示匹配行保留与NULL补位机制,重点讲解ON与WHERE子句中放置右表过滤条件的不同后果,提供防止LEFT JOIN退化的实战技巧及行数异常排查步骤。

    SQL CHECK约束的用法与取值范围限制
    SQL CHECK约束的用法与取值范围限制

    深入理解 SQL CHECK 约束在 PostgreSQL、MySQL 等数据库中的实现差异。文章通过订单业务场景,讲解如何定义单列范围与多列逻辑约束,分析 NULL 值对布尔条件的影响,并提供修改已有表结构时的安全操作建议,帮助开发者构建更健壮的数据完整性防线。

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

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

    Windows
    Windows

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

    PDF教程
    PDF教程

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

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?