创建 WebLogic 12.2.1.3 的 Docker 镜像
开场白
我们将创建一个 WebLogic 12.2.1.3 的 Docker 容器。因为要用作 intra-mart 的验证,所以我们预先进行了 intra-mart 所需的配置,在 intra-mart Accel Platform 设置指南(WebLogic 篇)中有详细说明。通过这个配置,与 Oracle 官方的 Docker 镜像不同,我们可以立即创建一个可用于验证的 WebLogic 环境,而不需要考虑任何其他事情。
Docker 基础镜像(CentOS 6.10)
我会像平常一样从基础映像开始制作。
我将使用CentOS 6.10 Final。
FROM centos:centos6
EXPOSE 22
# yum
RUN yum -y update \
&& yum provides -y '*/applydeltarpm' \
&& yum groupinstall -y 'Development Tools' \
&& yum install -y --enablerepo centosplus wget curl vim emacs tar unzip mlocate perl ssh openssh-server openssl-devel \
&& rm -rf /var/cache/yum/* \
&& yum clean all
# locale
RUN yum reinstall -y glibc-common \
&& localedef -i ja_JP -f UTF-8 ja_JP.utf8 \
&& touch /etc/sysconfig/i18n \
&& echo 'LANG="ja_JP.UTF-8"' >> /etc/sysconfig/i18n
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
# timezone
RUN yum install -y tzdata \
&& echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock \
&& echo 'UTC=false' >> /etc/sysconfig/clock \
&& ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# root passwd
RUN bash -c 'echo "root:password" | chpasswd'
# ssh
RUN sed -i -e "s/#PasswordAuthentication yes/PasswordAuthentication yes/g" /etc/ssh/sshd_config \
&& sed -i -e "s/#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config \
&& sed -i -e "s/UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config
RUN updatedb
CMD /etc/init.d/sshd restart && /bin/bash
我会建造。(wǒ huì
docker build -t mycentos:6.10 .
根据已创建的基础镜像,再创建一个基础镜像。
考虑到准备另外一个数据库也很麻烦,我们将在启动时一并安装好PostgreSQL 和Cassandra,以便立即使用。
FROM mycentos:6.10
EXPOSE 22 5432 8983 9160
# yum
RUN yum -y update \
&& yum -y upgrade && yum -y update \
&& yum localinstall -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm \
&& yum install -y postgresql96-server \
&& yum install -y --setopt=protected_multilib=false epel-release ld-linux.so.2 libstdc++.so.6 libpng12 nc \
&& rm -rf /var/cache/yum/* \
&& yum clean all
# JDK
COPY setup_jdk.sh /setup_jdk.sh
RUN chmod +x /setup_jdk.sh \
&& /setup_jdk.sh \
&& rm -f /setup_jdk.sh \
&& echo 'JAVA_HOME=/usr/local/java/jdk' >> /root/.bashrc \
&& echo 'PATH=$PATH:/usr/local/java/jdk/bin' >> /root/.bashrc
ENV JAVA_HOME /usr/local/java/jdk
ENV PATH /usr/local/java/jdk/bin:$PATH
# PostgreSQL
COPY setup_postgresql.sh /setup_postgresql.sh
RUN chmod +x /setup_postgresql.sh \
&& /setup_postgresql.sh \
&& rm -f /setup_postgresql.sh
# JDBC Driver
RUN mkdir -p /opt/jdbc
COPY postgresql-42.2.5.jar /opt/jdbc/postgresql.jar
COPY db2jcc4.jar /opt/jdbc/db2.jar
COPY ojdbc8.jar /opt/jdbc/oracle.jar
COPY mssql-jdbc-7.0.0.jre8.jar /opt/jdbc/sqlserver.jar
COPY ngdbc.jar /opt/jdbc/ngdbc.jar
# Cassandra
COPY setup_cassandra.sh /setup_cassandra.sh
RUN chmod +x /setup_cassandra.sh \
&& /setup_cassandra.sh \
&& rm -f /setup_cassandra.sh \
&& echo 'PATH=$PATH:/usr/local/apache-cassandra/apache-cassandra/bin' >> /root/.bashrc
ENV PATH $PATH:/usr/local/apache-cassandra/apache-cassandra/bin
# Solr
COPY setup_solr.sh /setup_solr.sh
RUN chmod +x /setup_solr.sh \
&& /setup_solr.sh \
&& rm -f /setup_solr.sh
# wkhtmltopdf
COPY setup_wkhtmltopdf.sh /setup_wkhtmltopdf.sh
RUN chmod +x /setup_wkhtmltopdf.sh \
&& /setup_wkhtmltopdf.sh \
&& rm -f /setup_wkhtmltopdf.sh
RUN updatedb
#!/bin/sh
curl -L -C - -O https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
tar -Jxvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
rm -f wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
mv wkhtmltox /usr/local/wkhtmltox
ln -s /usr/local/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf
yum install -y vlgothic-fonts
安装PostgreSQL。安装完成后,创建以下用户。
-
- postgres/postgres (ユーザ/パスワード)
- imart/imart (ユーザ/パスワード)
另外,我们将创建以下的数据库。
-
- imart
-
- iap_db
- default
另外,我们还会创建acceldocuments模式。
由于默认的max_connections和shared_buffers太小,我们将它们适当增加一些,以消除一些担忧。
#!/bin/bash
service postgresql-9.6 initdb
echo "listen_addresses = '*'" >> /var/lib/pgsql/9.6/data/postgresql.conf
sed -i -e "s/ident$/trust/g" /var/lib/pgsql/9.6/data/pg_hba.conf
sed -i -e "s/127\.0\.0\.1\/32/0\.0\.0\.0\/0/g" /var/lib/pgsql/9.6/data/pg_hba.conf
sed -i -e "s/max_connections = 100/max_connections = 200/g" /var/lib/pgsql/9.6/data/postgresql.conf
sed -i -e "s/shared_buffers = 128MB/shared_buffers = 512MB/g" /var/lib/pgsql/9.6/data/postgresql.conf
echo "postgres:postgres" | chpasswd
service postgresql-9.6 start
sleep 1
su postgres -c "psql -c \"ALTER USER postgres WITH PASSWORD 'postgres'\""
su postgres -c "psql -c \"CREATE ROLE imart WITH LOGIN PASSWORD 'imart'\""
su postgres -c "psql -c \"CREATE DATABASE imart OWNER=imart encoding 'utf8' TEMPLATE template0\""
su postgres -c "psql -c \"CREATE DATABASE iap_db OWNER=imart encoding 'utf8' TEMPLATE template0\""
su postgres -c "psql -c \"CREATE DATABASE \\\"default\\\" OWNER=imart encoding 'utf8' TEMPLATE template0\""
su postgres -c "psql -d imart -c \"CREATE SCHEMA acceldocuments AUTHORIZATION imart\""
su postgres -c "psql -d iap_db -c \"CREATE SCHEMA acceldocuments AUTHORIZATION imart\""
su postgres -c "psql -d default -c \"CREATE SCHEMA acceldocuments AUTHORIZATION imart\""
service postgresql-9.6 stop
接下来是JDK的下载,如果最新版本是8u191,则可以通过以下curl命令进行下载。
如果8u191不再是最新版本,则需要根据新的URL进行修改才能下载。如果觉得麻烦的话,也可以通过浏览器下载JDK,并将其COPY到Dockerfile中,将其放置在根目录下,并使用此COPY命令来使用已放置的JDK,也没有问题。
#!/bin/sh
curl -L -C - -b "oraclelicense=accept-securebackup-cookie" -O https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz
tar zxvf jdk-8u191-linux-x64.tar.gz
rm -f jdk-8u191-linux-x64.tar.gz
mkdir -p /usr/local/java
mv jdk1.8.0_191 /usr/local/java/jdk1.8.0_191
ln -s /usr/local/java/jdk1.8.0_191 /usr/local/java/jdk
#!/bin/sh
curl -L -C - -O https://archive.apache.org/dist/cassandra/1.1.12/apache-cassandra-1.1.12-bin.tar.gz
tar -zxvf apache-cassandra-1.1.12-bin.tar.gz
rm apache-cassandra-1.1.12-bin.tar.gz
mkdir -p /usr/local/apache-cassandra
mv apache-cassandra-1.1.12 /usr/local/apache-cassandra/apache-cassandra-1.1.12
ln -s /usr/local/apache-cassandra/apache-cassandra-1.1.12 /usr/local/apache-cassandra/apache-cassandra
sed -i -e "s/Xss180k/Xss228k/g" /usr/local/apache-cassandra/apache-cassandra/conf/cassandra-env.sh
Solr的设置如下,为了使用curl获取设置材料,请预先准备好从myserver下载solr_setup.zip文件。如果这也很麻烦,可以通过浏览器下载solr_setup.zip文件,并将其COPY到Dockerfile中并放置在/目录下,然后可以停止使用以下的curl方法,而是使用通过COPY放置的solr_setup.zip文件。
#!/bin/sh
curl -L -C - -O http://myserver/solr_setup.zip
unzip solr_setup.zip -d solr_setup
rm solr_setup.zip
cd solr_setup
chmod u+x ./setup.sh
./setup.sh jetty
mkdir -p /usr/local/solr
mv dist/jetty/jetty /usr/local/solr/jetty
cd ..
rm -rf solr_setup
我将进行构建工作。
docker build -t mywls_base .
Docker中的WebLogic版本为12.2.1.3。
现在我们来谈谈 WebLogic 12.2.1.3 的 Docker。
我们将使用之前提到的 mywls_base 作为基础镜像。
除了 Dockerfile 之外,还需要准备以下文件。
-
- run_server.sh
-
- setup_wls.sh
- Dockerfile
首先从 Dockerfile 开始。
FROM mywls_base
EXPOSE 22 5432 7001 9009 40608
# yum
RUN yum -y update \
&& yum -y upgrade && yum -y update \
&& yum install -y multitail ncurses-devel ncurses-static ncurses-term \
&& rm -rf /var/cache/yum/* \
&& yum clean all
# https://www.cyberz.org/blog/2014/10/31/weblogic-12c-very-slow-domain-creation/
ENV CONFIG_JVM_ARGS -Djava.security.egd=file:/dev/./urandom
# setup_wls
COPY setup_wls.sh /opt/setup_wls.sh
RUN chmod +x /opt/setup_wls.sh \
&& /opt/setup_wls.sh \
&& rm -f /opt/setup_wls.sh
COPY run_server.sh /opt/run_server.sh
RUN chmod +x /opt/run_server.sh \
&& sed -i -e "s/BUILD_TIME_HOSTNAME_FIXME/`hostname`/g" /opt/run_server.sh
RUN ln -s /opt/oracle/weblogic/user_projects/domains/mydomain/startWebLogic.sh /startWebLogic.sh \
&& ln -s /opt/oracle/weblogic/user_projects/domains/mydomain/bin/stopWebLogic.sh /stopWebLogic.sh \
&& ln -s /opt/oracle/weblogic/user_projects/domains/mydomain/startWebLogic.sh /opt/startWebLogic.sh \
&& ln -s /opt/oracle/weblogic/user_projects/domains/mydomain/bin/stopWebLogic.sh /opt/stopWebLogic.sh \
&& ln -s /opt/oracle/weblogic/user_projects/domains/mydomain/startWebLogic.sh /root/startWebLogic.sh \
&& ln -s /opt/oracle/weblogic/user_projects/domains/mydomain/bin/stopWebLogic.sh /root/stopWebLogic.sh \
&& ln -s /opt/run_server.sh /run_server.sh \
&& ln -s /opt/run_server.sh /root/run_server.sh
# COPY setDomainEnv.sh /opt/oracle/weblogic/user_projects/domains/mydomain/bin/setDomainEnv.sh
# COPY startWebLogic.sh /opt/oracle/weblogic/user_projects/domains/mydomain/bin/startWebLogic.sh
# COPY commExtEnv.sh /opt/oracle/oracle_common/common/bin/commExtEnv.sh
# COPY config.xml /opt/oracle/weblogic/user_projects/domains/mydomain/config/config.xml
# COPY PostgreSQL-8300-jdbc.xml /opt/oracle/weblogic/user_projects/domains/mydomain/config/jdbc/PostgreSQL-8300-jdbc.xml
RUN chmod +x /opt/oracle/weblogic/user_projects/domains/mydomain/bin/setDomainEnv.sh \
&& chmod +x /opt/oracle/weblogic/user_projects/domains/mydomain/bin/startWebLogic.sh \
&& chmod +x /opt/oracle/oracle_common/common/bin/commExtEnv.sh
&& updatedb
CMD ["/opt/run_server.sh"]
这里注释掉的 COPY 5 行将在稍后使用。现在保持注释状态即可。
在注释的状态下,执行一次docker build,docker run,并通过WebLogic的管理界面进行intra-mart的配置(如-Xmx,事务超时,数据源等)。
由于这些配置会反映到被注释的路径上(通过比较/opt/oracle文件夹在配置反映之前和之后的差异,可以确定),在获取配置反映后的上述路径文件后,取消注释(打开注释),然后再次执行docker build。
通过这样做,可以创建一个具有intra-mart配置的WebLogic Docker镜像。
接下来是WebLogic 12.2.1.3 的设置。
为了获取设备安装资料,通过curl设置如下,请提前准备好从myserver下载资料的条件。
如果这样太麻烦的话,可以通过浏览器下载设备安装资料,并通过Dockerfile中的COPY命令将其放置在/opt目录下,也可以使用COPY命令代替curl来使用已放置的设备安装资料,没有问题。
您可以从以下位置下载安装资料。
-
- WebLogic 12.2.1.3
- https://www.oracle.com/technetwork/jp/middleware/weblogic/downloads/index.html
#!/bin/bash
echo "Oracle WebLogic 12.2.1.3.0 install script"
# create user
useradd weblogic
echo 'weblogic:password' | chpasswd
mkdir -p /opt/oracle
chown -R weblogic /opt/oracle
cd /opt/oracle
# download repository
echo "Downloading installer..."
WLS_REPOSITORY_BASE_URL="http://myserver"
curl -L -C - -O "${WLS_REPOSITORY_BASE_URL}/fmw_12.2.1.3.0_wls_quick_Disk1_1of1.zip"
echo "Unpacking installer..."
unzip -q fmw_12.2.1.3.0_wls_quick_Disk1_1of1.zip
rm -f *.zip *.txt *.htm
# install weblogic
echo "Installing WebLogic..."
su weblogic -c "java -jar fmw_12.2.1.3.0_wls_quick.jar -force -ignoreSysPrereqs ORACLE_HOME=/opt/oracle"
rm -f fmw_12.2.1.3.0_wls_quick.jar
# create domain
echo "Creating domain..."
su weblogic -c "mkdir -p /opt/oracle/weblogic/user_projects/domains/mydomain"
export WL_HOME=/opt/oracle/wlserver
export CONFIG_JVM_ARGS=-Djava.security.egd=file:/dev/urandom
export PATH=$PATH:/opt/oracle/oracle_common/common/bin # wlst.sh へのパス
source /opt/oracle/oracle_common/common/bin/commEnv.sh
touch create_domain.py
echo '#!/usr/bin/python' >> create_domain.py
echo "import os, sys" >> create_domain.py
echo "selectTemplate('Basic WebLogic Server Domain')" >> create_domain.py
echo "loadTemplates()" >> create_domain.py
echo "cd('Servers/AdminServer')" >> create_domain.py
echo "set('Name', 'myserver')" >> create_domain.py
echo "set('ListenAddress', '')" >> create_domain.py
echo "set('ListenPort', 7001)" >> create_domain.py
echo "create('AdminServer', 'SSL')" >> create_domain.py
echo "cd('SSL/AdminServer')" >> create_domain.py
echo "set('Enabled', 'True')" >> create_domain.py
echo "set('ListenPort', 7002)" >> create_domain.py
echo "cd('/')" >> create_domain.py
echo "cd('Security/base_domain/User/weblogic')" >> create_domain.py
echo 'cmo.setPassword('\''password'\'')' >> create_domain.py
echo "setOption('OverwriteDomain', 'true')" >> create_domain.py
echo "writeDomain('/opt/oracle/weblogic/user_projects/domains/mydomain')" >> create_domain.py
echo "closeTemplate()" >> create_domain.py
echo "exit()" >> create_domain.py
wlst.sh create_domain.py
rm -f create_domain.py
# jdbc
ln -s /opt/jdbc/postgresql.jar /opt/oracle/wlserver/server/lib/postgresql.jar
ln -s /opt/jdbc/ngdbc.jar /opt/oracle/wlserver/server/lib/ngdbc.jar
正在静默安装WebLogic 12.2.1.3。
如果你想更改详细设置,请在上述shell脚本中修改create_domain.py文件的内容。
接下来是在运行docker命令时执行的WebLogic启动脚本。
还会启动sshd、PostgreSQL、Cassandra和Solr。
为了显示两个日志文件(myserver.log和startWebLogic.log),如果可用,我们会使用multitail来输出日志。
如果环境不允许使用multitail,我们将使用tail来输出日志。
#!/bin/bash
originalTerm="${TERM}"
if [ ${originalTerm} != "xterm" ]; then
export TERM=xterm
fi
/etc/init.d/sshd start
service postgresql-9.6 restart
sleep 1
cassandra &
cd /usr/local/solr/jetty
./startup.sh &
# docker build 時のホスト(BUILD_TIME_HOSTNAME_FIXME) がスクリプトや設定ファイルに書き込まれているため、Docker イメージ実行時のホストに書き換える
host=`hostname`
sed -i -e "s/BUILD_TIME_HOSTNAME_FIXME/${host}/g" /opt/oracle/weblogic/user_projects/domains/mydomain/init-info/tokenValue.properties
sed -i -e "s/BUILD_TIME_HOSTNAME_FIXME/${host}/g" /opt/oracle/weblogic/user_projects/domains/mydomain/init-info/startscript.xml
sed -i -e "s/BUILD_TIME_HOSTNAME_FIXME/${host}/g" /opt/oracle/weblogic/user_projects/domains/mydomain/bin/stopWebLogic.sh
sed -i -e "s/BUILD_TIME_HOSTNAME_FIXME/${host}/g" /opt/oracle/weblogic/user_projects/domains/mydomain/bin/stopManagedWebLogic.sh
mkdir -p /opt/oracle/weblogic/user_projects/domains/mydomain/servers/myserver/logs
nohup /opt/oracle/weblogic/user_projects/domains/mydomain/startWebLogic.sh </dev/null >/opt/oracle/weblogic/user_projects/domains/mydomain/servers/myserver/logs/startWebLogic.log 2>&1 &
while [ ! -r /opt/oracle/weblogic/user_projects/domains/mydomain/servers/myserver/logs/myserver.log ]
do
sleep 1
done
while [ ! -r /opt/oracle/weblogic/user_projects/domains/mydomain/servers/myserver/logs/startWebLogic.log ]
do
sleep 1
done
if [ ${originalTerm} = "xterm" ]; then
multitail -M 0 --follow-all --retry-all /opt/oracle/weblogic/user_projects/domains/mydomain/servers/myserver/logs/myserver.log -I /opt/oracle/weblogic/user_projects/domains/mydomain/servers/myserver/logs/startWebLogic.log
else
tail -F /opt/oracle/weblogic/user_projects/domains/mydomain/servers/myserver/logs/myserver.log /opt/oracle/weblogic/user_projects/domains/mydomain/servers/myserver/logs/startWebLogic.log
fi
如果到达这个地步,就先进行一次编译,然后执行。
docker build -t mywls:12.2.1.3 .
docker run -it --rm -p 7001:7001 -p 7002:7002 -p 40608:40608 -p 5432:5432 -p 2222:22 -p 9009:9009 -p 7091:7091 mywls:12.2.1.3
完成操作后,请使用ssh登录到容器中(可以使用root/password进行登录)。
zip -r oracle.zip /opt/oracle
执行并保存设置之前的状态 (oracle.zip)。保存后,进行intra-mart Accel Platform设置指南(WebLogic篇)的配置。
在設定反映後,使用ssh登入容器。
zip -r oracle2.zip /opt/oracle
执行操作,并保存在进行设置后的状态(oracle2.zip)。
使用WinMerge等工具比较oracle.zip和oracle2.zip的内容。
很可能在以下5个文件上检测到差异(日志文件也可能有差异,但可以忽略)。
-
- /opt/oracle/weblogic/user_projects/domains/mydomain/bin/setDomainEnv.sh
-
- /opt/oracle/weblogic/user_projects/domains/mydomain/bin/startWebLogic.sh
-
- /opt/oracle/oracle_common/common/bin/commExtEnv.sh
-
- /opt/oracle/weblogic/user_projects/domains/mydomain/config/config.xml
- /opt/oracle/weblogic/user_projects/domains/mydomain/config/jdbc/PostgreSQL-8300-jdbc.xml
取得上述的5个文件后,取消Dockerfile中以下被注释掉的地方的注释(取消注释)。
# COPY setDomainEnv.sh /opt/oracle/weblogic/user_projects/domains/mydomain/bin/setDomainEnv.sh
# COPY startWebLogic.sh /opt/oracle/weblogic/user_projects/domains/mydomain/bin/startWebLogic.sh
# COPY commExtEnv.sh /opt/oracle/oracle_common/common/bin/commExtEnv.sh
# COPY config.xml /opt/oracle/weblogic/user_projects/domains/mydomain/config/config.xml
# COPY PostgreSQL-8300-jdbc.xml /opt/oracle/weblogic/user_projects/domains/mydomain/config/jdbc/PostgreSQL-8300-jdbc.xml
请将以下内容改写为中文,只需要一种选项:
↓
COPY setDomainEnv.sh /opt/oracle/weblogic/user_projects/domains/mydomain/bin/setDomainEnv.sh
COPY startWebLogic.sh /opt/oracle/weblogic/user_projects/domains/mydomain/bin/startWebLogic.sh
COPY commExtEnv.sh /opt/oracle/oracle_common/common/bin/commExtEnv.sh
COPY config.xml /opt/oracle/weblogic/user_projects/domains/mydomain/config/config.xml
COPY PostgreSQL-8300-jdbc.xml /opt/oracle/weblogic/user_projects/domains/mydomain/config/jdbc/PostgreSQL-8300-jdbc.xml
完成更改后,再次执行 docker build。
docker build -t mywls:12.2.1.3 .
经过注释的5个COPY命令的执行后,应该从先前构建的镜像进行增量构建(而不是从头开始构建),从注释的COPY命令的行开始构建(因此,在构建时,主机名也应与执行注释的COPY命令之前相同)。
也许,在 Dockerfile 的开头
ENV HOSTNAME weblogic
使用该选项,可以使 docker build 时的主机名始终保持相同,从而减少可能出现的问题。
运行
docker run -it -p 7001:7001 -p 7002:7002 -p 40608:40608 -p 5432:5432 -p 2222:22 -p 9009:9009 -p 7091:7091 mywls:12.2.1.3
由于已经安装了PostgreSQL、Solr和Cassandra,您只需部署war文件即可立即进行验证。
Secure Shell (SSH) 是一種網絡通信協議,用於在不安全的網絡上遠程管理設備。
ssh -p 2222 root@localhost
当在执行docker run命令时,使用-p 2222:22选项,其中2222是ssh端口。
您可以使用root/password进行登录。
请将localhost替换为运行docker run的机器的IP地址。
部署
请根据以下内容,部署war。
请参考 intra-mart Accel Platform 设置指南(WebLogic版本)来部署war文件。
网址
-
- WebLogic 管理画面
http://localhost:7001/console (weblogic/password)
war デプロイ後の一般ユーザログイン画面
http://localhost:7001/imart/login
war デプロイ後のシステムユーザログイン画面
http://localhost:7001/imart/system/login
请将localhost替换为正在运行Docker的机器的IP地址。
因此,以下是对WebLogic 12.2.1.3 intra-mart用已配置的Docker的简要介绍。