分析Mysql 5.6的Dockerfile

62 篇文章 1 订阅

分析Mysql 5.6的Dockerfile

Docker官方的Mysql镜像的Dockerfile托管在Github上,地址如下:

https://github.com/docker-library/mysql/tree/5836bc9af9deb67b68c32bebad09a0f7513da36e/5.6

仔细研究了一下其Dockerfile,发现最有技术含量的倒不是其Dockerfile本身,无非是更新软件仓库,下载Mysql Server,稍微修改一下其配置文件。

倒是ENTRYPOINT对应的docker-entrypoint.sh很耐人寻味,这个文件相当详实,涉及了Mysql如何初始化,如何设置密码,如何启动服务等关键问题。

今天花费了大半天来分析这个脚本,果然是受益匪浅。

脚本及分析结果如下:

#!/bin/bash
set -e

# if command starts with an option, prepend mysqld
if [ "${1:0:1}" = '-' ]; then
    set -- mysqld "$@"
fi

if [ "$1" = 'mysqld' ]; then
    # Get config
    DATADIR="$("$@" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"

    if [ ! -d "$DATADIR/mysql" ]; then
        if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then
            echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set'
            echo >&2 '  Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?'
            exit 1
        fi

        mkdir -p "$DATADIR"
        chown -R mysql:mysql "$DATADIR"

        echo 'Running mysql_install_db'
        mysql_install_db --user=mysql --datadir="$DATADIR" --rpm --keep-my-cnf
        echo 'Finished mysql_install_db'

        mysqld --user=mysql --datadir="$DATADIR" --skip-networking &
        pid="$!"

        mysql=( mysql --protocol=socket -uroot )

        for i in {30..0}; do
            if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
                break
            fi
            echo 'MySQL init process in progress...'
            sleep 1
        done
        if [ "$i" = 0 ]; then
            echo >&2 'MySQL init process failed.'
            exit 1
        fi

        # sed is for https://bugs.mysql.com/bug.php?id=20545
        mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql

        "${mysql[@]}" <<-EOSQL
            -- What's done in this file shouldn't be replicated
            --  or products like mysql-fabric won't work
            SET @@SESSION.SQL_LOG_BIN=0;
            DELETE FROM mysql.user ;
            CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
            GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
            DROP DATABASE IF EXISTS test ;
            FLUSH PRIVILEGES ;
        EOSQL

        if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then
            mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
        fi

        if [ "$MYSQL_DATABASE" ]; then
            echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
            mysql+=( "$MYSQL_DATABASE" )
        fi

        if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
            echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}"

            if [ "$MYSQL_DATABASE" ]; then
                echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}"
            fi

            echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
        fi

        echo
        for f in /docker-entrypoint-initdb.d/*; do
            case "$f" in
                *.sh)  echo "$0: running $f"; . "$f" ;;
                *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
                *)     echo "$0: ignoring $f" ;;
            esac
            echo
        done

        if ! kill -s TERM "$pid" || ! wait "$pid"; then
            echo >&2 'MySQL init process failed.'
            exit 1
        fi

        echo
        echo 'MySQL init process done. Ready for start up.'
        echo
    fi

    chown -R mysql:mysql "$DATADIR"
fi

exec "$@"

 

说明如下:

1  set -e, Manual文档的说明如下:

Exit immediately if a pipeline (which may consist of a single simple command), a subshell com‐
mand enclosed in parentheses, or one of the commands executed as part of a command list
enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status.

这句语句告诉bash如果任何语句的执行结果不是true则应该退出。这样的好处是防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉。

关于set -e的利弊,可参考一下两篇博客

(1)Unix/Linux 脚本中 “set -e” 的作用

(2)linux中的set命令: "set -e" 与 "set -o pipefail"

2

if [ "${1:0:1}" = '-' ]; then
    set -- mysqld "$@"
fi

用于判断该脚本后面的参数是否以“-”开始,它考虑的是启动mysqld是带参数的情况,如果有的话,就将mysqld和参数作为变量存到$@中。

关于set --,Manual文档的说明如下:

If no arguments follow this option, then the positional parameters are unset. Otherwise, the
positional parameters are set to the args, even if some of them begin with a -.

验证如下:

首先构造脚本

 

[root@localhost ~]# cat 4.sh 
#!/bin/bash
if [ "${1:0:1}" = '-' ]; then
        set -- mysqld "$@"
fi
echo '$@: '"$@"
echo '$1: '"$1"

 

加入参数进行验证

 

[root@localhost ~]# sh 4.sh 123
$@: 123
$1: 123
[root@localhost ~]# sh 4.sh -123
$@: mysqld -123
$1: mysqld
[root@localhost ~]# sh 4.sh -123 456
$@: mysqld -123 456
$1: mysqld

 

补充一点:关于$@与$*的区别,$@指每个位置参数参数都是一个独立的""引用字串,这就意味着参数被完整地传递,而$*则指所有位置参数只被一个""引用,相当于一个参数。

3

if [ "$1" = 'mysqld' ]; then

如果$1为mysqld,则执行下面的代码,如果不是,则执行该脚本最后一行的exec "$@"。

注意:Dockerfile中的CMD命令为 ["mysqld"],CMD命令其实就是ENTRYPOINT的参数,譬如如果ENTRYPOINT命令为ls,则CMD命令为-l,则实现的效果就是ls -l,

在启动容器时,自己输入的命令其实是覆盖CMD参数的,具体在本例中,就意味着在启动容器时,自已输入的命令只有在三种情况下才会启动mysqld服务:一、mysqld(相当于CMD参数)。二、以“-”开始的参数列表,这样上述2中的脚本才会判断为真。三、mysqld + 以“-”开始的参数列表。除此之外,其它所有的命令都不会启动mysql server服务,而是直接执行自己输入的命令。

4

 DATADIR="$("$@" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"

获取mysql server的数据目录,倘若我们没有输入任何以“-”开始的参数列表,则$@为mysqld,上述命令执行的结果如下:

[root@localhost ~]# mysqld --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }'
/var/lib/mysql/

5

 if [ ! -d "$DATADIR/mysql" ]; then

如果存在/var/lib/mysql/mysql目录存在文件,则跳过中间的步骤,直接执行chown -R mysql:mysql "$DATADIR",它这里判断的一个依据是,如果/var/lib/mysql/mysql存在文件,则代表mysql server已经安装,这时就无需安装(当然,如果强行安装的 话,可能会覆盖),直接将其属主修改为mysql用户。很多童鞋可能好奇,不是新建的镜像么?这个目录怎么可能存在呢?我当初也存在这样的疑惑,后来验证了一番,发现如果将宿主机的目录直接挂载到镜像的/var/lib/mysql下,则启动mysql镜像时,没有进行mysql的初始化,设置root密码等,直接启动mysql服务,具体如下:

 

[root@localhost ~]# docker run -v /var/lib/mysql:/var/lib/mysql mysql
2015-09-24 02:08:05 0 [Note] mysqld (mysqld 5.6.26) starting as process 1 ...
2015-09-24 02:08:05 1 [Note] Plugin 'FEDERATED' is disabled.
2015-09-24 02:08:05 1 [Note] InnoDB: Using atomics to ref count buffer pool pages
2015-09-24 02:08:05 1 [Note] InnoDB: The InnoDB memory heap is disabled
2015-09-24 02:08:05 1 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-09-24 02:08:05 1 [Note] InnoDB: Memory barrier is not used
2015-09-24 02:08:05 1 [Note] InnoDB: Compressed tables use zlib 1.2.7
2015-09-24 02:08:05 1 [Note] InnoDB: Using Linux native AIO
2015-09-24 02:08:05 1 [Note] InnoDB: Using CPU crc32 instructions
2015-09-24 02:08:05 1 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-09-24 02:08:05 1 [Note] InnoDB: Completed initialization of buffer pool
2015-09-24 02:08:05 1 [Note] InnoDB: Highest supported file format is Barracuda.
2015-09-24 02:08:06 1 [Note] InnoDB: 128 rollback segment(s) are active.
2015-09-24 02:08:06 1 [Note] InnoDB: Waiting for purge to start
2015-09-24 02:08:06 1 [Note] InnoDB: 5.6.26 started; log sequence number 1697388
2015-09-24 02:08:06 1 [Note] Server hostname (bind-address): '*'; port: 3306
2015-09-24 02:08:06 1 [Note] IPv6 is available.
2015-09-24 02:08:06 1 [Note]   - '::' resolves to '::';
2015-09-24 02:08:06 1 [Note] Server socket created on IP: '::'.
2015-09-24 02:08:06 1 [Warning] 'user' entry 'root@localhost.localdomain' ignored in --skip-name-resolve mode.
2015-09-24 02:08:06 1 [Warning] 'user' entry '@localhost.localdomain' ignored in --skip-name-resolve mode.
2015-09-24 02:08:06 1 [Warning] 'proxies_priv' entry '@ root@localhost.localdomain' ignored in --skip-name-resolve mode.
2015-09-24 02:08:06 1 [Note] Event Scheduler: Loaded 0 events
2015-09-24 02:08:06 1 [Note] mysqld: ready for connections.
Version: '5.6.26'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

 

而先前的启动过程则涉及到初始化,启动,显性设置root密码等。

将宿主机的var/lib/mysql/挂载给容器后,我们再来看看宿主机上该目录的权限。

 

[root@localhost ~]# ll /var/lib/mysql/
total 110604
-rw-rw---- 1 polkitd ssh_keys       56 Sep 14 15:46 auto.cnf
drwx------ 2 polkitd ssh_keys      131 Sep 14 16:03 db1
drwx------ 2 polkitd ssh_keys      131 Sep 14 16:03 db2
drwx------ 2 polkitd ssh_keys       55 Sep 14 16:02 db3
-rw-rw---- 1 polkitd ssh_keys 12582912 Sep 24 10:08 ibdata1
-rw-rw---- 1 polkitd ssh_keys 50331648 Sep 24 10:08 ib_logfile0
-rw-rw---- 1 polkitd ssh_keys 50331648 Sep 14 15:45 ib_logfile1
drwx------ 2 polkitd ssh_keys     4096 Sep 23 14:18 mysql
drwx------ 2 polkitd ssh_keys     4096 Sep 22 13:47 performance_schema

 

属主为polkitd,属组为ssh_keys。

此时,需显性将/var/lib/mysql的属主和属组恢复为mysql,即chown -R mysql:mysql /var/lib/mysql/,不然,宿主机的mysql服务将无法启动。

 

6

 if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then
            echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set'
            echo >&2 '  Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?'
            exit 1
 fi

设置mysql的root账户的密码,其中-z判断是否为空字符串,-a 两个条件同时满足,才为true。从这里也可以看出来,随意给MYSQL_ALLOW_EMPTY_PASSWORD赋一个值,都可以实现无密码登录。

7

 

        mkdir -p "$DATADIR"
        chown -R mysql:mysql "$DATADIR"

        echo 'Running mysql_install_db'
        mysql_install_db --user=mysql --datadir="$DATADIR" --rpm --keep-my-cnf
        echo 'Finished mysql_install_db'

        mysqld --user=mysql --datadir="$DATADIR" --skip-networking &
        pid="$!"

 

创建/var/lib/mysql,同时将其属主和属组设置为mysql,然后初始化数据库,最后用mysqld命令启动数据库。$!指的是Shell最后运行的后台Process的PID。

8

        mysql=( mysql --protocol=socket -uroot )

        for i in {30..0}; do
            if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
                break
            fi
            echo 'MySQL init process in progress...'
            sleep 1
        done
        if [ "$i" = 0 ]; then
            echo >&2 'MySQL init process failed.'
            exit 1
        fi

 

这段代码主要是利用mysql客户端测试mysql服务是否启动。这里面利用括号()构造mysql变量的方式挺有意思的,以前没有见过。特意验证了一下:

[root@localhost ~]# mysql=( mysql --protocol=socket -uroot )
[root@localhost ~]# echo ${mysql}
mysql
[root@localhost ~]# echo ${mysql[@]}
mysql --protocol=socket -uroot

这段代码给了30s的时间来判断mysql服务是否已启动,如果启动了,则退出循环,如果没有启动,循环结束后,变量i的值为0,通过后续的if语句,屏幕输出“MySQL init process failed”。

这里判断mysql服务是否启动的方式蛮有意思的,

 

[root@localhost ~]# mysql=( mysql --protocol=socket -uroot )
[root@localhost ~]# echo 'SELECT 1' | "${mysql[@]}" 
1
1
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.6.26 MySQL Community Server (GPL)
mysql> select 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.01 sec)

 

如果停掉了mysql服务,则输出如下:

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# echo 'SELECT 1' | "${mysql[@]}" 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

在这里,还有一点很让人疑惑,

 if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
    break
 fi

if判断的条件难道不是echo 'SELECT 1' | "${mysql[@]}"命令的返回码么?如果是这样的话,成功执行,则$?为0,此时不应该执行break语句的,但事实与推测的相反。关于这点暂且留下。

9

mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql

修改mysql关于时区的一个bug,不去深究。

10

       "${mysql[@]}" <<-EOSQL
            -- What's done in this file shouldn't be replicated
            --  or products like mysql-fabric won't work
            SET @@SESSION.SQL_LOG_BIN=0;
            DELETE FROM mysql.user ;
            CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
            GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
            DROP DATABASE IF EXISTS test ;
            FLUSH PRIVILEGES ;
        EOSQL

 

这段主要是用客户端登录数据库进行相关操作,包括修改root密码,为其授权,删除测试数据库等。SET @@SESSION.SQL_LOG_BIN=0的作用是停止使用日志文件,这点不是很明白。

11

 

        if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then
            mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
        fi

        if [ "$MYSQL_DATABASE" ]; then
            echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
            mysql+=( "$MYSQL_DATABASE" )
        fi

        if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
            echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}"

            if [ "$MYSQL_DATABASE" ]; then
                echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}"
            fi

            echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
        fi

 

这段代码主要是创建数据库,新建mysql用户,并授权。这其实意味着用户在启动容器时可以通过指定MYSQL_DATABASE参数来创建数据库,通过MYSQL_USER和MYSQL_PASSWORD来创建新的数据库用户。

其中,mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )用于拼接变量。譬如:

[root@localhost ~]# mysql=( mysql --protocol=socket -uroot )
[root@localhost ~]# MYSQL_DATABASE=docker
[root@localhost ~]# mysql+=( "$MYSQL_DATABASE" )
[root@localhost ~]# echo ${mysql[@]}
mysql --protocol=socket -uroot docker

12

 

       for f in /docker-entrypoint-initdb.d/*; do
            case "$f" in
                *.sh)  echo "$0: running $f"; . "$f" ;;
                *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
                *)     echo "$0: ignoring $f" ;;
            esac
            echo
        done      

 

其它需要执行的shell脚本或者sql脚本,可放到/docker-entrypoint-initdb.d/目录下。只需启动容器时,通过-v参数将容器该目录挂载到宿主机目录上。

13

        if ! kill -s TERM "$pid" || ! wait "$pid"; then
            echo >&2 'MySQL init process failed.'
            exit 1
        fi

关闭已启动的mysql server,可能很多人会感到好奇,不是提供mysql服务么?为什么还要关闭呢?

答案就在于dockerfile中CMD的命令为 ["mysqld"],如果不关闭的话,这里就无法启动。

这里比较有意思的还是在于脚本部分,

一、关于kill,kill命令是通过向进程发送指定的信号来结束进程的。

-s的意思是Specify the signal to send.  The signal may be given as a signal name or number.指定需要发送的信号.

如果没有指定发送信号,那么默认值为TERM信号。

关于-TERM和-9的区别

kill -TERM PID:TERM是请求彻底终止某项执行操作.它期望接收进程清除自给的状态并退出,它是一种较温和的方式。

kill -9 PID:

这个强大和危险的命令迫使进程在运行时突然终止,进程在结束后不能自我清理。危害是导致系统资源无法正常释放,一般不推荐使用,除非其他办法都无效。
当使用此命令时,一定要通过ps -ef确认没有剩下任何僵尸进程。只能通过终止父进程来消除僵尸进程。如果僵尸进程被init收养,问题就比较严重了。杀死init进程意味着关闭系统。
如果系统中有僵尸进程,并且其父进程是init,而且僵尸进程占用了大量的系统资源,那么就需要在某个时候重启机器以清除进程表

二、关于||运算符

关于&&和||的区别

command1 && command2 :左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行。

command1 || command2:左边的命令(命令1)执行失败了,就执行右边的命令(命令2)。

三、关于wait

wait命令用来等待指令的完成,直到其执行完毕后返回终端。

所以这段脚本的逻辑是首先用kill -s TERM "$pid"的方式关闭mysqld进程,如果执行成功了,则! kill -s TERM "$pid"的结果为false,这时候就执行wait "$pid",wait是等待mysqld的关闭,mysqld关闭完毕后,wait "$pid"结果为真,此时! wait "$pid"结果为假。echo语句就不执行。

至此,分析完毕~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Docker是一个开源的容器化平台,而MySQL是一种流行的关系型数据库管理系统。Docker容器可以提供一种轻量级、可移植的部署方式,使得在不同的环境中运行MySQL数据库变得更加灵活和便捷。 对于使用Docker部署MySQL5.6,首先需要在本地电脑上安装Docker。安装完成后,可以通过Docker Hub下载MySQL5.6的镜像。镜像是一个预先准备好的文件,其中包含了安装了MySQL5.6的环境和配置。下载完成后,可以通过命令行将镜像拉取到本地。 拉取镜像后,就可以运行MySQL5.6容器了。运行容器的命令可以指定容器的名称、端口映射、环境变量等信息。例如,可以指定将本地的3306端口映射到容器的3306端口,以便通过本地客户端访问MySQL数据库。 运行MySQL容器后,可以使用MySQL命令行工具或任何MySQL客户端连接到该容器。使用这些工具,可以配置数据库、创建表、插入数据等操作。 总结一下,使用Docker部署MySQL5.6可以提供灵活和便捷的数据库环境。它可以方便地在不同的环境中部署和运行,同时还能够利用Docker的容器化特性,隔离数据库与其他应用程序,提高安全性和可移植性。通过Docker,我们可以更好地管理和扩展MySQL数据库。 ### 回答2: Docker是一个开源的容器管理工具,可以在不同的操作系统上创建和管理容器,是一种轻量级的虚拟化技术。Mysql是一种关系型数据库管理系统,可以用于存储和管理大量的数据。 在Docker中运行Mysql5.6可以带来很多好处。首先,Docker可以提供一个统一的运行环境,使得开发人员可以在不同的机器上运行相同的Mysql版本,不需要担心环境配置的问题。其次,Docker可以快速部署和启动Mysql5.6容器,无需手动安装和配置,提高了开发和测试的效率。此外,Docker的容器可以隔离运行,相互之间不会干扰,可以更方便地进行数据库集群的搭建和管理。 要在Docker中运行Mysql5.6,可以按照以下步骤进行操作。首先,在官方Docker仓库中下载Mysql5.6的镜像文件,可以使用命令"docker pull mysql:5.6"进行下载。下载完成后,可以使用命令"docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6"来创建一个名为mysql的容器,并设置root用户的密码为123456。然后,可以使用命令"docker exec -it mysql bash"进入到容器的shell环境中,通过"mysql -u root -p"命令来登录Mysql数据库,输入之前设置的密码即可。在Mysql中,可以执行各种SQL语句来创建表、插入数据等操作。 总结来说,使用Docker运行Mysql5.6可以提供统一的运行环境、快速部署和启动容器、容器间隔离等优势,方便了开发人员在不同机器上进行Mysql开发和测试工作。 ### 回答3: Docker 是一个开源的容器化平台,可以帮助开发者轻松地将应用程序打包成一个独立的、可移植的容器,然后部署到不同的环境中。MySQL 5.6 是一个流行的关系型数据库管理系统,它提供了强大的数据存储和管理功能。 使用 Docker 部署 MySQL 5.6 可以带来很多好处。首先,通过使用容器化的方式,我们可以在不同的开发环境中轻松地部署和管理 MySQL 5.6。这意味着我们可以迅速创建一个包含 MySQL 5.6 的独立容器,并且可以根据需要方便地复制、移动和删除这个容器。这对于开发人员和运维人员来说都是非常便利的。 其次,Docker 还可以提供隔离性和安全性。每个 MySQL 5.6 容器都是相互独立的,它们有自己的运行环境和文件系统。这意味着即使在同一台物理主机上运行多个 MySQL 5.6 容器,它们之间也是相互隔离的,不会互相干扰。这提供了更高的安全性,使得我们可以更好地保护和管理我们的数据。 另外,使用 Docker 部署 MySQL 5.6 还可以简化部署和配置流程。我们可以通过定义容器化的配置文件来指定 MySQL 5.6 的各种配置选项,然后在需要部署 MySQL 5.6 的地方运行这个容器即可,无需手动安装和配置 MySQL 5.6。这大大简化了部署流程,减少了出错的机会。 总之,使用 Docker 部署 MySQL 5.6 可以提供更加方便、可移植、安全和高效的数据管理解决方案。这为开发人员和运维人员带来了许多便利和好处。希望这个回答能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值