MuleSoft + Docker

Mazhar Ansari
5 min readAug 10, 2020

Note: While copy/paste the code snippet from blog please covert quotes and double quotes.

In this blog we will try to learn how we can create MuleSoft Docker Image and use it.

What is Container?

  • A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.
  • A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.
  • Container images become containers at runtime.

What is Docker?

  • Docker is a containerization platform that packages your application and all its dependencies together in the form of a docker container to ensure that your application works seamlessly in any environment.
Containers

Benefits of Docker:

Running applications in containers brings a number of benefits:

  • Portability
  • Performance
  • Agility
  • Isolation
  • Scalability

Difference between a Docker Image and Docker Container:

A Docker image is a non-changeable file containing libraries, source code, tools and other files needed to run applications.

Docker container is nothing but an environment virtualized during run-time to allow users to isolate applications from the system underpinning it. These containers are compact, portable units in which you can start up an application quickly and easily.

Docker Images and Containers

In Short If an Image is Java Class then Container is its Objects.

Install Docker:

I am using my unix machine for this blog so most of the steps are for Unix.

  • Uninstall old versions
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  • Set up the repository
sudo yum install -y yum-utils
sudo yum-config-manager — add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • Install Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io
  • Start Docker.
sudo systemctl start docker
  • Verify that Docker Engine is installed correctly by running the hello-world image.
sudo docker run hello-world

Create a Docker Image:

Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. Using docker build users can create an automated build that executes several command-line instructions in succession.

  • Create a file and name is “DockerFile
  • Copy below connect in DockerFile
  • Run below command to create an Image
docker build — tag=”mule-ee:4.3.0" .
Docker Build
  • Run below command to see the image
docker images
Docker Images

Dockerfile in Depth:

Lets try to explore Dockerfile in Depth.

FROM anapsix/alpine-java:8_jdk_nashorn# Define environment variables.
ENV MULE_HOME=/opt/mule && \
MULE_VERSION=4.3.0-ea2 && \
MULE_MD5=1c77132085645169b32647193e4ec265 && \
TZ=Asia/Kolkata && \
MULE_USER=mule
# SSL Cert for downloading mule zip
RUN apk — no-cache update && \
apk — no-cache upgrade && \
apk — no-cache add ca-certificates && \
update-ca-certificates && \
apk — no-cache add openssl && \
apk add — update tzdata && \
rm -rf /var/cache/apk/*
RUN adduser -D -g “” ${MULE_USER} ${MULE_USER}RUN mkdir /opt/mule-standalone-${MULE_VERSION} && \
ln -s /opt/mule-standalone-${MULE_VERSION} ${MULE_HOME} && \
chown ${MULE_USER}:${MULE_USER} -R /opt/mule*
RUN echo ${TZ} > /etc/timezoneUSER ${MULE_USER}# Checksum
RUN cd ~ && wget https://repository-master.mulesoft.org/nexus/content/repositories/releases/org/mule/distributions/mule-standalone/${MULE_VERSION}/mule-standalone-${MULE_VERSION}.tar.gz && \
echo “${MULE_MD5} mule-standalone-${MULE_VERSION}.tar.gz” | md5sum -c && \
cd /opt && \
tar xvzf ~/mule-standalone-${MULE_VERSION}.tar.gz && \
rm ~/mule-standalone-${MULE_VERSION}.tar.gz
# Define mount points.
VOLUME [“${MULE_HOME}/logs”, “${MULE_HOME}/conf”, “${MULE_HOME}/apps”, “${MULE_HOME}/domains”]
# Define working directory.
WORKDIR ${MULE_HOME}
CMD [ “/opt/mule/bin/mule”]# Default http port
EXPOSE 8081
  • Line # 1 says what is the base image we need to use for Docker Image
  • Line # 4–8 define different environment variables to which are used later in Dockerfile
  • Line # 11–17 used download SSL Cert for downloading mule zip
  • Line # 20 to add user mule
  • Line #22–24 to create temporary directory and directory where mule will be extracted as well giving permission to mule user on those directories
  • Line # 26 to update the timezone
  • Line # 31–35 to download mule standalone, verify its checksum and extract the mule tar.gz file
  • Line # 38 to define mount points which can later be mapped between container image and file system
  • Line # 41 to define the working directory
  • Line # 43 to run the mule engine so on start of docker container the mule engine will start automatically
  • Line # 46 to expose 8081 port
Dockerfile

Note: This example uses MuleSoft CE. To use MuleSoft EE please change the line # 31 to download the desired standalone software and also add below line to copy the valid license file.

COPY <Local-Dir>/muleLicenseKey.lic /opt/mule/conf/muleLicenseKey.lic

Run Docker Container:

Before starting Docker Container create below directories and make sure they have write access

/opt/mule/apps
/opt/mule/logs

To run docker container run below command.

docker run -d — name mule-ee.4.3.0 -p “80:8081” -v /opt/mule/apps:/opt/mule/apps -v /opt/mule/logs:/opt/mule/logs mule-ee:4.3.0

Run below command to check whether docker container status

docker ps
Docker Processes

Run Mule Application within Mule Docker Container:

Create a Mule Sample Application with below flow.

<?xml version=”1.0" encoding=”UTF-8"?><mule xmlns:ee=”http://www.mulesoft.org/schema/mule/ee/core" xmlns:http=”http://www.mulesoft.org/schema/mule/http"
xmlns=”http://www.mulesoft.org/schema/mule/core"
xmlns:doc=”http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=”http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
<http:listener-config name=”HTTP_Listener_config” doc:name=”HTTP Listener config” doc:id=”b8a39b7b-d853–403a-b8dd-c83f47c84bc9" >
<http:listener-connection host=”0.0.0.0" port=”8081" />
</http:listener-config>
<flow name=”mule-dockerFlow” doc:id=”9bcaaf34-dfb3–4f01–8992–45c36ac80f6b” >
<http:listener doc:name=”Listener” doc:id=”36635102–6321–4129–893b-952db7bd2882" config-ref=”HTTP_Listener_config” path=”/test”/>
<ee:transform doc:name=”Transform Message” doc:id=”c51eb0e8–80de-4c54–8ae8-de8d6f0bce27" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output text/plain
— -
“Mule Application Running in Docker”]]></ee:set-payload>
</ee:message>
</ee:transform>
</flow>
</mule>

Generate the jar file and place the jar file on /opt/mule/apps folder.

Hit below endpoint and see the output.

192.168.56.101:8081/test
Running Mule Application

To learn more about docker please refer below links.

https://docker-curriculum.com/

https://docs.docker.com/engine/reference/commandline/docker/

--

--

Mazhar Ansari

I am seasoned Integration Architect with around 18+ yrs of exp. I have extensively worked on TIBCO and Mulesoft. Mainly in EAI, ESB, SOA, API and BPM projects.