一、简单的介绍docker:
1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
2.假如你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
总之docker就是集装箱原理。
Java号称“一次编译,到处运行”,因为java虚拟机解决平台的兼容性问题,所以有java虚拟机的地方就能跑java代码;
Docker是:“一次封装,到处运行”,因为docker解决了应用环境的问题,安装了docker的平台就能跑“docker包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。
二:为什么用docker
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
Docker 在如下几个方面具有较大的优势:
更快速的交付和部署
Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发。可以直接集成到可持续开发流程中。
例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
高效的部署和扩容
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或方便的下线的你的应用和服务,这种速度趋近实时。
更高的资源利用率
Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
三、Docker核心:
镜像(image)
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
镜像(Image)就是一堆只读层(read-only layer)的统一视角。统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
仓库(repository)
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
容器(container)
Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
四、我们可以通过 docker --help 去查看命令的详细的帮助文档。在这里我只讲一些日常中我们可能会用到的一些命令。
docker 常用一些的参数:
-i: 交互式操作。
-t: 终端 (-it 同时使用可以让 docker 运行的容器实现"对话"的能力)
-d: 参数默认不会进入容器,后台运行,想要进入容器需要使用指令 docker exec(后边会讲到)
-v:挂载本地目录到镜像目录实现共享文件夹,格式:本地目录:容器目录,使用方法docker run -it --name=”abc” -v /d/mulu:/home image_id /bin/bash
–rm: 容器退出时自动被删除
在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据(即通过 docker ps -a 查看到的处于终止状态的容器,还可以通过docker start container_ID再次进入)。 因而可以在容器启动时设置–rm选项,这样在容器退出时就能够自动清理容器内部的文件系统。使用示例:docker run -it --rm -v /d:/home image_ID /bin/bash 。显然,–rm选项不能与-d同时使用
(一)docker 基础命令
1、启动、关闭、重启docker服务
systemctl start docker
systemctl stop docker
systemctl restart docker
2、设置docker开机自启动
systemctl enable docker
3、取消docker开机自启动
systemctl disable docker
4、查docker 运行状态----如果是在运行中 输入命令后 会看到绿色的active
systemctl status docker
5、查看docker 版本号信息(client、server)
docker version
6、docker info(docker更详细的系统级信息)
(在docker客户端命令行中我们可以使用info命令 显示 Docker 系统详细信息,例如镜像和容器数以及docker工作地址等;通过version命令显示 Docker 版本信息)
7、docker 帮助命令
忘记了某些命令便可使用此进行查看与回顾
docker --help
比如 咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用
docker pull --help
(二)docker 镜像命令
1、我们如果想查看下主机下存在多少镜像及镜像信息,我们可以用如下命令:
docker images(默认只列出最顶层的镜像,可以使用-a选项显示所有的镜像)
2、搜索镜像(搜索镜像名中包含busybox的镜像)
docker search busybox
3、拉取镜像。 不加tag(版本号) 即拉取docker仓库中该镜像的最新版本; 加tag 则是拉取指定版本。
docker pull 镜像名
docker pull 镜像名:tag
4、运行镜像:docker run -it -v /本地目录:/容器目录 镜像id /bin/bash
5、导出/导入镜像(当服务器无法访问公网的时候,又要pull镜像,这个时候可以将其他服务上的镜像导出,然后再导入到要用的服务器。):
导出镜像:docker save -o xx.tar xx
-o:指定保存的镜像的名字;xx.tar:保存到本地的镜像名称;xx:镜像名字或者IMAGE_ID(镜像id),通过"docker images"查看
导入镜像:docker load -i xx.tar
6、 docker镜像的删除
查看本地镜像: docker images
删除镜像: docker rmi image_ID (删除镜像前必须清理掉该镜像下所有处于终止状态的容器,可使用 docker ps -a 查看处于终止状态的容器)
-f:强制删除镜像
–no-prune: 保留被删除镜像中被打标签的父镜像
删除所有未被 tag 标记和未被容器使用的镜像:
docker image prune
删除所有未被容器使用的镜像: docker image prune -a
删除 docker 所有资源:docker system prune
删除停止的容器、删除所有未被容器使用的网络、删除所有none的镜像。
docker system prune -a
注意:删除镜像时需要把该镜像的容器全部删除,分为3步:
首先,查看已经退出的容器: docker ps -a
然后,删除退出的容器:docker rm 容器id
最后,删除镜像 docker rmi 镜像ID
前两步可以直接用 docker container prune 直接清理掉所有处于终止状态的容器
(三)docker 运维命令
1、查看docker工作目录
docker info | grep “Docker Root Dir”
2、查看docker磁盘占用总体情况
du -sh /var/lib/docker/
3、查看Docker的磁盘使用具体情况
docker system df
4、删除无用镜像清理空间:注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止的
docker system prune -a
(四)容器操作
1、列出所有正在运行的容器,不包含已停止的容器:docker ps
2、查看所有容器-----包含正在运行 和已停止的:docker ps -a
(docker ps命令可以查看容器的相关信息,默认只显示正在运行的容器的信息。可以查看到的信息包括CONTAINER ID、NAMES、IMAGE、STATUS、容器启动后执行的COMMAND、创建时间CREATED和绑定开启的端口PORTS。docker ps命令常用的功能就是查看容器的CONTAINER ID,以便对特定容器进行操作。)
3、创建容器:
使用镜像创建一个容器
docker create 镜像名称
使用镜像创建名为 rongqi1 的容器
docker create --name rongqi1 镜像名称
使用镜像 id 新建一个容器
docker create 镜像id
启动、停止、重启容器:
docker start 容器名|容器ID
docker stop 容器名|容器ID
docker restart 容器名|容器ID
创建并启动容器:docker run --name 自定义的容器名 镜像名
当本地镜像存在时,相当于 docker create + docker start
当本地镜像不存在时,相当于 docker pull + docker create + docker start
(参数说明:
–name:定义容器名。
-p:本机与容器的端口映射,格式:本机端口:容器内部端口
-v:本机目录与容器内目录映射,格式:本机目录:容器内部目录
-d:后台执行)
较为复杂指令:docker run --name 自定义容器名 -p 80:8081 -v 本机目录:容器目录 -d 镜像名
4、删除容器:docker rm 容器名|容器ID
docker rmi命令用于删除镜像,docker rm命令用于删除容器。它们可同时删除多个镜像或容器,也可按条件来删除。
5、删除所有停止运行的容器: docker container prune
6、进入容器:
docker exec -it 容器ID|名称 /bin/bash
(docker ps 查看后台运行的docker在使用 -d 参数时,容器启动后会进入后台。
此时想要进入容器,可以通过以下指令进入:
docker attach,使用方法: docker attach 容器ID
docker exec,推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止.使用方法:docker exec -it 容器id /bin/bash )
7、退出容器:
ctrl + p + q # 不停止退出容器
exit #容器停止退出
8、重新进入退出的容器:docker start 容器id (start后,容器后台运行)