Docker搭建Mysql容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker搭建Mysql容器

本文介绍如何使用docker迅速搭建MySQL的运行环境。


使用docker hub镜像


查找镜像


首先查找Docker Hub上的mysql镜像,有两种方式:


其一,直接登录docker hub网站https://hub.docker.com/搜索,可以知道镜像地址为https://hub.docker.com/_/mysql/


其二,可以使用docker search mysql命令搜索。


然后可以使用docker pull mysql命令下载相应的镜像,这里下载的是docker给出的官方MySQL镜像的最新版本。如果要pull指定版本,在后面加上:和版本号即可,比如:


docker pull mysql:5.6


使用镜像


找到需要的镜像后,就可以使用docker的run命令创建一个容器了。


比如,简单一点,使用默认配置的方法:


sudo docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql


其中:

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

-e 指定环境变量,其中MYSQL_ROOT_PASSWORD=root即初始化root用户的密码为root

-name 即命名容器的名称为mysql

-d: 后台运行容器,并返回容器ID


最后的mysql表明使用最新的mysql镜像,如果要指定版本,和pull命令一样,冒号:加版本号。


上面的命令如果本地不存在mysql镜像的话,也会先pull操作的。


这样就启动了一个运行mysql的docker容器。要连接的话,可以先查下启动容器的ip地址就好。


使用inspect命令,加上容器名称或者id即可:


sudo docker inspect mysql

可以看到我的容器ip地址为:172.17.0.2。

这时就可以使用mysql的客户端连接工具连接了。


这样,一个基本的mysql服务就搭建好了。省去了安装mysql的麻烦,基本上分分钟就可以完成。


sudo docker ps


环境变量(Environment Variables)


除了上面的MYSQL_ROOT_PASSWORD一个强制填写的环境变量外,mysql容器还可以指定其他的可选环境变量。


  1. MYSQL_USER, MYSQL_PASSWORD:创建一个新用户并设置该用户的密码。需要注意的是,不要使用此机制来创建根超级用户,该用户默认使用由MYSQL_ROOT_PASSWORD变量指定的密码创建。


  1. MYSQL_DATABASE:指定在容器启动时要创建的数据库的名称。如果提供了用户/密码,那么该用户将被授予对该数据库的超级用户访问(对应于GRANT ALL)。


  1. MYSQL_ALLOW_EMPTY_PASSWORD:设置为yes以允许为root用户使用空密码启动容器。不建议设置为yes。


  1. MYSQL_RANDOM_ROOT_PASSWORD:设置为yes时将为root用户生成随机初始密码(使用pwgen)。生成的root密码将被打印到标准输出(如:GENERATED ROOT PASSWORD:…..)


  1. MYSQL_ONETIME_PASSWORD:一旦init完成,将root用户(不是在MYSQL_USER!中指定的用户)设置为过期,强制在第一次登录时更改密码。需要注意的是:该功能仅在MySQL 5.6+上受支持。在MySQL 5.5上使用这个选项会在初始化时引发一个适当的错误。


以上参数解释,具体可以参见docker hub上mysql镜像详情。


配置文件


如果不想使用镜像默认的mysql配置文件,可以通过run命令的-v参数,指定文件挂载。这样也可以自己定义数据文件的存放位置等。

比如:


  • -v $PWD/conf/my.cnf:/etc/mysql/my.cnf:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf


  • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs


  • -v $PWD/data:/var/lib/mysql:将主机当前目录下的data目录挂载到容器的/var/lib/mysql,这个文件默认情况下为mysql的数据文件存放位置


  • 具体仍可以参见docker hub上mysql镜像详情的最新更新。


通过 Dock


erfile构建


除了使用官方提供的镜像,docker镜像都可以自己通过Dockerfile构建。


至于构建脚本,因目前水平有限,也写不出比官方更好的方式,这里给出docker hub上5.7版本的Dockerfile。可以自己通过docker build构建操作。完成后,使用的方法,和上面提到的是一样的。


源码位置:https://github.com/docker-library/mysql/blob/883703dfb30d9c197e0059a669c4bb64d55f6e0d/5.7/Dockerfile


FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql
# add gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
    && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \ && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ && export GNUPGHOME="$(mktemp -d)" \ && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true \ && apt-get purge -y --auto-remove ca-certificates wget RUN mkdir /docker-entrypoint-initdb.d RUN apt-get update && apt-get install -y --no-install-recommends \ # for MYSQL_RANDOM_ROOT_PASSWORD pwgen \ # for mysql_ssl_rsa_setup openssl \ # FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db: # File::Basename # File::Copy # Sys::Hostname # Data::Dumper perl \ && rm -rf /var/lib/apt/lists/* RUN set -ex; \ # gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \ export GNUPGHOME="$(mktemp -d)"; \ gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ gpg --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \ rm -r "$GNUPGHOME"; \ apt-key list > /dev/null ENV MYSQL_MAJOR 5.7 ENV MYSQL_VERSION 5.7.20-1debian8 RUN echo "deb http://repo.mysql.com/apt/debian/ jessie mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list # the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql) # also, we set debconf keys to make APT a little quieter RUN { \ echo mysql-community-server mysql-community-server/data-dir select ''; \ echo mysql-community-server mysql-community-server/root-pass password ''; \ echo mysql-community-server mysql-community-server/re-root-pass password ''; \ echo mysql-community-server mysql-community-server/remove-test-db select false; \ } | debconf-set-selections \ && apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \ && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \ # ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime && chmod 777 /var/run/mysqld \ # comment out a few problematic configuration values && find /etc/mysql/ -name '*.cnf' -print0 \ | xargs -0 grep -lZE '^(bind-address|log)' \ | xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \ # don't reverse lookup hostnames, they are usually another container && echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf VOLUME /var/lib/mysql COPY docker-entrypoint.sh /usr/local/bin/ RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 3306 CMD ["mysqld"]


Docker编排方式


简介


Docker在1.12版的引擎中内置编排能力,也就是 Swarm Mode,在容器之上引入了服务(service)的概念,推出了应用栈(stack)来支持多服务应用的部署管理。


在2017年1月发布的 Docker 1.13版本中,Swarm mode迅速成熟,相应的工具支持也进一步完善。 Docker Compose v3 规范,已经全面支持 Swarm mode 概念。从 1.13 开始,Docker 命令行工具支持直接使用 v3 版本的 docker-compose.yml 文件来进行应用栈(stack)部署管理,这大大简化了容器编排使用的复杂性。


相关命令


docker stack deploy 
or
docker-compose


yaml文件


示例文件mysql.yml,这里定义了一个mysql数据库,默认root密码为123456,服务异常始终自动重启。同时,定义了一个web管理数据库工具,映射到主机8080端口。


version: '3.1'
services:
    db:
        image: mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 123456 adminer: image: adminer restart: always ports: - 8080:8080


启动


docker stack deploy -c mysql.yml mysql 
or
docker-compose -f mysql.yml up


查看状态


sudo docker stack services mysql


这是通过浏览器访问,http://127.0.0.1:8080/可以打开管理界面,输入用户名root,密码123456,就可以进入管理控制台了。


具体仍可以参见docker hub上mysql镜像详情的最新更新。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
19天前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
11天前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
141 5
|
12天前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
kde
|
16天前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
kde
180 4
|
2月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
534 108
|
3月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
312 57
|
2月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
189 16