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
目录是酱紫的
拜拜~~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX网络编程 卷1:套接字联网API(第3版)
[美]W. 理查德•史蒂文斯(W. Richard Stevens)、比尔• 芬纳(Bill Fenner)、安德鲁 M. 鲁道夫(Andrew M. Rudoff) / 匿名 / 人民邮电出版社 / 2014-6-1 / 129.00
《UNIX环境高级编程(第3版)》是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的第3版。在本书第2版出版后的8年中,UNIX行业发生了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/......一起来看看 《UNIX网络编程 卷1:套接字联网API(第3版)》 这本书的介绍吧!