creating your own docker containers - howto


2 posts in this topic Last Reply

Recommended Posts

I have been trying to figure out how to add my own containers to Unraid and I couldn't find all the docs in one place.  These instructions include creating a docker image, using your own docker registry instead of dockerhub, and incorporating your image into the private apps section of Community Apps where it can be installed and maintained like any other docker container.  I hope this helps someone.

 

The example used here is a QR code generator I made.  It takes a string and when you submit the form it just shows the qrcode image in the browser.  I use the letsencrypt docker to proxy to it.

 

Set up your docker image.  I just use a Dockerfile, I think docker-compose is the more modern way.

Here is the Dockerfile:

FROM node:12.9.1
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY server.js .
EXPOSE 3016
CMD [ "node", "server.js" ]

Here is package.json:

{
  "name": "qrcode",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "qrcode": "^1.4.4"
  }
}

Here is server.js:

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.urlencoded({ extended: false }))
const QRCode = require('qrcode')

app.post('/qr/qrpost', (req, res) => {
        QRCode.toDataURL(req.body.qrstring, (err, image) => {
                const arr = image.split(/,/);
                const buf = Buffer.from(arr[1], 'base64');

                res.set({ 'Content-Type': 'image/png'});
                res.send(buf);
        });
});

app.listen(3016);

Create a docker image for this:

docker build -t yourname/qrcode .

If you wanted to run it and test it you would do:

docker run --net=yourprivatenet -h qrcode --name qrcode -d yourname/qrcode

At this point you could just be done.  The container will work fine, and you can see it in the Docker tab in Unraid.  You just can't do much with it from there.  I wanted to have my own containers controlled through the Unraid interface just like containers installed from Community Apps.

 

If you continue make sure you get the container id from docker ps and then:

docker stop $id && docker rm $id

I wanted to maintain my own docker registry instead of using dockerhub.  If your image is on dockerhub then you can skip this part:

 

Save this xml into a file called registry.xml.  (The icon is bogus, sorry.  I am too lazy to put the right one.)

<?xml version="1.0" encoding="utf-8"?>
<Container>
<Beta>False</Beta>
<Category>HomeAutomation:</Category>
<Date>2020-04-01</Date>
<Changes>
[b]1.APR.2020:[/b]Added[br]
</Changes>
<Support>https://docs.docker.com/registry/</Support>
<Name>Docker Registry Docker</Name>
<Description>
The Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images.[br][br]
This is the from the Docker team - I just created the template.[br][br]
</Description>
<Registry>https://docs.docker.com/registry/</Registry>
<GitHub>https://github.com/</GitHub>
<Repository>registry:2</Repository>
<BindTime>true</BindTime>
<Privileged>false</Privileged>
<Networking>
  <Mode>bridge</Mode>
  <Publish>
    <Port>
      <HostPort>5000</HostPort>
      <ContainerPort>5000</ContainerPort>
      <Protocol>tcp</Protocol>
    </Port>
  </Publish>
</Networking>
<Data>
  <Volume>
    <HostDir>/mnt/cache/appdata/DockerRegistry</HostDir>
    <ContainerDir>/var/lib/registry</ContainerDir>
    <Mode>rw</Mode>
  </Volume>
</Data>
<Banner>http://i.imgur.com/zXpacAF.png</Banner>
<Icon>http://i.imgur.com/zXpacAF.png</Icon>
</Container>

Create a directory on the usb stick that community apps will use (I'm actually not sure if this persists through reboots and Unraid upgrades):

mkdir -p /boot/config/plugins/community.applications/private/myrepo

Then copy that xml there:

cp registry.xml /boot/config/plugins/community.applications/private/myrepo

Now when you go to the Apps tab in Unraid you will see Private Apps on the left side.  Install the registry you set up there with defaults.  You can change the port from 5000 if you are already using it for something else.  Just remember to change 5000 in later instructions to that port.

 

Tag your qrcode (or whatever) image and push it to your registry:

docker image tag yourname/qrcode localhost:5000/qrcode
docker push localhost:5000/qrcode

(I think it is probably safe to docker rmi $imageid to remove the image you created earlier since it is now in your own registry.  I didn't test that yet.)

 

In the rest of the instructions that is how you refer to the image.  So if you had it uploaded to dockerhub it would be yourname/qrcode but if you have it in your own registry it would be localhost:5000/qrcode.

 

Now you create an xml file for your app, qrcode.xml or whatever.  Edit it for your app:  (Again, the icon is bogus.  Use a proper icon.)

<?xml version="1.0" encoding="utf-8"?>
<Container>
<Beta>False</Beta>
<Category>HomeAutomation:</Category>
<Date>2020-04-01</Date>
<Changes>
[b]1.APR.2020:[/b]Added[br]
</Changes>
<Support>http://forums.unraid.net</Support>
<Name>QRcode</Name>
<Description>
QRcode will take a string and return the QRcode image[br][br]
QRcode will run on port 3016.[br][br]
</Description>
<Registry>http://unraid:5000/qrcode/</Registry>
<GitHub>https://github.com/</GitHub>
<Repository>localhost:5000/qrcode</Repository>
<BindTime>true</BindTime>
<Privileged>false</Privileged>
<Networking>
  <Mode>bridge</Mode>
  <Publish>
    <Port>
      <HostPort>3016</HostPort>
      <ContainerPort>3016</ContainerPort>
      <Protocol>tcp</Protocol>
    </Port>
  </Publish>
</Networking>
<WebUI>http://[IP]:[PORT:3016]</WebUI>
<Banner>http://i.imgur.com/zXpacAF.png</Banner>
<Icon>http://i.imgur.com/zXpacAF.png</Icon>
</Container>

Copy that xml to where Community Apps can find it:

cp qrcode.xml /boot/config/plugins/community.applications/private/myrepo

Reload that tab.  Install your app (set the network to your private net).  Done.  Whew.  So much hassle, haha.  Good luck!

 

And I'm already back.  I forgot, if you actually want to try out the qrcode app you will need this qrcode.html:

<html><head></head><body>
Enter string to qrencode:<br>
<form action='/qr/qrpost' method='POST'>
  <input type='text' name='qrstring' id='qrstring'/>
</form>
</body></html>

Copy that to your letsencrypt nginx document root:

cp qrcode.html /mnt/user/appdata/letsencrypt/www

And the qrcode.subfolder.conf

location ^~ /qr/qrpost {
    include /config/nginx/proxy.conf;
    resolver 127.0.0.11 valid=30s;
    proxy_pass http://QRcode:3016;
}

Copy that to your letsencrypt nginx proxy-confs:

cp qrcode.subfolder.conf /mnt/user/appdata/letsencrypt/nginx/proxy-confs

And restart your letsencrypt docker.  Go to yoursite.com/qrcode.html, type in some words and hit enter to submit.  Voila!

 

I apologize for any mistakes.  Let me know so I can fix them.

Edited by uek2wooF
made first paragraph more descriptive. fixed port number
Link to post
  • 4 weeks later...

So the question now is how to do updates to the app.  I did a new image build with docker build, did the tag and push so it is in the repo, but I don't know what to do so it can be upgraded with community applications.  Any ideas?

Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.