說明
鏡像是Docker的三大組件之一,docker運行容器前需要本地存在對應鏡像,如果本地沒有鏡像,docker會從鏡像倉庫下載(默認是Docker Hub公共服務器中的倉庫)
基礎操作
-
獲取鏡像
docker pull [選項] [docker registry地址]<倉庫名>:<標簽>
- docker registry地址:一般為<域名/IP>[:端口號],默認地址為docker hub
- 倉庫名:倉庫名分為兩段,<用戶名>/<軟件名>。如果不給出用戶名,則默認為library,也就是官方鏡像
例如:
[root@localhost ~]# docker pull centos
以上命令中沒有給出docker registry地址,則默認是從docker hub中下載鏡像。而鏡像名是centos,因此會下載官方鏡像library/centos倉庫標簽為最新的(latest)鏡像
-
配置國內鏡像加速
docker pull 默認使用docker hub下載鏡像,速度非常慢,這里配置daocloud鏡像加速
- 在https://dashboard.daocloud.io/注冊
- 然后點擊加速器,有自動配置docker加速器,復制到命令行運行即可,該命令會在/etc/docker下生成一個daemon.json文件
-
運行鏡像
啟動一個臨時容器
[root@localhost ~]# docker run -it -rm centos bash
- docker run 運行一個新容器
- -it是兩個參數,-i:交互式操作,-t是給一個終端,因為這里需要進入到bash中輸入命令,所以需要一個交互式終端
- -rm,容器退出后自動刪除該容器,為了排障需求,默認退出容器不會刪除容器,需要手動docker rm。一般測試情況下添加rm參數可以節省空間
- bash,我們希望有個交互式的shell,因此使用bash
啟動一個web容器
[root@localhost ~]# docker run --name webserver -d -p 80:80 nginx
用nginx鏡像構建一個名為webserver的容器,并將容器的80端口映射到物理機的80端口
使用Dockerfile定制鏡像
docker的鏡像是以分層的形式工作的,定制鏡像就是定制每一層所添加的配置、 文件。我們可以把每一層的修改、安裝、構建、操作的命令都寫入一個腳本,用這 個腳本來構建鏡像,這個腳本就是Dockerfile
以nginx鏡像為例,定制ngixn默認首頁
[root@localhost ~]# mkdir mynginx && cd mynginx && touch Dockerfile
[root@localhost ~]# vim Dockerfile
FROM nginx
RUN echo '<h1>Hello Docker</h1>' > /usr/share/nginx/html/index.html
Dockerfile主要由FROM和RUN組成
- FROM指定基礎鏡像,是Dockerfile中必備指令,且必須放在第一個,鏡像可指定為scratch,表示不以任何鏡像為基礎
- RUN 用來指定命令的指令,RUN有兩種格式
- shell格式:RUN <命令>,就像直接在命令行中輸入一樣,上例就是該格式
- exec格式:RUN ["可執行文件","參數1","參數2"]
Dockerfile 中每一個指令都會建立一層,如果有多個RUN會建立多層,會產生非常臃腫、非常多層的鏡像,容易出錯,效率低,且docker對層有限制,Union FS限制不能超過127層。所以Dockerfile應將命令寫成一行,使用一個RUN
[root@localhost ~]# mkdir mynginx && cd mynginx && touch Dockerfile
[root@localhost ~]# vim Dockerfile
FROM centos
RUN yum install epel-release \
&& yum install nginx \
&& echo '<h1>Hello Docker</h1>' > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]
[root@localhost ~]# docker build -t nginx_v3 .
以上Dockerfile將多條命令寫到一個RUN中,減少了創建層的個數。如果Dockerfile中有編譯安裝軟件,最后要將下載的源碼包刪掉,以避免鏡像太臃腫。CMD為啟動該容器的時候自動運行的命令后續文章會仔細解釋
使用git repo構建鏡像
[root@localhost ~]# docker build https://github.com/xxxx/xxxx.git
使用tar包構建鏡像
[root@localhost ~]# docker build http://server/xxxx.tar.gz
從標準輸入構建
[root@localhost ~]# docker build - < Dockerfile
[root@localhost ~]# cat Dockerfile | docker build -
從標準輸入讀取壓縮包構建
[root@localhost ~]# docker build - < xxx.tar.gz