因为个人学习需要,为软件系统的虚拟容器化,以下将mysql制作为docker镜像,并记录下详细步骤。

欢迎大家学习交流和转载,同时写作不易,如果各位觉得不错,请点赞支持。

备注:以下代码和文章,欢迎复制和转载,请在开头备注清楚“原始网址和作者”,谢谢!

一、实验环境

1.本地电脑:

windows 10  x64 / git version 2.21.0.windows.1

2. 本地docker 构建环境:

CentOS 7.4 x64 / Docker Engine - Community 18.09.6 x64

3. 阿里云构建环境:

代码库:https://code.aliyun.com/03_docker_base/mysql-single

镜像库:https://cr.console.aliyun.com/repository/cn-hangzhou/kevin_docker_registry/docker_base_mysql-single/details4.

mysql版本:mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz

二、编写代码

本地编写dockerfile代码,目录层次如下

1. 目录层次,

dockerfile的代码目录,如下

----|----/03_docker_base/mysql-single/

|----soft/   # 放COPY命令,需要复制的小文件,大文件建议通过-v和VOLUMN方式挂载共享卷方式获得。

|----mysql.conf   # mysql的配置参数文件

|----mysql.sh      # mysql的启动脚本文件

|----mysql-single-centos.Dockerfile   # docker镜像的源代码

|----mysql-single.sh  # 个人笔记,记录一下当时操作的命令和步骤

构建环境下面的共享卷的资源目录,如下

----|----/nfs_data/dockerfile/mysql-single/soft/

|----mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar

2. 代码介绍,如下:

提醒:

<a>最初制作mysql镜像的时候,由于是挂载共享卷,所以共享卷的文件只能被CMD或ENTRYPOINT命令访问,RUN是构建时刻,所以访问不了volumn共享卷的文件。

<b>创建的dockerfile/mysql.sh/mysql.conf 等文件,一定要在linux下面创建和编辑,防止产生特殊字符和非法编码。编码都默认使用UTF-8 BOM。

<c>执行测试,可以使用命令 -v host_path:docker_path 进行挂载共享卷,并且dockerfile文件中也要对应写VOLUMN ["docker_path"]

 FROM centos:centos7
MAINTAINER tian.dong <tiandong19860806@126.com> RUN \
# yum update -y -q && \
yum -y -q install libaio -y && \
yum -y -q install numactl -y && \
yum clean all # step 1: set enviroment
ENV DOCKER_DATA /nfs_data
ENV DOCKER_PASS pass
ENV MYSQL_BASEDIR /opt/install/mysql
ENV MYSQL_DATADIR /opt/data/mysql
ENV MYSQL_LOGDIR /opt/log/mysql
ENV MYSQL_CONF /opt/install/mysql/conf
ENV SOFT_MYSQL /nfs_data/dockerfile/mysql-single/soft/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz RUN \
echo '' >> /etc/profile && \
echo 'PATH=$PATH:$MYSQL_BASEDIR/bin:$MYSQL_BASEDIR/lib' >> /etc/profile # VOLUME docker 方式需要写;K8S 方式不需要写,可通过PV/PVC实现
VOLUME ["$DOCKER_DATA"] # step 2: make directory
RUN mkdir -p ${MYSQL_CONF} && \
groupadd mysql && \
useradd -g mysql mysql && \
echo ${DOCKER_PASS} | passwd --stdin mysql # USER mysql:mysql COPY soft/mysql.conf ${MYSQL_CONF}/
COPY soft/mysql.sh /usr/local/bin/
# COPY soft/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz /opt/install/
# RUN wget -O /opt/install/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz -c \
# https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz # COPY soft/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz /opt/install/
# 使用RUN,不用CMD的原因,执行顺序 RUN (build) < CMD (starting) < ENTRYPOINT (started)
# 并且,在RUN命令中,所有VOLUMN或docker -v path:path的外部挂载点,都是处于尚未就绪的状态;只有ENTRYPOINT时刻,才会挂载外部存储介质完毕。
RUN \
chmod +x /usr/local/bin/mysql.sh && \
chmod -R 777 ${DOCKER_DATA} && \
mkdir -p ${MYSQL_BASEDIR} && \
mkdir -p ${MYSQL_DATADIR} && \
mkdir -p ${MYSQL_LOGDIR} && \
mkdir -p ${MYSQL_CONF} && \
mkdir -p ${MYSQL_LOGDIR}/{error,pid,bin,relayidx,relaylog,slow}/ && \
touch ${MYSQL_LOGDIR}/error/error.log && \
# tar -zxf ${SOFT_MYSQL} -C ${MYSQL_BASEDIR} && \
# mv ${MYSQL_BASEDIR}/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64/* ${MYSQL_BASEDIR}/ && \
touch ${MYSQL_LOGDIR}/pid/pid.log && \
touch ${MYSQL_LOGDIR}/bin/bin.log && \
touch ${MYSQL_LOGDIR}/relaylog/relay.log && \
touch ${MYSQL_LOGDIR}/relayidx/relay.index && \
touch ${MYSQL_LOGDIR}/slow/slow.log && \
chmod -R 744 ${MYSQL_BASEDIR} && \
chmod -R 744 ${MYSQL_DATADIR} && \
chmod -R 744 ${MYSQL_LOGDIR} && \
chmod -R 644 ${MYSQL_CONF}/mysql.conf && \
chmod -R 644 ${MYSQL_LOGDIR}/error/error.log && \
chmod -R 644 ${MYSQL_LOGDIR}/pid/pid.log && \
chown -R mysql:mysql ${MYSQL_BASEDIR} && \
chown -R mysql:mysql ${MYSQL_DATADIR} && \
chown -R mysql:mysql ${MYSQL_LOGDIR} && \
chown -R mysql:mysql ${MYSQL_CONF}/mysql.conf && \
chown -R mysql:mysql ${MYSQL_LOGDIR}/error/error.log && \
chown -R mysql:mysql ${MYSQL_LOGDIR}/pid/pid.log && \
chown -R mysql:mysql ${MYSQL_LOGDIR}/relaylog/relay.log && \
chown -R mysql:mysql ${MYSQL_LOGDIR}/relayidx/relay.index && \
chown -R mysql:mysql ${MYSQL_LOGDIR}/slow/slow.log && \
# RUN su mysql && \
rm -rf ${SOFT_MYSQL} && \
rm -rf ${MYSQL_BASEDIR}/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64 # open port
EXPOSE 13306 33060 # step 3: install mysql
# start application
ENTRYPOINT ["/usr/local/bin/mysql.sh"]

三、本地测试

操作环境:本地VM=CentOS 7.4 x64,并且安装有docker软件

1. 构建镜像,

# 首先把本地写好的dockerfile所有文件,复制到下面的linux目录。注意文件要按照linux的编码UTF-8 BOM。

 root >> cd /nfs_data/dockerfile/mysql-single

 root >> docker build  -f ./mysql-single.Dockerfile .  -t registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0.

 # 查看镜像
root >> docker images

2. 测试镜像

 root >> docker run -it -p 3306:13306 -p 3060:33060 -v /nfs_data:/nfs_data  registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0. /bin/bash

 # 如下root@localhost: ;B>l:0tq0Xht  

 # 就是mysql数据库的初始管理员账号和密码,用户可以使用如下命令,在本机登陆mysql数据库之后修改mysql的root账号密码

 # 本机登陆mysql控制台
root >> mysql -u root -p
# 然后输入默认的root密码,注意不是VM机器的密码。 # 修改账号密码(方式1:命令行 链接密码)
mysql >> alter user 'root'@'localhost' IDENTIFIED BY 'pass';
mysql >> alter user 'app_user'@'%' IDENTIFIED BY 'pass'; # 修改账号密码(方式2:Nactive工具 链接密码)
mysql >> alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass';
mysql >> alter user 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; # 创建新账号
mysql >> create user 'app_user'@'%' identified by 'pass';

四、发布镜像

1. 如果想把docker镜像发布到互联网,可以参考我之前的一篇文章,有详细介绍阿里的git代码库和docker镜像库的创建和使用。

https://www.cnblogs.com/itshare/p/11067054.html

2. 另外,如果只是每次从本地手动发布,只需要登陆链接aliyun的docker仓库地,使用如下命令,即可:

 # 查询本地镜像
root >> docker images | grep mysql # 登录远程镜像仓库
root >> docker login --username=kevin@ registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single # 上传镜像,到远程镜像仓库
# 格式 = docker pull {镜像的仓库}:{镜像的版本}
root >> docker pull registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0.

3. 查看阿里云的上传后的镜像,地址如下

# 镜像版本和状态

# 构建历史和结果

# 远程仓库的镜像,测试如下

# 远程仓库的镜像,详细如下

4. 客户端,登陆MYSQL,如下:

连接信息,IP为Docker容器的宿主VM的IP,端口为VM的映射端口。比如 192.168.XXX.YYY:3306

==================

Update:

最后,将上面制作的docker镜像,部署到K8S环境中,方法如下:

# 注意:PV/PVC,需要提前创建好

 kubectl apply -f - << EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql-single
namespace: database-system
spec:
selector:
matchLabels:
app: mysql-single
replicas:
template:
metadata:
labels:
app: mysql-single
spec:
containers:
- name: mysql-single
image: registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0.
volumeMounts:
- mountPath: /opt/soft # docker inner path
name: soft-storage
- mountPath: /opt/log # docker inner path
subPath: database-system
name: log-storage
- mountPath: /opt/app # docker inner path
subPath: database-system
name: app-storage
- mountPath: /opt/data # docker inner path
subPath: database-system
name: data-storage
env:
- name: DOCKER_DATA_ROOT
value: "/opt/data/mysql-single"
- name: DOCKER_APP_ROOT
value: "/opt/app/mysql-single"
- name: DOCKER_LOG_ROOT
value: "/opt/log/mysql-single"
- name: DOCKER_CODE_ROOT
value: "/opt/soft"
volumes:
- name: soft-storage
persistentVolumeClaim:
claimName: pvc2soft.database-system
- name: log-storage
persistentVolumeClaim:
claimName: pvc2log.database-system
- name: app-storage
persistentVolumeClaim:
claimName: pvc2app.database-system
- name: data-storage
persistentVolumeClaim:
claimName: pvc2data.database-system
---
apiVersion: v1
kind: Service
metadata:
name: mysql-single
namespace: database-system
spec:
type: LoadBalancer
ports:
- name: "mysql-console"
port:
targetPort:
protocol: TCP
- name: "mysql-manager"
port:
targetPort:
protocol: TCP
selector:
app: mysql-single

# 显示部署结果,如下:

 [root@CNT7XDCK11D01 ~]# kubectl get all -n database-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/mysql-single-697dfccfd-5hdw2 / Running 77m 172.16.216.3 192.168.3.97 <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/mysql-single LoadBalancer 10.3.184.205 10.5.0.16 :/TCP,:/TCP 77m app=mysql-single NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/mysql-single / 77m mysql-single registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0. app=mysql-single NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/mysql-single-697dfccfd 77m mysql-single registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0. app=mysql-single,pod-template-hash=697dfccfd

# 最后,在客户端设置Mysql Nactive工具的连接信息,如下

成功登陆mysql,截图如下:

制作一个docker镜像:mysql-8-x64-linux的更多相关文章

  1. 制作 leanote docker 镜像 并运行

    # 1.制作基础镜像 leanote 使用 mongodb 存储数据,如果把 mongodb 单独做成一个镜像,初始化数据时比较麻烦,所以最后还是决定把 mongodb 和 leanote 放到同一个 ...

  2. Python环境搭建、python项目以docker镜像方式部署到Linux

    Python环境搭建.python项目以docker镜像方式部署到Linux 本文的项目是用Python写的,记录了生成docker镜像,然后整个项目在Linux跑起来的过程: 原文链接:https: ...

  3. 给Ocelot做一个Docker 镜像

    写在前面 在微服务架构中,ApiGateway起到了承前启后,不仅可以根据客户端进行分类,也可以根据功能业务进行分类,而且对于服务调用服务也起到了很好的接口作用.目前在各个云端中,基本上都提供了Api ...

  4. Docker下制作一个容器镜像

    操作过程描述: (1)先基于centos的镜像启动一个centos容器 (2)在这个容器中安装nginx (3)然后把这个已经安装了nginx的容器制作成一个docker的镜像 操作:docker c ...

  5. springboot程序构建一个docker镜像(十一)

    准备工作 环境: linux环境或mac,不要用windows jdk 8 maven 3.0 docker 对docker一无所知的看docker教程. 创建一个springboot工程 引入web ...

  6. Spring Boot教程(十一) springboot程序构建一个docker镜像

    准备工作 环境: linux环境或mac,不要用windows jdk 8 maven 3.0 docker 对docker一无所知的看docker教程. 创建一个springboot工程 引入web ...

  7. 制作seata docker镜像

    seata是阿里巴巴的一款开源的分布式事务框架,官方已经支持docker了,但是因为业务的需要,需要自己定制. 制作docker镜像 官方的Dockerfile.下载seata-server-1.1. ...

  8. docker学习-运行第一个docker镜像hello world

    docker pull  [OPTIONS] NAME[:TAG]:从远程仓库拉取一个镜像到本地,NAME是要拉取的镜像的名称,TAG是docker镜像的版本,不指定的话默认是最新版本 docker ...

  9. 如何制作一个Nginx镜像

    1,从这里你将学到编写Dockerfile的4个重要指令RUN,EXPOSE,ADD,ENTRYPOINT2,在Dockerfile中编写拷贝文件至容器的方法3, 安装一个nginx server,并 ...

随机推荐

  1. (1)解锁 MongoDB replica set核心姿势

    副本集Replica Set是一个术语,定义具有多节点的数据库集群,这些节点具有主从复制(master-slave replication) 且节点之间实现了自动故障转移. 这样的结构通常需要具有奇数 ...

  2. 79.纯 CSS 创作单元素麦当劳金拱门 Logo(原文)

    1. 效果图: 效果地址:https://codepen.io/flyingliao/pen/JgavjX 原理:m是伪元素::before弄出来的,::after遮挡中间下方一小块. 感想:学到一个 ...

  3. C# HttpWebRequest传递参数多种方式混合使用

    在做CS调用第三方接口的时候遇到了这样的一个问题,通过PSOTman调试需要分别在parmas.Headers.Body里面同时传递参数.在网上查询了很多资料,以此来记录一下开发脱坑历程. POSTm ...

  4. 枚举 + exgcd

    题意:已知xi=(a*xi-1+b) mod 10001,且告诉你x1,x3.........x2*t-1,让你求出其偶数列 思路分析 : 题目所要求的的是对 10001 取余,由模运算的性质可知,a ...

  5. NetCore下的log4

    https://www.cnblogs.com/zhangxiaoyong/p/9463791.html 这一篇也不错 .NET常用的日志组件有NLog.Log4net等,.NET CORE下微软也自 ...

  6. 使用ABAP Data Validator验证数据有效性

    在日常的开发过程中,我们常常要处理不同来源的数据.数据可能来自不可靠的外部系统.不可靠的用户输入和甚至设计有误的数据库表,因此,对数据有效性进行验证是必要的工作. 开源工具ABAP Data Vali ...

  7. LeetCode 第七题--整数反转

    1. 题目 2.思路 1. 题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321示例 ...

  8. 关于 C#和.net 的 发展

    591. C# 1 的 委托 语法 看起来 似乎 并不 太坏 [2016-04-27 09:00:56]592. C# 2 支持 从 方法 组 到 一个 兼容 委托 类型 的 隐式 转换. [2016 ...

  9. linux开机无法进入桌面直接进入initramfs模式的问题修复

    可能是因为关机异常导致磁盘错误. kali linux升级到2019.4版本之后出现过好几次异常关机导致直接进入initramfs的模式,无法进入系统桌面,网上的办法基本上也都是无效的,前几次翻了很多 ...

  10. MCMC&Gibbs sampling

    Note of Markov Chain Monte Carlo and Gibbs Sampling :  http://pan.baidu.com/s/1jHpWY1o 序:A major lim ...