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