1. 为什么引入Docker
Docker现在大受追捧,风光无二。Docker是一个轻量级的容器技术,类似于虚拟机技术(xen、kvm、vmware、virtual)。Docker是直接运行在当前操作系统(Linux)之上,而不是运行在虚拟机中,但是也实现了虚拟机技术的资源隔离,性能远远高于虚拟机技术。
Docker支持将软件编译成一个镜像,在这个镜像里做好对软件的各项配置,然后发布这个镜像,使用者可以运行这个镜像,运行中的镜像称之为容器,容器的启动时非常快的,一般都是以秒为单位。
目前各大主流云计算平台都支持Docker容器技术,包括阿里云、百度云平台(资源隔离通过Docker实现)、Cloud Foundry(和Spring一家公司的,目前最成熟也最稳定)、Heroku等等;连微软也实现了在Windows Server及其云平台Azure上支持Docker,这样看来Docker大有统一云计算的趋势。
这里的云计算平台一般指的是PaaS(平台即服务),它是一个这样的云计算:平台提供了存储、数据库、网络、负载均衡、自动扩展等功能,你只需将你的程序交给云计算平台就可以了。你的程序可以是用不同的编程语言开发的,而使用的Docker的云计算平台就是用Docker来实现以上功能及不同程序之间隔离的。
目前主流的软件以及非主流的软件大部分都有人将其封装成Docker镜像,我们只需下载Docker镜像,然后运行镜像就可以快速获得已配置好并且可运行的软件。
Docker并不是为开发测试方便而提供的小工具,而是可以用于实际生产环境的一种极好的部署方式。
2. Docker的安装
2.1 Linux下安装
CentOS安装命令:
sudo yum update
sudo yum install docker
ubuntu安装命令:
sudo apt-get update
sudo apt-get docker.io
2.2 Windows下安装(略)
3. Docker常用命令及参数
基于Docker的镜像是可以自己编译的。通常情况下,Docker的镜像都是放置在Docker的官网上,地址是:https://registry.hub.docker.com
3.1 Docker镜像命令
image.png(1) Docker镜像检索
除了可以在https://registry.hub.docker.com
网站检索Docker镜像外,还可以使用下面的命令进行检索:
docker search 镜像名
例如检索Redis,输入 docker search redis
(2) 镜像下载
docker pull 镜像名
例如下载Redis,输入 docker pull redis
(3) 镜像列表
查看本地镜像列表:
docker images
查看Docker本地镜像列表
其中REPOSITORY
是镜像名,TAG
是版本名,IMAGE ID
是当前镜像的唯一标识,CREATE
是当前镜像的创建时间,SIZE
是当前镜像的大小.
(4)镜像删除
删除指定镜像通过以下命令:
docker rmi image-id|image名称
或者:docker rm image image-id|image名称
image-id是镜像的id
示例:dcoker rmi ubuntu:16.04
根据镜像名称删除镜像
删除所有的镜像:
docker rmi ${docker image -q}
3.2 Docker 容器命令
(1)容器的基本操作
最简单的运行镜像为容器的命令如下:
docker run --name container-name -d image-name
运行一个容器只要通过docker run
命令即可实现,其中,--name代表为容器起的名称,-d表示detached,意味着执行这段命令后控制台将不会被阻碍,可以继续输入命令操作;最后的image-name是要使用哪个镜像来运行容器.
例如来运行一个Redis容器:
docker run --name redis-test -d redis
Docker会为我们的容器生成一个唯一的标识
(2)容器列表
通过下面命令,查看运行中容器列表:
docker ps
如图所示:
其中
CONTAINER_ID
是启动容器的时候生成的ID,IMAGE
是该容器使用的镜像,COMMOND
是容器启动的时候调用的命令,CREATE
是容器的创建时间;STATUS
是当前容器的启动状态;PORTS
是容器系统所使用的端口号,Redis默认使用的6379端口,NAMES
是刚才在启动容器的时候给容器指定的名称(--name后面的),在这里可以看到我们刚刚启动的redis容器--redis-test
通过下面的命令可以查看运行中和停止状态的容器:
docker ps -a
(3)停止和启动容器
- 停止容器
停止容器可以使用下面的命令:
docker stop container-name/container-id
也就是说可以通过指定容器名或者容器的id来停止容器
以停止上面的redis为例:
docker stop redis-test
或者
docker stop 7048692cb777
- 启动容器
启动容器通过以下的命令:
docker start container-name/container-id
再次启动我们刚刚停止的redis容器
docker start redis-test
注意:运行镜像为容器的命令和运行停止的容器的命令,一个是docker run
,一个是docker start
- 端口映射
Docker容器中运行的软件所使用的端口,在本机和本机的局域网是不能访问的,所以我们就需要将Docker容器中的端口映射到当前主机的端口上,这样就可以在本机和本机所在的局域网就能够访问该软件了.
Dokcer的端口映射是通过一个-p
参数来实现的。我们以刚才的redis为例,映射容器的6379端口到本机(docker的宿主机)的6378端口,命令如下:
docker run -d -p 6378:6379 --name port-redis redis
-d
指的是以守护态运行,因为很多情况下需要让容器在后台运行而不是直接把执行命令的结果输出在当前的宿主机下(控制台)
-p
指定端口
--name
指定容器名
- 删除容器
删除单个容器:
docker rm container-id
删除所有容器的命令:
docker rm ${docker ps -a -q}
- 容器日志
查看当前容器日志的命令:
docker
- 登录容器(进入容器)
运行中的容器其实是一个功能完备的Linux操作系统,所以我们可以像常规的的操作系统一样登录并访问容器。
我们可以使用下面的命令,登录访问当前运行中的容器,登录后我们可以在容器中进行常规的Linux系统操作指令,还可以使用exit
命令退出登录
docker exec -it container-id/container-name bash
-it
:这是两个命令,i
指的是交互式操作,-t
指的是终端,这里我们是进入bash
执行一些命令,并查看返回结果,因此我们需要交互式终端.(可以简单理解为:主线程是阻塞式的(相当于java中的main线程,而工作线程相当于我们new了一个Thread并start,工作线程的运行我们是交互不了的,而这里的交互式终端就是运行了这个容器))。注意 docker run 是启动一个镜像为容器,对于同一个image,每次docker run的时候启动的是不同的容器。
示例:
doker run -it -rm ubuntu:16.04 bash
以交互式终端的方式运行名为ubuntu:16.04的镜像为一个容器,-rm表示当退出容器的时候,删除该容器, bash指的是我们希望有个交互式的shell,因此用的是bash
拓展:镜像相当于java中的类,而容器相当于创建出来的对象,容器启动以后,相当于在内存中创建了一个对象,当容器退出的时候,这个对象的状态变了,并且可以发现容器运行时和停止时他们的container_id
是不一样的.有的时候为了节约空间,在容器停止的时候就将次容器删除掉,所以就会在run
的时候加上-rm
的指令
参考:https://www.funtl.com/zh/docker 强烈推荐
参考:《Spring Boot实战》,感兴趣的可以阅读下这本书,强烈推荐。
网友评论