{"id":49165,"date":"2025-04-25T14:48:17","date_gmt":"2025-04-25T14:48:17","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49165"},"modified":"2025-04-25T14:48:17","modified_gmt":"2025-04-25T14:48:17","slug":"step-by-step-openshift-wordpress-deployment-demo","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/step-by-step-openshift-wordpress-deployment-demo\/","title":{"rendered":"Step-by-Step OpenShift WordPress Deployment Demo"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee0 Prerequisites:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OpenShift cluster (Local or Cloud)<\/li>\n\n\n\n<li><code>oc<\/code> CLI installed<\/li>\n\n\n\n<li>Basic access (developer\/admin rights)<\/li>\n\n\n\n<li>DockerHub or Red Hat certified WordPress container access<\/li>\n\n\n\n<li>(Optional) OpenShift Web Console access<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd25 Step 1: Login to OpenShift Cluster<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc login --token=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your-token<\/span>&gt;<\/span> --server=https:\/\/api.<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cluster-domain<\/span>&gt;<\/span>:6443\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Or via the Web Console.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfd7 Step 2: Create a New Project (Namespace)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project wordpress-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>(You can also create it from Web Console: <strong>Projects &gt; Create Project<\/strong>.)<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce6 Step 3: Deploy MySQL Database (for WordPress backend)<\/h2>\n\n\n\n<p>WordPress needs a database. Let&#8217;s deploy a simple MySQL Pod + Service.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">a) Create a Secret for MySQL Passwords<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create secret generic mysql-pass --<span class=\"hljs-keyword\">from<\/span>-literal=password=Wordpress@<span class=\"hljs-number\">123<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">b) Deploy MySQL using a Template or YAML<\/h3>\n\n\n\n<p>Here\u2019s a sample YAML to create MySQL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: apps\/v1\n<span class=\"hljs-attr\">kind<\/span>: Deployment\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: mysql\n<span class=\"hljs-attr\">spec<\/span>:\n  replicas: <span class=\"hljs-number\">1<\/span>\n  <span class=\"hljs-attr\">selector<\/span>:\n    matchLabels:\n      app: mysql\n  <span class=\"hljs-attr\">template<\/span>:\n    metadata:\n      labels:\n        app: mysql\n    <span class=\"hljs-attr\">spec<\/span>:\n      containers:\n      - name: mysql\n        <span class=\"hljs-attr\">image<\/span>: mysql:<span class=\"hljs-number\">5.7<\/span>\n        <span class=\"hljs-attr\">env<\/span>:\n        - name: MYSQL_ROOT_PASSWORD\n          <span class=\"hljs-attr\">valueFrom<\/span>:\n            secretKeyRef:\n              name: mysql-pass\n              <span class=\"hljs-attr\">key<\/span>: password\n        - name: MYSQL_DATABASE\n          <span class=\"hljs-attr\">value<\/span>: wordpress\n        <span class=\"hljs-attr\">ports<\/span>:\n        - containerPort: <span class=\"hljs-number\">3306<\/span>\n        <span class=\"hljs-attr\">volumeMounts<\/span>:\n        - name: mysql-persistent-storage\n          <span class=\"hljs-attr\">mountPath<\/span>: <span class=\"hljs-regexp\">\/var\/<\/span>lib\/mysql\n      <span class=\"hljs-attr\">volumes<\/span>:\n      - name: mysql-persistent-storage\n        <span class=\"hljs-attr\">emptyDir<\/span>: {}\n---\napiVersion: v1\n<span class=\"hljs-attr\">kind<\/span>: Service\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: mysql\n<span class=\"hljs-attr\">spec<\/span>:\n  ports:\n  - port: <span class=\"hljs-number\">3306<\/span>\n  <span class=\"hljs-attr\">selector<\/span>:\n    app: mysql\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Apply it:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">mysql<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u2705 Now you have a MySQL backend running!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf1f Step 4: Deploy WordPress Application<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">a) Deploy WordPress using YAML<\/h3>\n\n\n\n<p>Here\u2019s a <strong>WordPress Deployment YAML<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: apps\/v1\n<span class=\"hljs-attr\">kind<\/span>: Deployment\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: wordpress\n<span class=\"hljs-attr\">spec<\/span>:\n  replicas: <span class=\"hljs-number\">1<\/span>\n  <span class=\"hljs-attr\">selector<\/span>:\n    matchLabels:\n      app: wordpress\n  <span class=\"hljs-attr\">template<\/span>:\n    metadata:\n      labels:\n        app: wordpress\n    <span class=\"hljs-attr\">spec<\/span>:\n      containers:\n      - name: wordpress\n        <span class=\"hljs-attr\">image<\/span>: wordpress:latest\n        <span class=\"hljs-attr\">env<\/span>:\n        - name: WORDPRESS_DB_HOST\n          <span class=\"hljs-attr\">value<\/span>: mysql\n        - name: WORDPRESS_DB_PASSWORD\n          <span class=\"hljs-attr\">valueFrom<\/span>:\n            secretKeyRef:\n              name: mysql-pass\n              <span class=\"hljs-attr\">key<\/span>: password\n        <span class=\"hljs-attr\">ports<\/span>:\n        - containerPort: <span class=\"hljs-number\">80<\/span>\n        <span class=\"hljs-attr\">volumeMounts<\/span>:\n        - name: wordpress-persistent-storage\n          <span class=\"hljs-attr\">mountPath<\/span>: <span class=\"hljs-regexp\">\/var\/<\/span>www\/html\n      <span class=\"hljs-attr\">volumes<\/span>:\n      - name: wordpress-persistent-storage\n        <span class=\"hljs-attr\">emptyDir<\/span>: {}\n---\napiVersion: v1\n<span class=\"hljs-attr\">kind<\/span>: Service\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: wordpress\n<span class=\"hljs-attr\">spec<\/span>:\n  ports:\n  - port: <span class=\"hljs-number\">80<\/span>\n  <span class=\"hljs-attr\">selector<\/span>:\n    app: wordpress\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Apply it:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">wordpress<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u2705 Now WordPress Pod + Service are deployed!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf0d Step 5: Expose WordPress to Public<\/h2>\n\n\n\n<p>Expose WordPress Service via Route (URL):<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose service wordpress\n<\/code><\/span><\/pre>\n\n\n<p>This will automatically create a <strong>Route<\/strong>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83d\udccd You can get the URL:<\/p>\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route wordpress\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Example output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME        HOST\/PORT                         PATH   SERVICES    PORT   TERMINATION   WILDCARD\nwordpress   wordpress-demo.apps.cluster.com          wordpress   80                   None\n<\/code><\/span><\/pre>\n\n\n<p>Visit the URL in your browser \u2014 you&#8217;ll see the <strong>WordPress Installation Page<\/strong> \ud83c\udf89<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udcc8 Full Deployment Map:<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Component<\/th><th>Deployed As<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>MySQL Database<\/td><td>Deployment + Service + Secret<\/td><td>WordPress backend<\/td><\/tr><tr><td>WordPress Site<\/td><td>Deployment + Service + Route<\/td><td>Frontend exposed to public<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udcac Final Words:<\/h1>\n\n\n\n<p>\u2705 This is the simplest, fastest OpenShift WordPress demo. \u2705 For Production:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Persistent Volumes (PVCs) instead of emptyDir.<\/li>\n\n\n\n<li>Secure MySQL and WordPress (TLS, strong passwords).<\/li>\n\n\n\n<li>Set Resource limits (CPU, Memory).<\/li>\n\n\n\n<li>Scale Replicas.<\/li>\n\n\n\n<li>Use OpenShift templates or Helm Charts.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udce6 Bonus: One-Line Deployment (S2I)<\/h1>\n\n\n\n<p>You can also deploy WordPress from Source using OpenShift templates:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app wordpress\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udee0 Prerequisites: \ud83d\udd25 Step 1: Login to OpenShift Cluster Or via the Web Console. \ud83c\udfd7 Step 2: Create a New Project (Namespace) (You can also create it from Web Console:&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49165","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49165","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49165"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49165\/revisions"}],"predecessor-version":[{"id":49166,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49165\/revisions\/49166"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}