Docker—Dockerfile詳解及微服務制作運行容器鏡像步驟命令總結(jié)

關注WX:CodingTechWork桐筏,一起學習進步范抓。

引言

??上云骄恶、k8s部署,不可避免需要使用容器化匕垫,面對容器化僧鲁,不可避免使用Docker,對于Docker不得不提鏡像的制作。本文主要學習和總結(jié)Dockerfile聲明詳解及常用的docker命令寞秃。

Dockerfile

文件概述

??Dockerfile是一個用于自定義構(gòu)建鏡像的文本文件斟叼,其中包含了多條構(gòu)建鏡像所需要的指令、軟件依賴和說明春寿。

指令詳解

FROM

??指定基礎鏡像

格式:
    FROM <image>
    FROM <image>:<tag>
    FROM <image>@<digest>
描述:
    tag和digest可選朗涩,不指定時,則使用latest版本基礎鏡像绑改,digest表示V2版本及以上版本鏡像的內(nèi)容可尋址標識符谢床。
示例:
    FROM centos:7

MAINTAINER

??維護者信息

格式:
    MAINTAINER <name>
描述:
    name即為維護者信息,可自定義為姓名厘线、郵箱地址等
示例:
    MAINTAINER andya
    MAINTAINER andya@163.com
    MAINTAINER andya <andya@163.com>

ENV

??設置環(huán)境變量

格式:
    ENV <key> <value>
    ENV <key>=<value> ...
描述:
    1)ENV <key> <value> 中的<key>后面內(nèi)容都作為<value>的內(nèi)容识腿,所以一次只能設置一個變量
    2)ENV <key>=<value> ... 可以設置多個變量,若遇到空格等可使用\進行轉(zhuǎn)義造壮,或""進行標識
示例:
    ENV addressInfo suzhou xiancheng
    ENV addressCity=suzhou

VOLUME

??指定持久化目錄為匿名卷渡讼,防止運行時用戶將動態(tài)文件所保存目錄掛載為卷。

格式:
    VOLUME ["<dir01>", "<dir02>", ...]
    VOLUME <dir>
描述:
    指定持久化目錄耳璧,卷可以存在于一個或多個容器的指定目錄
示例:
    VOLUME ["/data/data01", "/data/data02"]
    VOLUME /data

COPY

??拷貝功能成箫,類似于ADD,但不可以自動解壓文件楞抡,且不能訪問網(wǎng)絡資源

格式:
    COPY [--chown=<user>:<group>] <src>... <dest>
    COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
描述:
    1)[--chown=<user>:<group>]為可選參數(shù)伟众,改變文件的所屬者和屬組。
    2)目標路徑不存在時召廷,會自動創(chuàng)建。
    
示例:
    COPY demo.tar demo01.tar
    COPY --chown=user01:group01 demo.tar demo02.tar

ADD

??拷貝功能账胧,類似于COPY竞慢,但會自動解壓tar等壓縮文件。

格式:
    ADD <sourceDir1>... <dest>
    ADD ["<sourceDir1>", ... "<targetDir>"]
描述:
    1)用[]治泥,可以支持包含空格的路徑筹煮。
    2)基本功能和格式同COPY。
示例:
    ADD demo.jar /app.jar
    ADD *.sh /shell
    ADD dir01 relativeDir/
    ADD dir02 /absoluteDir

RUN

??執(zhí)行命令居夹。

格式:
    # shell執(zhí)行
    RUN <command>
    # exec執(zhí)行
    RUN ["executable", "param1", "param2"]
描述:
    1)Dockerfile的指令每執(zhí)行一次都會在docker上新建一層败潦,所以盡量合并RUN。
    2)exec執(zhí)行格式是JSON數(shù)組准脂,必須使用雙引號描述劫扒。
    3)exec格式不調(diào)用命令行shell,需要使用shell格式或者路徑狸膏。如RUN [ "echo", "$HOME" ]不生效沟饥,需要使用RUN [ "sh", "-c", "echo $HOME" ]。
示例:
    RUN yum install wget \
        && tar -xvf demo.tar
        && chmod -R 777 /shell
    RUN /bin/bash -c 'source $HOME/.bashrc; \
    echo $HOME'
    RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
    RUN ["/bin/bash", "-c", "echo hello"]

EXPOSE

??指定與外界交互的端口。

格式:
    EXPOSE <port> [<port>/<protocol>...]
描述:
    1)默認TCP協(xié)議贤旷。
    2)EXPOSE不是真正的發(fā)布該端口广料,需要在docker run中使用-p進行發(fā)布,如docker run -p 80:80/tcp -p 80:80/udp幼驶。
示例:
    EXPOSE 8080
    EXPOSE 10001/tcp 10002/udp

WROKDIR

??指定工作目錄艾杏,類似于cd命令。默認不設置即為容器根目錄/

格式:
    WROKDIR <dir>
描述:
    1)設置工作目錄后盅藻,Dockerfile后的命令RUN, CMD, ENTRYPOINT, COPY和ADD等命令购桑,都在該目錄下運行。
    2)若不存在萧求,則自動創(chuàng)建其兴。
    3)在docker run時,可以通過-w或--workdir進行覆蓋夸政。
    4)在Dockerfile中可以多次使用元旬,使用相對路徑時,會基于第一個進行拼接成絕對路徑守问。
示例:
    # 此時工作目錄為根目錄/
    WROKDIR /
    # 此時工作目錄為/c
    WROKDIR c

ENTRYPOINT

??

格式:
    # exec格式
    ENTRYPOINT ["executable", "param1", "param2"]
    # shell格式
    ENTRYPOINT command param1 param2
描述:
    1)shell格式的將會拒絕任何CMD或者run命令行的參數(shù)匀归,將以/bin/sh -c開頭,只有exec格式的才可以在命令行中使用--entrypoint進行覆蓋耗帕。
    2)Dockerfile中只有最后一個ENTRYPOINT有效穆端。
    3)同RUN,exec格式中ENTRYPOINT [ "echo", "$HOME" ]無效仿便,需要指定sh -c体啰,如使用ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
示例:
    # exec格式
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    
    # shell格式
    ENTRYPOINT exec top -b

CMD

??CMD的最主要目的是為一個執(zhí)行中容器提供默認值。包括可執(zhí)行文件/程序嗽仪。

格式:
    # exec form, this is the preferred form
    CMD ["executable","param1","param2"] 
    # shell form
    CMD command param1 param2 
    # as default parameters to ENTRYPOINT
    CMD ["param1","param2"] 
描述:
    1)Dockerfile中若有多個CMD荒勇,則只有最后一個CMD有效。
    2)當CMD為ENTRYPOINT提供默認參數(shù)時闻坚,CMD和ENTRYPOINT都需要以JSON數(shù)組格式進行聲明沽翔。
    3)同ENTRYPOINT,exec格式中CMD [ "echo", "$HOME" ]無效窿凤,需要指定sh -c仅偎,如使用CMD [ "sh", "-c", "echo $HOME" ],當然雳殊,也可以直接使用shell格式:CMD echo $HOME
    4)與RUN不同橘沥,RUN是docker build構(gòu)建docker鏡像時執(zhí)行的命令,真正運行一個命令并提交運行結(jié)果相种。CMD在build時期不執(zhí)行任何東西威恼,在docker run執(zhí)行docker鏡像構(gòu)建容器時品姓,為鏡像聲明了預期的命令。ENTRYPOINT命令一定會執(zhí)行箫措,一般用于執(zhí)行腳本腹备。
示例:
    # exec格式
    CMD ["/usr/bin/wc","--help"]
    
    # shell格式
    CMD echo "This is a test." | wc -
    

LABEL

??給鏡像添加元數(shù)據(jù),LABEL是一堆key-value對斤蔓。

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
描述:
    鏡像可以有1個或多個label植酥,且可以在一行設置多個label,通過空格分隔弦牡。推薦使用一條LABEL指令指定多個label對友驮。
示例:
    LABEL "com.example.vendor"="ACME Incorporated"
    LABEL com.example.label-with-value="foo"
    LABEL version="1.0"
    LABEL description="This text illustrates \
    that label-values can span multiple lines."

USER

??設置用戶名(或UID)和可選設置用戶組(或GID),用于運行鏡像及RUN驾锰、CMD卸留、ENTRYPOINT命令。

格式:
    USER <user>[:<group>]
    USER <UID>[:<GID>]
描述:
    1)可以直接指定用戶名或所屬組名椭豫,也可以指定UID或GID耻瑟。
    2)當為用戶指定一個用戶組,則該用戶只有該指定的組關系赏酥,其他組成員關系將會被忽略喳整。
示例:
    USER userA

ARG

??用戶指定傳遞給build構(gòu)建運行時的變量

格式:
    ARG <name>[=<default value>]
描述:
    1)docker build命令中通過--build-arg <varname>=<value>進行指定,若Dockerfile不存在該arg聲明裸扶,則拋警告框都。
示例:
    FROM busybox
    ARG user1
    ARG buildno
    
    # 設置默認值
    FROM busybox
    ARG user1=someuser
    ARG buildno=1

RUN、ENTRYPOINT和CMD區(qū)別

  1. RUN是docker build構(gòu)建docker鏡像時執(zhí)行的命令呵晨,真正運行一個命令并提交運行結(jié)果魏保。
  2. CMD在docker build時期不執(zhí)行任何東西,在docker run執(zhí)行docker鏡像構(gòu)建容器時摸屠,為鏡像聲明了預期的命令囱淋。存在多條CMD時,只會執(zhí)行最后一條餐塘,當同時存在ENTRYPOINT時,CMD命令將充當參數(shù)(exec格式提供默認值)或者被覆蓋皂吮。若不存在ENTRYPOINT時戒傻,則可以動態(tài)覆蓋或執(zhí)行命令。
  3. ENTRYPOINT命令一定會執(zhí)行蜂筹,一般用于執(zhí)行腳本需纳。shell格式的ENTRYPOINT命令,都不會執(zhí)行在Dockerfile中存在CMD命令還是在docker run添加的命令艺挪。exec格式的ENTRYPOINT命令不翩,CMD命令或docker run添加的命令,會被當做ENTRYPOINT命令的參數(shù)執(zhí)行。

模板示例

基礎鏡像Dockerfile

編寫基礎鏡像的Dockerfile

# 設置及下載相關服務
RUN yum install -y tar \
    && yum install -y java-1.8.0-openjdk* \
    && yum install -y unzip \
    && yum install -y less \
    && yum install -y vi \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' > /etc/timezone

# 解決中文編碼    
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

制作基礎鏡像

$ docker build -t centos-basic:v1.0 .

服務鏡像Dockerfile

??有了上述的基礎鏡像口蝠,在服務Dockerfile中聲明FROM centos-basic:v1.0器钟。

# base images: 基礎鏡像
FROM centos-basic:v1.0

# maintainer: 維護者信息
MAINTAINER andya

# env config: 環(huán)境變量設置
ENV JAVA_HOME /usr/local/jdk1.8.0_170
ENV PATH $JAVA_HOME/bin:$PATH

# volume:匿名數(shù)據(jù)卷
VOLUME /nfs

# copy: 拷貝目錄或文件(不解壓tar包)
COPY --chown=userA:groupA demo.tar demo01.tar

# add:拷貝目錄或文件(自動解壓tar包)
ADD config /config
ADD sql /sql
ADD micro-service01-1.0.jar /app.jar

# run: 執(zhí)行命令,修改目錄權限
RUN chmod -R 777 /sql
# run: 執(zhí)行命令妙蔗,修改文件的訪問時間和修改時間為當前時間傲霸,而不會修改文件的內(nèi)容
RUN bash -c 'touch /app.jar'

# expose:暴露端口
EXPOSE 8001

# workdir: 類似于cd進入工作目錄
WROKDIR /

# entrypoint:設定容器啟動時第一個運行的命令及參數(shù)
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

鏡像制作

  1. docker build構(gòu)建鏡像
    docker build -t 鏡像倉庫ip:port/service/micro01:v1.0 .
    注意命令尾部的.

  2. docker login登錄鏡像倉庫
    docker login 鏡像倉庫ip:port

  3. docker images查看進行
    docker imgaes | grep micro01

  4. docker push推送鏡像至鏡像倉庫
    docker push 鏡像倉庫ip:port/service/micro01:v1.0

  5. docker save保存鏡像tar包
    docker save 容器id > 名字.tar

docker常用命令

運行容器

  1. docker load加載鏡像
    docker load -i 名字.tar

  2. docker images
    模糊查看鏡像iddocker images | grep "xxx"

  3. docker run啟動容器
    docker run image_id 得到container_id

  4. docker logs查看容器日志
    docker logs -f <containter_id>

  5. docker exec進入容器
    docker exec -it <container_id> /bin/bash

其他命令

  1. docker cp將文件拷貝到對應的容器的位置中
    docker cp <file> <container_id>:/dir01/dir02

  2. docker restart重啟容器
    docker restart <container_id>

  3. docker commit基于某個容器更改重建一個容器
    docker commit <container_id> <repository>:<tag>

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/root/.docker")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  engine      Manage the docker engine
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

refer to
https://docs.docker.com/engine/reference/builder/

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市眉反,隨后出現(xiàn)的幾起案子昙啄,更是在濱河造成了極大的恐慌,老刑警劉巖寸五,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梳凛,死亡現(xiàn)場離奇詭異,居然都是意外死亡梳杏,警方通過查閱死者的電腦和手機韧拒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秘狞,“玉大人叭莫,你說我怎么就攤上這事∷甘裕” “怎么了雇初?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長减响。 經(jīng)常有香客問我靖诗,道長,這世上最難降的妖魔是什么支示? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任刊橘,我火速辦了婚禮,結(jié)果婚禮上颂鸿,老公的妹妹穿的比我還像新娘促绵。我一直安慰自己,他們只是感情好嘴纺,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布败晴。 她就那樣靜靜地躺著,像睡著了一般栽渴。 火紅的嫁衣襯著肌膚如雪尖坤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天闲擦,我揣著相機與錄音慢味,去河邊找鬼场梆。 笑死,一個胖子當著我的面吹牛纯路,可吹牛的內(nèi)容都是我干的或油。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼感昼,長吁一口氣:“原來是場噩夢啊……” “哼装哆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起定嗓,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蜕琴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宵溅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凌简,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年恃逻,在試婚紗的時候發(fā)現(xiàn)自己被綠了雏搂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡寇损,死狀恐怖凸郑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矛市,我是刑警寧澤芙沥,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站浊吏,受9級特大地震影響而昨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜找田,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一歌憨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧墩衙,春花似錦务嫡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至籽懦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氛魁,已是汗流浹背暮顺。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工厅篓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捶码。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓羽氮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惫恼。 傳聞我的和親對象是個殘疾皇子档押,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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