天天看點

Docker—Dockerfile詳解及微服務制作運作容器鏡像步驟指令總結

本文主要Docker—Dockerfile詳解及微服務制作運作容器鏡像步驟指令總結。

Docker—Dockerfile詳解及微服務制作運作容器鏡像步驟指令總結
關注微信公衆号:CodingTechWork,一起學習進步。

引言

  上雲、k8s部署,不可避免需要使用容器化,面對容器化,不可避免使用Docker,對于Docker不得不提鏡像的制作。本文主要學習和總結Dockerfile聲明詳解及常用的docker指令。

Dockerfile

檔案概述

  Dockerfile是一個用于自定義建構鏡像的文本檔案,其中包含了多條建構鏡像所需要的指令、軟體依賴和說明。

指令詳解

FROM

  指定基礎鏡像

格式:
	FROM <image>
	FROM <image>:<tag>
	FROM <image>@<digest>
描述:
	tag和digest可選,不指定時,則使用latest版本基礎鏡像,digest表示V2版本及以上版本鏡像的内容可尋址辨別符。
示例:
	FROM centos:7
           

MAINTAINER

  維護者資訊

格式:
	MAINTAINER <name>
描述:
	name即為維護者資訊,可自定義為姓名、郵箱位址等
示例:
	MAINTAINER andya
	MAINTAINER [email protected]
	MAINTAINER andya <[email protected]>
           

ENV

  設定環境變量

格式:
	ENV <key> <value>
	ENV <key>=<value> ...
描述:
	1)ENV <key> <value> 中的<key>後面内容都作為<value>的内容,是以一次隻能設定一個變量
	2)ENV <key>=<value> ... 可以設定多個變量,若遇到空格等可使用\進行轉義,或""進行辨別
示例:
	ENV addressInfo suzhou xiancheng
	ENV addressCity=suzhou
           

VOLUME

  指定持久化目錄為匿名卷,防止運作時使用者将動态檔案所儲存目錄挂載為卷。

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

COPY

  拷貝功能,類似于ADD,但不可以自動解壓檔案,且不能通路網絡資源

格式:
	COPY [--chown=<user>:<group>] <src>... <dest>
	COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
描述:
	1)[--chown=<user>:<group>]為可選參數,改變檔案的所屬者和屬組。
	2)目标路徑不存在時,會自動建立。
	
示例:
	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

  執行指令。

格式:
	# shell執行
	RUN <command>
	# exec執行
	RUN ["executable", "param1", "param2"]
描述:
	1)Dockerfile的指令每執行一次都會在docker上建立一層,是以盡量合并RUN。
	2)exec執行格式是JSON數組,必須使用雙引号描述。
	3)exec格式不調用指令行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協定。
	2)EXPOSE不是真正的釋出該端口,需要在docker run中使用-p進行釋出,如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)若不存在,則自動建立。
	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指令行的參數,将以/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的最主要目的是為一個執行中容器提供預設值。包括可執行檔案/程式。

格式:
	# 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提供預設參數時,CMD和ENTRYPOINT都需要以JSON數組格式進行聲明。
	3)同ENTRYPOINT,exec格式中CMD [ "echo", "$HOME" ]無效,需要指定sh -c,如使用CMD [ "sh", "-c", "echo $HOME" ],當然,也可以直接使用shell格式:CMD echo $HOME
	4)與RUN不同,RUN是docker build建構docker鏡像時執行的指令,真正運作一個指令并送出運作結果。CMD在build時期不執行任何東西,在docker run執行docker鏡像建構容器時,為鏡像聲明了預期的指令。ENTRYPOINT指令一定會執行,一般用于執行腳本。
示例:
	# exec格式
	CMD ["/usr/bin/wc","--help"]
	
	# shell格式
	CMD echo "This is a test." | wc -
	
           

LABEL

  給鏡像添加中繼資料,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建構運作時的變量

格式:
	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差別

  1. RUN是docker build建構docker鏡像時執行的指令,真正運作一個指令并送出運作結果。
  2. CMD在docker build時期不執行任何東西,在docker run執行docker鏡像建構容器時,為鏡像聲明了預期的指令。存在多條CMD時,隻會執行最後一條,當同時存在ENTRYPOINT時,CMD指令将充當參數(exec格式提供預設值)或者被覆寫。若不存在ENTRYPOINT時,則可以動态覆寫或執行指令。
  3. ENTRYPOINT指令一定會執行,一般用于執行腳本。shell格式的ENTRYPOINT指令,都不會執行在Dockerfile中存在CMD指令還是在docker run添加的指令。exec格式的ENTRYPOINT指令,CMD指令或docker run添加的指令,會被當做ENTRYPOINT指令的參數執行。

模闆示例

基礎鏡像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: 環境變量設定
ENV JAVA_HOME /usr/local/jdk1.8.0_170
ENV PATH $JAVA_HOME/bin:$PATH

# volume:匿名資料卷
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: 執行指令,修改目錄權限
RUN chmod -R 777 /sql
# run: 執行指令,修改檔案的通路時間和修改時間為目前時間,而不會修改檔案的内容
RUN bash -c 'touch /app.jar'

# expose:暴露端口
EXPOSE 8001

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

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

鏡像制作

  1. docker build建構鏡像

    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

    模糊檢視鏡像id

    docker 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/

燒不死的鳥就是鳳凰