制作一個自定義的docker鏡像:mysql-8-x64-linux


      因為個人學習需要,為軟件系統的虛擬容器化,以下將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"]

 1 FROM centos:centos7
 2 MAINTAINER tian.dong <tiandong19860806@126.com>
 3 
 4 RUN \
 5     # yum update -y -q && \
 6     yum -y -q install libaio -y && \
 7     yum -y -q install numactl -y && \
 8     yum clean all 
 9 
10 # step 1: set enviroment
11 ENV DOCKER_DATA    /nfs_data
12 ENV DOCKER_PASS    pass
13 ENV MYSQL_BASEDIR  /opt/install/mysql
14 ENV MYSQL_DATADIR  /opt/data/mysql
15 ENV MYSQL_LOGDIR   /opt/log/mysql
16 ENV MYSQL_CONF     /opt/install/mysql/conf
17 ENV SOFT_MYSQL     /nfs_data/dockerfile/mysql-single/soft/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz
18 
19 RUN \
20     echo '' >> /etc/profile && \
21     echo 'PATH=$PATH:$MYSQL_BASEDIR/bin:$MYSQL_BASEDIR/lib' >> /etc/profile
22 
23 # VOLUME docker 方式需要寫;K8S 方式不需要寫,可通過PV/PVC實現
24 VOLUME ["$DOCKER_DATA"]
25 
26 
27 # step 2: make directory
28 RUN mkdir -p ${MYSQL_CONF} && \
29     groupadd mysql && \
30     useradd -g mysql mysql && \
31     echo ${DOCKER_PASS} | passwd --stdin mysql
32     
33 # USER mysql:mysql
34 
35 COPY soft/mysql.conf  ${MYSQL_CONF}/
36 COPY soft/mysql.sh    /usr/local/bin/
37 # COPY soft/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz /opt/install/
38 # RUN wget -O /opt/install/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz  -c \
39 #     https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz
40 
41 # COPY soft/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64.tar.gz /opt/install/
42 # 使用RUN,不用CMD的原因,執行順序 RUN (build) < CMD (starting) < ENTRYPOINT (started)
43 # 並且,在RUN命令中,所有VOLUMN或docker -v path:path的外部掛載點,都是處於尚未就緒的狀態;只有ENTRYPOINT時刻,才會掛載外部存儲介質完畢。
44 RUN \
45     chmod +x /usr/local/bin/mysql.sh && \
46     chmod -R 777  ${DOCKER_DATA} && \
47     mkdir -p ${MYSQL_BASEDIR} && \
48     mkdir -p ${MYSQL_DATADIR} && \
49     mkdir -p ${MYSQL_LOGDIR} && \
50     mkdir -p ${MYSQL_CONF} && \
51     mkdir -p ${MYSQL_LOGDIR}/{error,pid,bin,relayidx,relaylog,slow}/ && \
52     touch ${MYSQL_LOGDIR}/error/error.log && \
53     # tar -zxf ${SOFT_MYSQL} -C ${MYSQL_BASEDIR} && \
54     # mv ${MYSQL_BASEDIR}/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64/* ${MYSQL_BASEDIR}/ && \
55     touch ${MYSQL_LOGDIR}/pid/pid.log && \
56     touch ${MYSQL_LOGDIR}/bin/bin.log && \
57     touch ${MYSQL_LOGDIR}/relaylog/relay.log && \
58     touch ${MYSQL_LOGDIR}/relayidx/relay.index && \
59     touch ${MYSQL_LOGDIR}/slow/slow.log && \
60     chmod -R 744  ${MYSQL_BASEDIR} && \
61     chmod -R 744  ${MYSQL_DATADIR} && \
62     chmod -R 744  ${MYSQL_LOGDIR} && \
63     chmod -R 644  ${MYSQL_CONF}/mysql.conf && \
64     chmod -R 644  ${MYSQL_LOGDIR}/error/error.log && \
65     chmod -R 644  ${MYSQL_LOGDIR}/pid/pid.log && \
66     chown -R mysql:mysql ${MYSQL_BASEDIR} && \
67     chown -R mysql:mysql ${MYSQL_DATADIR} && \
68     chown -R mysql:mysql ${MYSQL_LOGDIR} && \
69     chown -R mysql:mysql ${MYSQL_CONF}/mysql.conf && \
70     chown -R mysql:mysql ${MYSQL_LOGDIR}/error/error.log && \
71     chown -R mysql:mysql ${MYSQL_LOGDIR}/pid/pid.log && \
72     chown -R mysql:mysql ${MYSQL_LOGDIR}/relaylog/relay.log && \
73     chown -R mysql:mysql ${MYSQL_LOGDIR}/relayidx/relay.index && \
74     chown -R mysql:mysql ${MYSQL_LOGDIR}/slow/slow.log && \
75     # RUN su mysql && \
76     rm -rf ${SOFT_MYSQL} && \
77     rm -rf ${MYSQL_BASEDIR}/mysql-cluster-8.0.18-rc-linux-glibc2.12-x86_64
78 
79 # open port
80 EXPOSE 13306 33060
81 
82 # step 3: install mysql
83 # start application
84 ENTRYPOINT ["/usr/local/bin/mysql.sh"]

 

三、本地測試

操作環境:本地VM=CentOS 7.4 x64,並且安裝有docker軟件

1. 構建鏡像,

# 首先把本地寫好的dockerfile所有文件,復制到下面的linux目錄。注意文件要按照linux的編碼UTF-8 BOM。

1 root >> cd /nfs_data/dockerfile/mysql-single
2 
3 root >> docker build  -f ./mysql-single.Dockerfile .  -t registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0.0
4 
5 # 查看鏡像
6 root >> docker images 

2. 測試鏡像

 1 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.0 /bin/bash
 2 
 3 # 如下root@localhost: ;B>l:0tq0Xht  
 4 
 5 # 就是mysql數據庫的初始管理員賬號和密碼,用戶可以使用如下命令,在本機登陸mysql數據庫之后修改mysql的root賬號密碼
 6 
 7 # 本機登陸mysql控制台
 8 root >> mysql -u root -p
 9 # 然后輸入默認的root密碼,注意不是VM機器的密碼。
10 
11 # 修改賬號密碼(方式1:命令行 鏈接密碼)
12 mysql >> alter user 'root'@'localhost' IDENTIFIED BY 'pass';
13 mysql >> alter user 'app_user'@'%' IDENTIFIED BY 'pass';
14 
15 # 修改賬號密碼(方式2:Nactive工具 鏈接密碼)
16 mysql >> alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass';
17 mysql >> alter user 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';
18 
19 # 創建新賬號
20 mysql >> create user 'app_user'@'%' identified by 'pass';

 

 

四、發布鏡像

1. 如果想把docker鏡像發布到互聯網,可以參考我之前的一篇文章,有詳細介紹阿里的git代碼庫和docker鏡像庫的創建和使用。

https://www.cnblogs.com/itshare/p/11067054.html

2. 另外,如果只是每次從本地手動發布,只需要登陸鏈接aliyun的docker倉庫地,使用如下命令,即可: 

1 # 查詢本地鏡像
2 root >> docker images | grep mysql
3 
4 # 登錄遠程鏡像倉庫
5 root >> docker login --username=kevin@1522315893340281 registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single
6 
7 # 上傳鏡像,到遠程鏡像倉庫
8 # 格式 = docker pull {鏡像的倉庫}:{鏡像的版本}
9 root >> docker pull registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0.0

3. 查看阿里雲的上傳后的鏡像,地址如下

# 鏡像版本和狀態

www.cnblogs.com/itshare

 

 

# 構建歷史和結果

 

# 遠程倉庫的鏡像,測試如下

# 遠程倉庫的鏡像,詳細如下

4. 客戶端,登陸MYSQL,如下:

連接信息,IP為Docker容器的宿主VM的IP,端口為VM的映射端口。比如 192.168.XXX.YYY:3306

 

 

==================

Update:

最后,將上面制作的docker鏡像,部署到K8S環境中,方法如下:

# 注意:PV/PVC,需要提前創建好

 1 kubectl apply -f - << EOF
 2 apiVersion: extensions/v1beta1
 3 kind: Deployment
 4 metadata:
 5   name: mysql-single
 6   namespace: database-system
 7 spec:
 8   selector:
 9     matchLabels:
10       app: mysql-single
11   replicas: 1
12   template:
13     metadata:
14       labels:
15         app: mysql-single
16     spec:
17       containers:
18       - name: mysql-single
19         image: registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0.0
20         volumeMounts:
21         - mountPath: /opt/soft # docker inner path
22           name: soft-storage
23         - mountPath: /opt/log # docker inner path
24           subPath: database-system
25           name: log-storage
26         - mountPath: /opt/app # docker inner path
27           subPath: database-system
28           name: app-storage
29         - mountPath: /opt/data # docker inner path
30           subPath: database-system
31           name: data-storage
32         env:
33         - name: DOCKER_DATA_ROOT
34           value: "/opt/data/mysql-single"
35         - name: DOCKER_APP_ROOT
36           value: "/opt/app/mysql-single"
37         - name: DOCKER_LOG_ROOT
38           value: "/opt/log/mysql-single"
39         - name: DOCKER_CODE_ROOT
40           value: "/opt/soft"
41       volumes:
42       - name: soft-storage
43         persistentVolumeClaim:
44           claimName: pvc2soft.database-system
45       - name: log-storage
46         persistentVolumeClaim:
47           claimName: pvc2log.database-system
48       - name: app-storage
49         persistentVolumeClaim:
50           claimName: pvc2app.database-system
51       - name: data-storage
52         persistentVolumeClaim:
53           claimName: pvc2data.database-system
54 ---
55 apiVersion: v1
56 kind: Service
57 metadata:
58   name: mysql-single
59   namespace: database-system
60 spec:
61   type: LoadBalancer
62   ports:
63    - name: "mysql-console"
64      port: 13306
65      targetPort: 13306
66      protocol: TCP
67    - name: "mysql-manager"
68      port: 33060
69      targetPort: 33060
70      protocol: TCP
71   selector:
72     app: mysql-single

# 顯示部署結果,如下:

 1 [root@CNT7XDCK11D01 ~]# kubectl get all -n database-system -o wide
 2 NAME                               READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
 3 pod/mysql-single-697dfccfd-5hdw2   1/1     Running   0          77m   172.16.216.3   192.168.3.97   <none>           <none>
 4 
 5 NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                           AGE   SELECTOR
 6 service/mysql-single   LoadBalancer   10.3.184.205   10.5.0.16     13306:41252/TCP,33060:47401/TCP   77m   app=mysql-single
 7 
 8 NAME                           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS     IMAGES                                                                                   SELECTOR
 9 deployment.apps/mysql-single   1/1     1            1           77m   mysql-single   registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0.0   app=mysql-single
10 
11 NAME                                     DESIRED   CURRENT   READY   AGE   CONTAINERS     IMAGES                                                                                   SELECTOR
12 replicaset.apps/mysql-single-697dfccfd   1         1         1       77m   mysql-single   registry.cn-hangzhou.aliyuncs.com/kevin_docker_registry/docker_base_mysql-single:1.0.0   app=mysql-single,pod-template-hash=697dfccfd

# 最后,在客戶端設置Mysql Nactive工具的連接信息,如下

成功登陸mysql,截圖如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM