Docker入門之構建鏡像、私有倉庫registry、數據卷、端口映射
一、構建自定義鏡像的方式
1.Dockerfile(基於源鏡像修改配置,用Dockerfile生成自己需要的鏡像),用於新的業務
2.基於已有的鏡像容器進行創建,常用在業務升級上面。
3.基於本地模塊進行構建(不常用)
1.1、Dockerfile 文件
1.1.1、鏡像的分層
Dockerfile中的每個指令都會創建一個新的鏡像層。
鏡像層將被緩存和複用。
當Dockerfile的指令修改了,複製的文件變化了,或者構建鏡像時指定的變量不同 了,對應的鏡像層緩存就 會失效。
某一層的鏡像緩存失效之後,它之後的鏡像層緩存都會失效。
鏡像層是不可變的,如果在某一層中添加一個文件,然後在下一層中刪除它,則鏡 像中依然會包含該文件
所以在Dockerfile創建鏡像過程中會產生臨時容器緩存數據,但是創建完成後臨時 容器都會被刪除。
1.1.2、文件的結構
Dockerfile文件是由一組指令組成的,文件結構有四部分:
基礎鏡像信息
維護者信息
鏡像操作指令
容器啓動時執行指令
操作命令的詳解:
1.1.3、創建步驟
1.在虛擬機新建目錄,編寫Dockerfile文件(下面對文件格式舉例介紹,可以參考)
// 我是在opt下面創建的目錄,進目錄裏在編寫Dockerfile
mkdir apache
cd papche
// 注意:這裏的文件名一定要是Dockerfile,不可以自定義
vim Dockerfile
//基於基礎鏡像
FROM centos:7
// 維護鏡像的用戶信息
MAINTAINER this is apache
// 鏡像操作指令安裝apache軟件
RUN yum -y update
RUN yum -y install httpd
// 開啓80端口
EXPOSE 80
// 複製網站首頁文件
ADD index.html /var/www/html/index.html // 稍後編寫index.html文件放在同一目錄下
// 將執行腳本複製到鏡像中
ADD run.sh /run.sh // 啓動腳本放在同一目錄下
RUN chmod 775 /run.sh
// 啓動容器時執行腳本
CMD ["/run.sh"]
2.在Dockerfile文件裏使用不了 systemctl、service 等命令啓動服務,可以編寫一個run.sh腳本
vim run.sh #啓動腳本
#!/bin/bash
rm -rf /run/httpd/* #清理httpd的緩存
exec /usr/sbin/apachectl -D FOREGROUND #啓動apache進程
3.複製網站首頁文件
echo "this is web" > index.html
4.生成新鏡像
docker build -t httpd:centos . (注意別忘了末尾一定要有 空格".")
5.鏡像生成好後運行容器
格式:docker run -d --name 名字 -p 端口:源端口 倉庫名稱:[標籤]
docker run -d --name wl -p 1216:80 httpd:centos
6.測試:用瀏覽器訪問 虛擬機IP地址:1216(我的IP是192.168.66.138)
1.2、基於已有鏡像容器進行創建
將容器裏面運行的程序及環境打包成新的鏡像
docker commit [選項] 容器ID/名稱 倉庫名稱:[標籤]
選項: -m:說明信息
-a:作者信息
//創建容器
docker run -it centos:7 /bin/bash
docker commit -m "new" -a "daoke" 容器ID daoke:centos
二、私有倉庫registry建立(簡易版)
1、下載倉庫鏡像
docker pull registry
2、在客戶終端中設置,指定私有倉庫位置
vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.66.138:5000"], #添加虛擬機的IP地址和端口
. . .
}
systemctl restart docker
3、生成registry容器,開放5000端口
//宿主機的/data/registry自動創建掛載容器中的/tmp/registry
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
在這裏-v 指定外部存儲時會自動創建此目錄。
#因爲docker重啓,容器關閉,需要重啓
docker ps -a #查看倉庫ID號
docker start 倉庫ID
4、鏡像打標籤docker tag 原鏡像名 倉庫IP:端口/鏡像名
docker pull nginx
docker tag nginx:latest 192.168.66.138:5000/nginx (必須修改)
格式:docker tag nginx:latest 私有倉庫節點:端口/鏡像名稱
5、上傳鏡像
格式:docker push 倉庫IP:端口/鏡像名
docker push 192.168.66.138:5000/nginx
驗證:
//獲取私有倉庫列表
[root@localhost ~]# curl -XGET http://192.168.66.138:5000/v2/_catalog
{"repositories":["nginx"]} #顯示上傳成功
//刪除原有的,測試私有倉庫是否下載OK
docker pull 192.168.66.138:5000/nginx
三、Docker 數據卷和數據卷容器
數據卷:掛載宿主系統的存儲空間
數據卷容器:掛載容器的存儲空間
Docker 數據卷創建
# Docker 數據卷創建
docker pull centos
#宿主機目錄/var/www 掛載容器中的/data1
格式:docker run -it --name 名字 -v 宿主機目錄:容器內目錄 倉庫名稱 /bin/bash
docker run -v /var/www:/data1 --name web2 -it centos /bin/bash
命令執行後自動進入容器裏了
[root@202dd484fd62 /]# ls #可以看見/data1目錄
[root@202dd484fd62 /]# cd /data1
[root@202dd484fd62 data1]# touch test123
另開一個終端窗口查看是否有/var/www/test123文件。
數據卷容器創建
1、現在容器裏創建一個目錄
docker run --name web3 -v /data1 -v /data2 -it centos /bin/bash
2、另開一個終端,新容器掛載數據卷容器web3
docker run -it --volumes-from web3 --name db1 centos /bin/bash
四、端口映射
-p:隨機生成端口映射
-P(大寫):指定端口映射
docker run -d -P httpd:latest
docker run -d -p 1234:80 httpd:latest
五、容器互聯(centos鏡像)
1、創建並運行容器取名web1,端口號自動映射
docker run -itd -P --name web1 centos /bin/bash
2、創建並運行容器取名web2,鏈接到web1和其通信
docker run -itd -P --name web2 --link web1:web1 centos /bin/bash
3、進入web2容器
docker exec -it ID號 /bin/bash
ping web1 #可以互相通信