美文网首页python测试开发
Docker创建自定义的Mysql镜像和容器

Docker创建自定义的Mysql镜像和容器

作者: 溯水心生 | 来源:发表于2018-11-27 16:47 被阅读56次

    [TOC]

    一、编写配置文件准备

    1.准备创建数据的脚本文件

    本实例准备了一个创建数据的脚本文件,包含了创建表,没有初始化数据的内容。

    • 脚本名称:aa.sql
    • 脚本内容:
    CREATE DATABASE IF NOT EXISTS `dev_yxywg`;
    USE `dev_yxywg`;
    DROP TABLE IF EXISTS `aa`;
    CREATE TABLE `aa` (
      `sync_pk` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL ,
      `hos_code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
      `create_time` varchar(19) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
      `study_iuid` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
      `study_content` mediumtext COLLATE utf8mb4_unicode_ci ,
      `study_state` int(255) DEFAULT NULL 
      `remark` varchar(1024) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
      PRIMARY KEY (`sync_pk`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ;
    
    

    2.编写一个Shell脚本

    这个脚本主要实现初始化创建数据库,表结构SQL文件的读取

    • 脚本名称:install_data.sh
    • 脚本内容:
    #!/bin/bash
    mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
    source $WORK_PATH/$FILE_0;
    
    

    3.编写构造镜像的Dockerfile

    -文件名称:Dockerfile
    -文件内容:

    # Docker image of image-gateway mariaDB
    # VERSION 0.0.1
    # Author: zhangyongliang
    
    #基础镜像使用mariaDB最新版
    FROM mariadb:latest
    
    #作者
    MAINTAINER ZhangYongliang <zhangyongliang1231@163.com>
    
    #定义工作目录
    ENV WORK_PATH /usr/local/work
    
    #定义会被容器自动执行的目录
    ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
    
    #定义sql文件名
    ENV FILE_0 aa.sql
    
    
    #定义shell文件名
    ENV INSTALL_DATA_SHELL install_data.sh
    
    #创建文件夹
    RUN mkdir -p $WORK_PATH
    
    #把数据库初始化数据的文件复制到工作目录下
    COPY ./$FILE_0 $WORK_PATH/
    
    #把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
    COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/
    
    #给执行文件增加可执行权限
    RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL
    
    

    二、 构造镜像

    1.执行构造镜像

    将上述的文件上传到具有Docker服务的服务器,定位到上传目录下执行如下命令:
    命令如下:

    [root@localhost DockerDB]# docker build -t gatewaydb:0.0.1 .
    
    

    TIPS:

    上述命令:0.0.1后面有一个空格,空格后面有个点号,注意书写格式,否则构建不成功,
    gatewaydb是你构建后的命名名称,可自定义

    image

    看到SuccessFully,则表明你的镜像构建成功。

    三、容器检查

    1.启动容器

    执行如下命令,启动容器:

    docker run --name imagedb -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -idt gatewaydb:0.0.1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    

    2.查看容器执行日志

    使用以下命令来查看容器是否启动,是否执行了数据库初始化的脚本

    [root@localhost DockerDB]# docker logs -f imagedb 
    
    

    imagedb为你的新建的容器名称

    如果看到实时打印日志显示:

    /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/install_data.sh
    /docker-entrypoint-initdb.d/install_data.sh: line 3: warning: here-document at line 2 delimited by end-of-file (wanted `EOF')
    
    2018-11-20 11:58:45 0 [Note] mysqld (initiated by: unknown): Normal shutdown
    2018-11-20 11:58:45 0 [Note] Event Scheduler: Purging the queue. 0 events
    2018-11-20 11:58:45 0 [Note] InnoDB: FTS optimize thread exiting.
    2018-11-20 11:58:45 0 [Note] InnoDB: Starting shutdown...
    2018-11-20 11:58:45 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool
    2018-11-20 11:58:45 0 [Note] InnoDB: Buffer pool(s) dump completed at 181120 11:58:45
    2018-11-20 11:58:47 0 [Note] InnoDB: Shutdown completed; log sequence number 1711647; transaction id 78
    2018-11-20 11:58:47 0 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1"
    2018-11-20 11:58:47 0 [Note] mysqld: Shutdown complete
    
    
    MySQL init process done. Ready for start up.
    
    

    则表明你的数据库脚本被正确执行且初始化完成了数据库的创建

    3.进入容器数据库查看库表建立情况

    • 使用以下命令进入容器
    [root@localhost DockerDB]# docker exec -it imagedb /bin/bash
    
    • 进入容器后,登录数据库:
    root@d13ef2b2d18e:/# mysql -uroot -p
    Enter password: 
    
    
    • 查看数据库初始化情况
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | dev_yxywg          |
    | information_schema |
    | mysql              |
    | performance_schema |
    +--------------------+
    4 rows in set (0.000 sec)
    
    MariaDB [(none)]> use dev_yxywg
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    MariaDB [dev_yxywg]> show tables;
    +---------------------+
    | Tables_in_dev_yxywg |
    +---------------------+
    | aa   |
    +---------------------+
    1 rows in set (0.001 sec)
    
    MariaDB [dev_yxywg]> 
    
    

    可以看到数据已经在容器建立就完成了数据库的初始化。

    四、 镜像仓库管理

    1.安装Jq

    jq为json格式化工具,添加epel源

    wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    
    rpm -ivh epel-release-latest-7.noarch.rpm
    
    yum repolist
    

    2.安装jq

    yum install jq
    

    3.编写镜像管理脚本

    编写一个shell脚本用于镜像管理

    脚本名称:img_registry.sh

    脚本内容:

    #!/bin/bash
    #cnetos7,docker-ce v17.12.0,registry v2.6.2
    #Docker registry 私有仓库镜像查询、删除、上传、下载
    
    #Author  Elven <elven89@qq.com>
    #Blog    http://www.cnblogs.com/elvi/p/8384675.html
    
    #root
    [[ $UID -ne 0 ]] && { echo "Run in root user !";exit; }
    #need jq ,get json data
    [[ -f /usr/bin/jq ]] || { echo 'install jq';yum install -y jq &>/dev/null; }
    
    #参数 variable
    #registry容器名称,默认registry
    RN=${RN:-registry}
    #访问网址,默认localhost:5000  请修改HUB信息为私有残仓库IP
    HUB=${HUB:-localhost:5000}
    HUB=10.18.33.90:5000
    
    #检测 check
    function Check_hub() {
    [[ `curl -s $HUB/v2/_catalog` == "Failed connect" ]] && { echo -e "\033[31m$HUB 访问失败\033[0m";exit;  }
    }
    
    #查询images
    function Select_img() {
    IMG=$(curl -s $HUB/v2/_catalog |jq .repositories |awk -F'"' '{for(i=1;i<=NF;i+=2)$i=""}{print $0}')
    [[ $IMG = "" ]] && { echo -e "\033[31m$HUB 没有docker镜像\033[0m";exit; }
    #echo "$HUB Docker镜像:"
    for n in $IMG;
      do
      TAG=$(curl -s http://$HUB/v2/$n/tags/list |jq .tags |awk -F'"' '{for(i=1;i<=NF;i+=2)$i=""}{print $0}')
        for t in $TAG;
        do
          echo "$n:$t";
        done
    done
    }
    
    #删除images
    function Delete_img() {
    for n in $IMGS;
    do
      IMG=${n%%:*}
      TAG=${n##*:}
      i=1
      [[ "$IMG" == "$TAG" ]] && { TAG=latest; n="$n:latest"; }
      Digest=`curl  --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -Is  ${HUB}/v2/${IMG}/manifests/${TAG} |awk '/Digest/ {print $NF}'`
      [[ -z "$Digest" ]] && { echo -e "\033[31m$IMG:$TAG  镜像不存在\033[0m";} || { 
        URL="${HUB}/v2/${IMG}/manifests/${Digest}"
        Rs=$(curl -Is -X DELETE ${URL%?}|awk '/HTTP/ {print $2}')
        [[ $Rs -eq 202 ]] && { let i++;echo "$n  删除成功"; } || { echo -e "\033[31m$n  删除失败\033[0m"; } }
    done
    #registry垃圾回收 RN=registry
    [[ "$i" -gt 1 ]] && { echo "Clean...";docker exec ${RN} /bin/registry garbage-collect /etc/docker/registry/config.yml &>/dev/null;docker restart ${RN} &>/dev/null; }
    }
    
    #删除镜像所在目录(清除所有 -dd .* )
    #简单高效,删库跑路,必备技能
    function Delete_img_a() {
    [[ -f /usr/bin/docker ]] || echo 'No docker !'
    [[ -z $(docker ps |awk '/'$RN'/ {print $NF}') ]] && { echo "$RN容器不存在!";exit; }
    for n in $IMGS;
    do
      IMG="${n%%:*}"
      docker exec $RN rm -rf /var/lib/registry/docker/registry/v2/repositories/$IMG
    done
    echo '清理 Clean ...'
    docker exec $RN bin/registry garbage-collect /etc/docker/registry/config.yml &>/dev/null
    docker restart $RN &>/dev/null
    }
    
    #上传 push
    function Push() {
    for IMG in $IMGS;
    do
      echo -e "\033[33m docker push $IMG to $HUB \033[0m"
      docker tag $IMG $HUB/$IMG
      docker push $HUB/$IMG
      docker rmi $HUB/$IMG &>/dev/null
    done
    }
    
    #下载 pull
    function Pull() {
    for IMG in $IMGS;
    do
      echo -e "\033[33m dokcer pull $IMG from $HUB \033[0m"
      docker pull $HUB/$IMG
      docker tag $HUB/$IMG $IMG
      docker rmi $HUB/$IMG &>/dev/null
    done
    }
    
    case "$1" in 
      "-h")
      echo  
      echo "#默认查询images"
      echo "sh $0 -h #帮助 -d #删除 -dd #清理空间"
      echo "    -pull img1 img2 #下载 -push #上传"
      echo 
      echo "#示例:删除 nginx:1.1 nginx:1.2 (镜像名:版本)"
      echo "sh $0 -d nginx:1.1 nginx:1.2 "
      echo "sh $0 -dd nginx #删除nginx所有版本"
      echo 
      echo "#定义仓库url地址hub.test.com:5000(默认 localhost:5000)"
      echo "env HUB=hub.test.com:5000 /bin/sh $0 -d nginx:1.1 "
      echo  
    ;;
      "-d")
      Check_hub
      IMGS=${*/-dd/}
      IMGS=${IMGS/-d/}
      Delete_img
    ;;
      "-dd")
      Check_hub
      IMGS=${*/-dd/}
      IMGS=${IMGS/-d/}
      Delete_img_a
    ;;
      "-pull")
      IMGS=${*/-pull/}
      Pull
    ;;
      "-push")
      IMGS=${*/-push/}
      Push
    ;;
      *)
      Check_hub
      Select_img
    ;;
    esac
    
    
    

    4.配置信息

    将脚本内容的HUB=10.18.33.90:5000 修改为docker镜像仓库的IP

    5.镜像使用

    使用脚本执行功能如下:

    sh img_registry.sh  # 镜像名称
    sh img_registry.sh -dd 镜像名   # 删除所有镜像
    示例:
    sh img_registry.sh -dd nginx #删除nginx所有版本"
    

    相关文章

      网友评论

        本文标题:Docker创建自定义的Mysql镜像和容器

        本文链接:https://www.haomeiwen.com/subject/bvxnqqtx.html