Docker简介
Docker是一个轻量级容器技术,类似于虚拟机技术(xen、kvm、vmware、virtual)。Docker是直接运行在当前操作系统(Linux)之上,而不是运行在虚拟机中,但是也实现了虚拟机技术的资源隔离,性能远远高于虚拟机技术。
Docker的三大核心:镜像、容器、仓库。
Docker支持将软件编译成一个镜像(image),在这个镜像里做好对软件的各种配置,然后发布这个镜像,使用者可以运行这个镜像,运行中的镜像称之为容器(container),容器的启动是非常快的,一般都是以秒为单位。这个有点像我们平时安装ghost操作系统?系统安装好后软件都有了,虽然完全不是一种东西,但是思路是类似的。
目前各大主流云计算平台都支持Docker容器技术,包括阿里云、百度云平台(资源隔离通过Docker实现)、Cloud Foundry(和Spring一家公司的,目前最成熟也最稳定)、HeroKu、DigitalOcean、OpenShift(JBoss的)、Apache Stratos、Apache MesOS(批处理平台,支持搭建基于Docker的云平台)、Deis(开源PaaS平台);连微软也会在下一个版本的Windows Server及其云平台Azure上支持Docker,这样看来Docker大有统一云计算的趋势。
这里的云计算平台一般指的是PaaS(平台即服务),它是一个这样的云计算:平台提供了存储、数据库、网络、负载均衡、自动扩展等功能,你只需将你的程序交给云计算平台就可以了。你的程序可以是用不同的编程语言开发的,而使用的Docker的云计算平台就是用Docker来实现以上功能及不同程序之间的隔离的。
目前主流的软件以及非主流的软件大部分都有人将其封装成Docker镜像,我们只需下载Docker镜像,然后运行镜像就可以快速获得已做好配置可运行的软件。
另外要特别指出的是,Docker并不是为开发测试方便而提供的小工具,而是可以用于实际生产环境的一种极好的部署方式。
1 Docker的安装
因为Docker的运行原理是基于Linux的,所以Docker只能在Linux下运行。不要紧张,这只能说明在真正的生产环节下,基于Docker的部署只能在Linux上,但是我们在开发测试的时候,Docker是可以在Windows以及Mac OS X系统下的,运行的原理是启动一个VirtualBox虚拟机,在此虚拟机里运行Docker。
Linux下安装
CentOS安装命令:
- sudo yum update
- sudo yum install docker
Ubuntu:
- sudo apt-get update
- sudo apt-get docker.io
Windows下安装
参考《JavaEE开发的颠覆者: Spring Boot实战》 8.1.1
启动Docker
我们可以通过service命令来启动docker,如:
[root@localhost ~]# service docker start
Redirecting to /bin/systemctl start docker.service
如果要开机启动则需要systemctl命令,如:
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
2 Docker常用命令及参数
1.Docker镜像命令
基于Docker镜像是可以自己编译的,我们将在10.3节讲解如何编译自己的Docker镜像,本节我们讲述与Docker镜像操作相关的命令。
通常情况下,Docker的镜像都放置在Docker官网的Docker Hub上,地址是https://registry.hub.docker.com
(1)Docker镜像检索
除了可以在https://registry.hub.docker.com网站检索镜像以外,还可以用下面命令检索:
docker search 镜像名
检索Redis,输入:
docker search redis
(2)镜像下载
下载镜像通过下面命令实现:
docker pull 镜像名
下载Redis镜像,运行:
docker pull redis
如果要获取某个指定的版本直接在后面跟上版本号,如:
docker pull redis:3.0.7
这根据据网络情况可能要这根据据网络情况可能要花费一段时间。
(3)镜像列表
查看本地镜像列表,如图所示,通过下面命令:
docker images
其中REPOSITORY是镜像名;TAG是软件版本,latest为最新版;IMAGE ID是当前镜像的唯一标识;CREATED是当前镜像创建时间;VIRTUAL SIZE是当前镜像的大小。
(4)镜像删除
删除指定镜像通过下面命令:
docker rmi image-id
删除所有镜像通过下面命令:
docker rmi $(docker images -q)
2.Docker容器命令
(1)容器基本操作
最简单的运行镜像为容器的命令如下:
docker run --name container-name -d image-name
但是最好运行的时候就把端接口加上,如:
docker run -d -p [本机端口]:[docker服务器端口] --name container-name image-name
运行一个容器只要通过Docker run命令即可实现。
- --name参数:是为容器取得名称;
- -d:表示detached,意味着执行完这句命令后控制台将不会被阻碍,可继续输入命令操作;
- image-name:是要使用哪个镜像来运行容器。
- -p:端口映射
- 本机端口:对外暴露的端口
- docker服务器端口: 各各应用占用的端口,比如redis占用6379
我们来运行一个Redis容器:
docker run --name test-redis -d redis
Docker会为我们的容器生成唯一的标识。
(2)容器列表
通过下面命令,查看运行中的容器列表,如图所示。
docker ps
其中CONTAINER ID是在启动的时候生成的ID;IMAGE是该容器使用的镜像;COMMAND是容器启动时调用的命令;CREATED是容器创建时间;STATUS是当前容器的状态;PORTS是容器系统所使用的端口号,Redis默认使用6379端口;NAMES是刚才给容器定义的名称。
通过下列命令可查看运行和停止状态的容器:
docker ps -a
(3)停止和启动容器
1)停止容器
停止容器通过下面的命令:
docker stop container-name/container-id
我们可以通过容器名称或者容器id来停止容器,以停止上面的Redis容器为例:
docker stop test-redis
此时运行中的容器列表为空。查看所有容器命令,可看出此时的STATUS为退出。
2)启动容器
启动容器通过下面命令:
docker start container-name/container-id
再次启动我们刚才停止的容器:
docker start test-redis
(4)端口映射
Docker容器中运行的软件所使用的端口,在本机和本机的局域网是不能访问的,所以我们需要将Docker容器中的端口映射到当前主机的端口上,这样我们在本机和本机所在的局域网就能够访问该软件了。
Docker的端口映射是通过一个-p参数来实现的。我们以刚才的Redis为例,映射容器的6379端口到本机的6378端口,命令如下:
docker run -d -p 6378:6379 --name port-redis redis
如果要映射多个端口就多设置一个-p参数,如启动rabbitMQ命令:
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq
目前在Windows下运行的Docker其实是运行在VirtualBox虚拟机中的,即我们当前的本机并不是我们当前的开发机器,而是VirtualBox虚拟机,所以我们还需要再做一次端口映射,将VirtualBox虚拟的端口映射到当前的开发机器。这部分内容将在实际部署软件的时候进行演示。
(5)删除容器
删除单个容器,可通过下面的命令:
docker rm container-id
删除所有容器,可通过下面的命令:
docker rm $(docker ps -a -q)
(6)容器日志
查看当前容器日志,可通过下面的命令:
docker logs container-name/container-id
我们查看下上面一个容器的日志,如图所示,命令如下:
docker logs port-redis
// 翻页查看
docker logs port-redis | less
【| less】模式下:回车键翻页,q键是退出。
(7)登录容器
运行中的容器其实是一个功能完备的Linux操作系统,所以我们可以像常规的系统一样登录并访问容器。
我们可以使用下面命令,登录访问当前容器,登录后我们可以在容器中进行常规的Linux系统操作命令,还可以使用exit命令退出登录。
docker exec -it container-id/container-name bash
(8)导出镜像
docker save -o redis-latest.tar redis:latest
(9)从文件中加载镜像
docker load -i redis-latest.tar
示例 Docker 官网 MYsql镜像运用
https://hub.docker.com/_/mysql/
1 启动mysql实例
docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
- some-mysql: 容器别名
- my-secret-pw:初始化设置的root用户的密码
- tag:mysql的版本,不写默认使用最新版
- -p 3306:3306:表示在这个容器中使用3306端口(第二个)映射到本机的端口号也为3306(第一个)
2 连接到mysql实例
2.1 连接到本地mysql
docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
2.1 连接其他地方的mysql
docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p
3 切换到容器shell中
docker exec -it some-mysql bash
退出输入:
exit
4 查看日志
docker logs some-mysql