Docker学习
Docker 基本知识:
Docker 是什么:
Docker 是一个轻量级的容器技术,类似于虚拟机技术(xen、kvm、vmware、virtualbox)。不过 Docker 是直接运行在当前操作系统 Linux 上的,而不是运行在虚拟机中,但是也实现了虚拟机技术的资源隔离,
性能自然远远高于虚拟机:
Docker 支持将软件编译成一个镜像 image,然后在镜像中做好对软件的各种配置,然后就可以发布这个镜像;使用者可以运行这个镜像,而运行中的镜像称为容器 container。容器的启动是非常快的,一般都是以秒为单位(这有点像安装 go 版的系统:系统装好了之后,软件什么的都有了,虽然完全不是一种东西,但是思路却是类似的)。
目前各大主流云计算平台都支持 Docker 容器技术,包括阿里云、百度云、Cloud Foundry(Spring 的一家公司,目前最成熟也最稳定)、HeroKu、DigitalOcean、OpenShift(JBoss 的)、Apache Stratos、Apache MesOS(批处理平台,支持搭建基于 Docker 的云平台)、Deis(开源 PaaS 平台);连微软也已经在 Win 10、Win Server 2016 以及其云平台 Azure 上支持 Docker,而且对 Docker 寄予厚望。看来 Docker 确有大统云计算的趋势,而且相比前几年,很多确实都已经做到了实现。
这里的云平台一般指的是 PaaS(Platform as a Service,平台即服务):平台提供了存储、数据库、网络、负载均衡、自动扩展等功能,只需要将你的程序交给云平台即可。程序也可以是用不同的语言开发的,而使用的 Docker 的云平台就是使用 Docker 的资源隔离技术来隔离以上的功能,以及不同程序。
目前各种软件大部分都有人将其封装成 Docker 镜像,我们只需要下载 Docker 镜像,然后运行即可快速获得已做好配置、可运行的软件 —— 使用 Docker 后,不再需要手动下载、安装、配置软件了。
另外,需要特别指出的是:Docker 并不是为了开发测试方便而提供的小工具(如果是这样,那也不可能这么火了),而是能真正用于实际生产环境的一种极好的部署方式。
Docker 的安装:
Docker 是直接运行在 Linux 中的,其运行原理是基于 Linux 的,所以 Docker 只能运行在 Linux 下。不要紧张,这只能说明在真正的生产环境下,基于 Docker 的程序部署只能在 Linux 上,但是在开发测试的时候,不太需要好高的性能,所以 Docker 依然是可以在 Windows、MacOS 下玩的,原理很简单,启动一个 VirtualBox 的虚拟机(现在 Windows 采用的是 Hyper-V),在虚拟机中运行 Docker。
Linux 下安装:
CentOS 安装命令:
sudo yum update sudo yum install docker
Ubuntu 安装:
sudo apt-get update sudo apt-get docker.io
Windows 下:
现在 Docker 已支持到 Windows 10,可以只安装 Docker(可以不用 Docker Toolbox 或者 Boot2Docker),然后 Switch to Linux containers 就可以运行 UNIX(linux)命令,当然也支持 Docker 命令:
演示Switch之后的区别(先是 Windows containers,然后是 Linux containers 的效果):
Docker 常用命令及参数:
(1)Docker 镜像命令:
1、Docker 镜像检索:
基于Docker,镜像是可以自己编译的。以前 Docker 的镜像都放在 Docker Hub 上,地址是 https://hub.docker.com/,可以在这里检索 Docker 的镜像。不过:
现在这些东西,都可以在 Docker Store 找,地址是 https://store.docker.com/ 。
除了上述方式,还可以用命令检索:
docker search 镜像名
如docker search redis:
2、镜像下载:
docker pull 检索的镜像名:tag (一般使用stars数最高的;不加版本号tag,则默认下载最新的)
3、列出本地已下载的镜像 —— 镜像列表:
docker images
如下,REPOSITORY 是镜像名,TAG 是版本(latest 最新版),IMAGE ID 是镜像的唯一标识,CREATED 是镜像已创建时间,SIZE 是镜像大小:
4、删除镜像(已停止镜像):
docker rmi IMAGE-ID / REPOSITORY
(2)Docker 容器命令:
1、新建并运行容器:
docker run --name container-name -d image-name //创建运行名为container-name的容器,-d参数表示detached,即容器的创建在后台执行,不影响当前命令行(无需等待);命令返回容器的ID
2、容器列表:
docker ps //查看正在运行中的容器 docker ps -a //查看所有容器
CONTAINER ID 是创建时返回的ID,IMAGE 是该容器使用的镜像,COMMAND 是容器启动时调用的命令,CREATED 是容器已创建时间,STATUS 是容器当前状态,PORTS 是容器运行时所使用的端口号(redis 默认使用 6379 端口),NAMES 是创建容器时定义的名称。
3、启动容器:
docker start container-name / container-id
4、停止容器:
docker stop container-name / container-id
5、端口映射:
容器其实也是一个功能完备的 Linux 操作系统,而 Docker 所在机器(本机)以及其局域网,是不能访问容器中软件所使用的端口的,因此需要将容器中的端口映射到本机的端口上,这样本机才能访问该软件。Docker 的端口映射是通过一个 -p 参数实现的。如下,以 Redis 为例,Redis 的默认端口是 6379,将容器的 6379 端口映射到本机的 6378 端口:
docker run -d -p 8378:6379 --name port-redis redis
结果如下:
而 Windows 下的 Docker 实际上是运行在 Hyper-V 虚拟机中的,即刚才映射的本机是 Windows 下的 Hyper-V 虚拟机,为此需要将 Hyper-V 的虚拟端口再映射到真实机器,使得程序可以访问(当然如果是 Linux 部署 Docker,比如在生产环境 Docker 必然是运行在 Linux 上,那么此时则不会存在这种问题)。
6、删除容器:
docker rm container-id //可以接受多个 id 参数
7、容器日志:
docker logs container-name / container-id
下面的演示将使用 Oracle XE 作为数据库,Redis 作为缓存和 NoSQL 数据库的演示,MongoDB 也是 NoSQL,ActiveMQ、RabbitMQ 和带有管理界面的 RabbitMQ 进行异步消息演示。所以事先下载,以备后用:
docker pull wnameless/oracle-xe-11g docker pull redis docker pull mongo docker pull cloudesire/activemq dcoker pull rabbitmq docker pull rabbit:3-management
下载完毕之后,查看镜像列表: