如何使用Docker 进行Java 开发
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Docker 进行Java 开发相关的知识,希望对你有一定的参考价值。
1、java项目开发,假定已有一个java项目能够编译成jar/war并且运行了。
2、编写dockerfile,docker是一个容器技术每一个容器就是一个“完整”的linux系统,这个dockerfile需要提供这个系统包含内容的描述,比如FROM maven:3.3.3、FROM ubuntu:16.04。如果这个java项目是个web项目那么还需要提供tomcat环境。添加项目构建信息。比如采用maven编译项目的话该如何如何。
ADD pom.xml /tmp/build/RUN cd /tmp/build && mvn -q dependency:resolve
ADD src /tmp/build/src
#构建应用RUN cd /tmp/build && mvn -q -DskipTests=true package \\
#拷贝编译结果到指定目录
&& rm -rf $CATALINA_HOME/webapps/* \\
&& mv target/*.war $CATALINA_HOME/webapps/ROOT.war \\
#清理编译痕迹
&& cd / && rm -rf /tmp/build
3、暴漏接口:EXPOSE 8080
CMD ["catalina.sh","run"]
4、执行镜像构建
docker build -t docker-demo-java-tomcat .5、基于创建好的镜像创建容器
docker run -d -p 8080:8080 docker-demo-java-tomcat6、访问
来源于dockercloud文档,可自去查看。
Maven的配置文件: pom.xml
一个Java类:Hello.java
一个Dockerfile
源码是下面的代码:
https://github.com/giantswarm/sparkexample
pom.xml
pom.xml包含一些基本的Maven配置,比如配置Spark所依赖的Java 8。它会把所有的依赖封装成一个大的jar包。
Hello.java
pom.xml文件定义mainClass为sparkexample.Hello,需要在src/main/java/sparkexample/目录下创建Hello.java文件。Dockerfile
最后我们来编写Dockerfile文件,这个Dockerfile使用到了Java镜像(java:oracle-java8),并从安装Maven开始做起。下一步它会安装项目依赖。我们通过pom.xml来解析这些依赖,正如你所看到的,它允许Docker缓存这些依赖。下一步,要编译打包应用,并启动应用。如果重建应用时,pom.xml文件没有任何修改,之前的步骤都被缓存下来了,直接到最后一步启动应用。这可以加快应用的重新构建速度。
创建和运行
一旦这三个文件已经完成,那创建Docker镜像就变得轻而易举了。
$ docker build -t giantswarm/sparkexample .
注意:首次启动时会花费一些时间,因为它要安装Maven并下载所有的依赖。之后再启动就需要几秒钟,因为所有的东西都已经缓存了。
镜像创建之后,用下面的命令创建容器:
docker run -d -p 4567:4567 giantswarm/sparkexample
用下面的命令访问:
curl localhost:4567 hello from sparkjava.com 参考技术B 现在有非常多的Java Web框架,但我这里并不打算使用它们。我只想要的是一个小的框架所以我选择了Spark,它是一个基于Java 8的极小的框架。Spark使用Maven作为构建工具。
回到顶部
源代码和配置文件
在这个例子中你要增加三个文件:
Maven的配置文件: pom.xml
一个Java类:Hello.java
一个Dockerfile
如果有读者等不及了,可以克隆这个repo:
https:// github.com/giantswarm/sparkexample下面我们会详细解释这三个文件的结构,你可以此视频来快速了解。(读者可以查看原文中的视频,看完视频基本可以了解怎么做) 参考技术C Docker只是一个容器,和java开发没什么关系。通常是把开发好的Java程序放进Docker里运行 参考技术D docker只是个容器而已,况且还是虚拟的。你可以开发好项目部署上去,最好不要用来开发。
如何使用URLOS进行docker应用开发
使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地。
如何快速入门docker,开发属于自己的容器应用?我们今天不整虚的,来点实打实的干货:利用URLOS快速开发docker应用,并可随意将应用导出给他人使用。
对URLOS不了解的朋友,这里大概介绍一下,URLOS是一个容器云管理面板,基于Docker容器技术打包和运行应用,可自动识别机器和云应用的故障并将云应用转移至可用的机器上,单机故障并不影响业务开展,配合云存储便可轻松搭建7x24小时持续运行的应用环境。
URLOS官网:https://www.urlos.com/
URLOS安装方法:https://www.urlos.com/center-home-index-detail-10-22-y.html
URLOS开发交流QQ群:695164700,147882180
URLOS微信公众号:
安装URLOS:
curl -SO https://www.urlos.com/install && chmod 544 install && ./install
安装完成后,地址栏输入 http://ip:9968 即可访问。
划重点:利用URLOS开发docker应用的最基本的流程:
这里我们以制作一个LNP(linux+nginx+php)网站环境为例,快速制作一个可以导出给他人使用的docker应用。
在开始制作之前,我们先到docker官网注册一个账号,这样我们才能将制作好的镜像上传到docker仓库,打开https://hub.docker.com/
有了hub账号,那么我们开始制作吧!
第一步:拉取镜像,启动容器,进入容器
使用SSH工具连接主机,输入以下命令拉取一个php:7.3.3-fpm-stretch
镜像,启动容器并进入这个容器内部:
docker run -it php:7.3.3-fpm-stretch bash
看到类似上图中类似的字符串时,表示已经成功进入容器内部,这个便是当前容器的ID
第二步:更新镜像,安装我们要的nginx以及PHP相关扩展
先更新一下镜像源,国内用阿里的会快一些
set -ex \ && sed -i ‘[email protected]@[email protected]‘ /etc/apt/sources.list
set -ex \ && sed -i ‘[email protected]@[email protected]‘ /etc/apt/sources.list
apt-get update
更新完成之后,再来安装nginx,默认安装目录为/etc/nginx
apt-get install -y nginx
官方镜像默认是没有ps -ef 命令,因此需要手动安装
apt-get install -y procps
安装PHP扩展。安装php自带的一些扩展时,可以使用docker-php-ext-configure
和docker-php-ext-install
。
例如我们要安装pdo_mysql:
docker-php-ext-configure pdo_mysql
docker-php-ext-install pdo_mysql
然后使用 php -m查看我们的扩展是否安装成功。使用这种方式安装,系统会自动生成一个配置文件,提供给
php加载,使用命令查看:
ls -l /usr/local/etc/php/conf.d/
gd扩展安装
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpegdir=/usr/include/
docker-php-ext-install gd
如果需要安装memcached、redis扩展,则需要下载扩展到容器,然后手动编译安装。地址:
https://pecl.php.net/package/memcached
https://pecl.php.net/package/redis
memcached扩展安装:
curl -O https://pecl.php.net/get/memcached-3.1.3.tgz
tar xf memcached-3.1.3.tgz && cd memcached-3.1.3
phpize
./configure
编译过程中若出现以下错误提示:
则执行安装命令,然后重新编译安装memcached扩展:
apt-get install -y libmemcached-dev
./configure
make && make install
添加extension=memcached.so
语句到php.ini文件。安装完成后通过命令查看扩展存放的位置
ls /usr/local/lib/php/extensions/no-debug-non-zts-20170718/
php安装目录:/usr/local/php
php.ini的配置文件目录:/usr/local/etc/php/
。在这个目录下有两个文件:php.ini-development
和php.iniproduction
。
因此,我们需要将php.ini-production
文件重命名为php.ini
。以后手动编译安装php扩展后需要添加extension=xx.so
到php.ini。
启动Nginx和php,检查是否正常运行。
nginx && php-fpm -D
第三步:打包镜像
在打包成镜像之前,我们先将nginx、php-fpm关闭,删除一些不需要的应用以及清理一些安装的缓存文件,从而减小最终打包成镜像的大小。
apt-get purge vim make
apt-get autoremove
apt-get autoclean
rm -f /usr/local/etc/php/conf.d/* #统一将php扩展写入到php.ini文件
然后,输入exit
退出容器,通过以下命令将更新过的容器重新打包成一个新镜像:
docker commit -m="php-nginx-website" -a="yourname" 96b3f038590b yourhubid/php-nginx:v0.1.0
参数说明:
-m:提交的描述信息
-a:指定镜像作者
96b3f038590b:容器ID
yourhubid/php-nginx:v0.1.0:指定要创建的目标镜像名
可以使用docker images
命令来查看我们的新镜像
第四步:上传镜像
使用docker login
命令登录 hub.docker.com,按提示输入账号和密码即可
使用docker push
命令将打包好的新镜像上传至镜像仓库:
docker push yourhubid/php-nginx:v0.1.0
第五步:登录URLOS制作应用
注意:需要修改将/data/urlos/master-config/config.jsonc
文件的envType的值设置为dev(开发环境):
vim /data/urlos/master-config/config.jsonc
添加镜像
浏览器地址栏输入http://主机ip:9968,登录URLOS,在左侧菜单栏选择镜像管理,然后点击右上角的添加按钮。
输入镜像名称
镜像地址
开发者信息
添加LNP应用
在左侧菜单中选择应用管理。然后点击右上角的添加应用按钮:
应用的基本信息如上图所示。
镜像:选择上一步骤添加的镜像。
URLOS最低版本号:如设置此选项则表示安装URLO的版本高于或者等于当前设置的值,才允许用户安装
使用。
容器端口:容器启动时对外通信的端口,即参数-p。网站的80、443等端口默认是对外开发的,在这里可
以不用设置。如必须特定端口时,设置的格式{"22":true}。
标签:应用标签多用于搜索场景。
选项开关注解:
固定节点运行:若勾选,则表示用户在安装此应用时(创建此应用的服务)需要选择安装在某个节点(云
主机)。若取消勾选,则表示此应用安装在选择的集群(单容器运行也取消勾选),可达到负载均衡,故障
转移的效果。
单容器运行:若勾选,则表示安装此应用时,每个服务只运行一个容器。与固定节点运行配合使用,即固
定节点运行时,则单容器运行。
允许特权允许:若勾选,则容器内的root拥有了真正的root权限(宿主机器的root),在容器内部就可以做
任何事情(包括修改宿主机器的文件,启动宿主机器其他容器,执行mount等操作),不建议勾选。
以root用户允许容器:这里的root用户是容器外部的一个普通用户,默认勾选。若容器内部的程序禁止
root用户允许,则取消(如:MySQL)。
挂载存储目录:如需要从宿主机器挂载文件到容器,则勾选。即参数 -v。
挂载时区定义文件:容器的时间与宿主机器的时间保持一致。
容器只读:禁止向容器写数据。
全局网络:允许同一集群不同容器网络的容器通信。
允许快照备份:勾选则允许执行快照备份(仅挂载了本地存储时有效)
开启反向代理,则可以实现多容器共享端口,反之则不能。
注解:
插件:由PHP语言编辑的脚本文件组成。插件的使用会让用户在安装应用(创建服务)时更便捷,更智
能。这里选择phpWebSite:v0_1_0 --- Liu Xin ---php网站环境这个插件即可。(制作插件后续会有详细说
明)
服务别名:创建服务时,在左上角显示的描述。
应用数据别名:创建服务完成后,服务产生的数据或者用户基于创建的服务需要添加新的数据,对这些数
据管理取的名字,即为应用数据别名。(如:创建MySQL数据库服务,用户可以手动添加数据库,创建网
站服务时也可以新增数据库。)
服务表单步骤:创建服务时,用户填写表单的步骤。(数字表示必填,其他符号表示选填)
额外挂载:将宿主机器的除存储目录外的其他目录挂载到容器。
额外启动参数:通过docker run运行容器时的额外参数,如:--add-host a.com:192.168.0.1
注解:
安装脚本:安装应用时需要执行的脚本命令。
test -d /etc/nginx/conf.d/ || mkdir -p /etc/nginx/conf.d/
启动脚本:需要启动程序的命令。
nginx
php-fpm -D
状态脚本:每隔2秒执行此脚本,用来检查程序是否正常允许。当前的脚本命令用来检查apache是否启动。
status1=0 && (ps -ef|grep "php-fpm"|grep "master process"|grep -v "grep") &&
status1=1;
status2=0 && (ps -ef|grep "nginx"|grep "master process"|grep -v "grep") &&
status2=1;
if [ ${status1} != 0 ] && [ ${status2} != 0 ]; then
statusScriptResult=1
fi
监控脚本:每隔1秒执行此脚本,检查状态脚本返回的结果判断程序是否正常允许。若异常,则执行退脚本。
{w:statusScript:w}
[ "$statusScriptResult" != 1 ] && exit 1
退出脚本:容器关闭时之前,执行的脚本。如同,我们关闭电脑时,系统会关闭正在允许的程序。
添加LNP模板
在这个应用,我们需要添加模板php.ini
、vhost.conf
,然后在这两个模板的参数设置一些变量,这样用户在安装应用时,就可以根据自己的需要动态的调整。(如:设置php的上传大小,最大内存等)那么如何添加模板呢?我们在应用管理列表中找到上述创建的应用,然后点击右侧的更多选择管理模板。
添加一个php.ini
模板,然后在模板内容将php.ini
文件内容复制进入,同时设置变量{w:upload_max_filesize:w}
、{w:PHP_memory_limit:w}
。
[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = {w:PHP_memory_limit:w}
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = {w:upload_max_filesize:w}
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
extension=gd.so
extension=memcached.so
extension=sockets.so
extension=mysqli.so
extension=pdo_mysql.so
[CLI Server]
cli_server.color = On
[Date]
[filter]
[iconv]
[imap]
[intl]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.cookie_samesite =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = -1
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[dba]
[opcache]
[curl]
[openssl]
添加Nginx的虚拟站点配置vhost.conf
模板
server {
server_name {w:domains:w};
{w:listenLines:w}
set $websiteRoot "/data/www/{w:indexDirName:w}";
root $websiteRoot;
index index.html index.htm index.php;
client_max_body_size {w:upload_max_filesize:w};
client_body_buffer_size 128;
location / {
{w:rewriteContents:w}
}
location ~ \.(php|phtml)$ {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
location ~ /\.ht {
deny all;
}
}
添加变量
变量分为:环境变量、数据变量和扩展变量。在这里只需要添加扩展变量。
环境变量:在操作系统中用来指定操作系统运行环境的一些参数,与平常使用的环境变量相同。有时容器启动需要设置一些参数提供给容器内部的程序。如:MySQL容器启动时可以设置MYSQL_ROOT和MYSQL_ROOT_PASSWORD。
数据变量:添加存储数据时设置的一些参数。如:往MySQL数据服务添加数据库时,需要填写dbName,dbPassword,status,charset。具体可以使用可以创建MySQL服务,然后在管理数据库中添加数据库。
扩展变量:即普通变量。如:上述在模板中设置的变量{w:upload_max_filesize:w}、{w:PHP_memory_limit:w}。变量的格式:{w:变量名:w}。
添加PHP最大内存变量:PHP_memory_limit
添加上传大小限制:upload_max_filesize
至此,LMP应用已经制作完成,我们在应用管理
列表中,选择刚才制作好的应用,点击创建服务
部署完成后,地址栏输入域名访问一下,如果访问正常,说明我们制作的应用没有问题了,可以导出供他人安装!
第六步:导出应用
将我们制作的应用导出,可将导出的文件发布到任何地方,供他人安装使用,只要对方的主机安装了URLOS,都可以完美运行(无需考虑兼容性问题)我们制作的应用。
导出的文件为txt文本。只要其他用户使用URLOS直接导即可。下面是导入方法:
打开文本,全选复制其中内容
登录URLOS,在左侧菜单点击导入应用
,将内容粘贴进去,提交
导入成功!!点击安装即可。哈哈,太爽了吧。任何服务器环境可以使用的应用都可以用这个方法来制作,比如微信小程序后端部分等等都可以这样制作,方便分发和安装。
以上是关于如何使用Docker 进行Java 开发的主要内容,如果未能解决你的问题,请参考以下文章
如何在微服务架构中使用 docker-compose 最好地处理共享服务以进行本地开发?