摘要:如果你用的是新建用戶命令是這樣的如果你用的是或者新建用戶命令是這樣的然后使用指令后面的指令就都是以用戶身份執(zhí)行了指定程序的接口對于聯(lián)網(wǎng)應(yīng)用而言,必須在中指定暴露的端口,否則該端口無法映射。詳見參考文檔命令教程
原文地址
本文源代碼是一個spring-boot應(yīng)用(在 https://github.com/chanjarste... ),不過本例子適用于所有Java應(yīng)用。
要求這里先給出一些Docker Image制作的要求,之后我們再看怎么做。
制作過程要融合在項目構(gòu)建過程中
使用官方Image作為基礎(chǔ)Image
設(shè)定正確的時區(qū)
Container內(nèi)的程序以非root用戶啟動
指定Web程序的端口
能夠傳遞JVM參數(shù)、Java System Properties、程序自定義的參數(shù)
下面具體講一下具體怎么做到以上幾點(diǎn):
制作過程要融合在項目構(gòu)建過程中這里推薦使用Spotify的dockerfile-maven-plugin,理由是這個plugin用起來最簡單且容易掌握。
該plugin的本質(zhì)上是你寫一個Dockerfile(關(guān)于Dockerfile的具體寫法請參照官方文檔),這個plugin把一些參數(shù)傳遞進(jìn)去來幫助你構(gòu)建Docker Image。
因此只要你會寫Dockerfile,就會使用這個plugin,它沒有加入任何額外的概念。
使用官方Image作為基礎(chǔ)ImageJava的基礎(chǔ)鏡像應(yīng)該在openjdk repository里尋找,而不是在已經(jīng)過時的java repository里找。
openjdk repository提供了各種各樣的image tags看起來眼花繚亂,但是本質(zhì)上來說就這么幾個:
openjdk:
openjdk:
openjdk:
關(guān)于
FROM openjdk:8-alpine
從尺寸上來講,alpine最小、slim稍大、默認(rèn)的最大。所以應(yīng)該盡可能的使用alpine版本的,如果發(fā)現(xiàn)程序的運(yùn)行環(huán)境缺少某些東西,那么嘗試用slim版本或者默認(rèn)版本。就目前的經(jīng)驗來講:
如果需要操作系統(tǒng)字體庫,那么就得使用slim版本或者默認(rèn)版本。需要操作系統(tǒng)字體庫的程序例如:圖片驗證碼、PDF導(dǎo)出。
如果需要某些Linux標(biāo)準(zhǔn)的動態(tài)/靜態(tài)連接庫,那么在alpine版本不行的情況下,嘗試slim版本或默認(rèn)版本。因為alpine版本是一個及其精簡的Linux,它刪除了很多東西。
設(shè)定正確的時區(qū)幾乎所有的Docker Image的時區(qū)都是UTC,我們需要給我們自己制作的Docker Image設(shè)定時區(qū):
ENV TZ=Asia/Shanghai RUN set -eux; ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; echo $TZ > /etc/timezone
如果是alpine系列的則要安裝tzdata:
ENV TZ=Asia/Shanghai RUN set -eux; apk add --no-cache --update tzdata; ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; echo $TZ > /etc/timezone
關(guān)于數(shù)據(jù)庫時區(qū)的相關(guān)內(nèi)容可以見:
數(shù)據(jù)庫時區(qū)那些事兒 - MySQL的時區(qū)處理
數(shù)據(jù)庫時區(qū)那些事兒 - Oracle的時區(qū)處理
Container內(nèi)的程序以非root用戶啟動在Docker Image內(nèi)部,我們應(yīng)該使用非root用戶啟動程序,這需要新建用戶。
如果你用的是openjdk:
RUN set -eux; addgroup --gid 1000 java-app; adduser -S -u 1000 -g java-app -h /home/java-app/ -s /bin/sh -D java-app;
如果你用的是openjdk:
RUN set -eux; addgroup --gid 1000 java-app; adduser --system --uid 1000 --gid 1000 --home=/home/java-app/ --shell=/bin/sh --disabled-password java-app;
然后使用Dockerfile USER指令
USER java-app # 后面的指令就都是以java-app用戶身份執(zhí)行了指定Web程序的接口
對于聯(lián)網(wǎng)應(yīng)用而言,必須在Dockerfile中指定暴露的端口,否則該端口無法映射。
EXPOSE 8080能夠傳遞JVM參數(shù)、Java System Properties、程序自定義的參數(shù)
我們需要能夠在啟動Docker Image的時候?qū)⒁恍﹨?shù)傳遞進(jìn)去:
JVM參數(shù)
Java System Properties
程序啟動參數(shù)
這里就需要參考Dockerfile best practice和Docker ENTRYPOINT了。
樣例項目拆解 目錄結(jié)構(gòu)所有與程序相關(guān)的東西都存放在/home/java-app/下:
/home/java-app ├── docker-entrypoint.sh ├── lib │ └── java-app.jar ├── etc ├── logs └── tmp
docker-entrypoint.sh,啟動腳本
lib,存放JAR包
lib/java-app.jar,程序JAR包
etc,存放配置文件
logs,存放日志文件
tmp,存放臨時文件
構(gòu)建Image的方法mvn clean package dockerfile:build運(yùn)行
普通啟動,然后訪問http://localhost:8080:
docker run -p 8080:8080 chanjarster/dockerfile-java-examples-1:1.0-SNAPSHOT
設(shè)定JVM參數(shù)/System Properties,使用JAVA_OPTS環(huán)境變量:
docker run -p 8080:8080 -e JAVA_OPTS="-Xmx128M -Xms128M -Dabc=xyz -Ddef=uvw" chanjarster/dockerfile-java-examples-1:1.0-SNAPSHOT
提供程序運(yùn)行參數(shù),在后面直接添加即可:
docker run -p 8080:8080 chanjarster/dockerfile-java-examples-1:1.0-SNAPSHOT --debug2018-12-27更新
在docker-entrypoint.sh里啟動Java進(jìn)程時,使用exec /usr/bin/java ...這種形式,保證進(jìn)程PID=1,這樣在進(jìn)程能夠在docker stop時收到SIGTERM。
詳見:docker stop
Dockerfile best practice
Docker ENTRYPOINT
Postgres Dockerfile & script
MySQL Dockerfile & script
Bash set命令教程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77185.html
摘要:如果你用的是新建用戶命令是這樣的如果你用的是或者新建用戶命令是這樣的然后使用指令后面的指令就都是以用戶身份執(zhí)行了指定程序的接口對于聯(lián)網(wǎng)應(yīng)用而言,必須在中指定暴露的端口,否則該端口無法映射。詳見參考文檔命令教程 原文地址 本文源代碼是一個spring-boot應(yīng)用(在 https://github.com/chanjarste... ),不過本例子適用于所有Java應(yīng)用。 要求 這里先給...
摘要:完成之后運(yùn)行命令你的輸出可能會像這樣和都為,這是因為剛剛在編寫時沒有指定它們。多階段構(gòu)建鏡像多階段構(gòu)建鏡像其實運(yùn)行程序只需要就行,我們沒有必要使用作為基礎(chǔ)鏡像。但把程序打包成包,然后再交給的方式太麻煩了。運(yùn)行簡單的Java程序先在當(dāng)前目錄創(chuàng)建App.java文件public class App{ public static void main(String[] args){ ...
摘要:方案二和也運(yùn)行在中。新增刪除節(jié)點(diǎn)變更配置均需要手工介入。公司已有的大多都是容器形式部署在各個服務(wù)器上。目前我們在每個節(jié)點(diǎn)上部署了傳統(tǒng)的。在接下來的階段團(tuán)隊也會對此做進(jìn)一步的探索。 回想起第一次接觸Mesos, 當(dāng)時有很多困惑: 這到底是用來做啥的?跟YARN比有什么優(yōu)勢?有哪些大公司在使用么?。 然而現(xiàn)在技術(shù)日新月異地發(fā)展, Mesos這個生態(tài)圈也開始被越來越多的團(tuán)隊熟悉關(guān)注, 像k8...
摘要:反過來別的上的鏡像,也不能在樹莓派上運(yùn)行。如果需要找樹莓派專用的鏡像,那就在上搜索或相關(guān)就能找到了。有一個叫的倉庫制作了非常多樹莓派專用,可以參考下。樹莓派安裝,最難的在于正確的選擇源和添加,才能找到版本適合的并下載。 最近學(xué)習(xí)Machine Learning發(fā)現(xiàn)好多人都用docker,之前一直聽說但是感覺和自己無關(guān)。但是現(xiàn)在發(fā)現(xiàn)原來docker是個這么方便的東西,可以跨平臺(不分什么...
閱讀 1972·2021-11-25 09:43
閱讀 653·2021-10-11 10:58
閱讀 1730·2019-08-30 15:55
閱讀 1725·2019-08-30 13:13
閱讀 736·2019-08-29 17:01
閱讀 1840·2019-08-29 15:30
閱讀 789·2019-08-29 13:49
閱讀 2172·2019-08-29 12:13