html
在实际生产环境中,虚拟化技术主要解决的是高性能的物理硬件性能过生和低性能硬件产能太低的重组重用,达到最大化的利用物理硬件,充分发挥其最大的做用mysql
虚拟化技术的种类有不少,好比软件虚拟化,内存虚拟化,服务虚拟化,虚拟机等,好比VMwarelinux
Docker是实现轻量级的操做系统虚拟化解决方案,基于Linux容器nginx
特别适用于微服务架构,咱们也知道微服务架构是将一个应用拆成十几个微服务项目,Docker的容器就特别迎合这种部署架构; git
一台宿主机能够建立多个Docker容器,每一个容器互不影响,相互隔离,分别部署微服务架构的多个应用,尽量的利用系统资源github
Docker容器是在操做系统层面上实现虚拟化,复用本地主机的操做系统,至关于调用一个应用同样,只要你有一个docker引擎,就能把本地操做系统复刻一个出来,固然系统仍是只有一个系统web
传统的虚拟机则是在硬件层面实现,在物理机上虚拟一个其余的系统,占用不少的内存,好比安装一个管理虚拟机的软件VMware,在Windows上经过虚拟机搭建Linux或者其余的环境,搭建的环境和本地操做系统是没有任何关系的redis
传统的虚拟机的启动和一个物理机的启动速度一致,比较慢且占大量内存,Docker容器技术并非构建一个新的操做系统,而是调用本地的操做系统,因此启动速度比较快,且只占用小量的内存空间sql
Docker是一个C/S架构程序(客服端-服务器),Docker客户端只须要向Docker服务器或守护线程发起请求,实现对Docker容器的管理,咱们能够在一台机器上运行Docker的守护程序和客户端,也能够本地客户端链接远程Docker守护线程,实现远程管理docker
镜像
镜像是构建Docker的基石,用户基于镜像来运行本身的容器,镜像的体积很小,易于分享、储存、更新,咱们这样理解或许会好不少,镜像就是一个面向Docker引擎的只读模版,包含了文件系统,好比咱们在装Windows系统时,经过镜像来安装的话,这个镜像能够只是一个干净的只有操做系统的镜像,也能够是安装了360全家桶等程序的不干净镜像,它将特定的一系列文件按照必定的格式制做成单一的文件,便于下载和使用
Docker容器
一个Docker容器简单来讲,包含三个东西:
一个镜像
一些列标准操做
一个执行环境
经过这张图,就能知晓容器的意义:
容器就像是一个轮船,上面装载了不少的软件,每个软件当作一个集装箱,Docker使用Registry来保存用户构建的镜像,Registry分为公共和私有的两种,Docker公司运营的是Docker Hub,就像github同样的,咱们能够在上面分享下载相关的镜像(速度超级慢!),私有的Registry须要咱们本身构建
环境CentOS7.X以上版本阿里云站点下载: http://mirrors.aliyun.com/centos/
而后再给一个CentOS7.X以上版本的网络环境配置指南:http://www.javashuo.com/article/p-rulcduay-hw.html
通常Docker都是挂载在CentOS7版本以上,6版本环境补全且不少补丁不支持更新
yum包更新到最新:sudo yum update
安装须要的软件包:sudo yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看Docker版本: yum list docker-ce --showduplicates | sort -r
默认安装最新免费版Docker: sudo yum install docker-ce
查看安装的docker版本:docker -v
直接去国外获取镜像特别慢,咱们须要设置国内的源,ustc是一个Linux镜像服务提供者,是一个不须要注册的公共服务
我这里出了一点小问题,没有默认的docker的daemon.json配置文件,touch daemon.json建立之
而后在文件中配置以下数据: vi /etc/docker/daemon.json
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}
保存后重启便可:systemctl restart docker
systemctl命令是系统服务管理指令
启动docker:systemctl start docker
中止docker:sysemctl stop docker
docker状态:systemctl status docker
重启docker:systemctl restart docker
开启启动docker:systemctl enable docker
docker概要信息: docker info
docker帮助文档:docker --help
刚开始建立的Docker,本地是没有任何镜像的,因此下面没有数据
查看本地镜像,就有tomcat的镜像了
以前咱们拉取一个Tomcat镜像到本地,如今咱们不想要它了,将其删除便可
docker rmi 365b0a528e2e 或者 docker rmi tomcat
查看当前正在运行的容器:docker ps
查看全部的容器:docker ps -a
查看中止的容器:docker ps -f status=exited
建立容器的经常使用参数说明:
建立容器的命令: docler run
-i:表示运行容器
-t:表示容器启动后会登陆容器进去到其命令行,至关于一个伪终端
--name:为建立的容器命名
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录)
可使用多个-v作多个目录或者文件映射,
注意:最好作目录映射,在宿主机上作修改共享到容器中
-d:在run后跟-d,就会建立一个守护式容器在后台运行(这样建立容器不会自动登陆容器)
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口,可使用多个-p作多个端口映射
建立:docker run -it --name=容器名称 镜像名称:标签 /bin/bash
若是镜像的标签是latest,能够不用标明,写一个镜像名称便可
下面咱们建立一个包含了centos镜像的容器:
另开一个Linux链接终端,查看当前正在运行的容器:发现该容器
退出当前容器,容器也会关闭:exit
建立:docker run -di --name=容器名称 镜像名称:标签
登陆:docker exec -it 容器名称(Name or ID) /bin/bash
退出仍是:exit
只不过咱们知识退出了那个伪终端,容器仍是运行着的,效果自测
启动: docker start 容器(Name or ID)
中止:docker stop 容器(Name or ID)
有时候咱们须要将文件拷贝到容器里去的需求,全程无需登陆容器
docker cp 目标文件或文件夹 容器名称:容器目录
固然也能够从容器内拷贝数据出来
docker cp 容器名称:容器目录 指定资源存放路径
咱们在建立容器的时候,将宿主机的目录与容器内的目录进行映射,这样咱们就尅经过修改宿主机上某个目录的文件从而实现对容器内想映射的文件的数据
建立容器时建立文件/文件夹映射:docker run -di --name=mycentos3 -v /usr/my.txt:/usr/my.txt centos
登陆容器观察变化docker exec -it mydentos3 /bin/bash
咱们在宿主机上修改my.txt,便可实现对容器内my.txt数据的修改
注意事项:若是挂载的是多级目录,可能会有权限不足的警告
咱们能够经过下面的命令来查看容器运行的各类数据:docker inspect 容器(Name or ID)
固然上面的信息太多了,通常咱们就提取一个ip最为经常使用:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos3
前面均为固定格式,最后指定那个容器便可
删除容器:docker rm 容器(Name or ID)
删除镜像:docker rmi 镜像(Name or ID)
这里说一下,当咱们的镜像正在被某个运行着的容器使用着的时候是不能删除的,须要关闭相关的容器才能删除该镜像
拉取镜像:docker pull centos/mysql-57-centos7
建立容器:docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
-p:端口映射,位于前面的是宿主机的端口,处于后面的是容器里的端口
-e:表明添加环境变量,设置Mysql的Root用户的登录密码
进入到MySQL容器: docker exec -it mysql /bin/bash
登陆到MySQL
bash-4.2$ mysql -uroot -p Enter password: (不用键入密码,回车便可)
SQLYog链接MySQL试试:
仍是和上面一致,首先搜索Tomcat :docker search tomcat
拉取最上面的那个tomcat镜像到本地:docker pull tomcat
建立容器:docker run -di --name=myTomcat -p 8080:8080 -v /usr/local/wabapps:/usr/local/tomcat/webapps tomcat
这里作一个说明 -v是文件挂载,咱们只须要将war包丢在宿主机下的/usr/local/wabapps目录便可对容器内的Tomcat起做用
/usr/local/tomcat/webapps:是Docker容器Tomcat的安装目录
为了方便测试,咱们丢一个war包到宿主机的/usr/local/wabapps下
打开浏览器访问便可:OK
到这里我相信你们闭着眼都知道怎么操做了吧?
首先对咱们安装的环境进行搜索:docker search nginx
拉取镜像到本地 :docker pull nginx
建立运行容器对外提供服务 :docker run -di --name=myNginx -p 80:80 nginx
固然到这里还没完,否则我也不会写出来了,Nginx还有一些须要特别注意的事项
如今环境却是安装好了,Ngin如何对咱们的静态资源进行代理?CP拷贝?Nginx配置文件不配?
首先咱们进入到Nginx容器:
看一下这个配置文件呢?
先赋值一个副本出来,以防万一。咱们在副本中动手脚
到这里咱们就能够动点脑袋了,如何才能对资源进行动态代理呢?将咱们的资源拷贝到/usr/share/nginx/html/下?
咱们经过cp拷贝一个index.页面到 /usr/share/nginx/html/试试?
循序渐进,天黑请闭眼
首先对咱们安装的环境进行搜索:docker search redis
拉取镜像到本地 :docker pull redis
建立运行容器对外提供服务 :docker run -di --name=myRedis -p 6379:6379 redis
就不作过测试了,这个没什么好说的,咱们使用客户端链接一下便可:
当咱们将该容器保存为镜像的时候,该容器的数据仍是一五一十的所有存在的
docker commit 容器(Name or Id) 生成的镜像Name
docker save -o mynginx.tar mynginx_i
为了作测试,咱们就想myNginx这个容器和与之相关的镜像都删掉,而后经过mynginx.tar 去建立新的镜像和容器
再补上一步,删除咱们容器保存下来的镜像:docker rmi mynginx_i
而后咱们经过以前备份的镜像文件 mynginx.tar试图恢复:docker load -i mynginx.tar
镜像已经恢复,咱们建立容器用它建立容器,再次提供服务试试:
docker run -di --name=myNginx -p 888:80 mynginx_i
Dockerfile就是一系列命令和参数构成的脚本,在基础镜像建立新镜像的时候被运用,提及来可能有点抽象,下面咱们演示一下,你就会尤为有深入的印象
先把经常使用的命令记下来,后面在解释:
命令 | 解释 |
---|---|
FROM 镜像:tag | 定义了使用那个基础镜像构建新的镜像 |
MAINTAINER user_name | 声明镜像的建立者 |
ENV key value | 设置环境变量,能够写多条 |
RUN command | 是Dockerfile和核心部分,能够写多条,在容器内会被执行 |
ADD file file | 将宿主机上的文件复制到容器内,若是是压缩文件,会自动解压 |
COPY file file | 和ADD类似,区别在于若是是压缩文件,不会自动解压 |
WORKDIR pathDir | 设置工做目录 |
EXPOSE port1 port2 | 指定端口,使容器内的应用能够和外界进行交互 |
CMD argument | 在构建容器时,会被docker run 后的argument覆盖 |
ENTRYPOINT argument | 和CMD类似,但不会被docker run后指定的参数覆盖 |
VOLUME | 将本地文件夹或者其余容器的文件挂在到容器中 |
首先咱们上传咱们的jdk8到Linux上,我把它上传到:/usr/local/jdk8/ 下
而后咱们对其进行解压,得到它解压后的名称后便可删掉解压了得文件,留下压缩包便可
建立一个固定文件名的Dockerfile文件,做为脚本文件,并键入数据:
保存退出,执行如下命令,经过这个脚本建立
新的镜像: docker build -t='jdk1.8' .
docker build :构建命令
-t=' ' :给建立的新镜像命名
. :指定Dockerfile的路径, .表示在当前路径下
而后就报错了:没有这个文件或者文件夹?而后我又试着修改了一下
再次构建试试:构建成功了一个基于Centos环境基础的带有jdk的镜像
dockerhub用于托管一些共同的镜像,就想github同样,通常在企业中都是不会将代码托管到开放到公共的平台上,这个时候,咱们都会搭建一个私服,用于存放咱们本身自定义的一些数据,一方面是为了安全,另外一方面是想完成小范围的共享;
在docker容器中运行原生的私有仓库:
docker pull registry
运行仓库:
docker run -di --name=regirstry -p 5000:5000 regirstry
私有仓库就算是搭建完成了,咱们能够启动浏览器测试一番:看到这里私有仓库就算搭建完成了
修改daemon.json。让docker信任私有仓库地址
vi /etc/docker/daemon.json,上一条数据是咱们的的镜像源地址
重启Docker服务便可完成
在本地镜像的上传以前,咱们须要将registry服务开起来:
docker start registry
上传第一步:打标签,标记此镜像为私有仓库的镜像
docker tag jdk1.8 192.168.159.189:5000/jdk1.8
上传第二部:推送到私服
docker push 192.168.159.189:5000/jdk1.8
经过浏览器,查看:镜像推送成功
当咱们想要下载该镜像的时候,记得修改daemon.json对该私服的信任,重启docker
docker pull 192.168.159.189:5000/jdk1.8便可完成下载