一篇注重于Docker入门的文章。
Docker是一个能够把开发的应用程序自动部署到容易的开源引擎。
简单来说,Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等,极大的简化了容器的创建和维护,使得Docker技术比虚拟化技术更为轻便、快捷。
Docker的优势?
- 更高效地利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
隔离文件系统、进程和网络
- 文件系统隔离:每个容器都有自己的root文件系统。
- 进程隔离:每个容器都运行在自己的进程的环境中。
- 网络隔离:容器间的虚拟网络接口和Ip地址是分开的。
- 资源隔离和分组:使用cgroups将cpu和内存之类的资源单独分配给每个Docker容器。
核心组件
镜像(Image)
镜像是构建Docker世界的基石。用户基于镜像还运行自己的容器。镜像也是Docker生命周期的“构建”部分。
Docker镜像相当于是一个root文件系统。它是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源和配置等文件外,还包含了一些为运行时准备的一些配置参数。
容器(Container)
容器是基于镜像启动起来的,容器可以运行一个或多个进程,镜像是Docker生命周期中的构建或者打包阶段,容器则是启动或执行阶段。
镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止和删除等。
仓库(Repository)
仓库是集中存放镜像的地方,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。
仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下周,国内的docker pool,这里仓库的概念与Git类似,registry可以理解为github这样的托管服务。
Docker常用命令
镜像相关命令
docker images #查看本地镜像。包含多个options:
-a #列出本地所有的镜像(镜像分层,含中间映像层)。
-q #只显示镜像id(-qa组合options)。
–digests #现实摘要信息。
– no-trunc #显示完整的镜像信息(–digests --no-trunc组合options)。
docker search #镜像名,options:
–no-trunc #显示完整的镜像描述。
-s #列出收藏数不小于指定值的镜像。
–automated #只列出automated build类型的镜像。
docker pull #镜像名(镜像名可以:版本号,不指定版本号默认latest)
docker rmi #镜像名id,删除镜像。options:
-f #删除单个镜像id。
#空格分割,删除多个镜像。
-f $(docker images -q) #删除全部镜像。
docker commit
docker push
容器相关命令
docker run 镜像id #新建并启动容器。options:
–name #为容器指定名字。
-d #后台运行容器 #并返回容器id #即启动守护式容器。
-i #以交互模式运行容器 #通常与-t同时使用。
-t #为容器重新分配一个伪输入终端。
-P #随机端口映射。
-p #指定端口映射 #有以下四种格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
docker ps #列出当前所有正在运行的容器。options:
-a #列出所有正在运行的容器+历史上运行过的。
-l #显示最近创建的容器。
-n #显示最近n个创建的容器。
-q #静默模式 #只显示容器编号(-lq可组合使用)。
–no-trunc #不截断输出。
exit #容器停止退出。
ctrl+P+Q #容器不停止退出。
docker start 容器id或容器名 #启动容器。
docker restart 容器id #重启容器。
docker stop 容器id或容器名 #停止容器。
docker kill 容器id或容器名 #强制停止容器。
docker rm 容器id #删除已经停止的容器。options:
-f $(docker ps -a -q) #删除全部。
docker ps -a -q | xargs docker rm #直接全部删除
docker image prune -a -f #删除所有不用的镜像
数据卷(volumes)
官方解释
默认容器的数据的读写发生在容器的存储层,当容器被删除时其上的数据将会丢失。所以我们要考虑Docker数据持久化,它的持久化方式主要有两种方式:
- bind mount
- volume
bind mount
bind mount 用于将宿主机的目录mount到container中,但是不同宿主机系统是不可移植的,列如windows和linux的目录结构是不一样的。
注意:
- 宿主机的目录路径必须的是全路径。
- 如果宿主机的目录不存在,docker会自动创建该目录。
- 如果容器中的目录不存在,docker会自动创建该目录。
- 如果容器中的目录已存在内容,那么docker会使用宿主机上的目录将其覆盖掉。
下面以服务的日志路径作为例子,默认dp-service-export服务的日志写在/tmp/dsq/目录下:
docker run -P --name service-export -v /tmp/dsq/:/tmp/dsq/ service-export:latest
服务运行日志已持久化到宿主机/tmp/dsq目录下。
volume
volume也是绕过container的文件系统,直接将数据写到宿主机上,只是volume是被docker管理的,docker下所有的volume都在宿主机上的指定目录下。
注意
- 如果volume是空的而容器中的目录有内容,那么docker会将容器目录中的内容拷贝到volume中。
- 但是如果volume中已经有内容,则会将容器中的目录覆盖。
#创建卷
docker volume create log-volume
#查看所有卷
docker volume ls
#查看卷
docker volume inspect log-volume
/app/docker_file/docker/volumes/log-volume/_data 是 log-volume 在宿主机存储数据的映射路径。
docker run -P --name service-export -v log-volume:/tmp/dsq/ service-export:latest
服务运行日志已持久化到宿主机/app/docker_file/docker/volumes/log-volume/_data目录下。
分别在宿主机创建文件夹(syx)、容器创建文件夹(syx2)
宿主机
容器