Docker的安裝及鏡像、容器的基本操作詳見博客http://blog.51cto.com/11134648/2160257
下面介紹Docker創建鏡像和創建私有倉庫的方法,詳細如下:
創建鏡像
創建鏡像的方法有三種,分別是基於已有鏡像創建、基於本地鏡像模板創建以及基於Dockfile創建。下面介紹這三種鏡像的方法
1.基於已有鏡像創建
實質就是把一個容器裏面運行的程序以及該程序的運行環境打包起來生成新的鏡像。
命令格式:docker commit [選項] 容器ID/名稱 倉庫名稱:標籤
(1)首先需要查看啓動已有鏡像的容器的ID號
docker ps -a
(2)之後使用docker commit命令創建一個新鏡像
命令格式:docker commit [選項] 容器ID/名稱 倉庫名稱:標籤
常用選項: -m 說明信息
-a 作者信息
-p 生成過程中停止容器的運行
(3)創建完成後會返回新創建鏡像的ID號
docker images | grep daoke
2.基於本地模板創建
通過導入操作系統模板文件可以生成鏡像,模板文件可以從OPENVZ開源項目下載,下載地址爲http://download.openvz.org/template/precreated。
(1)下載模板文件
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
(2)使用docker導入命令導入爲本地鏡像
cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
(3)導入完成後會返回生成鏡像的ID信息
docker images | grep new
3.基於Dockerfile創建
Dockfile是由一組指令組成的文件,其中每條指令對應Linux中的一條命令,Docker程序將讀取Dockfile中的指令生成指定鏡像。
- Dockfile結構大致分爲四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動時執行指令。
- Dockfile每行支持一條指令,每條指令可攜帶多個參數,支持使用”#“號開頭的註釋。
Dockerfile有十幾條命令可用於構建鏡像,其中常見的指令如下:
指令 | 含義 |
---|---|
FROM 鏡像 | 指定所創建鏡像的基礎鏡像 |
MAINTAINER 名字 | 指定維護者信息 |
RUN 命令 | 在所基於鏡像上執行命令 |
CMD ["要運行的程序",“參數1”,“參數2”] | 指定啓動容器時默認執行的命令 |
LABEL | 指定生成鏡像的元數據標籤信息 |
EXPOSE 端口號 | 指定新鏡像加載到Docker時要開啓的端口 |
ENV 環境變量 變量值 | 設置一個環境變量的值,會被後面的RUN使用 |
ADD < src > <dest> | 賦值指定的< src > 路徑下的內容到容器中的<dest>路徑下,<src>可以爲URL;,<src>要與Dockerfile位於相同目錄;如果爲tar文件,會自動解壓到<dest>路徑下 |
COPY < src > <dest> | 複製本地主機的<src>路徑下的內容到鏡像中的<dest>路徑下;一般情況下推薦使用COPY,而不是ADD |
ENTRYPOINT | 指定鏡像的默認入口 |
VOLUME ["目錄"] | 在容器中創建數據卷掛載點 |
USER 用戶名/UID | 指定運行容器時的用戶名或UID |
WORKDIR 路徑 | 爲後續的RUN、CMD、ENTRYPOINT指定工作目錄 |
ARG | 指定鏡像內使用的參數(例如版本號信息等) |
ONBUILD 命令 | 配置當前所創建的鏡像作爲其他鏡像的基礎鏡像時,所執行的創建操作指令 |
STOPSIGNAL | 容器退出的信號值 |
HEALTHCHECK | 如何進行健康檢查 |
SHELL | 指定使用shell時默認shell類型 |
例如基於Dockerfile創建httpd鏡像,步驟如下:
(1)建立目錄,作爲生成鏡像的工作目錄
mkdir apache
cd apache
(2)創建並編寫Dockerfile文件
vim Dockerfile
#基於的基礎鏡像
FROM centos
#維護鏡像的用戶信息
MAINTAINER The porject <[email protected]>
#鏡像操作指令安裝apache軟件
RUN yum -y update
RUN yum -y install httpd
#開啓 80 端口
EXPOSE 80
#複製網站首頁文件
ADD index.html /var/www/html/index.html
#將執行腳本複製到鏡像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#啓動容器時執行腳本
CMD ["/run.sh"]
(3)編寫執行腳本內容
vim run.sh
#!/bin/bash
rm -rf /run/httpd/* #清理httpd緩存
exec /usr/sbin/apachectl -D FOREGROUND #啓動apache服務
(4)創建測試頁面
echo "web test" > index.html
需要注意的是Dockerfile文件、需要運行的腳本文件以及要複製到容器中的文件都必須在工作目錄下同一級。
(5)使用Dockfile生成鏡像
命令格式:docker build [選項] 路徑
常用選項: -t 指定鏡像的標籤信息
docker build -t httpd:centos . #注意別忘了末尾有"."
(6)使用新的鏡像運行容器
docker run -d -p 1216:80 httpd:centos #其中-p選項實現從本地端口1216到容器中的80端口的映射
可以看到該鏡像已在容器中加載運行
本機的ip地址是192.168.100.138,訪問容器中的Apache服務。
firefox http://192.168.100.138:1216
創建私有倉庫
使用registry鏡像來搭建本地私有倉庫。
1.下載registry鏡像
docker pull registry
2.在/etc/docker/目錄下創建一個json文件,定義私有倉庫地址
vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.100.138:5000"]}
3.重啓docker服務
systemctl start daemon-reload
systemctl restart docker.service
4.使用下載好的registry鏡像啓動一個容器
- 默認情況下倉庫存放於容器內的/tmp/registry目錄下。
- -v選項可以將本地目錄掛載到容器內的/tmp/registry下使用,這樣就不會容器被刪除後鏡像也會隨之消失。
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
5.將上傳的鏡像標記
docker tag httpd:centos 192.168.100.138:5000/httpd
6.上傳做標記的鏡像
docker push 192.168.100.138:5000/httpd
7.獲取私有倉庫列表
curl -XGET http://192.168.100.138:5000/v2/_catalog
curl -XGET http://192.168.100.138:5000/v2/httpd/tags/list
8.刪除做標記的鏡像
docker rmi 192.168.100.138:5000/httpd
docker images
9.從私有倉庫下載標記的鏡像
docker pull 192.168.100.138:5000/httpd
可以看出下載速度明顯很快