介绍
在Linux服务器部署一个单体JavaWeb应用,一般会在服务器安装Tomcat、MySql、Redis、JDK等相关环境或软件,安装完软件之后需要进行相关配置,最后把项目打成War包,放在服务器进行部署。这样有几个缺点,那就是面对黑糊糊的命令行,如果想部署成功需要一定的Linux知识储备,再者就是如果我们想在另一台服务器上部署,也需要重复刚刚的下载软件、配置环境、部署,极为繁琐。而Docker作为一门容器技术,很好的解决这一问题。
我们只需要在一台Linux机器上完成软件的安装和配置,然后把他们做成镜像,MySQL做成MySQL-Docker镜像,Tomcat做成Tomcat-Docker镜像。当我们在另一台Linux服务器
安装的时候只需要安装Docker这个软件,然后把镜像拿过来运行即可,这个镜像就成了一个容器。容器启动是非常快速的。类似windows里面的ghost操作系统,安装好后什么都有了,这样就降低了对linux操作的难度。
原理
:
和宿主机共享内核,所有容器运行在容器引擎之上,容器并非一个完整的操作系统,所有容器共享操作系统,在进程级
进行隔离
根据操作系统的不同,可以通过shell或者远程桌面进行
不同与传统容器,docker早起基于LXC,后来基于自研的libContainer,docker对于传统容器做了许多优化,如下:
- 跨平台的可移植性
- 面向应用
- 版本控制
- 组件复用
- 共享性
- 工具生态系统
Docker采用了C/S架构,分为Docker客户端(Docker可执行程序)与Docker守护进程,Docker客户端通过命令行和API的形式与Docker守护进程进行通信,Docker守护进程则提供Docker服务。因此,我们操作的各种docker命令实际上都是由docker客户端发送到docker守护进程上去执行。我们在构建
一个镜像时,不可避免的需要将一些本地文件拷贝到镜像中,用户在构建镜像时,需要指定构建镜像的上下文路径(即前文的.),docker build在获得这个路径之后,会将路径下的所有内容打包,然后上传给Docker引擎
docker应用场景
- 加速本地开发
- 自动打包和部署应用
- 创建轻量、私有的PaaS环境
- 自动化测试和持续集成/部署
- 部署并扩展Web应用、数据库和后端服务器
Docker的核心概念
docker镜像(Images):Docker 镜像是用于创建Docker 容器的 模板。
docker容器(Container):容器是独立运行的一个或一组应用。
docker客户端(Client):客户端通过命令行或者其他工具使用 Docker API 与Docker
的守护进程通信
docker主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器
docker仓库(Registry):Docker 仓库用来保存镜像,可以理解 为代码控制中的代码仓
库,Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用
docker容器查看命令
docker中的容器就是一个轻量级的虚拟机,是镜像运行起来的一个状态
如果需要查看所有容器,则可以通过docker ps -a命令查看
使用docker ps -l可以查看最近创建的容器
可以使用docker ps -n=XXX来查看最新创建的n个容器
如果开发者需要既创建又启动容器,则可以使用docker run命令。docker run命令又可以启动两种不同模式的容器:后台型容器和交互型容器,顾名思义,后台型容器就是一个在后台运行的容器,默默的在后台执行计算就行了,不需要和开发者进行交互,而交互型容器则需要接收开发者的输入进行处理给出反馈。对于开发者而言,大部分情况下创建的都是后台型容器,不过在很多时候,即使是后台型容器也不可避免的需要进行交互,下面分别来看。
docker run --name nginx1 -d -p 8080:80 nginx
–name含义和上文一样,表示创建的容器的名字,-d表示容器在后台运行,-p表示将容器的80端口映射到宿主
机的8080端口,创建过程如下图:
首先依然会去本地检查,本地没有相应的容器,则会去Docker Hub上查找,查找到了下载并运行,并且生
成了一个容器id。运行成功后,在浏览器中输http://localhost:8080就能看到Nginx的默认页面了
docker run --name ubuntu -it ubuntu /bin/bash
-it参数,i表示开发容器的标准输入(STDIN),t则表示告诉docker,为容器创建一个命令行终端。执行结果如下
docker stop命令可以终止一个容器,如下:
可以通过docker rm命令删除一个容器。删除容器时,只能删除已经停止运行的容器,不能删除正在运行的容器
容器也可以批量删除,命令如下:
docker rm $(docker ps -a -q)
docker ps -a -q会列出所有容器的id,供rm命令删除。
如下命令也支持删除已退出的孤立的容器:
docker container prune
docker attach
依附容器这个主要是针对交互型容器而言的,该命令有一定的局限性,可以作为了解。
通过docker inspect命令查看容器的详细信息,这些详细信息包括容器的id、容器名、环境变量、运行命令、主机配置、网络配置以及数据卷配置等信息
使用docker top命令可以查看容器中正在运行的进程,首先确保容器已经启动,然后执行docker top命令
如果要查看日志,则可以使用docker提供的docker logs
使用export命令可以导出容器,具体操作如下:
- 创建一个容器,进行基本的配置操作
本案例中我首先创建一个nginx容器,然后启动,启动成功后,将本地一个index.html文件上传到容器中,修改nginx首页的显示内容。具体操作步骤如下
容器导入成功后,就可以使用docker run命令运行了。
可以通过docker images命令查看本地所有镜像
镜像可以通过docker rmi命令进行删除,参数为镜像的id或者镜像名,参数可以有多个,多个参数之间用空
格隔开。如下:
镜像
镜像的体系结构
镜像的体系结构
镜像的最底层是一个启动文件系统(bootfs)镜像,bootfs的上层镜像叫做根镜像,一般来说,根镜像是一个操作系统,例如Ubuntu、CentOS等,用户的镜像必须构建于根镜像之上,在根镜像之上,用户可以构建出各种各样的其他镜像。
从上面的介绍读者可以看出,镜像的本质其实就是一系列文件的集合,一层套一层的结构有点类似于Git。
通过docker run命令指定一个容器创建镜像时,实际上是在该镜像之上创建一个空的可读写的文件系统层级,
可以将这个文件系统层级当成一个临时的镜像来对待,而命令中所指的模版镜像则可以称之为父镜像。父镜像的内容都是以只读的方式挂载进来的,容器会读取共享父镜像的内容,用户所做的所有修改都是在文件系统中,不会对父镜像造成任何影响。当然用户可以通过其他一些手段使修改持久化到父镜像中。