初试docker以及搭建mysql on docker
前一阵阅读了google的borg论文,在最后的related works和总结中发现了kubernetes。从论文中了解的kubernetes这个东西很有意思,按照论文所说,它的实现有希望解决an entire multi-job service的统一调度,这个对于目前的调度系统算是一个难题了。当前即使是Borg这样成熟的分布式系统,能够解决production任务(gmail等长运行的service)和batch任务的同时运行,但是依旧无法解决multi-job service的调度问题,对于整个service来讲,还是必须走多次调度才可以执行完成,这对于用户的体验并不友好,这个问题类似于spark的DAGScheduler和传统Hadoop的调度的区别,spark可以根据RDD的dependency关系来判断上下游关系,通过lazy的方式构造一个有向无环图进行处理,作为一个普通用户,我可以更灵活的构造多个Batch任务在一个spark的Application中,这样可以降低我的等待时间可提高编程灵活性,但是spark也只是支持多batch任务的DAG,对于其他任务,如production,流处理任务之类的结合也是毫无办法。如果kubernetes真的能够完美解决那这个系统肯定是未来的主流了。当然kubernetes是google borg的原班人马打造,自身高素质的运维经验会给k8s带来更多的技术支持,并且相比于borg还加入了每个container独立IP避免端口号冲突,强权限用户在线调试对其他用户的影响也有所改进。光看论文可以说是非常棒的系统。
嘛,所以稍微了解了一下k8s,发现是基于docker做的,docker本身不是很熟,当年还曾经把docker和yarn的container搞混,只能说还是得从头开始学习docker才行。
学习的第一步自然是先学会使用,根据官网的教程,我们可以简化为以下几个步骤:
#获取curl
sudo apt-get install curl
#安装docker
curl -fsSL https://get.docker.com/ | sh
#跑hello-world
docker run hello-world
#看一看本地image镜像
docker images
#看一看本地container
docker ps -a -q
#删除container
docker rm $(docker ps -a -q)
最新更新:docker分化了ce版和ee版,所以现在安装稍微复杂了一点,根据不同操作系统有不同的安装方式,Ubuntu参考:
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-docker-ce-1
看起来使用还是挺简单的,这里的hello-world程序不是在本地,是从hub上同步下来的image镜像。下面介绍了一些从远程hub上pull image的方法。我比较关心的是build your own image这点,首先创建一个Dockerfile:
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
然后使用docker build -t name .命令来构建一个image,在这里,FROM是源镜像,如构建mysql可以使用FROM ubuntu:14.04来指定操作系统,RUN是跑的一些shell命令,我们能通过这些命令来在image持久化一些操作。CMD则是docker run时执行的命令。
到此example学习完毕,自己尝试下构建mysql on docker。
构建dockerfile:
FROM ubuntu:14.04
MAINTAINER gaoze
RUN apt-get update
RUN apt-get -y install mysql-server
EXPOSE
CMD ["/usr/bin/mysqld_safe"]
执行docker build,再执行docker run,发现无法远程访问,虽然暴露了3306接口但是mysql没设置权限。那么我们加入远程访问的权限再试试:
FROM ubuntu:14.04
MAINTAINER gaoze
RUN apt-get update
RUN apt-get -y install mysql-server
RUN /etc/init.d/mysql start \
&& mysql -uroot -e "grant all privileges on *.* to 'root'@'%' identified by '1';" \
&& mysql -uroot -e "grant all privileges on *.* to 'root'@'localhost' identified by '1';" EXPOSE
CMD ["/usr/bin/mysqld_safe"]
由于安装时是apt-get -y的,我们使用用户root,没密码,mysql -e 操作执行grant all privileges 操作。并将密码设置为1。
build再run之后依旧无法访问。。。但是使用命令:
docker run -i -t docker-mysql /bin/bash
之后发现本地修改确实成功了。于是决定去看看hub上的mysql官方给的Dockerfile是如何做的发现了这个:
# 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/my.cnf \
&& echo 'skip-host-cache\nskip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf \
&& mv /tmp/my.cnf /etc/mysql/my.cnf
shell操作不好,我是没看懂这个。。于是去查了查,首先第一句话是sed操作,这里是在文件中将bind-address和log前面都加上#将其变为注释。第二步,在mysqld启动参数中加入了跳过DNS检测的部分。这段shell的意义就是保证远程连接并关闭DNS解析,提高mysql本身的连接性能。
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied) 在这里-i代表直接修改文件内容,大E没找到什么意思
/^reg/replace/代表将reg开头的行替换为replace
于是,修改后的Dockerfile为这样:
FROM ubuntu:14.04
MAINTAINER gaoze
#RUN apt-get update
RUN apt-get -y install mysql-server
RUN /etc/init.d/mysql start \
&& mysql -uroot -e "grant all privileges on *.* to 'root'@'%' identified by '1';" \
&& mysql -uroot -e "grant all privileges on *.* to 'root'@'localhost' identified by '1';" RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf \
&& echo 'skip-host-cache\nskip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf \
&& mv /tmp/my.cnf /etc/mysql/my.cnf EXPOSE
CMD ["/usr/bin/mysqld_safe"]
ok。接下来是执行:
#shell下执行命令,指定docker image的名字为docker-mysql
docker build -t docker-mysql . #启动这个image,-d代表后台执行,-p代表端口映射
docker run -d -p : docker-mysql #让我们访问mysql试试,先看看container的运行状况
docker ps #发现port写的是 0.0.0.0: -> /tcp
mysql -h 0.0.0.0 -P -uroot -p1 ok,可以访问了,由于0.0.0.0是localhost(虽然hosts中已经屏蔽了,然而还是可以访问本地),试试mysql -h ${本机IP地址} -P -uroot -p1。那么,这样便创建了一个可用的docker image
目前,大家更推荐使用Dockerfile来创建image,而不是命令行修改container再固化成为image。
编辑于2019-3-13,最近mysql有个简单的方式进行部署,使用如下命令:
sudo /kubernetes/local/bin/docker run --name mysql-base -e MYSQL_ROOT_PASSWORD=${MYSQL_PASSWD} -d -p 23306:3306 mysql:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=1
此命令的含义如下:
docker run:基本命令,执行docker image创建container并执行的过程;
--name:指定容器名称;
-e:指定环境变量,将mysql的根用户密码传递进容器,在容器启动后可以直接通过此密码进行远程连接,不需要再exec -it进入Bash改priviledge了;
-p:端口映射,将本物理机的23306端口的所有访问映射到此容器的3306端口;
mysql:latest:指定Image名称和版本;
--character-set-server和--collation-server:改变server字符集;
--lower_case_table_names=1: 忽略表名大小写,mysql8表名是默认区分大小写的。
通过此命令我们可以创建一个最新版的mysql,并且对外端口为23306,root密码为${MYSQL_PASSWD},字符集为utf8mb4。常用设置直接完成。对大部分人来说可以直接使用。
初试docker以及搭建mysql on docker的更多相关文章
- 【架构】docker环境搭建mysql主从
序 本文主要研究怎么在docker上搭建mysql的主从.因为在单机搭建mysql多实例然后再配主从,感觉太痛苦了,环境各有不同,配置各不大相 同,从网上找搭建方法,试了半天也没成功,最后也没耐心调试 ...
- windows Docker Desktop 搭建mysql,mssql和redis服务
其实网上关于docker上搭建mysql的文章已经很多了,只是今晚自己搭建的时候遇到一些问题,记录一下 1.首先是pull image , docker pull mysql 2.启动服务 docke ...
- Docker容器启动Mysql,Docker实现Mysql主从,读写分离
Docker容器启动Mysql,Docker实现Mysql主从,读写分离 一.Docker文件编排 二.配置主从复制 2.1 配置master 2.2 配置slave 三.验证主从复制 3.1 mas ...
- Docker - Docker中搭建MySQL主从
1.pull完centos7纯净版的镜像后,创建容器,然后将宿主机上下载的MySQL文件 (MySQL下载地址:http://mysql.mirror.kangaroot.net/Downloads/ ...
- Docker 快速搭建 MySQL 5.6 开发环境
使用 Docker 快速搭建一个 MySQL 5.6 开发环境 步骤 获取镜像 docker pull mysql:5.6 启动容器,密码 123456,映射 3306 端口 docker run - ...
- 在Docker下搭建MySQL双主双重集群(单机展示,与多机原理一致)
前言 Docker的安装部署&在Docker下MySQL的安装与配置 https://www.cnblogs.com/yumq/p/14253360.html 在Docker进行单机主从复制M ...
- mac docker环境搭建mysql主从同步服务器
参考地址:https://www.cnblogs.com/jinjiangongzuoshi/p/9299275.html 1.下载镜像 docker pull mysql:5.7.19 2.建立配用 ...
- docker 快速搭建 mysql
准备工作 系统 centos7 切换阿里源 #备份资源文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo ...
- 基于Docker Compose搭建mysql主从复制(1主2从)
系统环境 * 3 Ubuntu 16.04 mysql 8.0.12 docker 18.06.1-ce docker-compose 1.23.0-rc3 *3 ==> PS ###我用的是 ...
随机推荐
- Agile.Net 组件式开发平台 - 平台系统介绍
平台介绍 Agile.Net 组件式开发平台是一款针对企业级产品的开发框架,平台架构基于SOA服务体系,多层组件式架构打造.平台提供企业应用开发所需的诸如ORM.IOC.WCF.EBS.SOA等分布式 ...
- css笔记——css 实现自定义按钮
css实现自定义按钮的样式实际上很早就有了,只是会用的人不是很多,里面涉及到了最基础的css写法,在火狐中按钮还是会显示出来,这时需要将i标签的背景设置为白色,同时z-index设置比input高一些 ...
- javascript笔记——js的阻塞特性[转载]
JS具有阻塞特性,当浏览器在执行js代码时,不能同时做其它事情,即<script>每次出现都会让页面等待脚本的解析和执行(不论JS是内嵌的还是外链的),JS代码执行完成后,才继续渲染页面. ...
- NDK中, 如何提高脚本式语言的可读性
原文来自安卓教程网android.662p.com,转载时请注明文章的来源:http://android.662p.com/thread-5245-1-1.html [概述] NDK开发中, ...
- 动态linq表达式新方法,Dynamic LINQ Extension Method
Remember those old posts on Dynamic LINQ? You are probably aware that Microsoft has made its impleme ...
- DTCMS获取栏目子类
<%set DataTable categoryList=get_category_child_list(channel,0)%> <%foreach(DataRow cdr in ...
- Jquery 获取各种高度、宽度【整理】
alert($(window).height()); //浏览器当前窗口可视区域高度 alert($(document).height()); //浏览器当前窗口文档的高度 alert($(docum ...
- xml学习总结(一)
xml DTD 定义元素<!ELEMENT 元素名 元素类型描述 > (1)元素类型描述:任意类型,字符串型,空元素,包含子元素,混合类型 任意类型: <?xml version=& ...
- linux设备驱动模型(kobject与kset)
Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...
- NEV_SDK开发环境部署手册
根据项目开发需求,要在MEC服务器上部署如下内容:Nginx.Nginx push stream module.Jason CPP.Spawn-fcgi.libfcgi.Redis.Hiredis.B ...