因为个人学习需要,为软件系统的虚拟容器化,以下将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. 2次方的期望dp

    某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(    我们来简化一下这个游戏的规则    有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个com ...

  2. 使用git将本地文件提交到github存储库

    1.首先你要安装git https://git-for-windows.github.io/ 去官网自行下载对应版本 2.安装好git服务器后,找到你项目的文件夹,右键git bash here打开命 ...

  3. 轻松弄懂var、let、const之间的区别

    ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,于2015年6月正式发布,也称ECMAScript 2015. ES6的好处 ES6的出现为我们前端带来了很多方便之处,以 ...

  4. java 三元运算

    一.格式: 数据类型 变量名称 = 条件判断 ? 表达式a : 表达式b; 二.注意: 1.不是打印操作时,需要 三元运算的右则 2.表达式a和表达式b的值,必须要和变量名称 的数据类型相等 貌似和C ...

  5. 10.JavaSE之包机制

    包机制: 为了更好的组织类,Java提供了包机制,用于区别类名的命名空间 包语句的语法格式为: package pkg1[ . pkg2[ . pkg3...]]; package com.duan. ...

  6. CTF-Keylead(ASIS CTF 2015)

    将keylead下载到本地用7-ZIP打开,发现主要文件 keylead~ 在ubuntu里跑起来,发现是个游戏,按回车后要摇出3,1,3,3,7就能获得flag. 拖进IDA 直接开启远程调试,跑起 ...

  7. MCLS Notes

    MainToolbar View Button Click Event handle àMainToolbar.xaml.cs OnConnect() functionàService.Messeng ...

  8. vwmare 十月第 1 弹

    step one 不管 是 ubuntu 还是 win vm tools 都是需要在虚拟的系统里面的去安装的. 这一点是相同的.

  9. 总是在起头可是能怎么办呢 Python数据分析

    目录 前言1 第1章准备工作5 本书主要内容5 为什么要使用Python进行数据分析6 重要的Python库7 安装和设置10 社区和研讨会16 使用本书16 致谢18 第2章引言20 来自bit.l ...

  10. Flask 笔记

    1.CBV 模式 1.继承 views.MethodView from flask.views import MethodView 2.HTTP具有 8 种请求方法 - CBV中的方法 - GET 获 ...