Docker及三劍客(Compose、Machine、Swarm)

weixin_34007291發表於2017-12-01

最近在做持續整合交付部署的事,想系統的學一下Docker。看到這個系列教程,將自己認為重要的知識點摘抄下來,推薦大家看看原著無蹤無影

1.如果在Docker裡下載基礎linux系統映象,底層用的是Host的核心空間kernel,Docker只需要提供rootfs。

理解:
Linux的作業系統是由核心空間kernel和使用者空間組成的;
核心空間:kernel,linux啟動的時候會載入bootfs檔案系統,之後bootfs會被解除安裝掉;
使用者空間的檔案系統是rootfs,包括/dev/,/proc,/bin等目錄(PS
:不同的linux發行版的主要區別是rootfs不同);
基礎linux系統映象只是在使用者空間與發行版一致,核心空間kernel不一定一致,容器的核心版本與底層Host保持一致,容器只能使用Host的核心版本,不能修改

2.docker commit將當前容器儲存為映象

例如:

docker run -it centos      //以互動的方式執行一個映象,並進入容器
yum install -y vim         //在這個容器中安裝vim程式
docker commit 容器名 centos-vi         //另外一個終端連線host後,執行該命令,將該容器儲存為centos-vi這個映象名

3.利用Dockerfile構建一個映象

vi ./Dockerfile      //編輯一個dockerfile檔案
FROM centos          //寫入"FROM centos "內容,表示引用centos這個基礎映象
RUN yum install -y vim    //寫入"RUN yum install -y vim",表示在新構建的映象中新增vim程式
//儲存並退出後
docker build -t centos-vim-dockerfile .    //在當前目錄下(Dockerfile存在當前目錄,也可以用[-f 檔案路徑/Dockfile]來指定dockerfile位置)構建一個名為centos-vim-dockerfile的新映象

注意:docker會將dockerfile所在的目錄下的所有檔案傳送給docker伺服器,所以使用build context就要謹慎了,最好不要將多餘的檔案放到build context,尤其是不要把 / 或者 /usr 作為build context ,否則建立映象的過程會非常緩慢或者建立失敗。

利用docker進行映象構建時,如若系統內已經存在某些共同的基礎映象,則新構建映象將會用這些快取的基礎映象

4.Dockerfile命令解析

FROM:指定base映象
MAINTAINER:設定映象作者,可以是任意字元
COPY:將檔案從build context複製到映象。支援兩種形式:1.COPY src dest 2.COPY [“src”,“dest”]
注意:src只能指定build context中的檔案或目錄(即Dockerfile檔案所在目錄中的檔案或目錄)
ADD:與COPY類似,從build context複製檔案到映象。不同的是,如果src是歸檔檔案(tar,zip,tgz,xz等),檔案會自動解壓到dest
EXPOSE:制定容器中的程式會監聽某個埠,Docker可以將該埠暴露出來
RUN: 在容器中執行相應的指令
CMD:容器啟動時執行的相應的命令,dockerfile中可以有多個cmd指令,但只有最後一個生效。CMD可以被docker run 之後的引數代替
ENTRYPOINT:設定容器啟動的時候執行的命令。Dockerfile中可以有多個ENTRYPOINT指令,但只有最後一個生效,CMD或docker run之後的引數都會被當作引數傳遞給ENTRYPOINT
舉個微服務例子:

FROM java:8-jre                         //基礎映象為java8
MAINTAINER daihl <060531108@163.com>    //作者資訊
ADD ./target/gateway.jar /app/          //將mvn編譯後的jar檔案,複製到映象/app目錄資料夾下
CMD ["java", "-Xmx200m", "-jar", "/app/gateway.jar"]    //容器啟動時執行 java -Xmx200m -jar /app/gateway.jar
EXPOSE 4000                             //容器監聽4000埠,可將該埠暴露出去
FROM mongo:3                            //基礎映象為mongo3
MAINTAINER daihl <060531108@163.com>    //作者資訊
ADD init.sh /init.sh                    //將當前build context目錄下的init.sh檔案複製到映象/中
ADD ./dump /                            //將當前build context目錄下的dump資料夾複製到映象/中
RUN \
 chmod +x /init.sh && \
 apt-get update && apt-get dist-upgrade -y && \
 apt-get install psmisc -y -q && \
 apt-get autoremove -y && apt-get clean && \
 rm -rf /var/cache/* && rm -rf /var/lib/apt/lists/*    //在容器中執行相應的指令
ENTRYPOINT ["/init.sh"]                 //設定容器啟動的時候執行的命令

1.使用RUN 指令安裝應用和軟體包,構建映象
2.使用ENTRYPOINT執行應用程式或服務,比如執行一個MySQL,應該優先使用EXEC格式的ENTRYPOINT指令
3.CMD可為ENTRYPOINT提供額外的預設引數,同時可以利用docker run後面的引數進行更改。

5.Docker儲存

docker 有兩種儲存方式:storage driver和data volume
stroage driver這種儲存方式主要是儲存那些無狀態的資料,是映象層和容器層組成的,而data volume是目錄或者檔案
平時執行容器的時候既有無狀態的容器也有有狀態的容器,我們的資料層(映象層和容器層)和volume都可以儲存資料,使用的時候該怎麼選擇呢?
需要考慮以下幾個場景:
1.Database軟體VS Database資料
2.Web應用VS應用產生的日誌
3.資料分析軟體VS input/output資料
4.Apache Server VS靜態Html 檔案
很顯然這幾個場景:前部分都是無狀態的,可以放在資料層(映象層和容器層),應該作為映象的一部分
而後面的都是資料需要儲存的,應該放在data volume,並且與映象分開存放

相關文章