手记

我学啥你就学啥Docker(1)No.125

Docker安装

一般项目Dokcer 的安装比较简单,直接 brew install Docker  就可以了,不会安装的自己谷哥或者度娘去去去去。

容器历史

凡事先聊聊历史,其实在 Docker 出现之前,也出现过很多很多其他的容器技术,比如 chroot、 FreeBSD Jails、Linux VServer、 Solaris容器 等等。至于为什么会出现容器技术,大概是因为各种软件的运行环境千差万别,而规模化需要我们实现两个核心内容   标准化和隔离。

标准化怎么做呢?做Java的基本都懂,就是面向接口,抽象出核心接口层就ok了,至于里边的实现和运行态,管理层不管,只要接口一致就好了。隔离怎么做呢?一般来说要么就是物理隔离,要么就是逻辑 namespacce 隔离。

Docker 镜像

不扯那么多犊子了,今天实战跟大家分享一个Docker的一个核心概念,镜像。镜像是一个比较让人舒坦的发明,解决了一个核心问题,就是各个地方运行环境不一致的问题。

运营: "你这破应用部署不上去啊,大蕉你看看"

大蕉: "不可能我本地试了一下,是好的吖"

现在我们有了镜像,把所有的  "运行时环境"  都定义好了,以 Dockerfile 的形式保存下来,那么无论在哪个地方跑,运行时环境都是一样的。那又有人要说了,为什么不把整个镜像文件打包起来吖?屁,一个镜像小的几百M,大的几个G,每次打包上传可不等死人了,所以都会以 Dockerfile 的形式先保存。

那么运行的时候去是怎么跑的呢,就是 Docker Engine 按照Dockerfile 的格式进行一行命令一行命令执行,构建出一个跟我们本地一样的环境。

Docker 基础镜像

问题又来了,那我搞一个 python 环境可不搞死我了?我不单单要关注自己的应用,还要先下载 linux文件、编译打包、安装linux系统、 node 、npm、python、pydev ,这么一大批工程随便来哪个人写起来都要废。根据我多年的软件开发经验,如果有什么问题解决不了的,我们抽象一层。嗯  Docker 为我们准备了一个概念,就是基础镜像,我们可以在 Dockerfile 的第一行先 FROM 一下,把它继承下来,再进行我们自己的构建。

比如使用 python 的官方 Docker 基础镜像是这样的

#Use an official Python runtime as a parent image

FROM python:2.7-slim

我们现在整一个 Java 应用

现在假设我们打包好一个 Java 的 SpringBoot 应用了,非常开心地,我们理论上应该只需要跑这一行就完事了。

java -jar BananaApplication.war

但是很绝望,服务器上并没有 JDK ,所以这肯定是跑不起来的,咋整?按照我们之前将的基础环境搭建的套路,我们有两个选择。一是可以先装 linux、下载OpenJDK,配置JAVA环境变量,当然也可以  直接 FROM 一下,JDK7 环境就有啦。

FROM = 从基础镜像继承 = extends(Java)

FROM openjdk:7

ARG = 变量 

如果我们要通用点,我们要定义一个变量 APP_NAME ,从命令行传过来,作为我们的应用名称以及目录,我们要怎么做呢?答案是ARG,定义完之后我们在命令行中指定的 APP_NAME=BananaApplication 就会直接透传到环境中,如果不传,就用我们预先定义的默认值 appName。

ARG APP_NAME=appName

ENV = 环境变量 = PATH(Linux)

好了,我们运行时有一段程序使用了系统变量的形式读取了某个值,报错了又,咋整?那我们需要有一个环境变量,我们要怎么办?答案是用 ENV

ENV BANANA_PARAM=banana

COPY=拷贝文件 = cp(Linux)

一切都搞定了,常见一个目录,并把文件拷贝到我们想要的目录  /home/admin/aplication 好了。

RUN mkdir /home/application/{APP_NAME}/bin && mkdir /home/admin/application/${APP_NAME}/pros

COPY banana.properties /home/admin/application/${APP_NAME}/pros

COPY start.sh  /home/application/{APP_NAME}/bin

WORKDIR = 切换文件 = cd(Linux)

再把当前目录切换到工作目录下 

WORKDIR banana.properties /home/admin/application/bin

RUN = 跑脚本 = sh(Linux)

改一下启动脚本的权限

RUN chmod a+x  /home/admin/application/bin/start.sh

启动应用,bingo。

RUN  /home/admin/application/bin/start.sh

完整Dockerfile 是酱紫的

# This file is handwrite by big banana.

# the base image

FROM openjdk:7

#APP_NAME argument

ARG APP_NAME=appName

#SET THE  ENVIRONMENT VARIABLES

ENV BANANA_PARAM=banana

#create the directory that the application needs

RUN mkdir /home/application/{APP_NAME}/bin && mkdir /home/admin/application/${APP_NAME}/pros

#COPY THE PROPERTIES FILES

COPY banana.properties /home/admin/application/${APP_NAME}/pros

#COPY THE START UP SHELL

COPY start.sh  /home/application/{APP_NAME}/bin

#change the working directory to what you want

WORKDIR banana.properties /home/application/bin

#change the authority of the shell that you want run.

RUN chmod a+x  /home/application/{APP_NAME}/bin/start.sh

#then run it 

RUN  /home/application/${APP_NAME}/bin/start.sh

目录是酱紫的

拜拜~~


0人推荐
随时随地看视频
慕课网APP