docker学习
在老系统的部署过程中,我们通常是把项目打成war包放在Linux服务器运行,我们知道Linux是个操作系统,它太过于笨重,如果发一台机器还好,如果我们要将这个项目发布到N多台机器,那么我们是否需要在每个机器上都进行相同的步骤,并且要进行环境兼容性的测试。其次Linux既然是个操作系统,它就可以装许多软件,如果部署的项目和这些软件互相干扰怎么办?docker的出现就为我们解决了这一个问题。
一、docker简介
上面是百度百科对docker的介绍,书面的话都很难理解,从应用的角度来看,docker就是相当于我们部署项目的虚拟机,但是docker缺不是虚拟机,我们来看看docker与虚拟机的区别:
虚拟机:
docker:
从上面的图我们可以看出,docker和虚拟机最大的区别就是docker不是一个操作系统级,docker更像是一个软件,这个软件可以安装我们写好的程序和第三方的组件如:redis。docker本质就是一个应用,一个Linux服务器中可以安装多个docker应用。
二、docker的三大核心
1.镜像
Docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker容器启动是需要的一些文件,而这些文件就可以称为Docker镜像。
简单的来说,镜像就是操作系统的环境,再简单点,如:redis镜像。说到这里大概就明白了吧。
docker官网为我们提供了第三方的镜像仓库,如:redis、rabbitMQ,官网的地址:https://hub.docker.com/
国内推荐使用阿里云的仓库:https://www.aliyun.com/
2.容器
容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
3.仓库
仓库就是存放Docker镜像的地方。Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。
三、数据卷
在开发过程中,数据库是我们必须使用的东西,但是我们使用数据库时必定会有数据的产生,那么我们把数据库是放在容器外面还是里面?
如果将数据保存在内部,那么也就意味着我们改变了原有镜像,这种做法是不可取的,因为在后期的镜像升级将变得不可能了。
所以我们需要将数据库保存在外面,那么问题又来了,容器如何访问外部的数据呢?
数据卷就为我们解决了这个问题:在create或者run容器时,可以通过-v参数指定主机的目录,挂在到容器中的某一个目录上,这样,容器就在这个目录读写数据了。从而实现了容器和数据的分离。
docker命令创建一个容器并且访问外部数据:
docker create --name percona -v /data/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.6
代码中命令的解释:
--name percona: 指定是容器的名称
-v /data/mysql-data:/var/lib/mysql : 将主机目录/data/mysql-data挂载到容器的/var/lib/mysql上
-p 33306:3306 :设置端口映射,主机端口是33306,容器内部端口3306
-e MYSQL_ROOT_PASSWORD=root :设置容器参数,设置root用户的密码为root
percona:5.6 :镜像名:版本
四、构建web项目(开发完成打的包)镜像
下面我们将介绍如何把自己的web项目部署到docker中
Dockerfile文件
Dockerfile文件是构建web项目的配置文件,它是一个文本文件,里面编写多条命令,这些命令描述了一个镜像构建的细节,DockerFile分为四部分组成:基础镜像信、维护者信息、镜像操作指令和容器启动时执行的指令。
我们看一个Dockerfile文件的实例:
# 基于java8构建,必须是第一条命令
FROM java 8
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#将helloWordjar包导入在Linux系统下的helloWord文件夹下
COPY ./helloWord.jar /helloWord/helloWord.jar
COPY ./docker-entrypoint.sh /
#RUN 执行以下命令
RUN chmod +x /docker-entrypoint.sh
#EXPOSE 映射端口
EXPOSE 80
其中docker-entrypoint.sh文件是一个入口文件,是docker构建容器前的初始化环境配置文件,一般这个入口文件是一个脚本,且Dockerfile文件只会有一个入口文件,docker-entrypoint.sh文件内容是:
#!/bin/bash
java -jar /helloWord/helloWord.jar
构建:
docker build -t helloWord:1.0