第一章 Docker简介
Docker 是一个开源的应用容器引擎,基于go语言并遵从apache2协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
Docker的三要素:镜像、容器、仓库。
镜像:Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
容器:Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库:仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
第二章 Docker常用命令
1.镜像操作
1.将镜像导出磁盘
docker save -o [保存的目标文件名称] [镜像名称]
2.将镜像加载回来
docker load -i [镜像名称]
3.保存镜像到磁盘
docker save -o /usr/local/nginx.tar nginx
4.删除镜像
docker rmi nginx
5.查看镜像
docker images
6.加载镜像
docker load -i /usr/local/nginx.tar
2.容器操作
- docker run:创建并运行一个容器,处于运行状态
- docker pause:让一个运行的容器暂停
- docker unpause:让一个容器从暂停状态恢复运行
- docker stop:停止一个运行的容器
- docker start:让一个停止的容器再次运行
- docker rm:删除一个容器
3.数据卷
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。这样我们操作宿主机中的目录就等于操作容器中的目录了。
数据卷可以将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
基本语法:docker volume [COMMAND]
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
第三章 Dockerfile 自定义镜像
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。
Dockerfile的13指令
1.FROM
指定基础镜像,必须为第一个命令。
FROM <image>
FROM <image>:<tag>
2.MAINTAINER
维护者信息
MAINTAINER <name>
3.WORKDIR
工作目录
WORKDIR /usr/workdir
注意
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
4.RUN
构建镜像时执行的命令
# 1. shell执行
RUN <command>
# 2. exec执行
RUN ["executable", "param1", "param2"]
注意:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。 如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
5.ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
宿主机不支持绝对路径 ,只能用相对路径 ,容器支持绝对路径
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:
6.COPY
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
COPY <源路径> <目标路径>
7.CMD
构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。
1. shell格式:CMD <命令>
2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]
注意
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
8.ENTRYPOINT
配置容器,使其可执行化。配合CMD可省去"application",只使用参数。 指定容器启动的要运行的命令,可以追加命令
1.ENTRYPOINT ["executable", "param1", "param2"]
2.ENTRYPOINT command param1 param2 (shell内部令)
注意:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile 中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
9.ENV
用于设置环境变量
ENV <key>=<value>
10.EXPOSE
指定于外界交互的端口
EXPOSE 80
11.VOLUME
用于指定持久化目录
VOLUME ["/path/to/dir"]
注意
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
-
卷可以容器间共享和重用
-
容器并不一定要和其它容器共享卷
-
修改卷后会立即生效
-
对卷的修改不会对镜像产生影响
-
卷会一直存在,直到没有任何容器在使用它
12.USER
USER 指令用于将会用以什么样的用户去运行
USER user
USER user:group
13.ONBUILD
帮助别人定制而准备的
ONBUILD [INSTRUCTION]