AvegaGroup / dockerApplicationServer

dockerApplicationServer
MIT License
7 stars 15 forks source link

Meeting notes 2014-06-04 #1

Open dmarell opened 10 years ago

dmarell commented 10 years ago

Skapat ett nytt github-projektdockerApplicationServer för att skapa en maskin att köra Docker på. Mac OS X kör inte Docker native. Då kan man använda samma maskindefinition att utveckla på som i produktion.

Om vi lägger Dockerdefinitionen i en eget github-projekt kan vi bygga en docker-image som kan finnas i dockers repository (Dockers affärsmodell är liknande githubs, de hostar images gratis så länge de är publika. Vill du ha privata docker images kostar det).

Utgår från phusion/baseimage därför att den har stöd för ssh, default för Docker är att ssh-stöd saknas. skapa VagrantFile vagrant up --provider=docker

Docker behöver port 4243 och det kolliderade med CrashPlan, så har man CrashPlan eller nåt annat på 4243 får man stoppa det.

Vi började med att skapa en databasmaskin. Vi tror att rätt modell med docker är att starta en docker-container per databas och inte försöka klämma in flera databaser i samma db-container.

Nästa steg är att skapa en appserver med tomcat.

Vi fick trassel med hängning vid uppstart: ... ==> app: Creating the container... app: Name: app app: Image: phusion/baseimage app: Cmd: /sbin/my_init --enable-insecure-key app: Volume: /var/lib/docker/docker_1401893872_25527:/vagrant app: Port: 2222:22 Här hänger den i evigheter vid vagrant up --provider=docker. Beror detta på att vi kör phusion/baseimage?

Vi övergick att köra doodleshop som är en demoapp med embedded tomcat. Då behöver vi bara ha JRE på maskinen och slipper installera Tomcat.

Vi tänker oss att lägga CoreOS i botten, dvs starta denna med Vagant (man ska kunna köra samma konfig från Windows, Linux och OS X). CoreOS har Docker. Som Docker-containers kör vi hela miljön: prodserver, testserver, dbserver, lastbalanserare, ciserver.

Vi håller på med att försöka mappa upp kataloger i containrarna till hostens filsystem. Till exempel databasen skall lagra sitt data i en katalog som mappas till en katalog på dess host, CoreOS. Och denna katalog på CoreOS måste i sin tur mappas till en katalog i dess hosts filsystem, t.ex. Mac OS X. Samma gäller appservrar för att få ut loggar. Ett alternativ är att skippa att mappa upp appservrarna och satsa på centraliserad loggning via logstash, ELK stack.

Sedan kom vi på att det blir svårt att starta nya docker-containers (prod, test, lb, db) från CI-servern om även denna ligger som en Docker-container, vilket innebär att vi vill installera CI på hosten, samma som docker själv kör på. Detta innebär att det är mest praktiskt att köra precise64 där istället för CoreOS.

Första steget i build pipeline är "Build". Denna bygger artefakten från senaste källkoden. Kör enhetstester. Sedan skapas en Docker-image. Integrationstestjobbet löses genom att pre-integration-test i maven deployar denna versions docker image till en docker container och startar denna. Integrationstesterna kör mot denna container. URL är miljöspecifik så man kan köra integrationtesterna lokalt också. post-integration-test tar ned containern.

Vi fortsatte med att implementera detta i Go. Vi har behov av att flytta ut konfigurationsparametrarna för olika miljöer till environmentvariabler, t.ex. http-port. När man startar en docker-container med docker run anger man vilken port den skall exponera. Applikationen måste startas med samma port och porte beror av vilken Docker-container applikationen kör. Denna parameter måste kunna styras utifrån för att informationen om vilken port vi kör på inte ska behöva finnas på två ställen, dvs först incheckad i den miljöspecifika konfigurationen och dessutom i den incheckade go-jobbkonfigen. Samma gäller andra parametrar som databas url.

sennerholm commented 10 years ago

https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-docker-dev-environments.html länk med lite info kring docker i vagrant

sennerholm commented 10 years ago

OBS, behöver vagrant 1.6.2

dmarell commented 10 years ago

Embedded tomcat java app: https://github.com/dmarell/doodleshop

dmarell commented 10 years ago

$ java -jar doodleshop.war Create a doodle: $ curl -i -H "Content-Type: application/json" -X POST -d '{"created":1399581007414,"author":"Hoomer","message":"Ummm..."}' http://localhost:8080/doodles Read created doodles: $ curl http://localhost:8080/doodles?author=Homer

danielfagerstrom commented 10 years ago

Docker tutorials http://www.centurylinklabs.com/.

danielfagerstrom commented 10 years ago

Design patterns for Heroku apps that are very relevant for Docker apps http://12factor.net/.

dmarell commented 10 years ago

http://coreos.com/docs/running-coreos/platforms/vagrant/

sennerholm commented 10 years ago

Go conf

<?xml version="1.0" encoding="utf-8"?>
<cruise xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="cruise-config.xsd" schemaVersion="69">
  <server artifactsdir="artifacts" commandRepositoryLocation="default" serverId="3c98e67f-7050-46ef-b051-fd8e63aef897" />
  <pipelines group="docker">
    <pipeline name="Build" labeltemplate="1.0.${COUNT}" isLocked="false">
      <environmentvariables>
        <variable name="LISTEN_ON_PORT">
          <value>8090</value>
        </variable>
      </environmentvariables>
      <materials>
        <git url="https://github.com/dmarell/doodleshop" />
      </materials>
      <stage name="Set_version">
        <jobs>
          <job name="mvn_set_version">
            <tasks>
              <exec command="mvn">
                <arg>versions:set</arg>
                <arg>-DnewVersion=${env.GO_PIPELINE_LABEL}</arg>
                <runif status="passed" />
              </exec>
            </tasks>
          </job>
        </jobs>
      </stage>
      <stage name="Package" fetchMaterials="false">
        <jobs>
          <job name="mvn_clean_package">
            <tasks>
              <exec command="mvn">
                <arg>clean</arg>
                <arg>package</arg>
                <arg>-B</arg>
              </exec>
            </tasks>
          </job>
        </jobs>
      </stage>
      <stage name="LocalTest" fetchMaterials="false">
        <jobs>
          <job name="Dummy_Local_Integration_tests">
            <tasks>
              <exec command="/bin/true" />
            </tasks>
          </job>
        </jobs>
      </stage>
      <stage name="PreDockerCopy" fetchMaterials="false">
        <jobs>
          <job name="ChangeNameOnTarget">
            <tasks>
              <exec command="echo">
                <arg>target/doodleshop-${env.GO_PIPELINE_LABEL}.war</arg>
                <arg>doodleshop.war</arg>
                <runif status="passed" />
              </exec>
            </tasks>
          </job>
          <job name="env">
            <tasks>
              <exec command="env" />
            </tasks>
          </job>
        </jobs>
      </stage>
      <stage name="CreateDockerImage" fetchMaterials="false">
        <jobs>
          <job name="Docker_Build">
            <tasks>
              <exec command="sudo">
                <arg>docker</arg>
                <arg>build</arg>
                <arg>--tag=doodleshop:${env.GO_PIPELINE_LABEL}</arg>
                <arg>.</arg>
                <runif status="passed" />
              </exec>
            </tasks>
          </job>
        </jobs>
      </stage>
      <stage name="DockerRun">
        <jobs>
          <job name="docker_run_doodle_shop_tag_">
            <tasks>
              <exec command="echo">
                <arg>"sudo to start right config"</arg>
              </exec>
            </tasks>
          </job>
        </jobs>
      </stage>
      <stage name="MavenRunTestsAgainsDockerImage">
        <jobs>
          <job name="tired">
            <tasks>
              <exec command="/bin/true" />
            </tasks>
          </job>
        </jobs>
      </stage>
    </pipeline>
  </pipelines>
  <agents>
    <agent hostname="go" ipaddress="10.0.2.15" uuid="6f1e9596-2fc7-4772-ac7e-f76d0d49f932" />
  </agents>
</cruise>
dmarell commented 10 years ago

img_20140604_211347 1 img_20140604_211355 1