Docker官方起步指南学习笔记②——容器及Dockerfile

Docker官方起步指南学习笔记②——容器及Dockerfile

九月 12, 2019
当前设备屏幕尺寸过小,推荐使用PC模式浏览。

本学习笔记 Base on ——

>Get Started With Docker<


容器及其相关

容器是一个映像的实例,是APP运行的底层基础。


从Dockerfile构建容器

Dockerfile 定义了容器内的环境,它提供了对硬件及网络的虚拟化接入定义标准,告知Docker复制哪些文件到该环境中及相应的交互方式。

  1. Dockerfile 创建一个环境总是基于某个基准映像,如python:2.7-slim,在编码规范上,提倡所有Dockerfile关键字采用大写
  2. 不提倡将Dockerfile命名为除Dockerfile之外的名字,除非一个文件夹下存在多个Dockerfile文件。若同一目录下存在多个Dockerfile文件,建议采用Dockerfile.secondDockerfile.server等方式命名。
  3. Dockerfile的编写思想,应参照自动化的思想,即无交互式的Docker构建过程。其次,应使用 \ 将过长的命令分行。更多编码规范可>参见此处<

Dockerfile指令

指令列表

1.FROM 10.VOLUME
2.MAINTAINER 11.USER
3.RUN 12.WORKDIR
4.ENV 13.ONBUILD
5.COPY 14.LABEL
6.ADD 15.ARG
7.EXPOSE 16.STOPSIGNAL
8.CMD 17.HEALTHCHECK
9.ENTRYPOINT 18.SHELL
  1. FROM

表示从某个基础映像构建新的映像,其必为整个Dockerfile的第一句有效命令。

1
FROM <imagesName:tag>

Back

  1. MAINTAINER</>

表示维护者的信息。非必需语句。

1
MAINTAINER Name <Email>

Back

  1. RUN

用来在Docker的编译环境中运行指定命令,其在shell或exec的环境下执行。
如exec格式:RUN ["程序名","参数1","参数2"]

1
RUN echo hello-docker

Back

  1. ENV

用于设置环境变量,该变量可在后续任何RUN指令和容器中使用。
ENV <key> <value>

1
2
ENV val hello-docker
RUN echo $val

Back

  1. COPY

用来将本地(宿主机)的文件复制到映像的指定路径下。
COPY <本地地址> <映像地址>

1
COPY /local/path/flie /image/path/file

Back

  1. ADD

与COPY类似,将某个URL地址的资源下载到映像指定位置。

1
ADD latest.tar.gz /image/path.file

Back

  1. EXPOSE

暴露指定的端口,指明映像/容器中的应用将会侦听某个端口;或用于多容器间的通信。
EXPOSE <端口1> [<端口2>...]

1
EXPOSE 80

Back

  1. CMD

该指令指明了容器默认的执行指令。一般用于在整个Dockerfile完成所有环境的安装与配置之后的最后一道指令。
CMD ["executable","param1","param2"]
注意:一个Dockerfile只允许使用一次CMD指令,并以最后一个CMD指令为最终需要执行的指令。
另外,docker run命令将会覆盖CMD命令,此时其与ENTRYPOINT的功能相似。如对于下面的代码,若映像名为image-test,当运行docker run image-test echo "new hello world",将会输出"new hello world"而不是"hello ubantu"。

1
2
FROM ubuntu
CMD ["echo","hello ubuntu"]

Back

  1. ENTRYPOINT

用于向容器内赋参数,相当于把容器当成一个程序使用。

1
2
FROM ubuntu
ENTRYPOINT ["echo"]
1
docker run image-test "Hello world!"

这时将会输出"Hello world!"

Back

  1. VOLUME

该指令用于向映像/容器内添加设置数据卷,以实现数据的共享、备份、迁移等。
注意:数据卷将会已知存在,知道没有任何容器使用它;此时,它对于宿主机而言还是一个普通文件,不会随着容器的停用而被销毁。
VOLUME ["/data", "/data2"]

1
2
3
FROM ubuntu
VOLUME /app
CMD ["cat", "/app/test.txt"]
1
docker run --rm -v /app test.txt

将会输出宿主机/app/test.txt中的内容。

Back

  1. USER

指定运行容器时的默认用户(默认为root)。
USER user[:group]
USER uid:gid

Back

  1. WORKDIR

设置工作目录,指定RUN、CMD、ENTRYPOINT的工作路径。
WORDDIR <PATH>
注意:若多次重复指令(后几个路径必为相对路径),则最终路径为其组合,例如:

1
2
3
WORKDIR /a
WORKDIR b
WORKDIR c

等效于WORKDIR /a/b/c

Back

  1. ONBUILD

设置二次映像构建时的执行指令。其在当前dockerfile进行构建时并不执行,而在基于该映像的子映像构建时执行。
注意:ONBUILD后不应存在FROM和MAINTAINER指令。

1
2
FROM busybox
ONBUILD RUN echo "Now it works!"

Back

  1. LABEL

添加元数据到映像。尽量只使用一个标签LABEL。
LABEL <label>=<value> [<label>=<value>....]

1
2
LABEL multi.label1="label1" \ 
multi.label2="label2"

Back

  1. ARG

构建变量,该变量与ENV构建的环境变量不同,只能在Dockerfile内起效。
ARG <key> <value>

Back

  1. STOPSIGNAL

允许用户定制化运行docker stop时的信号。

file
1
STOPSIGNAL SIGNALKILL

Back

  1. HEALTHCHECK

用于检测映像的状态。
HEALTHCHEK [OPTION] CMD command,配置项包括:

  • --interval=DURATION 用于指定容器启动多久后开始自建,默认30s。
  • --tiemout=DURATION 设置超时时间,默认30s。
  • --retries=N 设置充实次数,默认3次。
1
HEALTHCHECK --interval=5m --timeout=3s CMD ["echo", "we cool!"]

Back

  1. SHELL

Docker构建时默认使用/bin/sh作为shell环境(windows下是cmd),该配置项可以修改其shell环境。

1
SHELL ["powershell", "-command"]

Back


从容器到映像

从Dockerfile完成容器(及其内部应用的部署)的构建之后,还可以选择将其打包为一个映像(Image),将其发布到DockerHub上,实现轻量级的应用移动和部署。

使用docker build 命令进行打包

docker build [OPTIONS] PATH | URL | -,常用指令有:

  • -c 控制CPU的使用数
  • -f – file <string> 选则所使用的Dockerfile
  • -m --memory <value> 设置内存使用上限
  • -q --quite 不显示构建过程的日志输出
  • -t --tag <value> 为映像打上标签
1
docker build --tag=myImage:v0.01

发布Image

需要拥有DockerHub的账号,并利用docker login指令登录服务器之后,利用docker push指令发布。在发布前,利用docker tag指令为映像打上标签。

1
2
docker tag myImage myUserName/myRepository:tag
docker push myUserName/myRepository:tag

容器基本操作

常用指令列表

命令 说明
attach 依附到正在运行的容器
cp 从容器里面复制文件或目录到宿主机系统或以标准形式输出
create 创建一个新容器
diff 检查容器的文件系统变化情况
events 获取Docker服务器端的事件日志
exec 在一个运行中的容器中执行命令
export 导出容器的文件系统到指定位置
inspect 获取容器的元数据
kill 杀死一个运行中的容器,该指令不可被容器内部拦截
logs 获取容器的运行日志
pause 暂停容器内部的所有进程
port 输出容器的端口信息
ps 显示当前Docker中的容器列表
rename 重命名一个容器
restart 重启一个容器
rm 移除一个或多个容器
run 启动一个容器
start 启动一个或多个挂起/暂停中的容器
stats 显示容器的资源占用情况
stop 暂停正在运行的容器
top 显示容器内正在运行的进程
unpause 恢复所有暂停的进程
update 更新一个或多个容器的配置
wait 阻塞一个容器,并逐步停止该容器