首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我学啥你就学啥Docker(1)No.125

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

作者头像
大蕉
发布2018-12-29 11:26:49
1.2K0
发布2018-12-29 11:26:49
举报

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

目录是酱紫的

拜拜~~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一名叫大蕉的程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档