Deploying Docker Image applications¶
Overview¶
This document is a hands-on guide to deploy a simple Docker Image web application.
Creating the app¶
To create an app, you need to use the command app-create:
$ tsuru app-create <app-name> <app-platform>
For Docker Images, doesn’t exist a specific platform, but we can use static
! Let’s be over creative and develop a hello
world tutorial-app, let’s call it “helloworld”:
$ tsuru app-create helloworld static
To list all available platforms, use the command platform-list.
You can see all your applications using the command app-list:
$ tsuru app-list
+-------------+-------------------------+--------------------------------+
| Application | Units State Summary | Address |
+-------------+-------------------------+--------------------------------+
| helloworld | 0 of 0 units in-service | helloworld.192.168.50.4.nip.io |
+-------------+-------------------------+--------------------------------+
Application code¶
A simple Dockerfile:
FROM golang
RUN mkdir /app
WORKDIR /app
ADD . /app/
RUN go build .
ENTRYPOINT ./app
Note
Notice that you do not have to EXPOSE a port in your Dockerfile. When a EXPOSE clause is used, the port mapping goes to the exposed port. Make sure to not expose more than one port. This will make the deployment fail. If you do not expose a port, the port is mapped to the $PORT environment variable.
A simple web application in Go main.go:
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func(){
for sig := range c {
if sig == os.Interrupt || sig == os.Kill {
os.Exit(1)
}
}
}()
http.HandleFunc("/", hello)
fmt.Println("running on "+os.Getenv("PORT"))
http.ListenAndServe(":"+os.Getenv("PORT"), nil)
}
func hello(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "hello, world!")
}
Note
The app should listen to $PORT or to the exposed port.
Building the image¶
docker login registry.myserver.com
docker build -t registry.myserver.com/image-name .
Don’t forget the dot(.) at the end of the command, this indicates where the Dockerfile is placed
Sending the image to registry¶
docker push registry.myserver.com/image-name
Docker Image deployment¶
After pushing your image to your Docker image registry, you can do the deploy using the command tsuru app-deploy -i.
tsuru app-deploy -i registry.myserver.com/image-name -a helloworld
Note
This image should be in a registry and be accessible by the nodes. Image should also have a Entrypoint or a Procfile at given paths, / or /app/user/ or /home/application/current
Running the application¶
Now that the app is deployed, you can access it from your browser, getting the
IP or host listed in app-list
and opening it. For example,
in the list below:
$ tsuru app-list
+-------------+-------------------------+--------------------------------+
| Application | Units State Summary | Address |
+-------------+-------------------------+--------------------------------+
| helloworld | 1 of 1 units in-service | helloworld.192.168.50.4.nip.io |
+-------------+-------------------------+--------------------------------+
It’s done! Now we have a simple Docker image project deployed on tsuru.
Now we can access your app in the URL displayed in app-list (“helloworld.192.168.50.4.nip.io” in this case).
Going further¶
For more information, you can dig into tsuru docs, or read complete instructions of use for the tsuru command.