创建镜像 - 创建与定制 mysql 镜像

本文通过制作与定制 mysql 镜像为案例,一方面说明创建镜像简单,另一方面解释 docker image 的内容,直观描述 docker build 命令与 Dockerfile 主要配置。这些基本能满足日常工作需要,需要完整的命令和配置说明可参考官方文档或网上的翻译。

1、docker images?

docker images 使得软件实现拿来即用。docker images 中包含什么呢?

先得看官方关于 docker 的描述1:

其中:

  • KERNEL 是每个 Linux 操作系统都有的, image 不包含。
  • DEBIAN-image 代表我们常见的 Linux 系统(不含 KERNEL),如 CentOS, Ubuntu,Debian 等又称为 Linux 发行版。这些除了包含 KERNEL 外,包含大量操作系统扩展、各种管理工具、开发工具、图像界面支持等。通常都是庞然大物,命令行版本的文件系统也有几百兆。这些镜像大约 100~200M。
  • BUSY BOX-image 代表精简的 Linux 系统, 如 Alpine, busybox, CoreOS 等,仅支持一些最基本 Linux 命令和一个简单应用包管理,以及以满足云应用需求的支持。这些镜像 5~10M。
  • ADD EMACS-image 代表 Emacs 这样的基础应用,它仅在基础操作系统文件基础上添加了自己的代码和依赖包;
  • ADD APACHE-image 代表 Apache web 应用,建立在已有 emacs 镜像基础上,即文件系统添加了 apache 及其依赖包。这样形成多层叠加的文件系统,尽管 APACHE-image 仅包含自己的内容,但启动后,我们可以访问基础操作系统、emacs 提供的程序和软件包。
  • WRITEBLE COTAINER 是镜像中程序在与主机(Host)隔离环境下运行进程产生的中间文件。

因此:

image 是文件(增量)与环境(context)配置文件的集合。

这个定义太枯燥,我们来看它的生成过程:

2、mysql 镜像制作

2.1 Dockerfile 文件

docker build 默认使用 Dockerfile 文件创建镜像。mysql 官方 docker 构建(mysql5.7)的 Dockerfile 文件内容是2:

FROM debian:jessie# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql# add gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \&& export GNUPGHOME="$(mktemp -d)" \&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \&& chmod +x /usr/local/bin/gosu \&& gosu nobody true \&& apt-get purge -y --auto-remove ca-certificates wgetRUN mkdir /docker-entrypoint-initdb.d# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
RUN apt-get update && apt-get install -y perl pwgen --no-install-recommends && rm -rf /var/lib/apt/lists/*# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.17-1debian8RUN echo "deb http://repo.mysql.com/apt/debian/ jessie mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { \echo mysql-community-server mysql-community-server/data-dir select ''; \echo mysql-community-server mysql-community-server/root-pass password ''; \echo mysql-community-server mysql-community-server/re-root-pass password ''; \echo mysql-community-server mysql-community-server/remove-test-db select false; \} | debconf-set-selections \&& apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* \&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime&& chmod 777 /var/run/mysqld# comment out a few problematic configuration values
# don't reverse lookup hostnames, they are usually another container
RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/mysql.conf.d/mysqld.cnf \&& echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnfVOLUME /var/lib/mysqlCOPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 3306
CMD ["mysqld"]

其中3:

  • FROM debian:jessie 表示在操作系统 debian:jessie 版本基础上构建。docker 会创建容器,加载它的文件系统
  • RUN groupadd … 表示运行虚拟容器中命令文件,所有产生的文件变化在新的层(不会修改 debian:jessie 镜像内容)
  • ENV 设置环境变量

官方 ENV 案例与解释:

FROM busybox
ENV foo /bar
WORKDIR ${foo}   # WORKDIR /bar
ADD . $foo       # ADD . /bar
COPY \$foo /quux # COPY $foo /quux
  • VOLUME [“/data”] 指令创建挂载点 以允许本地 host 或 其他容器挂载卷。

VOLUME /var/lib/mysql 在 mysql 容器运行加载时,会将 /var/lib/mysql 目录下所有文件拷贝到新的容器的卷。这将加速当前程序读写速度(仅在当前文件系统操作)。

  • COPY 从本地拷贝到容器文件系统。

官方的一些案例

COPY hom* /mydir/        # adds all files starting with "hom"
COPY hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"COPY test relativeDir/   # adds "test" to `WORKDIR`/relativeDir/
COPY test /absoluteDir/  # adds "test" to /absoluteDir/
  • WORKDIR

    指定当前容器文件系统的当前目录。

  • ADD 官方描述与 COPY 类似,只是 ADD 支持 remote file URL。

  • ENTRYPOINT [“docker-entrypoint.sh”] 指定执行命令前的配置或其他工作。

  • EXPOSE 3306 指定暴露对外服务端口。

  • CMD [“mysqld”] 指定默认执行的容器服务。

2.2 制作镜像

利用上述文件,使用命令 docker build <path> -t <image-name>:<tag> 就可以构建镜像,例如:

当前目录下包含 Dockerfile 和 docker-entrypoint.sh ,执行
sudo docker build . -t mysql:1.0-yours

从 Dockerfile 配置看出, Dockerfile 包含两大类指令,

  • 一类 RUN、ADD、COPY 等,在原镜像基础上制作了新的文件系统(增量);
  • 一类 FROM、ENV、WORDIR、ENTRYPOINT、VOLUME、EXPOSE、CMD等,配置镜像执行期间的环境与默认行为。

当然,你可能和我一样不熟悉 debian:jessie 环境, 熟悉 ubuntu 可以看创建 Mysql 容器4。

3、定制镜像

制定前准备

是否需要定制镜像,从那个起点定制镜像并不是一件容易的决策。

是否需要定制镜像?

  • 无论 mysql,redis,nginx 都有官方镜像,直接拉下来用可解决多数问题
  • 如果你不喜欢官方的,Git 上有很多非官方镜像可用

当然,发布程序、定制官方镜像,以方便使用是定制镜像的理由。

从那个基础镜像开始?

  • 以操作系统为基础,你得选择你熟悉的 CentOS、Ubuntu、Debian 还是精简的 Alpine、CoreOS。熟悉程度与镜像体积是两难的选择。
  • 以应用程序为基础,也是比较难的。例如,java 应用即可用 Maven 构建(嵌入服务器),也可以用 jetty,tomcat 为基础添加应用程序构建。

没有特殊情况,不必从操作系统构建

定制 mysql

一句话,pull 官方镜像,编写 my.cnf ,然后写 Dockerfile,例如:

FROM mysql:5.7
COPY my.cnf /etc/mysql/conf.d
ENV MYSQL_ROOT_PASSWORD root

然后:

docker build . --rm=true -t yours/mysql:5.7

检查能力

你能否参考Docker mysql 主从配置详解及实例 完成 mysql 主从配置呢?

小结

本文介绍了 mysql 官方的 Dockerfile ,并以此为案例介绍了镜像配置,构建的要点。尽管网上中文资料很多,仍然建议你以官方文档为基础,发展变化毕竟太快。

【参考】


  1. What is Docker? https://www.docker.com/what-docker ↩
  2. Docker Official Image packaging for MySQL https://github.com/docker-library/mysql ↩
  3. Dockerfile reference https://docs.docker.com/engine/reference/builder/ ↩
  4. Creating a MySQL Docker Container http://txt.fliglio.com/2013/11/creating-a-mysql-docker-container/ ↩

创建镜像 - 创建与定制 mysql 镜像相关推荐

  1. docker mysql镜像 使用_docker下MySQL镜像的使用方法

    预习: 使用到的docker命令: docker images   显示本地有的镜像 docker pull +镜像名称   从docker hub上面拉取镜像 docker run --name  ...

  2. Docker - 从创建mysql镜像开始

    文章目录 Docker - 从创建mysql镜像开始 1.下载mysql 镜像 2.查看已经安装的镜像 3.运行mysql 镜像 4.进入docker 命令行界面 5.登陆mysql 6.mysql ...

  3. Window中的Docker 拉取Mysql镜像 并在本地Navicate链接

    首先本地   拉取mysql镜像 以下是所有mysql镜像 我自己下载的为5.6   下面 以5.6为例:(拉取mysql5.6镜像) docker pull mysql:5.6 创建一个容器 doc ...

  4. Docker 制作 MySQL 镜像并使用 `/docker-entrypoint-initdb.d/` 机制初始化数据

    需求 制作一个 MySQL Docker 镜像并初始化数据库信息 环境 win 11 Docker-Desktop 4.14.0 (91374) 分析 启动一个MySQL容器很容易.如何初始化数据呢? ...

  5. Dockerfile创建Linux/CentOS6.x Nginx MySQL Tomcat PHP(LNMTP)镜像

    Dockerfile Dockerfile是实现自动构造镜像的工具,用户可以按照自己的需求定制私有镜像 环境介绍 CentOS6.x镜像 此为基础镜像,我们通过Dockerfile来创建一个包含自定义 ...

  6. mysql镜像远程连接_Docker创建MySQL镜像并成功进行远程连接

    1.安装 1.1 拉取镜像 docker pull mysql 拉取成功可以验证一下 docker images 1.2 创建并启动一个 mysql 容器 docker run --name ly-m ...

  7. mysql镜像远程连接_docker 创建mysql镜像,并成功进行远程连接

    1.安装 1.1 拉取镜像 docker pull mysql 拉取成功可以验证一下 docker images 1.2 创建并启动一个mysql容器 docker run --name ly-mys ...

  8. Docker学习之路04:创建定制Nginx镜像

    Docker学习之路04:创建定制Nginx镜像 Docker学习路线传送门: Docker学习之路01:Docker的安装 Docker学习之路02:阿里云镜像加速器 Docker学习之路03:Do ...

  9. docker(虚拟化,沙箱(沙盒),简介,docker和vm的区别,安装,基本操作,基本使用) 镜像的操作 容器的操作 使用mysql镜像 使用canda创建虚拟环境

    一.docker 1.概念介绍 虚拟化: 是一种资源的管理技术,将计算机中的实体资源,进行抽象,然后呈现出来,目的是为了打破实体结构之间的不可分割障碍,使用户以更好的组态使用资源 形象化形容如下: 我 ...

最新文章

  1. HashMap.values().addAll()异常
  2. 设置winfrom窗体透明度,拖动,任务栏中显示窗体
  3. PHP性能调优---PHP-FPM配置及使用总结
  4. 一篇RxJava友好的文章(一)
  5. 有微型计算机广告,广告还会受欢迎?都是斯巴达克显卡惹的“祸”
  6. MySQL复制性能优化
  7. LeetCode 20. 有效的括号(栈)
  8. 下一代 Node 强势来袭:Deno
  9. 现代计算机模型要求程序在执行,大学计算机基础考试考点.doc
  10. 计算机基础教程2 - 计算机发展历程
  11. 逆置单链表c语言程序,逆置单链表C语言
  12. 【路径规划】基于matlab改进的人工势场算法机器人避障路径规划【含Matlab源码 1151期】
  13. JS:读取excel并显示
  14. [转]VMPlayer的Briged网络配置
  15. 2021-0(C++)输入一个字符串,判断其是否是回文字符串(回文字符串就是正序与反序是相同的字符串)5-27
  16. matlab 图像分割-自定义函数T_SGM
  17. html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码
  18. Sloth:网易流计算服务化平台架构实践
  19. android serviceconnection 作用,Android Service服务的相关介绍
  20. 2020年11月软考网络规划设计师上午真题及答案解析

热门文章

  1. jenkins设置清华镜像时报错 unable to find valid certification path to requested target
  2. 【图像理论】透视变换
  3. IDEA开发工具2018破解版教程
  4. Python GUI编程(Tk)--聊天窗口--键盘值查询
  5. 分享几个苹果CMS采集资源站
  6. iconfont图标Font class使用
  7. 客户端渲染CSR、服务器端渲染SSR、预渲染Prerendering
  8. java学习文档xmind文件,全是精华!
  9. EPIC 创建DMEEX付款结构
  10. 关于『进击的Markdown』:第二弹