本文主要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差別
- RUN是docker build建構docker鏡像時執行的指令,真正運作一個指令并送出運作結果。
- CMD在docker build時期不執行任何東西,在docker run執行docker鏡像建構容器時,為鏡像聲明了預期的指令。存在多條CMD時,隻會執行最後一條,當同時存在ENTRYPOINT時,CMD指令将充當參數(exec格式提供預設值)或者被覆寫。若不存在ENTRYPOINT時,則可以動态覆寫或執行指令。
- 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"]
鏡像制作
- docker build建構鏡像
注意指令尾部的docker build -t 鏡像倉庫ip:port/service/micro01:v1.0 .
.
- docker login登入鏡像倉庫
docker login 鏡像倉庫ip:port
- docker images檢視進行
docker imgaes | grep micro01
- docker push推送鏡像至鏡像倉庫
docker push 鏡像倉庫ip:port/service/micro01:v1.0
- docker save儲存鏡像tar包
docker save 容器id > 名字.tar
docker常用指令
運作容器
- docker load加載鏡像
docker load -i 名字.tar
-
docker images
模糊檢視鏡像id
docker images | grep "xxx"
- docker run啟動容器
得到container_iddocker run image_id
- docker logs檢視容器日志
docker logs -f <containter_id>
- docker exec進入容器
docker exec -it <container_id> /bin/bash
其他指令
- docker cp将檔案拷貝到對應的容器的位置中
docker cp <file> <container_id>:/dir01/dir02
- docker restart重新開機容器
docker restart <container_id>
- 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/
燒不死的鳥就是鳳凰