Docker med shipyard i RedBridge Cloud

(Magnus Bengtsson)

Sätt upp din RedBridge Cloud miljö

I RedBridge Cloud är det enkelt att komma igång med Docker. Jag kommer att visa hur du enkelt kan få igång en Wordpress site i RedBridge Cloud med hjälp av Docker.

Docker är en platform för att bygga, distribuera och köra applikationer. Applikationerna körs som containers, en slags lättviktig virtualisering i operativsystemet där separata containers inte kan se eller påverka varandras processer eller kommunikation. En Docker container byggs med principen "en app/container".

Uppsättningen kommer att bestå av 3 st Ubuntu 14.04 trusty instanser som kör Docker 1.5. Wordpress stacken kommer att köras på en MySQL och en Wordpress container. För att enkelt administrera Docker miljön kommer vi att använda Shipyard. Det går givetvis lika bra att använda Dockers kommandoradsverktyg.

Shipyard är ett grafiskt verktyg för att hantera instanser som kör docker, Shipyard har både ett trevligt GUI samt ett bra kommandoradsinterface, CLI.

Inledningsvis kommer vi att använda oss av en terminal för att få igång miljön.

Föra att snabbt kunna komma igång med uppsättningen använder jag rbc-tools, våra kommandoradsverktyg för att hantera resurser i RedBridge Cloud. För att installera rbc-tools behöver du Python på din dator, kör du Mac eller Linux behöver du bara installera dem genom:

$ pip install rbc-tools

När de är installerade behöver du skapa en rbc.fg fil som anger hur du skall ansluta mot vårt API, följ instruktionerna här för att komma igång snabbt. Jag kommer att använda mig av ett VPC (Virtual Private Cloud) i RedBridge Cloud som jag har kopplat upp mig med VPN mot. Det går givetvis lika bra att använda ditt "vanliga" nätverk i RedBridge Cloud, se till att aktiva klient-VPN och anslut till det, instruktioner kan du hitta här.

$ rbc-networks list
name             zone       offering               cidr            domain            snat           vpn    state
---------------  ---------  ---------------------  --------------  ----------------  -------------  -----  -----------
demo-vpc         se-sth-z1  VPC                    172.17.18.0/23  rbcloud.internal  185.53.167.50  No     Enabled
vpc-1-public-lb  se-sth-z1  dynamic-vpc-public-lb  172.17.18.0/25  rbcloud.internal                 No     Implemented

Du behöver även en ssh nyckel definierad:

$ rbc-sshkeys generate ubuntu > id_rsa.ubuntu && chmod 400 id_rsa.ubuntu

För att komma igång snabbt skall vi använda user-data i RedBridge Cloud, user-data är information som instanser får tillgång till genom att göra ett webbanrop mot en speicell url. Med rbc-tools kan du ange en fil som innehåller user-data. I de templates som RedBridge skapar i RedBridge Cloud finns alltid cloud-init installerat, cloud-init läser instansens user-data och utför de instruktioner som finns där. Cloud-init använder en enkel yaml baserad syntax. Så skapa en fil vid namn user-data.txt i den katalog som du står i :

cat <<EOF > user-data.txt
#cloud-config
runcmd:
  - [ sh, -xc, "curl -sSL https://get.docker.io/ubuntu/ | sh" ]
  - [ sh, -xc, 'echo DOCKER_OPTS=\"-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock\" >> /etc/default/docker']
  - restart docker
EOF

Denna user-data fil kommer att på din nya instans installera senaste Docker, lägga till en option för att få Docker demonen att lyssna på TCP för externa kommandon samt starta om Docker.

Det är nu dags att starta några instanser och komma igång:

$  rbc-instances deploy -i 3 -t rbc/ubuntu-14.04-server-cloudimg-amd64-20GB-20153214 -s ubuntu -w vpc-1-public-lb -o medium -f user-data.txt docker-host
name             zone       state    offering    group    network          ipaddress     sshkey    password    template                                              created
---------------  ---------  -------  ----------  -------  ---------------  ------------  --------  ----------  ----------------------------------------------------  ------------------------
docker-host-0b1  se-sth-z1  Running  medium      None     vpc-1-public-lb  172.17.18.27  ubuntu    xxxxxxxxx   rbc/ubuntu-14.04-server-cloudimg-amd64-20GB-20153214  2015-03-12T13:54:00+0100
docker-host-b5d  se-sth-z1  Running  medium      None     vpc-1-public-lb  172.17.18.38  ubuntu    xxxxxxxxx   rbc/ubuntu-14.04-server-cloudimg-amd64-20GB-20153214  2015-03-12T13:54:00+0100
docker-host-fff  se-sth-z1  Running  medium      None     vpc-1-public-lb  172.17.18.59  ubuntu    xxxxxxxxx   rbc/ubuntu-14.04-server-cloudimg-amd64-20GB-20153214  2015-03-12T13:54:00+0100

I exemplet ovan startar jag 3 st medium instanser baserade på templaten rbc/ubuntu-14.04-server-cloudimg-amd64-20GB-20153214, anger att den ssh nyckel som jag skapde ovan skickas med, begär att de skall startas i nätverket vpc-1-public-lb samt att mitt user-data i filen user-data.txt skickas med.

Konfigurera Shipyard

Instanserna kommer att starta snabbt och om du har ditt VPN igång mot RedBridge Cloud  kan du ansluta mot en av maskinerna med ssh:

$ ssh -l ubuntu -i id_rsa.ubuntu 172.17.18.27

Bli root och installera Shipyard som docker container:

$ sudo -i
# docker run --rm -v /var/run/docker.sock:/var/run/docker.sock shipyard/deploy start

Shipyard containern skall nu ha startat upp och den kommer att ange viket lösenord (shipyard) och användarnamn (admin) du skall använda för att logga in.

Nu behöver Shipyard konfigureras så att den känner till de instanser som ska köra Docker containrar åt oss, Shipyards api styrs enkelt med hjälp av shipyard-cli containern, starta den och logga in mot Shipyards API:

# docker run -it shipyard/shipyard-cli
# logga in
shipyard cli> shipyard login
URL: http://localhost:8080
Username: admin
Password:
# Lägg till våra instanser
shipyard cli> shipyard add-engine --id docker-host-0b1 --addr http://172.17.18.27:2375 --cpus 2.0  --memory 3072  --label docker-host-0b1 --label docker-host
shipyard cli> shipyard add-engine --id docker-host-b5d --addr http://172.17.18.38:2375 --cpus 2.0  --memory 3072  --label docker-host-b5d --label docker-host
shipyard cli> shipyard add-engine --id docker-host-fff --addr http://172.17.18.59:2375 --cpus 2.0  --memory 3072  --label docker-host-fff --label docker-host

I Shipyard kan man ange etiketter eller labels till sina Docker maskiner, med dessa blir det enkelt att styra var en container skall köras.

Starta nu en webläsare och logga in i Shipyards GUI från din lokala maskin:

$ open http://172.17.18.27:8080

Logga in som admin, du skall då får se en trevlig överblick av resursutnyttjandet samt se ett par menylänkar där du kan se på de "engines" (Docker instanser) samt containrar som körs.

Wordpress och MySQL

Uppsättningen kommer att använda officiella Docker images för MySQL och Wordpress. Jag kommer att använda Dockers"länk"-funktionalitetför att knyta samman applikation och databas. Börja med att starta en MySQL container:

image0

Namnge containern samt välj vilken instans den ska köras på genom att specificera label för den.

  • sätt ett lämpligt containernamn, jag har valt wp-mysql-1.
  • Vi exporterar även en miljövariabel som containern behöver för att köras, MYSQL_ROOT_PASSWORD, dett blir root lösenordet för mysql.
  • Välj "Publish all Exposed ports", detta kommer att skapa portforward regler för de portar som är satta som "EXPOSE" i dockerfile. För MySQL kommer det att vara 3306.
  • Välj CPU och minne för containern
  • Välj Type "service", detta gör att Shipyard startar containern på din specificerade host, om containern skall köras i ett "high availability" läge kan Shipyard se till att endast en continer körs per host/engine i Shipyard, i detta fall väljer man "unique"
  • Var noggrann och välj den "engine" label som stacken skall köras på.

I "Containers" vyn skall du nu se din nya MySQL container:

image1

När databasen är igång är det dags att starta och koppla en Wordpress container till databasen:

image2

Nu sätter vi en länk till mysql-containern så att Wordpress får tillgång till sin databas. Om jag vill köra Wordpress containern på en annan host/engine kan miljlövariabler sättas för att peka ut databas kopplingen:

  • WORDPRESS_DB_HOST=... (defaults to the IP and port of the linked mysql container)
  • WORDPRESS_DB_USER=... (defaults to "root")
  • WORDPRESS_DB_PASSWORD=... (defaults to the value of the MYSQL_ROOT_PASSWORD environment variable from the linked mysql container)
  • WORDPRESS_DB_NAME=... (defaults to "wordpress")

Du ska nu kunna gå till den adress som Wordpress containern pekar ut och installera din Wordpress, i ports nedan:

image3

Alltså: http://172.17.18.38:49154.

Om du vill att din site skall bli tillgänglig från Internet behöver du nu antingen skapa en lastbalanserare i RedBridge Cloud eller sätta upp portforward regler för extern åtkomst.