本学习笔记 Base on ——
容器及其相关
容器是一个映像的实例,是APP运行的底层基础。
从Dockerfile构建容器
Dockerfile 定义了容器内的环境,它提供了对硬件及网络的虚拟化接入定义标准,告知Docker复制哪些文件到该环境中及相应的交互方式。
- Dockerfile 创建一个环境总是基于某个基准映像,如
python:2.7-slim
,在编码规范上,提倡所有Dockerfile关键字采用大写。 - 不提倡将Dockerfile命名为除
Dockerfile
之外的名字,除非一个文件夹下存在多个Dockerfile文件。若同一目录下存在多个Dockerfile文件,建议采用Dockerfile.second
、Dockerfile.server
等方式命名。 - 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 |
- FROM
表示从某个基础映像构建新的映像,其必为整个Dockerfile的第一句有效命令。
FROM <imagesName:tag>
- MAINTAINER</>
表示维护者的信息。非必需语句。
MAINTAINER Name <Email>
- RUN
用来在Docker的编译环境中运行指定命令,其在shell或exec的环境下执行。
如exec格式:RUN ["程序名","参数1","参数2"]
RUN echo hello-docker
- ENV
用于设置环境变量,该变量可在后续任何RUN指令和容器中使用。
ENV <key> <value>
ENV val hello-docker
RUN echo $val
- COPY
用来将本地(宿主机)的文件复制到映像的指定路径下。
COPY <本地地址> <映像地址>
COPY /local/path/flie /image/path/file
- ADD
与COPY类似,将某个URL地址的资源下载到映像指定位置。
ADD latest.tar.gz /image/path.file
- EXPOSE
暴露指定的端口,指明映像/容器中的应用将会侦听某个端口;或用于多容器间的通信。
EXPOSE <端口1> [<端口2>...]
EXPOSE 80
- 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"。
FROM ubuntu
CMD ["echo","hello ubuntu"]
- ENTRYPOINT
用于向容器内赋参数,相当于把容器当成一个程序使用。
FROM ubuntu
ENTRYPOINT ["echo"]
docker run image-test "Hello world!"
这时将会输出"Hello world!"
Back
- VOLUME
该指令用于向映像/容器内添加设置数据卷,以实现数据的共享、备份、迁移等。
注意:数据卷将会已知存在,知道没有任何容器使用它;此时,它对于宿主机而言还是一个普通文件,不会随着容器的停用而被销毁。
VOLUME ["/data", "/data2"]
FROM ubuntu
VOLUME /app
CMD ["cat", "/app/test.txt"]
docker run --rm -v /app test.txt
将会输出宿主机/app/test.txt
中的内容。
Back
- USER
指定运行容器时的默认用户(默认为root)。
USER user[:group]
USER uid:gid
- WORKDIR
设置工作目录,指定RUN、CMD、ENTRYPOINT的工作路径。
WORDDIR <PATH>
注意:若多次重复指令(后几个路径必为相对路径),则最终路径为其组合,例如:
WORKDIR /a
WORKDIR b
WORKDIR c
等效于WORKDIR /a/b/c
。
Back
- ONBUILD
设置二次映像构建时的执行指令。其在当前dockerfile进行构建时并不执行,而在基于该映像的子映像构建时执行。
注意:ONBUILD后不应存在FROM和MAINTAINER指令。
FROM busybox
ONBUILD RUN echo "Now it works!"
- LABEL
添加元数据到映像。尽量只使用一个标签LABEL。
LABEL <label>=<value> [<label>=<value>....]
LABEL multi.label1="label1" \
multi.label2="label2"
- ARG
构建变量,该变量与ENV构建的环境变量不同,只能在Dockerfile内起效。
ARG <key> <value>
- STOPSIGNAL
允许用户定制化运行docker stop时的信号。
STOPSIGNAL SIGNALKILL
- HEALTHCHECK
用于检测映像的状态。
HEALTHCHEK [OPTION] CMD command
,配置项包括:
--interval=DURATION
用于指定容器启动多久后开始自建,默认30s。--tiemout=DURATION
设置超时时间,默认30s。--retries=N
设置充实次数,默认3次。
HEALTHCHECK --interval=5m --timeout=3s CMD ["echo", "we cool!"]
- SHELL
Docker构建时默认使用
/bin/sh
作为shell环境(windows下是cmd),该配置项可以修改其shell环境。
SHELL ["powershell", "-command"]
从容器到映像
从Dockerfile完成容器(及其内部应用的部署)的构建之后,还可以选择将其打包为一个映像(Image),将其发布到DockerHub上,实现轻量级的应用移动和部署。
使用docker build 命令进行打包
docker build [OPTIONS] PATH | URL | -
,常用指令有:
- -c 控制CPU的使用数
- -f – file <string> 选则所使用的Dockerfile
- -m --memory <value> 设置内存使用上限
- -q --quite 不显示构建过程的日志输出
- -t --tag <value> 为映像打上标签
docker build --tag=myImage:v0.01
特别的,要注意路径的问题:
docker build --tag=myImage:v0.01 -f Dockerfile .
(命令末有个表示相对路径的.
),会在当前路径下寻找Dockerfile文件并构建镜像。
发布Image
需要拥有DockerHub的账号,并利用
docker login
指令登录服务器之后,利用docker push
指令发布。在发布前,利用docker tag
指令为映像打上标签。
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 | 阻塞一个容器,并逐步停止该容器 |