目錄
- 引入
- 了解Docker的資源隔離和主機模式
- 創建 centos7 容器
- 部署mysql5.7
- 創建Docker Hub倉庫
- 生成鏡像
- 提交鏡像
引入
在部署畢節服務器時遇到了個問題:
因為在三臺服務器做好ovirt-engine
超融合后,在主節點服務器上部署可視化平臺需要安裝mysql5.7
,但是安裝mysql
時需要卸載一些依賴,但是由于怕影響原有的postgresql
數據庫和ovirt-engine
的服務組件,選擇了用docker
容器部署mysql
數據庫。
在順利創建好容器,配置好mysql
遠程連接后,發現用navicat
死活連不上,部署mysql8
也連不上,能改的配置文件都改了,路由也開放了,端口也開放了,就是不得行。非常懷疑是ovirt-engine
超融合的一些設置影響了docker
容器和宿主機的網絡溝通。
后面沒辦法就創建了臺虛擬機作為mysql
服務器。
隔了一天偶然翻博客發現docker
容器有個主機模式
,這玩應好像直接用的宿主機的網絡和端口。于是嘗試著在自己公司部署了一下,還真行。然后就想著直接部署好創建一個自己的鏡像,以后方便點。于是就有了這篇部署記錄。
了解Docker的資源隔離和主機模式
此模式下 dockers
容器與宿主機在同一個網絡中,但沒有獨立IP地址。
docker
使用了Linux
的Namespaces
技術來進行資源隔離,如:
PID Namespace
隔離進程Mount Namespace
隔離文件系統Network Namespace
隔離網絡等
一個Docker
容器一般會分配一個獨立的Network Namespace
。但如果啟動容器的時候使用host
模式,那么這個容器將不會獲得一個獨立的Network Namespace
,而是和宿主機共用一個Network Namespace
。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。
創建 centos7 容器
創建mysql
數據目錄
mkdir -p /usr/mysql/data
創建容器
docker run -dit --name mysql5.7 --privileged=true --network=host \ -v /usr/mysql/data:/var/lib/mysql \ centos:centos7 /usr/sbin/init
因為用了主機模式--network=host
,所以就不用映射端口了。
進入容器
docker exec -it mysql5.7 /bin/bash
安裝必要的工具
yum install -y wget
部署mysql5.7
傳送門
創建Docker Hub倉庫
https://hub.docker.com/
注冊登錄創建自己的倉庫,可以是公共也可以是私有
注意自己的倉庫命名,最好是見名知義,因為倉庫名就是后面鏡像的名稱
在服務器上登錄你的 docker
docker login
生成鏡像
創建自己的鏡像
docker commit -m "centos7 with mysql5.7" -a "echoo" a3dee73dbafa cent7sql:5.7
-m
描述信息
-a
作者信息 a3dee73dbafa
容器id
cent7sql:5.7
鏡像名:版本標簽
注意:當你登錄了自己的 docker
后,查看鏡像你會發現鏡像名多了點東西 如docker.io/centos
,這里的docker.io
就是Docker Hub
的公共用戶名,centos
則是鏡像倉庫的名字。 此時我這個鏡像名是不符合規則的,如果直接推送會報錯,必須按照用戶名/倉庫名:版本標簽 這樣的規則命名,這就是為啥上面創建倉庫的時候說最好要見名知義。
更改鏡像名字(重新打一個標簽)
docker tag cent7sql:5.7 echoo2787/centos7:sql5.7
這樣的命名就可以啦
提交鏡像
docker push echoo2787/centos7:sql5.7
這個命令在創建倉庫完成后那個頁面右邊可以找到
等待推送完成就好,如果報拒絕錯誤,檢查是不是鏡像命名和要求不一致。