docker-基礎(chǔ)命令和使用案例

Docker基礎(chǔ)命令

## 即從注冊(cè)服務(wù)器 registry.hub.docker.com 中的 alpine 倉(cāng)庫(kù)來(lái)下載標(biāo)記為 3.7 的鏡像
docker pull registry.hub.docker.com/alpine:3.7

## 存出鏡像
docker save -o alpine-3.7.tar alpine:3.7

## 載入鏡像
docker load --input alpine-3.7.tar
docker load < alpine-3.7.tar

## 導(dǎo)出容器
docker ps -a
#-- CONTAINER ID  IMAGE       COMMAND      CREATED     STATUS                   PORTS        NAMES
#-- 7691a814370e  alpine:3.7  "/bin/sh"  36 hours ago  Exited (0) 21 hours ago               test
docker export 7691a814370e > alpine-3.7.tar

## 導(dǎo)入容器快照
cat alpine-3.7.tar | docker import - test/alpine:v1.0
docker import http://example.com/exampleimage.tgz example/imagerepo

# 注:用戶既可以使用 docker load 來(lái)導(dǎo)入鏡像存儲(chǔ)文件到本地鏡像庫(kù)照卦,也可以使用 docker import
#     來(lái)導(dǎo)入一個(gè)容器快照到本地鏡像庫(kù)忍啤。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息
#     (即僅保存容器當(dāng)時(shí)的快照狀態(tài))镀脂,而鏡像存儲(chǔ)文件將保存完整記錄赞季,體積也要大沈跨。此外篮奄,從容器快照文
#     件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息展氓。

## 進(jìn)入容器或執(zhí)行命令
docker exec -it $cname/$id $command

## 刪除所有容器
docker rm $(docker ps -a -q)

# 刪除所有鏡像
docker rmi (docker images | grep none | awk '{print3}' | sort -r)

# 一個(gè)容器連接到另一個(gè)容器
# sonar容器連接到mmysql容器穆趴,并將mmysql容器重命名為db。
# 這樣带饱,sonar容器就可以使用db的相關(guān)的環(huán)境變量了毡代。
docker run -i -t –name sonar -d -link mmysql:db tpires/sonar-server

# 構(gòu)建自己的鏡像
# 如Dockerfile在當(dāng)前路徑:docker build -t xx/gitlab .
docker build --no-cache=ture -t <鏡像名> <Dockerfile路徑>

# ----- 查看容器的 -----
# 容器的狀態(tài)
docker inspect -f '{{.State.Running}}' $cid
# 容器的IP 
docker inspect –format='{{.NetworkSettings.IPAddress}}' 87d22e81a3a3 

Dockerfile指令

# 選擇鏡像
FROM ubuntu:14.04

# 指定作者
MAINTAINER darebeat@126.com

# 增加標(biāo)簽(labels)來(lái)協(xié)助通過(guò)項(xiàng)目組織鏡像,記錄授權(quán)信息勺疼,幫助自動(dòng)化教寂,或者其他原因
# 一行一行設(shè)置標(biāo)簽
LABEL com.example.version="0.0.1-beta"
LABEL vendor="ACME Incorporated"
LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""

# 一行設(shè)置多個(gè)標(biāo)簽
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"

# 多行設(shè)置多個(gè)標(biāo)簽
LABEL vendor=ACME\ Incorporated \
      com.example.is-beta= \
      com.example.is-production="" \
      com.example.version="0.0.1-beta" \
      com.example.release-date="2015-02-12"


# 變量參數(shù),可以build時(shí)候傳入
## docker build --build-arg user=darebeat .
ARG user
ARG CONT_IMG_VER


# 修改環(huán)境變量將軟件安裝目錄加到PATH
ENV PATH /usr/local/nginx/bin:$PATH # 將使 CMD [“nginx”] 可以工作

# 也可用于指定通用版本號(hào),這樣版本易于維護(hù)
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}

# 運(yùn)行系統(tǒng)構(gòu)建指令
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
 && rm -rf /var/lib/apt/lists/*

# 文件操作
## 對(duì)于不需要ADD tar自動(dòng)提取功能的其他項(xiàng)目(文件执庐,目錄)酪耕,應(yīng)始終使用COPY
COPY requirements.txt /tmp/
ADD rootfs.tar.xz /
ADD arr[[]0].tar.xz /mydir/

## 避免如下用法,而用wget或curl
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all
## 應(yīng)換成如下用法
RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all


# 指示容器將監(jiān)聽鏈接的端口
EXPOSE 27017
EXPOSE 80


# 默認(rèn)用戶
## 變量可以設(shè)置默認(rèn)值
USER ${user:-root}


# 工作目錄
WORKDIR /root

# 設(shè)置鏡像主命令,允許鏡像把它作為命令運(yùn)行(然后使用CMD作為默認(rèn)標(biāo)識(shí))
ENTRYPOINT ["ls"]
CMD ["--help"]

# 與輔助腳本組合使用轨淌,允許其以類似于上述命令的方式運(yùn)行迂烁,即使啟動(dòng)工具可能需要多于一個(gè)步驟
ENTRYPOINT ["/docker-entrypoint.sh"]

# 用于運(yùn)行你鏡像包含中的軟件,連同任意參數(shù)
CMD [“executable”, “param1”, “param2”…]

編寫Dockerfile原則

  • 1.減少鏡像層:
    一次RUN指令形成新的一層递鹉,盡量Shell命令都寫在一行
  • 2.使用.dockerignore文件來(lái)排除文件和目錄盟步。該文件與 .gitignore 類似
  • 3.避免安裝不需要的包,優(yōu)化鏡像大小:
    一次RUN形成新的一層,如果沒有在同一層刪除躏结,無(wú)論文件是否最后刪除却盘,都會(huì)帶到下一層,所以要在每一層清理對(duì)應(yīng)的殘留數(shù)據(jù)媳拴,減小鏡像大小黄橘。
  • 4.每個(gè)容器只關(guān)心一個(gè)問(wèn)題
    解耦應(yīng)用為多個(gè)容器使水平擴(kuò)容和復(fù)用容器更容易
  • 5.對(duì)多行參數(shù)排序
    無(wú)論何時(shí),以排序多行參數(shù)來(lái)緩解以后的變化,避免重復(fù)的包并且使里列表更容易更新屈溉。這也使得PR更容易閱讀和審查塞关。
  • 6.減少網(wǎng)絡(luò)傳輸時(shí)間:
    最好在內(nèi)部有一個(gè)存放軟件包的地方,提高鏡像構(gòu)建速度子巾。
  • 7.多階段進(jìn)行鏡像構(gòu)建
    如果運(yùn)行一個(gè)項(xiàng)目帆赢,根據(jù)咱們上面的做法,是直接把代碼拷貝到基礎(chǔ)鏡像里线梗,如果是一個(gè)需要預(yù)先代碼編譯的項(xiàng)目呢椰于?例如JAVA語(yǔ)言,如何代碼編譯缠导、部署在一起完成呢!

1.上面做法需要事先在一個(gè)Dockerfile構(gòu)建一個(gè)基礎(chǔ)鏡像溉痢,包括項(xiàng)目運(yùn)行時(shí)環(huán)境及依賴庫(kù)僻造,再寫一個(gè)Dockerfile將項(xiàng)目拷貝到運(yùn)行環(huán)境中憋他,有點(diǎn)略顯復(fù)雜了
2.像JAVA這類語(yǔ)言如果代碼編譯是在Dockerfile里操作,還需要把源代碼構(gòu)建進(jìn)去髓削,但實(shí)際運(yùn)行時(shí)只需要構(gòu)建出的包竹挡,這種把源代碼放進(jìn)去有一定安全風(fēng)險(xiǎn),并且也增加了鏡像體積
3.為了解決上述問(wèn)題立膛,Docker 17.05開始支持多階段構(gòu)建(multi-stage builds)揪罕,可以簡(jiǎn)化Dockerfile,減少鏡像大小

  • 例如宝泵,構(gòu)建JAVA項(xiàng)目鏡像:

    # git clone https://github.com/lizhenliang/tomcat-java-demo
    # cd tomcat-java-demo
    # vi Dockerfile
    FROM maven AS build
    ADD ./pom.xml pom.xml
    ADD ./src src/
    RUN mvn clean package
    
    FROM lizhenliang/tomcat
    RUN rm -rf /usr/local/tomcat/webapps/ROOT
    COPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war
    
    # docker build -t demo:v1 .
    # docker container run -d -v demo:v1
    

首先好啰,第一個(gè)FROM 后邊多了個(gè) AS 關(guān)鍵字,可以給這個(gè)階段起個(gè)名字儿奶。
然后框往,第二部分FROM用的我們上面構(gòu)建的Tomcat鏡像,COPY關(guān)鍵字增加了--from參數(shù)闯捎,用于拷貝某個(gè)階段的文件到當(dāng)前階段椰弊。這樣一個(gè)Dockerfile就都搞定了

解決了什么問(wèn)題: 減少鏡像大小,快速部署、快速回滾瓤鼻。減少服務(wù)中斷時(shí)間秉版,同時(shí)鏡像倉(cāng)庫(kù)占用磁盤空間也少了

問(wèn)題與支持

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茬祷,隨后出現(xiàn)的幾起案子清焕,更是在濱河造成了極大的恐慌,老刑警劉巖牲迫,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耐朴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盹憎,警方通過(guò)查閱死者的電腦和手機(jī)筛峭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陪每,“玉大人影晓,你說(shuō)我怎么就攤上這事¢莺蹋” “怎么了挂签?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盼产。 經(jīng)常有香客問(wèn)我饵婆,道長(zhǎng),這世上最難降的妖魔是什么戏售? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任侨核,我火速辦了婚禮草穆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搓译。我一直安慰自己悲柱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布些己。 她就那樣靜靜地躺著豌鸡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪段标。 梳的紋絲不亂的頭發(fā)上涯冠,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音怀樟,去河邊找鬼功偿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛往堡,可吹牛的內(nèi)容都是我干的械荷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼虑灰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吨瞎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起穆咐,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颤诀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后对湃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崖叫,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年拍柒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了心傀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拆讯,死狀恐怖脂男,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情种呐,我是刑警寧澤宰翅,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站爽室,受9級(jí)特大地震影響汁讼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一嘿架、第九天 我趴在偏房一處隱蔽的房頂上張望卜录。 院中可真熱鬧,春花似錦眶明、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至柑土,卻和暖如春蜀肘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稽屏。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工扮宠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狐榔。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓坛增,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親薄腻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子收捣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容