【MySQL&docker】基于CentOS7.5 編譯制作MySQL5.7.28鏡像

實(shí)驗(yàn)背景

一般我們都是在x86的機(jī)器上涮因,運(yùn)行MySQL呵俏,ARM服務(wù)器由于目前的生態(tài)不如intel畔师,所以用的不廣泛薄霜。

因?yàn)锳RM架構(gòu)的處理器在功耗上是一個(gè)很大的天然優(yōu)勢(shì)违诗,所以仍有許多人在攻堅(jiān)ARM生態(tài)漱凝。

對(duì)MySQL5.7.x,官方?jīng)]有提供編譯好的基于ARM架構(gòu)的包诸迟,所以如果需要在ARM服務(wù)器上使用MySQL5.7.x茸炒,需要自己使用官方源碼包進(jìn)行編譯。

現(xiàn)在手頭上沒(méi)有ARM虛擬機(jī)亮蒋,所以下面用x86架構(gòu)的CentOS7.5模擬扣典,在ARM機(jī)器上的實(shí)現(xiàn)思路是一樣的!


一慎玖、實(shí)驗(yàn)環(huán)境


虛擬機(jī)操作系統(tǒng): CentOS7.5

docker版本:18.06.0-ce




二贮尖、創(chuàng)建工作目錄,下載鏡像制作所需軟件包


# mkdir? ?/root/mysql5.7.28-docker

# cd???/root/mysql5.7.28-docker

# wget -O? ?/root/mysql5.7.28-docker/gosu? ? ?https://github.com/tianon/gosu/releases/download/1.7/gosu-amd64

# chmod? +x? ?/root/mysql5.7.28-docker/gosu

#? wget? ?http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

#? wget? ?https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.28.tar.gz?



# cat? Dockerfile

############################################################################

FROM centos:centos7.5.1804

COPY mysql-5.7.28.tar.gz /opt

COPY boost_1_59_0.tar.gz /opt

COPY docker-entrypoint.sh? /

COPY gosu /usr/local/bin/

RUN yum clean all && \

? ? yum -y install gcc gcc-c++ ncurses ncurses-devel make cmake bison bison-devel openssl openssl-devel pwgen zlib zlib-devel && \

? ? cd /opt && \

? ? tar -zxf boost_1_59_0.tar.gz? && \

? ? mv boost_1_59_0 /usr/local/ && \

? ? groupadd -g? 2020 mysql && \

? ? useradd -r -u 2020 -g? mysql -s /sbin/nologin mysql && \

? ? mkdir -p /var/lib/mysql && \

? ? tar -zxf mysql-5.7.28.tar.gz && \

? ? cd mysql-5.7.28 && \

? ? cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

? ? ? ? ? -DMYSQL_DATADIR=/var/lib/mysql \

? ? ? ? ? -DSYSCONFDIR=/etc \

? ? ? ? ? -DMYSQL_USER=mysql \

? ? ? ? ? -DWITH_MYISAM_STORAGE_ENGINE=1 \

? ? ? ? ? -DWITH_INNOBASE_STORAGE_ENGINE=1 \

? ? ? ? ? -DWITH_ARCHIVE_STORAGE_ENGINE=1 \

? ? ? ? ? -DWITH_MEMORY_STORAGE_ENGINE=1 \

? ? ? ? ? -DWITH_READLINE=1 \

? ? ? ? ? -DMYSQL_TCP_PORT=3306 \

? ? ? ? ? -DENABLED_LOCAL_INFILE=1 \

? ? ? ? ? -DENABLE_DOWNLOADS=1 \

? ? ? ? ? -DWITH_PARTITION_STORAGE_ENGINE=1 \

? ? ? ? ? -DEXTRA_CHARSETS=all \

? ? ? ? ? -DDEFAULT_CHARSET=utf8 \

? ? ? ? ? -DDEFAULT_COLLATION=utf8_general_ci \

? ? ? ? ? -DWITH_DEBUG=0 \

? ? ? ? ? -DMYSQL_MAINTAINER_MODE=0 \

? ? ? ? ? -DWITH_BOOST=/usr/local/boost_1_59_0 && \

? ? make -j `grep processor /proc/cpuinfo | wc -l` && \

? ? make install && \

? ? chown -R mysql:mysql /usr/local/mysql /var/lib/mysql && \

? ? yum -y remove gcc gcc-c++ ncurses-devel make cmake bison-devel openssl-devel zlib-devel && \

? ? yum clean all && \

? ? rm -rvf? /opt/* /usr/local/boost_1_59_0? /var/cache/yum/*

VOLUME /var/lib/mysql

ENV? PATH=/usr/local/mysql/bin:$PATH

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 3306 33060

CMD ["mysqld"]

#####################################################################################


# cat docker-entrypoint.sh

###################################################

#!/bin/sh

set -e

umask 0077

if [ -z "$(ls -A /var/lib/mysql)" ]; then

? ? mysqld? --initialize-insecure --user=mysql

? ? cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

? ? chmod +x /etc/init.d/mysqld

? ? /etc/init.d/mysqld start

? ? mysql -u root --skip-password -e "alter user root@'localhost' identified by \"${MYSQL_ROOT_PASSWORD}\";"

? ? mysql -u root? -p"${MYSQL_ROOT_PASSWORD}" -e "flush privileges;"

? ? /etc/init.d/mysqld stop

? ? rm -f /etc/init.d/mysqld

fi

exec gosu mysql "$@"

####################################################


在MySQL數(shù)據(jù)目錄為空湿硝、允許以非安全模式(root@'localhost'為空密碼)初始化的前提下薪前,可以將邏輯設(shè)計(jì)的更嚴(yán)謹(jǐn)一點(diǎn):

1. 如果MYSQL_ROOT_PASSWORD為空值,直接以非安全模式(root空密碼)初始化

2. 如果MYSQL_ROOT_PASSWORD不為空值线衫,以非安全模式初始化凿可,然后根據(jù)MYSQL_ROOT_PASSWORD的傳值,設(shè)置root@'localhost'的密碼


# cat docker-entrypoint.sh

########################################################################

#!/bin/sh

set -e

umask 0077

if [ -z "$(ls -A /var/lib/mysql)" ]; then

? ? if [ -z "${MYSQL_ROOT_PASSWORD}" ]; then

? ? ? ? mysqld? --initialize-insecure --user=mysql

? ? else

? ? ? ? mysqld? --initialize-insecure --user=mysql

? ? ? ? cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

? ? ? ? chmod +x /etc/init.d/mysqld

? ? ? ? /etc/init.d/mysqld start

? ? ? ? mysql -u root --skip-password -e "alter user root@'localhost' identified by \"${MYSQL_ROOT_PASSWORD}\";"

? ? ? ? mysql -u root? -p"${MYSQL_ROOT_PASSWORD}" -e "flush privileges;"

? ? ? ? /etc/init.d/mysqld stop

? ? ? ? rm -f /etc/init.d/mysqld

? ? fi

fi

# if command starts with an option, prepend mysqld

if [ "${1:0:1}" = '-' ]; then

? ? set -- mysqld "$@"

fi

# If container is started as root user, restart as dedicated mysql user

if [ "$1" = 'mysqld' -a "$(id -u)" = '0' ]; then

? ? exec gosu mysql "$0" "$@"

fi

########################################################################

# chmod +x?? docker-entrypoint.sh

三授账、用Dockerfile文件build鏡像

#? docker build -f Dockerfile -t mysql:5.7.28 .

# docker images

四枯跑、用鏡像起容器測(cè)試

初始化MySQL


# cat? mysql5.7.28_test.sh??

#########################################################

#!/bin/bash

mysql_ver="5.7.28"

mysql_datadir="/opt/mysqldata"

mysql_root_pwd="MySQL@123"

registry_addr=""

docker run -itd ?\

? --name mysql \

? -p 3306:3306 \

? -e MYSQL_HISTFILE=/dev/null \

? -v ${mysql_datadir}:/var/lib/mysql \

? -e MYSQL_ROOT_PASSWORD="${mysql_root_pwd}" \

? mysql:${mysql_ver}

sleep 30

if ss -tan | grep -w "3306" > /dev/null 2>&1; then

? echo "Mysql init successfuly!"

else

? echo "Mysql init failed!"

fi

##########################################################

# mkdir? /opt/mysqldata

#? sh? ??mysql5.7.28_test.sh

#? chmod 400 /opt/mysqldata/*.pem


# docker exec -it mysql mysql -u root -p"MySQL@123"

# docker exec -it mysql mysql -u root -p"MySQL@123" -e "select user,host from mysql.user;"


開(kāi)啟root遠(yuǎn)程登錄

# docker exec -it mysql mysql -u root -p"MySQL@123" -e "grant all privileges on *.* to root@'%' identified by 'MySQL@123' with grant option;"

?# docker exec -it mysql mysql -u root -p"MySQL@123" -e "flush privileges;"

# docker exec -it mysql mysql -u root -p"MySQL@123" -e "select user,host from mysql.user;"


# docker exec -it mysql cat /etc/passwd



# docker exec -it mysql ls -l /usr/local/mysql




五、將容器服務(wù)注冊(cè)成系統(tǒng)服務(wù)


# docker stop mysql

# docker rm? mysql


# mkdir???/opt/mysqlconfig

# cat???/opt/mysqlconfig/mysqld.cnf

###################################################

[mysqld]

pid-file? ? ? ? ? ? ? ? ? ? ? ? ?= /var/lib/mysql/mysqld.pid

socket? ? ? ? ? ? ? ? ? ? ? ? ? = /tmp/mysql.sock

datadir? ? ? ? ? ? ? ? ? ? ? ? ? = /var/lib/mysql

symbolic-links? ? ? ? ? ? ? ? ? ? ? ? ?= 0

max_connections? ? ? ? ? ? ? ? ? ?= 1000

skip_name_resolve

character-set-client-handshake? = FALSE

lower_case_table_names? ? ? ? ? ? ?= 1

sql-mode? ? ? ? ? ? ? ? ? ? ? ? = "ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,STRICT_ALL_TABLES"

character-set-server? ? ? ? ? ? = utf8

collation-server? ? ? ? ? ? ? ? ? ? = utf8_general_ci

init_connect? ? ? ? ? ? ? ? ? ? ? ? ? = "SET NAMES 'utf8'"


[mysql]

default-character-set? ? ? ? ? = utf8


[client]

default-character-set? ? ? ? ? = utf8


###################################################


注意: 編譯的MySQL白热,如果編譯時(shí)沒(méi)指定socket文件路徑敛助,默認(rèn)為?/tmp/mysql.sock,所以 my.cnf 中要么不寫使用默認(rèn)值棘捣,要寫就寫正確辜腺!

# chown? -R? 2020:2020? ?/opt/mysqlconfig

# cat /etc/systemd/system/mysqld.service

#####################################################

[Unit]

Description=MySQL Server

After=network-online.target docker.service

Requires=docker.service

[Service]

ExecStartPre=-/usr/bin/docker rm -f mysql

ExecStart=/usr/bin/docker run \

? --name mysql \

? -p 3306:3306 \

? -e UMASK=0600 \

? -e UMASK_DIR=0700 \

? -e MYSQL_HISTFILE=/dev/null \

? -v /opt/mysqldata:/var/lib/mysql \

? -v /opt/mysqlconfig/mysqld.cnf:/etc/my.cnf \

? mysql:5.7.28

ExecStop=/usr/bin/docker stop mysql

LimitNOFILE=65535

Restart=on-failure

StartLimitBurst=3

StartLimitInterval=60s

[Install]

WantedBy=multi-user.target

#####################################################



# systemctl? daemon-reload

# systemctl ?start mysqld.service

# systemctl? enable?mysqld.service

# systemctl ?status?mysqld.service


# docker exec -it mysql ps aux

# docker exec -it mysql env

六、參考


MySQL version乍恐、release、distribution 三者區(qū)別

https://www.cnblogs.com/hellotracy/articles/5063983.html

MySQL Source-Configuration Options

https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html

Mysql 5.6的 Dockerfile 分析

https://www.cnblogs.com/ivictor/p/4832832.html


MySQL 鏡像相關(guān)環(huán)境變量的使用

https://cloud.tencent.com/developer/article/1439653


Docker容器與鏡像管理

https://www.cnblogs.com/breezey/p/8812039.html


Dockerfile reference

https://docs.docker.com/engine/reference/builder

使用 Dockerfile 定制鏡像

https://yeasy.gitbooks.io/docker_practice/image/build.html


docker 官方的 redis 鏡像如何指定配置文件

https://segmentfault.com/q/1010000008272753

https://stackoverflow.com/questions/50790197/why-redis-in-docker-need-set-daemonize-to-no


What does set -e and exec “$@” do for docker entrypoint scripts?

https://stackoverflow.com/questions/39082768/what-does-set-e-and-exec-do-for-docker-entrypoint-scripts


編寫 docker-entrypoint.sh 入口文件

https://docs.lvrui.io/2017/06/09/%E7%BC%96%E5%86%99docker-entrypoint-sh%E5%85%A5%E5%8F%A3%E6%96%87%E4%BB%B6


Dockerfile 指令詳解

http://www.reibang.com/p/eb9bd494105c


What is the purpose of [ x“$1” != x“” ]?

https://stackoverflow.com/questions/29892916/what-is-the-purpose-of-x1-x


CMD ENTRYPOINT 區(qū)別

https://blog.csdn.net/u010900754/article/details/78526443


Dockerfile 中 ENTRYPOINT 與 CMD 區(qū)別

https://blog.csdn.net/Gekkoou/article/details/80869301


Dockerfile中的RUN测砂、CMD 和 ENTRYPOINT指令的兩種格式(shell與exec)

https://blog.csdn.net/lilygg/article/details/88647718


使用docker run的選項(xiàng)以覆蓋Dockerfile中的設(shè)置詳解

https://blog.csdn.net/taiyangdao/article/details/73123939


docker-entrypoint.sh 文件的用處

https://blog.csdn.net/u013272009/article/details/84073136


10 Docker Image Security Best Practices

https://snyk.io/blog/10-docker-image-security-best-practices/


docker與gosu

https://blog.csdn.net/boling_cavalry/article/details/93380447


MySQL docker entrypoint入口文件詳解

https://www.cnblogs.com/breezey/p/8812197.html


Docker: 精通ENTRYPOINT指令

https://blog.csdn.net/CHENYUFENG1991/article/details/78766584


Dockerfile定制鏡像茵烈、Dockerfile應(yīng)用示例、CMD 與 ENTRYPOINT

https://blog.csdn.net/weixin_41927237/article/details/81878282


Docker: 精通ENTRYPOINT指令

https://blog.csdn.net/CHENYUFENG1991/article/details/78766584


怎么理解 Dockerfile中? ?set? -- mysqld"$@"? ?命令砌些?

https://segmentfault.com/q/1010000003874406


docker與gosu

https://blog.csdn.net/boling_cavalry/article/details/93380447


sudo or gosu

https://segmentfault.com/a/1190000004527476


docker-library 大量Dockerfile 實(shí)例

https://github.com/docker-library


Docker —— 從入門到實(shí)踐

https://yeasy.gitbooks.io/docker_practice/image/dockerfile/user.html


10 Docker Image Security Best Practices

https://snyk.io/blog/10-docker-image-security-best-practices


docker-mysql5.7.27-arm

https://github.com/whutwf/docker-mysql5.7.27-arm


mysql 5.6 Dockerfile分析

http://www.reibang.com/p/e493559e4d22


mysql docker-entrypoint.sh分析

https://segmentfault.com/a/1190000019608671

https://c.lanmit.com/bianchengkaifa/go/2265.html


Docker 環(huán)境變量的運(yùn)用

https://ryanc.cc/archives/docker-env


如何在ENTRYPOINT數(shù)組中使用Docker環(huán)境變量呜投?

https://cloud.tencent.com/developer/ask/102167


docker容器中的環(huán)境變量

https://xuxinkun.github.io/2019/03/12/docker-env


entrypoint.sh shell腳本解析

https://www.cnblogs.com/iiiiher/p/8033194.html


如何編寫最佳的Dockerfile

https://segmentfault.com/a/1190000009514788

https://segmentfault.com/a/1190000015606305


docker-entrypoint.sh 文件的用處

https://blog.csdn.net/u013272009/article/details/84073136



ARM服務(wù)器上源碼編譯安裝MySQL5.7.21

https://blog.csdn.net/smart9527_zc/article/details/81153053


Linux ARM機(jī)器上源碼安裝MySQL5.7.23

https://blog.csdn.net/qd1308504206/article/details/99686650


ARM CentOS7 上安裝MysQL 8.0.15教程

https://blog.csdn.net/fengshaungme/article/details/88746201


MySQL5.7.x的交叉編譯

https://github.com/velarn/CrossCompliteArmMysql


MySQL 5.6?基于 ARM 服務(wù)器的編譯

https://www.huaweicloud.com/kunpeng/software/mysql.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市存璃,隨后出現(xiàn)的幾起案子仑荐,更是在濱河造成了極大的恐慌,老刑警劉巖纵东,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粘招,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡偎球,警方通過(guò)查閱死者的電腦和手機(jī)洒扎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門辑甜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人袍冷,你說(shuō)我怎么就攤上這事磷醋。” “怎么了胡诗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵邓线,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我煌恢,道長(zhǎng)褂痰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任症虑,我火速辦了婚禮缩歪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谍憔。我一直安慰自己匪蝙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布习贫。 她就那樣靜靜地躺著逛球,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苫昌。 梳的紋絲不亂的頭發(fā)上颤绕,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音祟身,去河邊找鬼奥务。 笑死,一個(gè)胖子當(dāng)著我的面吹牛袜硫,可吹牛的內(nèi)容都是我干的氯葬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼婉陷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帚称!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起秽澳,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闯睹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后担神,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體楼吃,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了所刀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衙荐。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浮创,靈堂內(nèi)的尸體忽然破棺而出忧吟,到底是詐尸還是另有隱情,我是刑警寧澤斩披,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布溜族,位于F島的核電站,受9級(jí)特大地震影響垦沉,放射性物質(zhì)發(fā)生泄漏煌抒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一厕倍、第九天 我趴在偏房一處隱蔽的房頂上張望寡壮。 院中可真熱鬧,春花似錦讹弯、人聲如沸况既。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棒仍。三九已至,卻和暖如春臭胜,著一層夾襖步出監(jiān)牢的瞬間莫其,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工耸三, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乱陡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓吕晌,卻偏偏與公主長(zhǎng)得像蛋褥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睛驳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容