關注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ū)別
- RUN是docker build構(gòu)建docker鏡像時執(zhí)行的命令呵晨,真正運行一個命令并提交運行結(jié)果魏保。
- CMD在docker build時期不執(zhí)行任何東西,在docker run執(zhí)行docker鏡像構(gòu)建容器時摸屠,為鏡像聲明了預期的命令囱淋。存在多條CMD時,只會執(zhí)行最后一條餐塘,當同時存在ENTRYPOINT時,CMD命令將充當參數(shù)(exec格式提供默認值)或者被覆蓋皂吮。若不存在ENTRYPOINT時戒傻,則可以動態(tài)覆蓋或執(zhí)行命令。
- 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"]
鏡像制作
docker build構(gòu)建鏡像
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
模糊查看鏡像iddocker images | grep "xxx"
docker run啟動容器
docker run image_id
得到container_iddocker 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.