如何安裝容器引擎?
容器引擎幾乎支持在所有操作系統上安裝,用戶可以根據需要選擇要安裝的容器引擎版本。
說明
容器鏡像服務支持使用容器引擎1.11.2 及以上版本上傳鏡像。
安裝容器引擎需要連接互聯網,內網服務器需要綁定彈性IP后才能訪問。
另外,在Linux 操作系統下,可以使用如下命令快速安裝容器引擎。
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
如何制作容器鏡像?
自行制作容器鏡像,主要有兩種方法:
- 制作快照方式獲得鏡像(偶爾制作的鏡像):在基礎鏡像上(比如Ubuntu),先登錄鏡像系統并安裝容器引擎軟件,然后整體制作快照。
- Dockerfile方式構建鏡像(經常更新的鏡像):將軟件安裝的流程寫成Dockerfile,使用docker build構建成容器鏡像。
方法一:制作快照方式獲得鏡像
如果后續鏡像沒有變化,可采用方法一制作鏡像。


具體操作如下:
- 找一臺主機,安裝容器引擎軟件。
- 啟動一個空白的基礎容器,并進入容器。
例如:啟動一個CentOS的容器。
docker run -it centos
- 執行安裝任務。
yum install XXX
git clone //github.com/lh3/bwa.git
cd bwa;make
說明請預先安裝好Git,并檢查本機是否有ssh key設置。
- 輸入exit退出容器。
- 制作快照。
docker commit -m "xx" -a "test" container-id test/image:tag
-a:提交的鏡像作者。
container-id:步驟2中的容器id。可以使用docker ps -a查詢得到容器id。
-m:提交時的說明文字。
test/image:tag:倉庫名/鏡像名:TAG名。
- 執行docker images可以查看到制作完成的容器鏡像。
方法二:使用Dockerfile方式構建
如果后續鏡像經常變更(例如某個軟件更新版本),則需要采用方法二制作鏡像。若仍采用方法一制作鏡像,則每次變更都需要重新執行方法一的命令,操作過程比較繁瑣,所以建議使用自動化制作鏡像的方法。
其實就是將方法一制作鏡像的方法,用文件方式寫出來(文件名為Dockerfile)。然后執行: docker build -t test/image:tag. 命令(命令中“.”表示Dockerfile文件的路徑),自動完成鏡像制作。


簡單的Dockerfile示例:
說明如果依賴外部網絡,請搭建網絡環境,并保證網絡可用。
#Version 1.0.1
FROM centos:latest
#設置root用戶為后續命令的執行者
USER root
#執行操作
RUN yum update -y
RUN yum install -y java
#使用&&拼接命令
RUN touch test.txt && echo "abc" >>abc.txt
#對外暴露端口
EXPOSE 80 8080 1038
#添加網絡文件
ADD //www.baidu.com/img/bd_logo1.png /opt/
#設置環境變量
ENV WEBAPP_PORT=9090
#設置工作目錄
WORKDIR /opt/
#設置啟動命令
ENTRYPOINT ["ls"]
#設置啟動參數
CMD ["-a", "-l"]
#設置卷
VOLUME ["/data", "/var/www"]
#設置子鏡像的觸發操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt
Dockerfile基本語法
- FROM:
指定待擴展的父級鏡像(基礎鏡像)。除注釋之外,文件開頭必須是一個FROM指令,后面的指令便在這個父級鏡像的環境中運行,直到遇到下一個FROM指令。通過添加多個FROM命令,可以在同一個Dockerfile文件中創建多個鏡像。
- MAINTAINER:
聲明創建鏡像的作者信息:用戶名、郵箱,非必須參數。
- RUN:
修改鏡像的命令,常用來安裝庫、安裝程序以及配置程序。一條RUN指令執行完畢后,會在當前鏡像上創建一個新的鏡像層,接下來的指令會在新的鏡像上繼續執行。RUN 語句有兩種形式:
RUN yum update :在**/bin/sh**路徑中執行的指令。
RUN ["yum", "update"] :直接使用系統調用exec來執行。
RUN yum update && yum install nginx :使用&&符號將多條命令連接在同一條RUN語句中。
- EXPOSE:
指明容器內進程對外開放的端口,多個端口之間使用空格隔開。
運行容器時,通過設置參數 -P (大寫)即可將EXPOSE里所指定的端口映射到主機上其他的隨機端口,其他容器或主機可以通過映射后的端口與此容器通信。
您也可以通過設置參數 -p (小寫)將Dockerfile中EXPOSE中沒有列出的端口設置成公開。
- ADD:
向新鏡像中添加文件,這個文件可以是一個主機文件,也可以是一個網絡文件,也可以是一個文件夾。
第一個參數:源文件(夾)。
如果是相對路徑,必須是相對于Dockerfile所在目錄的相對路徑。
如果是URL,會將文件先下載下來,然后再添加到鏡像里。
第二個參數:目標路徑。
如果源文件是主機上的zip或者tar形式的壓縮文件,容器引擎會先解壓縮,然后將文件添加到鏡像的指定位置。
n 如果源文件是一個通過URL指定的網絡壓縮文件,則不會解壓。
- VOLUME:
在鏡像里創建一個指定路徑(文件或文件夾)的掛載點,這個容器可以來自主機或者其它容器。多個容器可以通過同一個掛載點共享數據,即便其中一個容器已經停止,掛載點也仍可以訪問。
- WORKDIR:
為接下來執行的指令指定一個新的工作目錄,這個目錄可以是絕對目錄,也可以是相對目錄。根據需要,WORKDIR可以被多次指定。當啟動一個容器時,最后一條WORKDIR指令所指的目錄將作為容器運行的當前工作目錄。
- ENV:
設置容器運行的環境變量。在運行容器的時候,通過設置**-e**參數可以修改這個環境變量值,也可以添加新的環境變量。
例如:
docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ...
- CMD:
用來設置啟動容器時默認運行的命令。
- ENTRYPOINT:
用來指定容器啟動時的默認運行的命令。區別在于:運行容器時添加在鏡像之后的參數,對ENTRYPOINT是拼接,CMD是覆蓋。
若在Dockerfile中指定了容器啟動時的默認運行命令為 ls -l ,則運行容器時默認啟動命令為 ls -l ,例如:
ENTRYPOINT [ "ls", "-l"] :指定容器啟動時的程序及參數為 ls -l 。
docker run centos :當運行centos容器時,默認執行的命令是docker run centos ls -l
docker run centos -a :當運行centos容器時拼接了-a參數,則默認運行的命令是docker run centos ls -l -a
若在Dockerfile中指定了容器啟動時的默認運行命令為 --entrypoint ,則在運行容器時如果需要替換默認運行命令,可以通過添加**--entrypoint**參數來替換Dockerfile中的指定。例如:
docker run gutianlangyu/test --entrypoint echo "hello world"
- USER:
為容器的運行及RUN、CMD、ENTRYPOINT等指令的運行指定用戶或UID。
- ONBUILD:
觸發器指令。構建鏡像時,容器引擎的鏡像構建器會將所有的ONBUILD指令指定的命令保存到鏡像的元數據中,這些命令在當前鏡像的構建過程中并不會執行。只有新的鏡像使用FROM指令指定父鏡像為當前鏡像時,才會觸發執行。
使用FROM以這個Dockerfile構建出的鏡像為父鏡像,構建子鏡像時:
ONBUILD ADD . /app/src :自動執行ADD . /app/src
如何制作鏡像壓縮包?
使用docker save命令可將容器鏡像制作成tar或tar.gz文件壓縮包,具體命令格式如下:
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS說明:--output、-o,表示導出到文件。
示例:
$ docker save nginx:latest > nginx.tar
$ ls -sh nginx.tar
108M nginx.tar
$ docker save php:5-apache > php.tar.gz
$ ls -sh php.tar.gz
372M php.tar.gz
$ docker save --output nginx.tar nginx
$ ls -sh nginx.tar
108M nginx.tar
$ docker save -o nginx-all.tar nginx
$ docker save -o nginx-latest.tar nginx:latest
docker push使用什么協議將鏡像推動到SWR?
HTTPS協議。
同名稱同tag的鏡像上傳后會覆蓋之前的鏡像嗎?
會覆蓋,保留最新上傳的鏡像。
SWR單個layer的最大限制是多少?
使用客戶端向SWR上傳鏡像,鏡像的每個layer大小不能超過10G。
為什么通過客戶端上傳和頁面上傳的鏡像大小不一樣?
問題描述
假設在本地Docker客戶端上制作了一個nginx鏡像,版本號為v2.0.0,使用docker images命令查詢SIZE為 22.8MB :
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2.0.0 22f2bf2e2b4f 9 days ago 22.8MB
- 通過客戶端(即執行docker push命令)上傳該鏡像至SWR鏡像倉庫,查詢大小為 9.5MB 。


- 在本地Docker客戶端將鏡像打包為tar格式,將nginx.tar下載至本地后,通過頁面方式上傳至SWR鏡像倉庫,查詢大小為 23.2MB 。


可以發現,通過客戶端和頁面上傳的鏡像大小不一樣。
原因分析
使用客戶端上傳的鏡像每一層layer都進行了tgz壓縮,而頁面上傳的鏡像包是經過docker打包的,每一層layer只進行了打包,沒有壓縮。所以兩種方式上傳的鏡像大小顯示會不一致。
是否支持跨區域同步鏡像?
目前不支持跨區域同步鏡像。
如果您想把最新推送的鏡像同步到其他區域鏡像倉庫內,您可以先將鏡像下載到本地,然后上傳到需要同步區域的鏡像倉庫中。
SWR支持ARM鏡像上傳嗎?
SWR鏡像倉庫對鏡像的內核架構是沒有任何限制的,您上傳ARM架構的鏡像和上傳x86的鏡像是沒有區別的,直接上傳即可。
如何通過API上傳鏡像到SWR?
SWR暫時沒有開放鏡像上傳的API,您可以使用docker push或頁面方式上傳鏡像。
如何通過API下載鏡像?
SWR暫不支持通過API下載鏡像。如果要下載鏡像,請通過docker pull命令來進行下載操作。
docker pull下載的鏡像存放在什么地方?
docker pull將鏡像下載到本地節點上,您可以通過docker save命令將鏡像保存成tar歸檔文件。
是否支持跨區域下載鏡像?
支持。
SWR當前支持跨區域公網下載,請確保下載機可訪問公網且獲取正確的倉庫登錄指令。例如:您想下載“廣州4”區域的鏡像,則需要獲取“廣州4”區域的鏡像倉庫登錄指令。
控制臺頁面的鏡像可以下載到本地嗎?
控制臺頁面的鏡像不能直接下載至本地,您可以參考以下方法操作:
- 在鏡像詳情頁獲取鏡像的下載指令。
- 在安裝了Docker客戶端的機器上執行上一步的指令下載鏡像。
示例:
docker pull registry.cn-jssz 1 .ctyun .cn ** /group/nginx:v1**
- 將鏡像保存為.tar或.tar.gz格式的文件。
示例:
docker save nginx:v1 > nginx.tar
下載文件至本地。