使用alpine创建一个能够运行intra-mart的Docker容器
总结主要内容
受到intra-mart启动Docker容器的启发,我决定尝试一下,结果有点生气。
将intra-mart环境构建在Docker容器上。
在轻量级且备受传言的Alpine上。虽然在Ubuntu上可以用apt-get安装resin,但现在时光变了呢。
这次的目标是以下的感觉。
– 确认可以使用”/imart/login”登录到已创建的租户管理员。
– imart.war将被转移到外部。
– 数据库将使用单独建立的容器。
– 不需要准备Web服务器(如Apache)。
– 不包括IMBox和IM-ContentSearch(因为需要Cassandra和Solr)。
这是每个应用程序的版本,都进行了测试。
虽然系统要求没有百分之百满足,但这一点并不重要。重要的是达成理解和相互关系。
本家的resin-pro不包含许可证,因此您需要自行安装许可证。即使不安装,似乎也能持续约30天。
如果在intra-mart上运行的应用程序不是Oracle,那就假装没看到。
提前准备好的事物
-
- imart.war
- postgresのjdbcドライバ (postgresql-9.4.1208.jar)
从intra-mart Accel系列的TRY版下载IM-Juggling工具,然后创建war文件。
请参考《启迪》上有关详细步骤的说明。
关于resin-web.xml的内容
如果将preparedStatementCacheQueries的值设置为0或8或较小的值,那么在租户设置期间会出现错误并导致痛苦。
虽然本家手册提供了将20作为输入值的示例,但是尝试使用该示例却导致了错误。
在进行intra-mart租户环境设置时,如果出现java.sql.SQLException,应采取如下对策。
<database jndi-name="jdbc/default">
<driver>
<type>org.postgresql.Driver</type>
<url>jdbc:postgresql://postgres:5432/iap_db</url>
<user>imart</user>
<password>imart</password>
<init-param>
<param-name>preparedStatementCacheQueries</param-name>
<param-value>8</param-value>
</init-param>
</driver>
<max-connections>20</max-connections>
<prepared-statement-cache-size>8</prepared-statement-cache-size>
</database>
创建用于Docker构建的文件 (Cjù chù jù Docker dì
Dockerfile
我写了一个类似以下的Dockerfile。
只要有Java就好了,这种甜蜜的想法将在制作Resin阶段被打破。
而且,在制作时还需要jni.h。因此,在Resin制作完成后,会根据需要使用apk del进行删除。(为了减肥)
在alpine的网站上,我们会寻找所需的文件以及包含这些文件的软件包。
FROM alpine:3.4
ENV RESIN_VERSION 4.0.48
ENV RESIN_HOME /opt/resin-pro-${RESIN_VERSION}
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
RUN apk add --virtual=build-dependencies --no-cache g++ libstdc++ linux-headers make wget ca-certificates && \
apk add --no-cache openjdk8 && \
ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" && \
ALPINE_GLIBC_PACKAGE_VERSION="2.23-r3" && \
ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
wget \
"https://raw.githubusercontent.com/andyshinn/alpine-pkg-glibc/master/sgerrand.rsa.pub" \
-O "/etc/apk/keys/sgerrand.rsa.pub" && \
wget \
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
apk add --no-cache \
"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
\
rm "/etc/apk/keys/sgerrand.rsa.pub" && \
/usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 C.UTF-8 || true && \
echo "export LANG=C.UTF-8" > /etc/profile.d/locale.sh && \
\
apk del glibc-i18n && \
\
rm "/root/.wget-hsts" && \
rm \
"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"
ENV LANG=C.UTF-8
RUN wget http://caucho.com/download/resin-pro-${RESIN_VERSION}.tar.gz -P /usr/local && \
cd /usr/local && \
tar xvzf resin-pro-${RESIN_VERSION}.tar.gz && \
rm -f resin-pro-${RESIN_VERSION}.tar.gz && \
cd resin-pro-${RESIN_VERSION} && \
./configure --prefix=/opt/resin-pro-${RESIN_VERSION} --enable-64bit && \
make && \
make install && \
rm -rf /usr/local/resin-pro-4.0.48 && \
ln -s /opt/resin-pro-${RESIN_VERSION} /opt/resin && \
apk del build-dependencies
EXPOSE 8080
ENTRYPOINT ["/opt/resin/bin/resinctl"," -server", "app-0", " start-with-foreground"]
尽管实际上需要适当编辑resin.properties等文件,但即使在没有进行操作确认的水平下,也可以设法解决。
我决定坚决地继续前进。
构建Docker镜像
执行Docker构建,创建镜像。
docker build -t imart-base:4.0.48 .
准备 PostgreSQL
获取和启动图像
docker run --name postgres -d -e PGPASSWORD=postgres -e POSTGRES_USER=postgres -p 5432:5432 postgres:latest
目前最新版本为9.5.3。
创建与intra-mart连接的角色。
根据数据库和登录角色的创建参考,创建一个角色。
这次由于PostgreSQL也是一个容器,所以我按照以下方式尝试了一下。
首先,将容器连接起来。
docker exec -it postgres bash
请连接到PostgreSQL。
psql -U postgres
创建角色和数据库。
postgres=# CREATE ROLE imart WITH LOGIN PASSWORD 'imart';
CREATE ROLE
postgres=# CREATE DATABASE iap_db OWNER imart ENCODING 'utf8';
CREATE DATABASE
启动树脂容器。
首先,假设预先准备好的文件如下。
-
- /home/intramart/war/*.war (IM-Jugglingで作成したwarファイル)
- /home/intramart/lib/*.jar (JDBCドライバ)
我决定在运行Docker时挂载并传递这个。
我将先启动的PostgreSQL通过–link参数传递给它。
docker run -it -d –name intra -p 8080:8080 –link postgres:postgres -v /home/intramart/war/:/opt/resin/webapps -v /home/intramart/lib/:/opt/resin/webapp-jars imart-base:4.0.48
过了一段时间,war文件会被解压并启动Resin。
租户设置和登录确认
当您访问以下链接时,将会显示初始设置页面。请按照向导进行操作。
http://<Docker主机的IP地址>:8080/imart/system/login
当您以系统管理员身份登录后,将会出现以下类似的屏幕。
访问以下链接,并确认租户管理员可以登录。
http://<Dockerのホスト>:8080/imart/login
赠品
树脂容器的图像大小
Docker的主机是Ubuntu 16。也许可以再精简一些。