首页 > 技术文章 > docker学习

daijiting 2019-07-31 21:21 原文

  在老系统的部署过程中,我们通常是把项目打成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

 

推荐阅读