初試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避免端口號衝突,強權限用戶在線調試對其餘用戶的影響也有所改進。光看論文能夠說是很是棒的系統。mysql

  嘛,因此稍微瞭解了一下k8s,發現是基於docker作的,docker自己不是很熟,當年還曾經把docker和yarn的container搞混,只能說仍是得從頭開始學習docker才行。linux

  學習的第一步天然是先學會使用,根據官網的教程,咱們能夠簡化爲如下幾個步驟:sql

#獲取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參考:docker

  https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-docker-ce-1shell

  看起來使用仍是挺簡單的,這裏的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時執行的命令。ubuntu

  到此example學習完畢,本身嘗試下構建mysql on docker。bash

  構建dockerfile:運維

FROM ubuntu:14.04
MAINTAINER gaoze
RUN apt-get update
RUN apt-get -y install mysql-server
EXPOSE 3306  
CMD ["/usr/bin/mysqld_safe"]

  執行docker build,再執行docker run,發現沒法遠程訪問,雖然暴露了3306接口可是mysql沒設置權限。那麼咱們加入遠程訪問的權限再試試:curl

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 3306  
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 3306  
CMD ["/usr/bin/mysqld_safe"]

ok。接下來是執行:

#shell下執行命令,指定docker image的名字爲docker-mysql
docker build -t docker-mysql .

#啓動這個image,-d表明後臺執行,-p表明端口映射
docker run -d -p 50001:3306 docker-mysql

#讓咱們訪問mysql試試,先看看container的運行情況
docker ps 

#發現port寫的是 0.0.0.0:50001 -> 3306/tcp
mysql -h 0.0.0.0 -P 50001 -uroot -p1

ok,能夠訪問了,因爲0.0.0.0是localhost(雖然hosts中已經屏蔽了,然而仍是能夠訪問本地),試試mysql -h ${本機IP地址} -P 50001 -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。經常使用設置直接完成。對大部分人來講能夠直接使用。

相關文章
相關標籤/搜索