ewd 3 training course part 42: the qewd docker appliance
TRANSCRIPT
![Page 1: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/1.jpg)
Copyright © 2016 M/Gateway Developments Ltd
EWD 3 Training CoursePart 42
The QEWD Docker Appliance
Rob TweedDirector, M/Gateway Developments Ltd
Twitter: @rtweed
![Page 2: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/2.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Docker?
• A technology that allows software to be encapsulated inside an isolated container
• According to Docker themselves:– "Docker containers wrap a piece of software in a
complete filesystem that contains everything needed to run: code, runtime, system tools, system libraries –anything that can be installed on a server. This guarantees that the software will always run the same, regardless of its environment."
– See https://www.docker.com/what-docker
![Page 3: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/3.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Docker Container• QEWD is available from the main docker.io
repository as a pre-built Docker container– rtweed/qewd
• You can also build your own version using the Dockerfile that is included in the QEWD repository– eg, if you wanted to apply your own customisations– See https://github.com/robtweed/qewd/blob/master/docker/Dockerfile
![Page 4: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/4.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Benefits of the QEWD Container
• Provided you've installed Docker, you don't need to do any further installation– Just run the container
• First time you do this, it will automatically download it from docker.io
![Page 5: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/5.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Benefits of the QEWD Container
• QEWD functionality without any "moving parts" on your system– eg no Node.js dependency clashes
• You don't even need Node.js installed on your system
– You just define your handler modules• Write JavaScript files and let the QEWD container
handle them– Without Node.js having to even be present on your
system
![Page 6: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/6.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Appliance
• Just the core QEWD engine– Master process– Worker processes
• Doesn't include the embedded database– Currently designed to work with Redis only
• Using mapped volumes– You can use Redis locally, in another
container or remotely
![Page 7: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/7.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Appliance
• Normal QEWD Session management will take place provided a Redis database is available
![Page 8: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/8.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Appliance
• Nothing you can do in a standard local QEWD installation that can't also be achieved by using the Dockerised version– There's even a version for the Raspberry Pi!
• rtweed/rpi-qewd
![Page 9: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/9.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Appliance
• "Out of the box" defaults– Management password: 'keepThisSecret!'– Worker pool size: 1– Database: Redis listening on port 6379
• qewd-monitor application is included and ready to run– No other applications or APIs pre-defined
![Page 10: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/10.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Appliance
• You can customise the configuration:– Management password– Server name (what appears in qewd-monitor's
banner)– Worker pool size
![Page 11: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/11.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Appliance
• By using Docker volume mapping, you can make specific directories in your host system available to the QEWD Docker container
• In your host system you can therefore define interactive QEWD applications:– Static browser-side resources (HTML, JS,
CSS files)– Back-end handler modules
![Page 12: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/12.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Appliance
• You can also define routes within your host system, to be used by the QEWD Appliance– For Web / REST service APIs
![Page 13: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/13.jpg)
Copyright © 2016 M/Gateway Developments Ltd
So let's try it out
• I'm going to use a Ubuntu Linux system• However, Docker can be installed on most
platforms– Windows– Linux (all versions/flavours)– Unix– MacOS– Even the Raspberry Pi!
![Page 14: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/14.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Installing Docker on Ubuntu 16.04
• sudo apt-get update• sudo apt-get install docker.io
• You can now use Docker– By default, you'll need to run Docker
commands as sudo– This can be modified. See:– https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
![Page 15: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/15.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Installing Docker on Raspberry Pi
• Just invoke the command:curl -sSL https://get.docker.com | sh
• You can now use Docker on your Raspberry Pi– By default, you'll need to run Docker
commands as sudo
![Page 16: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/16.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Some Quick Docker Tests
• Try running these to confirm that Docker is properly installed and working on your system:– sudo docker version– sudo docker info
![Page 17: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/17.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Let's start a Redis ContainerOn Linux:
• sudo docker run -d --name redis -p 6379:6379 redis
• Runs as a daemon (-d)• Exposes internal port 6379 (the default Redis port)
externally to the host as port 6379 (-p)
• First time you invoke this command, it will download and install the Redis Docker container
![Page 18: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/18.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Let's start a Redis ContainerOn Raspberry Pi:
• sudo docker run -d --name redis -p 6379:6379 hypriot/rpi-redis
• Runs as a daemon (-d)• Exposes internal port 6379 (the default Redis port)
externally to the host as port 6379 (-p)
• First time you invoke this command, it will download and install the Redis Docker container
![Page 19: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/19.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Test Redis• First install the Redis command line tool:
– sudo apt-get install redis-tools
• Now start the Redis command line:redis-cli
• It should respond with127.0.0.1:6379>– it's working and you're connected to the Redis container!
• Try the command:info
• Exit redis-cli by typing CTRL&C
![Page 20: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/20.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Prepare for the QEWD Appliance
• First important step:– Create a directory for mapping the QEWD working
directory– It can be any directory you like. I'll use:
cd ~mkdir qewd
– Now make a sub-directory named modulescd qewdmkdir modules
• You don't need to put anything into this directory yet, but it should exist
![Page 21: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/21.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Start the QEWD Appliance
sudo docker run -d -p 8080:8080 --link redis:redis -v /home/ubuntu/qewd/modules:/opt/qewd/mapped rtweed/qewd
First time you invoke this, it will download the QEWD Container fromDocker.io
-p 8080:8080 maps port 8080 in the QEWD container to your host's port 8080-d run as a daemon. You can also try -it for interactive display-link redis:redis links to the Redis container-v maps the QEWD working directory to the one we created
QEWD will now be running!
On Linux:
![Page 22: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/22.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Start the QEWD Appliance
sudo docker run -d -p 8080:8080 --link redis:redis -v /home/pi/qewd/modules:/opt/qewd/mapped rtweed/rpi-qewd
First time you invoke this, it will download the QEWD Container fromDocker.io
-p 8080:8080 maps port 8080 in the QEWD container to your host's port 8080-d run as a daemon. You can also try -it for interactive display-link redis:redis links to the Redis container-v maps the QEWD working directory to the one we created
QEWD will now be running!
On Raspberry Pi:
![Page 23: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/23.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Try QEWD
http://192.168.1.123:8080/qewd-monitor/index.html
Change the IP address / host name as appropriate for your host machine
You should see the qewd-monitor application!
Log in using the default password: keepThisSecret!
![Page 24: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/24.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Let's check Redis again
• Start redis-cli again• This time enter the command:
– keys *
• You should see a load of Redis key/value pairs, representing the QEWD Session global storage used by your qewd-monitorsession
![Page 25: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/25.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Let's build a quick application
• We'll create the files in the ~/qewddirectory that we previously made
![Page 26: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/26.jpg)
Copyright © 2016 M/Gateway Developments Ltd
First, stop the QEWD Container
• Use the qewd-monitor; or• Use the docker stop command
– To do that we need to first find out the QEWD container's unique Id
– sudo docker ps -aCONTAINER ID IMAGEd810c520894e rtweed/qewd7d0c18b8cec5 redis
![Page 27: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/27.jpg)
Copyright © 2016 M/Gateway Developments Ltd
First, stop the QEWD Container
• Use the qewd-monitor; or• Use the docker stop command
– To do that we need to first find out the QEWD container's unique Id
– sudo docker ps -aCONTAINER ID IMAGEd810c520894e rtweed/qewd7d0c18b8cec5 redis Usually the first
3 characters aresufficient
![Page 28: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/28.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Stop the QEWD Container
• sudo docker stop d81
![Page 29: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/29.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create a test application
• We'll name it testapp– It will have a button which, when clicked,
sends a message to the QEWD back-end which returns an acknowledgement response
• First create a directory for the browser-side static files:
cd ~/qewdmkdir wwwcd www
![Page 30: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/30.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create the index.html<html> <head><title>Demo QEWD application</title>
</head> <body><script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script><script src="/socket.io/socket.io.js"></script><script src="/ewd-client.js"></script><script src="app.js"></script>
<button id="testBtn">Click Me</button>
<div id="content">Content goes here
</div></body>
</html> Save as ~/qewd/www/testapp/index.html
![Page 31: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/31.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create the app.js
Save as ~/qewd/www/testapp/app.js
$(document).ready(function() {
EWD.log = true;
EWD.on('ewd-registered', function() {$('#testBtn').on('click', function(e) {var message = {type: 'testButton'};EWD.send(message, function(messageObj) {$('#content').text(messageObj.message.ok);
});
});});
EWD.start('testapp', $, io);});
![Page 32: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/32.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create the back-end module
• This needs to go into the directory we created earlier:
~/qewd/modules• We'll name the module testapp.js
![Page 33: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/33.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create testapp.jsmodule.exports = {handlers: {testButton: function(messageObj, session, send, finished) {console.log('*** handling the button click message!');session.data.$('foo').value = 'bar';finished({ok: 'testButton message was processed successfully!'
});}
}};
Save as ~/qewd/modules/testapp.js
![Page 34: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/34.jpg)
Copyright © 2016 M/Gateway Developments Ltd
How will QEWD find the module?
• The QEWD Docker Appliance will expect to find it in its node_modules directory
• We don't have access to that from the host• But we've mapped ~/qewd/modules to a
mapped volume in the Docker container:~/opt/qewd/mapped
![Page 35: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/35.jpg)
Copyright © 2016 M/Gateway Developments Ltd
How will QEWD find the module?
• We can use a QEWD module map to tell QEWD where to find the back-end module for our testapp application
• The QEWD Docker appliance allows us to define this in the mapped volume directory using the reserved file name: – moduleMap.js
![Page 36: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/36.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create moduleMap.jsmodule.exports = {testapp: '/opt/qewd/mapped/testapp'
}
Save as ~/qewd/modules/moduleMap.js
![Page 37: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/37.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create moduleMap.jsmodule.exports = {testapp: '/opt/qewd/mapped/testapp'
}
The module map exports as many mappings as you want
Save as ~/qewd/modules/moduleMap.js
![Page 38: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/38.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create moduleMap.jsmodule.exports = {testapp: '/opt/qewd/mapped/testapp'
}
The module map exports as many mappings as you want
We just need this one.
Save as ~/qewd/modules/moduleMap.js
![Page 39: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/39.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create moduleMap.jsmodule.exports = {testapp: '/opt/qewd/mapped/testapp'
}
Note: the mapped module path is to the internal pathwithin the container
Save as ~/qewd/modules/moduleMap.js
![Page 40: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/40.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create moduleMap.jsmodule.exports = {testapp: '/opt/qewd/mapped/testapp'
}
Note: the mapped module path is to the internal pathwithin the container, not the path we created on the host
~/qewd/modules/testapp.js
![Page 41: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/41.jpg)
Copyright © 2016 M/Gateway Developments Ltd
That should be all we need
• When we start the QEWD Appliance again, we must also map the directory containing the browser-side files, ie– ~/qewd/www/testapp
![Page 42: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/42.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Start the QEWD Appliance
• On Linux:
sudo docker run -d -p 8080:8080 --link redis:redis ↩ -v /home/ubuntu/qewd/modules:/opt/qewd/mapped ↩
-v /home/ubuntu/qewd/www/testapp:/opt/qewd/www/testapp ↩ rtweed/qewd
![Page 43: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/43.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Start the QEWD Appliance
• On Raspberry Pi:
sudo docker run -d -p 8080:8080 --link redis:redis ↩-v /home/pi/qewd/modules:/opt/qewd/mapped ↩
-v /home/pi/qewd/www/testapp:/opt/qewd/www/testapp ↩rtweed/rpi-qewd
![Page 44: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/44.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Try running testapp
It works
The console show that testapp correctly registereditself on QEWD
Try clicking the button..
![Page 45: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/45.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Try running testapp
It works too!
A message was sentto the QEWD back-endwhich returned the expectedresponse
![Page 46: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/46.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Check the SessionStart the qewd-monitor application and click the Session tab:
![Page 47: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/47.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Check the SessionStart the qewd-monitor application and click the Session tab:
Where did this come from?
![Page 48: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/48.jpg)
Copyright © 2016 M/Gateway Developments Ltd
It came from testapp.jsmodule.exports = {handlers: {testButton: function(messageObj, session, send, finished) {console.log('*** handling the button click message!');session.data.$('foo').value = 'bar';finished({ok: 'testButton message was processed successfully!'
});}
}};
Save as ~/qewd/modules/testapp.js
![Page 49: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/49.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD Apps with no moving parts!
• We just created a QEWD app without having anything installed other than Docker
• We just defined:– the HTML and JavaScript files for the
browser– The back-end JavaScript handler module
• And mapped their directories as Docker volumes
![Page 50: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/50.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Adding more apps• Each app you create will need its own
subdirectory under the ~/qewd/www directory– For its browser-side HTML, JavaScript, etc files– Each of these will have to be mapped to the
corresponding volume in the QEWD container• Their back-end modules, however, just go into
your mapped ~/qewd/modules folder– And then define their module mapping in
moduleMap.js
![Page 51: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/51.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Mapping Multiple Apps
module.exports = {testapp: '/opt/qewd/mapped/testapp',mySecondApp: '/opt/qewd/mapped/mySecondApp',myThirdApp: '/opt/qewd/mapped/myThirdApp'
}
~/qewd/modules/moduleMap.js
![Page 52: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/52.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Mapping Multiple Apps
• eg, On Linux:
sudo docker run -d -p 8080:8080 --link redis:redis ↩-v /home/ubuntu/qewd/modules:/opt/qewd/mapped ↩
-v /home/ubuntu/qewd/www/testapp:/opt/qewd/www/testapp ↩-v /home/ubuntu/qewd/www/mySecondApp:/opt/qewd/www/mySecondApp ↩-v /home/ubuntu/qewd/www/myThirdApp:/opt/qewd/www/myThirdApp ↩rtweed/qewd
![Page 53: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/53.jpg)
Copyright © 2016 M/Gateway Developments Ltd
What about REST APIs?
• We can use the QEWD Docker Appliance to very quickly create REST APIs, again without any moving parts other than Docker itself
• Even simpler to create than applications
![Page 54: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/54.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Let's create an API• We'll define a URL path prefix:
– /api• And handle any lower-level URLs, eg:
– /api/test
• To do this we just need to create a handler module for the /api path. We'll call it api.js. It must be saved into the ~/qewd/modules directory
![Page 55: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/55.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create api.jsmodule.exports = {
restModule: true,
handlers: {test: function(messageObj, finished) {finished({foo: 'bar'});
}}
}; Save as ~/qewd/modules/api.js
![Page 56: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/56.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create api.jsmodule.exports = {
restModule: true,
handlers: {test: function(messageObj, finished) {finished({foo: 'bar'});
}}
}; Save as ~/qewd/modules/api.js
It's just a standard QEWD REST/Web Service Module
![Page 57: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/57.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create api.jsmodule.exports = {
restModule: true,
handlers: {test: function(messageObj, finished) {finished({foo: 'bar'});
}}
}; This function, test, will handleany incoming /api/test requests
![Page 58: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/58.jpg)
Copyright © 2016 M/Gateway Developments Ltd
QEWD needs to know how to find it
• As we're defining the handler module in a mapped directory, we need to tell QEWD where to find it and how to define it as a route.
• For this we define a reserved named file in our ~/qewd/modules directory:– routes.js
![Page 59: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/59.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create routes.jsmodule.exports = [{path: '/api',module: '/opt/qewd/mapped/api'
}];
Save as ~/qewd/modules/routes.js
![Page 60: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/60.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create routes.jsmodule.exports = [{path: '/api',module: '/opt/qewd/mapped/api'
}];
Save as ~/qewd/modules/routes.js
You export an array of route objects
We'll just define one for /api in this example,but you can define as many routes as you wish
![Page 61: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/61.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create routes.jsmodule.exports = [{path: '/api',module: '/opt/qewd/mapped/api'
}];
Note that the route must map to the container'sinternal mapped volume path
So any incoming requests with a URL starting/api will be handled by the api.js file we've createdin the host's mapped directory
![Page 62: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/62.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Let's try it
• Our handler function isn't making any distinctions about the HTTP method used, so we can test it just using a browser.
![Page 63: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/63.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Let's try it
It worked!
![Page 64: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/64.jpg)
Copyright © 2016 M/Gateway Developments Ltd
REST/Web Service APIs
• Of course this was a very simple example• But you can write as complex APIs as you
wish. • All the functionality described in parts 31
and 36 of this course are available in the QEWD Docker Appliance
![Page 65: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/65.jpg)
Copyright © 2016 M/Gateway Developments Ltd
REST APIs without moving parts
• You can now define Web/REST APIs by writing JavaScript handler module files
• No need to install Node.js
![Page 66: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/66.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Customising QEWD Appliance
• QEWD Docker Appliance defaults:– Management password: keepThisSecret!
• Always a good idea to change this!– Server name: QEWD Docker Server
• Used by the qewd-monitor application– Worker pool size: 1
• You can change these
![Page 67: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/67.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Customising QEWD Appliance
• Create a file named custom.js in your mapped directory (eg ~/qewd/mapped)– custom.js is a reserved name that the QEWD
Docker Appliance will look for and use for customising its configuration
![Page 68: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/68.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create custom.jsmodule.exports = {config: {managementPassword: 'mySecret!',serverName: 'Robs QEWD Docker Appliance',poolSize: 2
}};
Save as ~/qewd/modules/custom.js
![Page 69: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/69.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Restart the Appliance
• eg:– sudo docker restart d81
• Try running qewd-monitor– You'll need to use your new custom login
password– It will display the new name for your server– It will show 2 worker processes
![Page 70: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/70.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Further Customisation
• You can get access to the master process objects:– Create user defined data / objects that are
passed to worker processes– Access the ewd-qoper8 object– Access the Express object
• Define a run function. This is invoked when QEWD starts.
![Page 71: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/71.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create custom.jsfunction customise(config, q, intercept) {console.log('*** This is the custom function calling!');
}
module.exports = {config: {run: customise,managementPassword: 'mySecret!',serverName: 'Robs QEWD Docker Appliance',poolSize: 2
}};
Save as ~/qewd/modules/custom.js
![Page 72: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/72.jpg)
Copyright © 2016 M/Gateway Developments Ltd
Create custom.jsfunction customise(config, q, intercept) {console.log('*** This is the custom function calling!');
}
module.exports = {config: {run: customise,managementPassword: 'mySecret!',serverName: 'Robs QEWD Docker Appliance',poolSize: 2
}}; q is the main ewd-qoper8 object
intercept.app is the Express objectallowing you to add custom middleware
![Page 73: EWD 3 Training Course Part 42: The QEWD Docker Appliance](https://reader031.vdocuments.site/reader031/viewer/2022022413/58a061da1a28ab5c1c8b6ef5/html5/thumbnails/73.jpg)
Copyright © 2016 M/Gateway Developments Ltd
That's the QEWD Docker Appliance
• A handy and simple, low-impact way of using QEWD without worrying about interactions with your existing set-up– And without having to install Node.js or a
database• All the functionality of a standard local
implementation of QEWD is still available to you