<div dir="ltr"><div>Hi all,</div><div><br></div><div>This email is to make some notes regarding to our current services running in Docker containers. The main idea is to enable anyone to fix a container problem or deploy a new one. This will be a long email, sorry for that. After this email thread, we should write some documentation in our wiki.</div><div><br></div><div><b>How are we running Docker currently?</b></div><div><b><br></b></div><div>We are using a bridged network with Docker and it lets us publish a service using a specific port in freedom. Then we proxy-pass the service through nginx (port 80).</div><div>There is a bridge called docker0 and every container has an interface inside this bridge. This is managed automatically by Docker.</div><div><b><br></b></div><div><b>What are the services currently running in a Docker container?</b></div><div><b><br></b></div><div>The current running containers are:</div><div><br></div><div>1) org.sugarlabs.bugs.</div><div><br></div><div>Trac instance. Listening on port 5007.</div><div><br></div><div>You can check this on <a href="http://18.85.44.59:5007">18.85.44.59:5007</a>. Then we proxy this in nginx (/etc/nginx/sites-available/<a href="http://bugs.sugarlabs.org">bugs.sugarlabs.org</a>) using:</div><div><br></div><div><div><font face="monospace, monospace">location / {</font></div><div><font face="monospace, monospace">                proxy_pass <a href="http://localhost:5007">http://localhost:5007</a>;</font></div><div><font face="monospace, monospace">        }</font></div></div><div><br></div><div>2) org.sugarlabs.hook.</div><div><br></div><div>Web hook for SL activities? Listening on port 5004.</div><div><br></div><div>3) kafka: linked with zookeeper. Listening on port 9092.</div><div>4) zookeeper. Listening on port 2181. Locally open ports 2888 and 3888.</div><div><br></div><div>What are we using kafka and zookeeper?</div><div><br></div><div>5) org.sugarlabs.socialhelp_sso.</div><div><br></div><div>Apparently for <a href="http://socialhelp.sugarlabs.org/sso">socialhelp.sugarlabs.org/sso</a>. is it working? Listening on port 5005.</div><div><br></div><div>6) org.sugarlabs.bundlebin.</div><div><br></div><div>Like a pastebin for SL. The code is hosted on <a href="http://github.com/samdroid-apps/bundlebin">http://github.com/samdroid-apps/bundlebin</a>. Listening on port 5000.</div><div><br></div><div>7) org.sugarlabs.nagios.</div><div><br></div><div>Nagios instance. Currently not working the postfix service inside the container. I should fix this or we should create a common postfix container in order to link this and other containers to it.</div><div><br></div><div>Listening on port 8081.</div><div><br></div><div>8) today.sam.sugarstick-creator</div><div><br></div><div>Listening on port 5008.</div><div>Can you explain a little more about this?</div><div><br></div><div>9) rethinkdb</div><div><br></div><div>Only listening locally on ports 8080, 28015 and 29015. What is the purpose of this container?</div><div><br></div><div>10) org.sugarlabs.activities-2</div><div><br></div><div>Listening on port 5006.</div><div>Self descriptive. are we going to kill it?</div><div><br></div><div>11) org.sugarlabs.use-socialhelp</div><div><br></div><div>Listening on port 5003.</div><div><br></div><div>12) org.sugarlabs.help_rebuilder</div><div><br></div><div>Not listening. According to main.py, this is used with kafka.</div><div><br></div><div>13) local_discourse/app</div><div><br></div><div>Listening on port 8002 (web) and 2222 (ssh). Here we host socialhelp.sl.o.</div><div><br></div><div>Sam, if you can give more information about each container would be pretty useful for everyone.</div><div><br></div><div><b>How we build the images and containers?</b></div><div><b><br></b></div><div>Docker can build images automatically by reading instructions from a Dockerfile, a text file that contains all the commands, in order, needed to build a given image. We host all the files needed by a every container in /containers. Actually, we can find there a symlink for every container. For example:</div><div><br></div><div><font face="monospace, monospace">org.sugarlabs.bugs -> /srv/containers/org.sugarlabs.bugs/</font><br></div><div><br></div><div>In case we want to deploy a new service, we can write our own Dockerfile or we can get one from DockerHub (docker image repository).</div><div><br></div><div>We can check the built images in our host with: </div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">docker images</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">We can create a image </font><span style="font-family:arial,helvetica,sans-serif">from a Dockerfile </span><span style="font-family:arial,helvetica,sans-serif">executing the following command: </span></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">docker build -t OUR-IMAGE-NAME .</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">In the last example, the <i>cwd</i> is the container folder where the dockerfile resides. Once the image is created, we can create a container (that run as a daemon) from that image executing:</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="monospace, monospace">docker run -d --name CONTAINER-NAME </font><span style="font-family:monospace,monospace">IMAGE-NAME</span><br></div><div><span style="font-family:monospace,monospace"><br></span></div><div><font face="arial, helvetica, sans-serif">In the last command, we are not publishing our service. In order to bind a container to a specific port we should the -p flag. For example;</font></div><div><br></div><div><font face="monospace, monospace">docker run -d -p 8081:80 </font><span style="font-family:monospace,monospace">--name </span><font face="monospace, monospace">CONTAINER-NAME </font><span style="font-family:monospace,monospace">IMAGE-NAME</span></div><div><span style="font-family:monospace,monospace"><br></span></div><div><font face="arial, helvetica, sans-serif">This would map port 80 inside the container to port 8081 on Freedom.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">We can customize our container at the moment of its deploying giving to the docker run command some options. For example: </font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="monospace, monospace">--cpu-quota</font><font face="arial, helvetica, sans-serif">: in order to limit CPU usage. </font><span style="font-family:arial,helvetica,sans-serif">We have another email thread explaining its usage.</span></div><div><font face="monospace, monospace">--memory</font><font face="arial, helvetica, sans-serif">: memory limit. </font><span style="font-family:arial,helvetica,sans-serif">We have another email thread explaining its usage.</span></div><div><font face="monospace, monospace">--restart: </font><font face="arial, helvetica, sans-serif">restart policy to apply when a container exists.</font><br></div><div><font face="monospace, monospace">--volume</font>: bind mount a volume. Very useful to keep container files inside our own chosen location instead of a docker default location. For example: keeping configuration files of nagios inside /srv/nagios3. This let us re-create the entire container every time we need/want without losing any data.</div><div><br></div><div>Example:</div><div><br></div><div><font face="monospace, monospace">docker run -d -p 8081:80 --cpu-quota=20000 --memory=512M --volume=/srv/nagios3:/etc/nagios3 --name org.sugarlabs.nagios nagios</font><br></div><div><font face="arial, helvetica, sans-serif"> </font></div><div><font face="arial, helvetica, sans-serif">In Sugar Labs, we use a Sam's script called container.yml [1] in order to make docker container configurations live in files. So, we can store all this container configuration inside a container.yml file :-)</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">For example: </font><b style="font-family:arial,helvetica,sans-serif">container.yml</b></div><span style="font-family:monospace,monospace">ports:</span><br><span style="font-family:monospace,monospace"> - 8081:80</span><br><font face="monospace, monospace"><br></font><span style="font-family:monospace,monospace">volumes:</span><br><span style="font-family:monospace,monospace"> - /srv/nagios3:/etc/nagios3</span><br><span style="font-family:monospace,monospace"> - /srv/nagios-plugins:/usr/lib/nagios/plugins</span><br><font face="monospace, monospace"><br></font><span style="font-family:monospace,monospace">memory: 512m</span><br><div><div><font face="monospace, monospace">cpu: 20</font></div></div><div><div style="font-family:arial,helvetica,sans-serif"><br></div></div><div style=""><span style="font-family:arial,helvetica,sans-serif">In order to run the container with the settings defined in the container.yml file, we simply do</span><font face="arial, helvetica, sans-serif">:</font></div><div style=""><font face="monospace, monospace"><br></font></div><div style=""><font face="monospace, monospace">container.yml start -d</font></div><div style=""><font face="monospace, monospace"><br></font></div><div style=""><font face="arial, helvetica, sans-serif">We can also build images using container.yml script. It is a good idea to read container.yml code in order to understand how it works.</font></div><div><br></div><div><b>How can we check a containers' status?</b></div><div><b><br></b></div><div><font face="monospace, monospace">docker ps</font></div><div><br></div><div><b>How can we stop/start a container?</b></div><div><br></div><div>Stop: <span style="font-family:monospace,monospace">docker stop CONTAINER-NAME</span></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Start: </font><span style="font-family:monospace,monospace">docker start CONTAINER-NAME</span></div><div><span style="font-family:monospace,monospace"><br></span></div><div><font face="arial, helvetica, sans-serif">We can also use start/stop from sam's script.</font></div><div><span style="font-family:monospace,monospace"><br></span></div><div><b>How can we get a console from a Container?</b></div><div><b><br></b></div><div><font face="monospace, monospace">docker exec -it [CONTAINER-ID or CONTAINER-NAME] bash</font><br></div><div><b><br></b></div><div>Best regards,</div><div><br></div><div>Samuel C.</div><div><b><br></b></div><div><br></div><div>[1] <a href="https://github.com/sugarlabs-infra/container.yml">https://github.com/sugarlabs-infra/container.yml</a></div></div>