docker到底是什么?
- docker是世界领先的软件容器平台,基于GO语言进行开发实现
- docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放开发人员
- 用户可以方便地创建和使用容器,把自己的应用放入容器,容器还可以进行版本管理,复制,分享,修改,就像管理普通的代码一样
- docker可以对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器
为什么要使用docker
docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销低
传统的开发流程中,我们的项目通常需要使用Mysql,Redis等环境,这些环境都是需要我们手动去进行下载并配置的,安装配置流程极其复杂,而且不同操作下的操作也不一样。
docker的出现完美地解决了这一问题,我们可以在容器中安装mysql。redis等软件环境,使得应用和环境架构分开,它的优势在于:
- 一致的运行环境,能够更轻松地迁移
- 对进程进行封装隔离,容器与容器之间互不影响,更高效地利用系统资源
- 可以通过镜像复制多个一致的容器
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
linux中安装docker centos7 为例
plain
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
安装完成后直接启动服务:
plain
systemctl start docker
推荐设置开机自启,执行指令 :
plain
systemtl enable docker
Docker中的几个概念
镜像
镜像就是一个只读模版,镜像可以用来创建docker容器,一个镜像可以创建多个容器
容器
容器是用镜像创建的运行实例,Docker利用容器独立运行一个或一组应用。它可以被启动,开始,停止,删除,每个容器都是相互隔离的,保证安全的平台。可以把容器看作是一个简易的linux环境和运行在其中的应用程序,容器的定义和镜像几乎一模一样。也是一堆层的统一视角。唯一区别在于容器的最上面那一层是可读可写的
仓库
仓库是集中存放镜像文件的场所。仓库和仓库注册服务器是有去别的,仓库注册服务器上往往放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。仓库分为公开仓库和私有仓库两种,最大的公开仓库是DockerHub,存放了数量庞大的镜像供用户下载,国内的公开仓库有阿里云,网易云等
总结
一个镜像代表一个软件;而基于某个镜像运行就是生成一个程序实例,这个程序实例就是容器;而仓库是用来存储Docker中所有镜像的
其中仓库又分为远程仓库和本地仓库,第一次访问依赖时,将其下载到本地仓库,第二次,第三次使用时直接用本地仓库的依赖即可
Docker初体验
可以去访问DockerHubhttps://hub.docker.com/open in new window
搜索想要下载的镜像,找到下载的指令
例如mysql的指令:
plain
docker pull MySQL
该指令会下载MySQL镜像的最新版本
docker镜像指令
查看docker中当前拥有哪些镜像:
plain
docker images
查询指定镜像名:
plain
docker images MySQL
-q表示仅显示镜像的id:
plain
docker images -q
下载镜像使用:
plain
docker pull MySQL:5.7
未指定则下载最新的
删除镜像使用指令 :
plain
docker images rm MySQL
还可以通过指定镜像id进行删除。
在删除之前应该先让容器停止
也可以进行强制执行删除
plain
docker iamges rm -f id
该指令会将镜像和通过该镜像执行的容器全部删除,谨慎使用
docker容器指令
容器是基于镜像的
若需要通过镜像运行一个容器,则使用:
plain
docker run tomcat:8.0-jre8
如果没有这个镜像
所有就先去下载一个镜像
plain
docker pull tomcat:8.0-jre8
下载完成之后就可以运行了,运行后查看一下当前运行的容器:docker ps
通过该方式运行的tomcat是不能直接被外部访问的,因为容器具有隔离性,若是想直接通过8080端口访问容器内部的tomcat,则需要对宿主机端口与容器内的端口进行映射:
plain
docker run -p 8080:8080 tomcat:8.0-jre8
解释一下这两个端口的作用(8080:8080),第一个8080为宿主机端口,第二个8080为容器内的端口,外部访问8080端口就会通过映射访问容器内的8080端口。
此时外部就可以访问Tomcat了:
若是这样进行映射:
plain
docker run -p 8088:8080 tomcat:8.0-jre8
则外部需访问8088端口才能访问tomcat,需要注意的是,每次运行的容器都是相互独立的,所以同时运行多个tomcat容器并不会产生端口的冲突。
容器还能够以后台的方式运行,这样就不会占用终端:
plain
docker run -d -p 8080:8080 tomcat:8.0-jre8
启动容器时默认会给容器一个名称,但这个名称其实是可以设置的,使用指令:
plain
docker run -d -p 8080:8080 --name tomcat01 tomcat:8.0-jre8
此时的容器名称即为tomcat01,容器名称必须是唯一的
该参数会将运行和非运行的容器全部列举出来:
plain
docker ps -a
接下来是容器的开始,停止,重启指令,因为非常简单,
plain
docker start xxx
docker restart xxx
docker stop xxx
docker kill xxx
docker rm xxx
docker rm -f xxx
查看容器的日志
plain
docker logs xxx
查看实时的日志
plain
docker logs -f xxx
通过-t参数还能够显示日志的时间戳,通常与-f参数联合使用
plain
docker logs -ft xxx
查看容器内运行了哪些进程可以使用指令:
plain
docker top xxx
若想与容器进行交互,则使用指令:
plain
docker exec -it xxx bash
此时终端将会进入容器内部,执行的指令都将在容器中生效
若退出则使用exit
下面将介绍如何在容器中部署一个项目
plain
docker cp ./test.html xxx:/usr/local/tomcat/webapps
通过docker cp 指令能够将文件从Centos复制到容器中,./test.html为centos中的资源路径,xxx为容器id,/usr/local/tomcat/webapps 为容器的资源路径,此时test.html文件将会被复制到该路径下
plain
docker exec -it xxx bash
cd webapps
ls
若是想见容器内的文件复制到centos中,则反过来写即可
plain
docker cp xxx:usr/local/tomcat/webapps/test.html./
所以现在若是想要部署项目,则先将项目上传到centos,然后将项目从centos复制到容器内,此时启动容器即可
看似使用docker中启动软件环境非常简单,但是同时也面临着一个问题,我们无法知晓容器内部具体细节,比如监听的端口,绑定的ip地址等
我们可以使用
plain
docker inspect xxx
docker数据卷
学习了容器的相关指令之后,我们来学习一下docker中的数据卷,它能够实现宿主机与容器之间的文件共享,它的好处在于我们对宿主机的文件进行修改将直接影响容器,而无需再将宿主机的文件再复制到容器中
若是想将宿主机中/opt/apps目录与容器中webapps目录做一个数据卷,则应该这样编写指令:
plain
docker run -d -p 8080:8080 --name tomcat01 -v /opt/apps:/usr/local/tomcat/webapps tomcat:8.0-jre8
若此时发现无法访问,这就说明我们的设置成功了。docker会将容器内的webapps目录与/opt/apps目录进行同步,而此时/opt/apps目录是空的,导致webapps目录也会变成空目录,所以无法访问
此时我们只需要向/opt/apps目录下添加文件,就会使得webapps目录也会拥有相同的文件,达到文件共享。
这种方式设置的数据卷称为自定义数据卷,因为数据卷的目录是我们自己设置的
docker还为我们提供了另一种设置数据卷的方式 :
plain
docker run -d -p 8080:8080 --name tomcat01 -v aa:/usr/local/tomcat/webapps tomcat:8.0-jre8
此时的aa并不是数据卷的目录而是数据卷的别名,docker会自动为我们创建一个名为aa的数据卷,并且会将容器内webapps目录下所有的内容复制到数据卷中,该数据卷的位置在/var/lib/docker/volumes目录下:
此时我们只需要修改该目录的内用就能够影响到容器
最后再介绍几个容器和镜像相关的指令:
plain
docker commit -m '描述信息' -a '镜像作者' tomcat01 my_tomcat:1.0
该指令能够将容器打包成一个镜像,此时查询docker中的镜像将会看到自己的镜像
若想将镜像备份出来,则可以使用指令:
plain
docker save my_tomcat:1.0 -0 my-tomact-1.0.tar
拥有.tar格式的镜像,如何加载到docker中呢?
plain
docker load -i my-tomcat-1.0.tar