Docker上手体验

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker应用场景

1.Web 应用的自动化打包和发布。

2.自动化测试和持续集成、发布。

3.在服务型环境中部署和调整数据库或其他的后台应用。

4.从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。

‘食’用命令

docker run

创建一个新的容器并运行一个命令

1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • -d: 后台运行容器
  • -i: 以交互模式运行容器,通常与 -t 同时使用
  • -P: 随机端口映射,容器内部端口随机映射到主机的高端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
  • -name=”nginx-lb”: 为容器指定一个名称

docker pause

暂停容器中所有的进程。

docker unpause

恢复容器中所有的进程。

docker exec

在运行的容器中执行命令,进入容器内部

docker logs

获取容器的日志

docker port

列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口

docker cp

用于容器与主机之间的数据拷贝。

文件挂载For Windows

1
2
3
4
docker run -d -p 8081:80 --name oracle-nginx -v   
G:/docker-container/nginx/www:/usr/share/nginx/html -v
G:/docker-container/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v
G:/docker-container/nginx/logs:/var/log/nginx nginx

DockerFile 指令

Docker可以从Dockerfile中一步一步的读取指令来自动的创建镜像,常使用Dockerfile来创建用户自定义的镜像

1
2
# Comment
INSTRUCTION arguments

建议大写。docker是严格按照顺序(#注释起来的忽略)运行指令的

FORM

1
2
3
FROM  <image>

FROM <image>:<tag>

在Dockerfile中第一条非注释INSTRUCTION一定是FROM,它决定了以哪一个镜像作为基准,首选本地是否存在,如果不存在则会从公共仓库下载

RUN

1
2
3
 RUN <commnad>

RUN ["executable", "param1", "param2"]

RUN指令会在当前镜像的顶层执行任何命令,并commit成新的(中间)镜像,提交的镜像会在后面继续用到

1
2
3
4
5
RUN apt-get install vim -y
=
RUN ["apt-get", "install", "vim", "-y"]

RUN ["/bin/bash", "-c", "apt-get install vim -y"] 与shell风格相同

ENTRYPOINT

ENTRYPOINT命令设置在容器启动时执行命令,如果有多个ENTRYPOINT指令,那只有最后一个生效

1
2
3
4
5
6
 ENTRYPOINT ["executable", "param1", "param2"]  数组/exec格式,推荐

ENTRYPOINT command param1 param2 shell格式

#示例
docker run -i -t --rm -p 80:80 nginx

CMD

1
2
3
CMD ["executable","param1","param2"]  (数组/exec格式)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell格式)

一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效。CMD指令的主要功能是在build完成后,为了给docker run启动到容器时提供默认命令或参数,这些默认值可以包含可执行的命令,也可以只是参数(此时可执行命令就必须提前在ENTRYPOINT中指定)。

它与ENTRYPOINT的功能极为相似,区别在于如果docker run后面出现与CMD指定的相同命令,那么CMD会被覆盖;而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖)。另外CMD还可以单独作为ENTRYPOINT的所接命令的可选参数。

1
2
3
4
5
6
7
8
Dockerfile:
CMD ["echo CMD_args"]
运行
docker run <image> echo run_arg
结果
输出 run_arg

因为echo run_arg覆盖了CMD。如果run后没有echo run_arg,则输出CMD_args

1
2
3
4
5
6
Dockerfile:
ENTRYPOINT ["echo", "ENTRYPOINT_args"]
运行
docker run <image> run_arg
结果
输出 ENTRYPOINT_args run_arg

因为echo run_arg追加到ENTRYPOIINT的echo后面了。如果在ENTRYPOINT后再加入一行CMD [“CMD_args”],则结果依旧,除非去掉run后的所有参数。
当出现ENTRYPOINT指令时CMD指令只可能(当ENTRYPOINT指令使用exec方式执行时)被当做ENTRYPOINT指令的参数使用,其他情况则会被忽略

EXPOSE

EXPOSE指令告诉容器在运行时要监听的端口,但是这个端口是用于多个容器之间通信用的(links),外面的host是访问不到的。要把端口暴露给外面的主机,在启动容器时使用-p

1
2
# expose memcached(s) port
EXPOSE 11211 11212

ADD

1
ADD <src>... <dest>

将文件拷贝到container的文件系统对应的路径下。

可以是文件、文件夹、URL,对于文件和文件夹必须是在Dockerfile的相对路径下(build context path),即只能是相对路径且不能包含../path/。

只能是容器中的绝对路径。如果路径不存在则会自动级联创建,根据你的需要是里是否需要反斜杠/,习惯使用/结尾从而避免被当成文件。

1
2
3
4
5
6
7
支持模糊匹配
ADD hom* /mydir/ # adds all files starting with "hom"
ADD hom?.txt /mydir/ # ? is replaced with any single character

ADD requirements.txt /tmp/
RUN pip install /tmp/requirements.txt
ADD . /tmp/

COPY

COPY的语法与功能与ADD相同,只是不支持上面讲到的是远程URL、自动解压这两个特性,但是Best Practices for Writing Dockerfiles建议尽量使用COPY,并使用RUN与COPY的组合来代替ADD,这是因为虽然COPY只支持本地文件拷贝到container,但它的处理比ADD更加透明,建议只在复制tar文件时使用ADD,如ADD trusty-core-amd64.tar.gz /

ENV

用于设置环境变量:

1
ENV <key> <value>

设置了后,后续的RUN命令都可以使用,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加-env =参数来修改

VOLUME

VOLUME指令用来在容器中设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移

WORKDIR

WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /a,WORKDIR b,RUN pwd最终输出的当前目录是/a/b