Docker中MySQL容器的创建和连接教程

2023-12-05 0 940

创建MySQL容器

本文是以Dockerfile方式创建一个mysql容器,也可以使用docker commit 以提交镜像的方式创建,但是对于别人来说不知道你容器里修改了哪些地方 所以推荐使用Dockerfile方式。服务的管理使用的是supervisord, 因为dockerfile里只会有一个cmd生效,如果我想通过ssh去管理容器还要有mysql服务的启动起来 cmd的方式就无法实现,当然容器不需要以sshd的方式去管理,这些也都是看自己怎么去使用,比如说我想备份容器里的数据 我完全可以使用 –volumes-from <容器name> , 重启使用 docker restart <容器id>, 我个人也是使用ssh习惯了 所以依赖的镜像把ssh服务栽进去了。

# docker 版本:复制代码代码如下:[root@private_network mysql]# docker versionClient version: 1.6.0-rc5Client API version: 1.18Go version (client): go1.4.2Git commit (client): fc4825dOS/Arch (client): linux/amd64Server version: 1.6.0-rc5Server API version: 1.18Go version (server): go1.4.2Git commit (server): fc4825dOS/Arch (server): linux/amd64[/code]

# 目录结构复制代码代码如下:mysql/|– cmake-3.2.2.tar.gz |– create_mysql_user.sh # mysql用户初始化脚本|– Dockerfile|– install_mysql-5.6.24.sh # mysql服务安装脚本|– my.cnf # mysql服务配置文件|– mysql-5.6.24.tar.gz`– supervisord.conf # 服务管理工具配置文件

# Dockerfile复制代码代码如下:# FROM: 依赖的镜像FROM ted1993/mysql:5.6.24 #MAINTAINER: 个人信息MAINTAINER xuqiangqiang \”739827282@qq.com\” # RUN: 执行命令RUN yum -y install tar gcc-c++ supervisor ncurses-devel libtool bison bison-devel pwgen RUN mkdir -p /var/log/supervisor # ADD: 添加本地文件到容器中,如果是压缩包会在目标目录进行自动解压,如果只想添加文件可以使用 COPY命令ADD ./supervisord.conf /etc/supervisord.confADD ./cmake-3.2.2.tar.gz /root/tools/ADD ./mysql-5.6.24.tar.gz /root/tools/ADD ./install_mysql-5.6.24.sh /root/tools/ADD ./create_mysql_user.sh /create_mysql_user.sh # WORKDIR: 当前的工作目录WORKDIR /root/tools/ RUN sh install_mysql-5.6.24.sh ADD ./my.cnf /data/server/mysql-5.6.24/etc/my.cnf RUN rm -rf /root/tools/mysql-5.6.24RUN rm -rf /root/tools/mysql-5.6.24.tar.gzRUN rm -rf /root/tools/cmake-3.2.2RUN rm -rf /root/tools/cmake-3.2.2.tar.gz # EXPOSE: 公开的端口,会暴露在外的端口EXPOSE 22 3306 # CMD: 容器启动执行的命令 一个dockerfile只有一个cmd生效。CMD [\”/usr/bin/supervisord\”]

# supervisord.conf 服务管理工具通过supervisord管理服务复制代码代码如下:[supervisord]nodaemon=true [program:mysqld]command=/etc/init.d/mysqld startnumprocs=1autostart=trueautorestart=true [program:sshd]command=/usr/sbin/sshd -Dnumprocs=1autostart=trueautorestart=true

# install_mysql-5.6.24.sh复制代码代码如下:#!/bin/bashgrep \”^mysql:\” /etc/passwd &> /dev/null || groupadd mysql && useradd -g mysql -s /sbin/nologin mysql if [ ! -d cmake-3.2.2 ];then tar xzvf cmake-3.2.2.tar.gzficd cmake-3.2.2./bootstrap && gmake && gmake install && cd .. if [ ! -d mysql-5.6.24 ];then tar xzf mysql-5.6.24.tar.gzficd mysql-5.6.24cmake \\-DCMAKE_INSTALL_PREFIX=/data/server/mysql-5.6.24 \\-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \\-DMYSQL_DATADIR=/data/mysql-5.6.24/ \\-DSYSCONFDIR=/data/server/mysql-5.6.24/etc/ \\-DWITH_INNOBASE_STORAGE_ENGINE=1 \\-DWITH_MYISAM_STORAGE_ENGINE=1 \\-DWITH_PARTITION_STORAGE_ENGINE=1 \\-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \\-DWITH_ARCHIVE_STORAGE_ENGINE=1 \\-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \\-DWITH_EXTRA_CHARSETS=complex \\-DENABLED_LOCAL_INFILE=1 \\-DDEFAULT_CHARSET=utf8 \\-DDEFAULT_COLLATION=utf8_unicode_ci \\-DWITH_DEBUG=0CPU_NUM=$(cat /proc/cpuinfo | grep processor | wc -l)if [ $CPU_NUM -gt 1 ];then make -j$CPU_NUMelse makefimake install echo \”PATH=\\$PATH:/data/server/mysql/bin\” >> /etc/profile && . /etc/profileln -s /data/server/mysql-5.6.24/ /data/server/mysqlrm -rf /etc/my.cnf mkdir -p /data/server/mysql-5.6.24/etc/mkdir -p /data/server/mysql/data/mkdir -p /data/log/mysql/ chown -R mysql:mysql /data/server/mysql/chown -R mysql:mysql /data/server/mysql/data/chown -R mysql:mysql /data/log/mysql\\cp -f /data/server/mysql/support-files/mysql.server /etc/init.d/mysqldsed -i \’s#^basedir=$#basedir=/data/server/mysql#\’ /etc/init.d/mysqldsed -i \’s#^datadir=$#datadir=/data/server/mysql/data#\’ /etc/init.d/mysqldchmod 755 /etc/init.d/mysqld/data/server/mysql/scripts/mysql_install_db –datadir=/data/server/mysql/data/ –basedir=/data/server/mysql –user=mysql

# create_mysql_user.sh

复制代码代码如下:#!/bin/bash /data/server/mysql/bin/mysqld_safe >> /dev/null 2>&1 & RET=1while [[ RET -ne 0 ]]; do echo \”=> Waiting for confirmation of MySQL service startup\” sleep 5 /data/server/mysql/bin/mysql -uroot -e \”status\” > /dev/null 2>&1 RET=$?done echo \”============================MYSQL_PASS_INFO=============================== \”echo \”\”PASS_ROOT=${MYSQL_PASS:-$(pwgen -s 8 1)}PASS_DBA=${MYSQL_PASS:-$(pwgen -s 8 1)}echo \”\”echo \”=> Creating MySQL root user with ${PASS_ROOT} password\”echo \”=> Creating MySQL dba user with ${PASS_DBA} password\”echo \”\”/data/server/mysql/bin/mysql -uroot -e \”grant all privileges on *.* to \’dba\’@\’%\’ identified by \’${PASS_DBA}\’\”;/data/server/mysql/bin/mysql -uroot -e \”update mysql.user set password=PASSWORD(\’${PASS_ROOT}\’) where user=\’root\’ and host=\’localhost\’\”;echo \”\”echo \”===================================END=====================================\”echo \”\”echo \”=> Done!\” echo \”\”echo \”\”echo \”==============================REMOTE_MYSQL_PASSWORD=====================\”echo \”You can now connect to this MySQL Server using:\”echo \”\”echo \” mysql -udba -p${PASS_DBA} -h<host> -P<port>\”echo \”\”echo \”Please remember to change the above password as soon as possible!\”echo \”MySQL user \’root\’ has no password but only allows local connections\”echo \”========================================================================\”

# 通过docker build命令提交镜像复制代码代码如下:docker build -t ted1993/mysql:5.6.24 . # 注意最后面有一个\”.\”

# 使用docker images 命令查看镜像复制代码代码如下:[root@private_network mysql]# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEted1993/mysql 5.6.24 d3ed9c578f4c 5 days ago 902.8 MB

# 使用docker run 命令启动容器 -P 使用随机端口映射容器端口 -p 3306:3306 使用指定端口复制代码代码如下:docker run -d -P ted1993/mysql:5.6.24

# 使用docker ps 命令查看运行容器id

复制代码代码如下:[root@private_network mysql]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESab622592bf1e mysql:5.6.24 \”/usr/bin/supervisor 3 days ago Up 3 days 0.0.0.0:5000->22/tcp, 0.0.0.0:5001->3306/tcp jolly_swartz

# 使用docker commit 提交新的镜像docker commit ab622592bf1e ted1993/mysql:2015-06-02[/code]

Docker使用Link在容器之间建立连接

在使用Docker的时候我们会常常碰到这么一种应用,就是我需要两个或多个容器,其中某些容器需要使用另外一些容器提供的服务。比如这么一种情况:我们需要一个容器来提供mysql的数据库服务,而另外两个容器作为客户端来连接使用mysql数据库服务。下面我们就来看看Docker是怎样通过Link来实现这种功能的。

这里我们首先创建两个容器image,一个用来模拟mysql数据库,另外一个使用mysql的client来模拟一些使用mysql服务的应用,这种应用可以是任何php,python,java等的应用。

先创建一个mysql_server目录并在其下创建一个Dockerfile文件,内容如下

复制代码代码如下: FROM centos:centos6 MAINTAINER Fanbin Kong \”kongxx@hotmail.com\” RUN yum install -y mysql-server mysql RUN /etc/init.d/mysqld start &&\\ mysql -e \”grant all privileges on *.* to \’root\’@\’%\’ identified by \’letmein\’;\”&&\\ mysql -e \”grant all privileges on *.* to \’root\’@\’localhost\’ identified by \’letmein\’;\”&&\\ mysql -u root -pletmein -e \”show databases;\” EXPOSE 3306 CMD [\”/usr/bin/mysqld_safe\”]

然后根据Dockerfile来创建image

复制代码代码如下: sudo docker build -t kongxx/mysql_server .

创建一个mysql_client目录并在其下创建一个Dockerfile文件,内容如下

复制代码代码如下: FROM centos:centos6 MAINTAINER Fanbin Kong \”kongxx@hotmail.com\” RUN yum install -y mysql

然后根据Dockerfile来创建image

复制代码代码如下: sudo docker build -t kongxx/mysql_client .

创建完image之后,我们可以使用下面命令来查看结果

复制代码代码如下: $ sudo docker images | grep kongxx kongxx/mysql_client latest aa31f22f6fc5 2 hours ago 303.7 MB kongxx/mysql_server latest 3b9b08c8dda4 2 hours ago 353.3 MB

第二步是根据image来创建我们的应用场景

首先创建提供mysql数据库服务的容器

复制代码代码如下: sudo docker run –name=mysql_server -d -P kongxx/mysql_server

分别创建两个使用上一步创建出来mysql数据库服务的容器

第一个应用容器

复制代码代码如下: sudo docker run –name=mysql_client1 –link=mysql_server:db -t -i kongxx/mysql_client /usr/bin/mysql -h db -u root -pletmein

第二个应用容器

复制代码代码如下: sudo docker run –name=mysql_client2 –link=mysql_server:db -t -i kongxx/mysql_client /usr/bin/mysql -h db -u root -pletmein

这里需要特别注意一下“–link=mysql_server:db”,这个参数就是告诉Docker容器需要使用“mysql_server”容器,并将其别名命名为db,这样在这两个容器里就可以使用“db”来作为提供mysql数据库服务的机器名。所以在最后启动参数里我们使用的是“/usr/bin/mysql -h db -u root -pletmein”来连接mysql数据库的。

运行完上面两个命令,我们就会在创建了两个mysql的client的容器,此时我们可以使用下面命令来查看状态

复制代码代码如下: sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ac0c76c627c0 kongxx/mysql_client:latest /usr/bin/mysql -h db 10 seconds ago Up 9 seconds mysql_client2 763c4825722d kongxx/mysql_client:latest /usr/bin/mysql -h db 41 minutes ago Up 40 minutes mysql_client 32f7839f7e9d kongxx/mysql_server:latest /usr/bin/mysqld_safe About an hour ago Up About an hour 0.0.0.0:49153->3306/tcp mysql_client1/db,mysql_client2/db,mysql_server

这里注意一下最后一行,也就是mysql_server容器的“NAMES”列的内容“mysql_client/db,mysql_client2/db,mysql_server”,这就说明mysql_client1和mysql_client2都和db建立的连接。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 其它系统 Docker中MySQL容器的创建和连接教程 https://www.u-9.cn/system/qtos/89753.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务