Docker入门

91 阅读4分钟

一篇注重于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)

宿主机

容器