能否在OpenShift中执行Docker客户端命令(如docker push)?
当你拥有Docker主机后,用Docker做部署简直不要太顺手——只需要把Docker客户端和主机引擎连起来就行。在Jenkins这类构建服务器上,构建并部署复杂Docker镜像的常规流程一般是这样的:
mvn clean install=> 构建WAR文件docker build=> 创建包含该WAR应用文件的Wildfly镜像docker tag=> 为新镜像打标签docker push=> 将镜像推送至Docker Hubdocker run=> 在Docker主机上安装并运行该Docker镜像
那OpenShift Starter能不能搞定这套流程?当然可以!这种容器即服务(CAAS)方案完全能实现需求。
完整解决方案
下面的步骤会帮你创建一个包含两个镜像的项目:一个MySQL镜像,另一个是由Wildfly服务器托管的SpringBoot/Angular/Hibernate镜像(这套方案同样适用于Spring Boot JAR应用)。
注意:操作前先启动本地Docker守护进程,用Docker Quickstart Terminal就能搞定,本文不会用到仅用于本地测试的minishift。
步骤1:创建项目及MySQL应用
不用Docker也能轻松完成:要么通过OpenShift Web控制台操作,要么直接执行命令oc new-project来创建项目。
步骤2:登录OpenShift项目
打开在线控制台,点击顶部右侧的问号图标,选择「命令行工具」,再点右侧图标把登录命令复制到剪贴板,然后在终端执行:
$ oc login ... # 粘贴你复制的完整命令即可
步骤3:登录Docker镜像仓库
查看OpenShift在线控制台后,执行以下命令:
docker login -u `oc whoami` -p `oc whoami --show-token` registry.pro-us-east-1.openshift.com
⚠️ 重要提醒:千万不要添加端口号后缀,比如openshift:443这种,会导致登录失败!
步骤4:本地/构建服务器(如Jenkins)上构建并打标签
依次执行下面的命令:
mvn clean install # 生成WAR文件,建议命名为'ROOT.war' docker build -t myproject/mynewapplication:latest . docker tag myproject/mynewapplication registry.pro-us-east-1.openshift.com/myproject/mynewapplication
⚠️ 注意:镜像名称一定要准确!比如把pro-us-east-1写成pro-us-east1这种小错误,会直接导致镜像推不上去,一定要仔细核对。
下面是两种常用的Dockerfile示例:
Wildfly版本(适用于WAR应用)
FROM jboss/wildfly COPY target/ROOT.war /opt/jboss/wildfly/standalone/deployments/ # CMD - 使用Wildfly默认启动命令
内存优化版本(适用于JAR应用)
FROM openjdk:8-jdk-alpine ENV JAVA_APP_JAR your.jar ENV AB_OFF true EXPOSE 8080 ADD target/$JAVA_APP_JAR /deployments/ CMD ["java","-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-jar","/deployments/your.jar"]
亲测有效:这套配置能大幅降低内存占用,我测试时容器运行内存从600MB+降到了约300MB,而且运行非常稳定!
步骤5:推送镜像到OpenShift内部仓库
执行命令把本地镜像推送到OpenShift的内部仓库:
docker push registry.pro-us-east-1.openshift.com/myproject/mynewapplication
步骤6-A.1:用new-app命令从已有镜像创建应用(仅首次执行)
第一次创建应用时,执行下面的命令:
oc new-app mynewapplication
执行后会返回类似这样的成功提示:
--> Found image 1233123223 (About an hour old) in image stream "myproject/mynewapplication" under tag "latest" for "mynewapplication"
...
This image will be deployed in deployment config "mynewapplication"
--> Creating resources ...
deploymentconfig "mynewapplication" created
service "mynewapplication" created
--> Success
Run 'oc status' to view your app.
步骤6-A.2:初始化路由配置(仅需一次)
部署完应用或Web服务器后,必须创建「route」才能让外部客户端访问。这个操作建议通过控制台完成(路径:Applications > Routes),举个配置HTTPS访问的例子:
- 目标端口设为8080(HTTP服务器运行的端口)
- 勾选「Secure route」选项
- TLS Termination保持为「Edge」
- 不安全流量选择「Redirect」
设置完成后创建route,稍等片刻就能得到一个支持HTTPS访问的站点了。
步骤6-B:更新镜像后的操作
推送更新后的镜像不会自动触发重新部署,你可以通过在线控制台操作,或者执行下面的命令手动启动新部署:
oc rollout latest dc/mynewapplication -n myproject
之后可以用这些命令检查状态:
- 检查部署结果:
oc status - 检查MySQL容器是否运行:
oc get pods,拿到容器名称后,执行oc rsh <容器名称>就能进入容器内部操作了。
内容的提问来源于stack exchange,提问作者tm1701

