zoukankan      html  css  js  c++  java
  • 详解如何使用Docker Hub官方的MySQL镜像生成容器

    一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像。但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了。Docker Hub官方提供的CentOS镜像才324MB。目前来说我还没有找到什么好的方法把我制作的镜像的体积减下来,所以就先使用官方的吧!

    一、下载官方的mysql镜像

    docker pull mysql

    下载完成后查看镜像:

    [root@localhost mysql_data]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    mysql               latest              e206c8d4ffcf        4 days ago          324.3 MB

    二、生成容器 
    我在第一次生成容器时使用之前生成容器的方法,生成的容器运行后会马上退出。

    [root@localhost mysql_data]# docker run -d -P mysql
    c98c9e052d5d5a7981218140f0128390190e0e8d6e72d78ca05a29e2ed161c9f
    [root@localhost mysql_data]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
    c98c9e052d5d        mysql               "/entrypoint.sh mysq   4 seconds ago       Exited (1) 3 seconds ago                       mad_kirch

    查看logs

    [root@localhost mysql_data]# docker logs c98c
    error: database is uninitialized and MYSQL_ROOT_PASSWORD not set
      Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?
    

    提示说是因为没有使用参数MYSQL_ROOT_PASSWORD 
    但是除了这个参数还有没有其他参数呢?想到这里,我看到生成容器时,调用的启动脚本是/entrypoint.sh,我想应该查一下这个脚本的内容确定一下。

    但是这个容器无法启动,根本就没法查看,那只能是新生成一个查看/entrypoint.sh脚本的容器了:

    [root@localhost mysql_data]# docker run mysql cat /entrypoint.sh
    #!/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 "$@"
    

    通过查看/entrypoint.sh脚本内容,总结参数如下

    mysqld #启动mysql服务,必须使用
    MYSQL_ROOT_PASSWORD #设置mysql的root密码,必须使用
    #以下二个参数添加除root之外的用户并设置密码,可选。
    MYSQL_USER 
    MYSQL_PASSWORD
    #设置生成容器时需要新建的数据库,可选
    MYSQL_DATABASE
    #容器的mysql数据库默认的保存路径是:
    /var/lib/mysql
    #容器的配置文件my.cnf的路径为:
    /etc/mysql/my.cnf

    使用上要的参数生成新的容器:

    mkdir /mysql_data
    docker run -d -P -e mysqld -e MYSQL_ROOT_PASSWORD=147258 -e MYSQL_USER=steven -e MYSQL_PASSWORD=147258  -e MYSQL_DATABASE=discuz -v /mysql_data:/var/lib/mysql  mysql

    命令详解: 
    1、设置容器的mysql的root密码为”147258”; 
    2、新添加一个名为“steven”的用户,密码设置为“147258”; 
    3、在生成容器的同时新建一个名为“discuz”的数据库; 
    4、将宿主机的目录“/mysql_data”映射到容器的“/var/lib/mysql”目录。这是因为默认情况下数据库的数据库文件和日志文件都会存放于容器的AUFS文件层,这不仅不使得容器变得越来越臃肿,不便于迁移、备份等管理,而且数据库的性能也会受到影响。因此建议挂载到宿主机的目录到容器内。

    查看新生成的容器:

    [root@localhost mysql_data]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS                     NAMES
    9a5733de65cf        mysql               "/entrypoint.sh mysq   4 seconds ago       Up 3 seconds                0.0.0.0:32792->3306/tcp   determined_lovelace
    32c10755406e        mysql               "/entrypoint.sh cat    29 minutes ago      Exited (0) 29 minutes ago                             jolly_torvalds
    c98c9e052d5d        mysql               "/entrypoint.sh mysq   34 minutes ago      Exited (1) 34 minutes ago                             mad_kirch

    容器的3306端口已经映射给了宿主机的32792端口。如果需要将容器的3306端口开放给指定的宿主机端口,请使用参数 “-p 宿主机端口:3306”。 
    查看本地的mysql_data是否生成容器内的数据库:

    [root@localhost ~]# ll /mysql_data/
    总用量 110608
    -rw-rw---- 1 999 999       56 10月 18 09:55 auto.cnf
    drwx------ 2 999 999     4096 10月 18 09:55 discuz
    -rw-rw---- 1 999 999 12582912 10月 18 11:10 ibdata1
    -rw-rw---- 1 999 999 50331648 10月 18 11:10 ib_logfile0
    -rw-rw---- 1 999 999 50331648 10月 18 09:55 ib_logfile1
    drwx------ 2 999 999     4096 10月 18 09:55 mysql
    drwx------ 2 999 999     4096 10月 18 09:55 performance_schema

    已经生成相关的文件和默认数据库,同时也新建了”disucz”数据库.

    测试:在宿主机上通过端口访问容器中的mysql服务: 
    安装 mysql

    yum -y install mysql

    测试:

    [root@localhost ~]# mysql -u steven -p -h 127.0.0.1 -P 32792
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 3
    Server version: 5.6.27 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql>

    测试成功!

    需要注意的是:宿主机上的UID和GID是999。这是容器里用户mysql的UID和GID。千万另进行权限变更,否则容器对这个目录进行读写就会出现问题。如果觉得不舒服,可以在本地新建一个mysql_docker的用户指定UID和GID是999。

    三、进入到新生成的容器 
    由于官方的镜像没有提供sshd服务,所以可以选择在生成容器之前先自行安装sshd服务,重新生成镜像,然后再生成容器。这部分在之前的文章里提过,所以就不多说了。

    另一种方法是使用exec命令直接进入到容器内部 
    查看生成的容器ID

    [root@localhost ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS                     NAMES
    9a5733de65cf        mysql               "/entrypoint.sh mysq   11 minutes ago      Up 11 minutes               0.0.0.0:32792->3306/tcp   determined_lovelace

    使用exec进入容器,同时进行相关操作:

    [root@localhost ~]# docker exec -it  9a57 /bin/bash

    查看进程:

    root@9a5733de65cf:/# ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    mysql        1  0.0 11.5 678020 118008 ?       Ssl  03:10   0:00 mysqld
    root        33  0.3  0.1  20156  1916 ?        Ss   03:23   0:00 /bin/bash
    root        38  0.0  0.1  17432  1140 ?        R+   03:23   0:00 ps aux

    查看数据库所在的文件夹:

    root@9a5733de65cf:/# ls -l /var/lib/mysql/
    total 110608
    -rw-rw---- 1 mysql mysql       56 Oct 18 01:55 auto.cnf
    drwx------ 2 mysql mysql     4096 Oct 18 01:55 discuz
    -rw-rw---- 1 mysql mysql 50331648 Oct 18 03:10 ib_logfile0
    -rw-rw---- 1 mysql mysql 50331648 Oct 18 01:55 ib_logfile1
    -rw-rw---- 1 mysql mysql 12582912 Oct 18 03:10 ibdata1
    drwx------ 2 mysql mysql     4096 Oct 18 01:55 mysql
    drwx------ 2 mysql mysql     4096 Oct 18 01:55 performance_schema

    进入mysql:

    root@9a5733de65cf:/# mysql -u steven -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 2
    Server version: 5.6.27 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql>

    四、修改容器中mysql的配置文件 
    默认镜像中并没有安装vi或者vim,需要手工安装。

    apt-get update && apt-get -yq install vim

    然后就可以使用vim 来修改mysql的配置文件:

    vim /etc/mysql/my.cnf

    如果已经有一个比较成熟的my.cnf的配置方案,可以在宿主机上新建一个文件夹将已经设置好的my.cnf和conf.d这二个文件放到里面,在新建窗口的时候,直接使用参数”-v” 将这个文件夹映射到容器的”/etc/mysql”目录上即可。

  • 相关阅读:
    关于react fiber的理解
    前段框架——VueX
    前段框架——Vue组件间传值
    前段框架——Vue的get和post请求数据
    前段框架——Vue的一级路由和二级路由
    前端框架——Vue脚手架
    前段框架——Vue
    关于Tomcat的BUG
    验证身份证号格式
    mysql 占用90%多的CPU,解决思路
  • 原文地址:https://www.cnblogs.com/lijinze-tsinghua/p/8555390.html
Copyright © 2011-2022 走看看