On Github mrodem / bigone-docker
FROM python:2.7 # Install Python packages RUN pip install gunicorn Flask # Add our own code to the image ADD . /code # Run the application CMD ["bin/start.sh"]- Oppskriften for hva som skal være med i et image defineres i en såkalt Dockerfile - Øverst definerer man et base image som ofte er hentet fra Docker hub - Deretter en serie med instruksjoner, f.eks. installere avhengigheter - Til slutt defineres hvilken kommando som skal kjøres når man starter kontaineren - Instruksjonene blir cachet, så hvis du har bygd imaget en gang, og bygger på nytt senere, vil den hoppe over de stegene som allerede er gjort tidligere - Hvis man i dette tilfellet har endret noe kode i stående katalog, og bygger imaget på nytt, vil den f.eks. hoppe over installeringen av python-pakker
myapi:
build: .
volumes:
- .:/code
ports:
- 8080:80
environment:
- DB_URL=postgresql://user:pw@database:5432/mydb
links:
- database
database:
image: postgres:9.4
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pw
- Her er et eksempel på en docker-compose fil
- Vi har en api container (myapi) og en database container
- Vi ser at vi har definert build med et punktum
- Det betyr at docker-compose skal bygge et image basert på Dockerfile i
stående katalog - med mindre det allerede finnes et slikt image
- Vi ser også at vi har angitt at stående katalog skal mappes inn i
API-containeren, via volumes - dette vil man typisk gjøre når man utvikler
- Slik at hvis man endrer noen filer på hosten, vil dette også reflekteres i
containeren
- Man kan også mappe opp porter, f.eks. her sier vi at trafikk som går mot port
8080 på hosten skal rutes til port 80 i containeren
- Api containeren er linket mot database-containeren, slik at den kan
kommunisere med databasen
- Finnes mange muligheter for konfigurasjon her
# Build and start all containers $ docker-compose up -d # List running containers $ docker-compose ps Name Command State Ports ------------------------------------------------------------------ myapi_myapi_1 bin/start.sh Up 0.0.0.0:8080->80/tcp myapi_db_1 postgres Up 5432/tcp- Nå kan man starte alle containerne ved å skrive docker-compose up - Man kan også få en oversikt over kjørende containere med docker-compose ps - Man kan starte og stoppe containere hver for seg osv.
repositories ├── myapi │ ├── docker-compose.yml │ ├── Dockerfile │ └── ... └── mywebapp ├── docker-compose.yml ├── Dockerfile └── ...- I vårt eksempel her har vi to repositories - Et API repository - Et webapp repository - Begge har hver sitt sett med docker-compose og Dockerfile - Med disse kan man teste og kjøre opp applikasjonene hver for seg
repositories
├── myapi
│ └── ...
├── mywebapp
│ └── ...
└── myenvironments
├── local
│ └── docker-compose.yml
├── develop
│ └── docker-compose.yml
├── test
│ └── docker-compose.yml
└── production
└── docker-compose.yml
- For å kjøre opp både API og webapp samtidig, har
vi et ekstra Git repository som inneholder
konfigurasjon for alle miljøer
- Her har vi konfigurasjon for local, develop, test, og production
myapi: build: ../../myapi ... mywebapp: build: ../../mywebapp ... database: image: postgres:9.4 ... elasticsearch: image: elasticsearch:2.3 ... nginx: image: nginx:1.8 ...- Her er nedstrippet eksempel på docker-compose fil for kjøring lokalt når man utvikler - En stor fordel her er at alle utviklere kan kjøre opp hele systemet lokalt på sin PC, og konfigurasjonen er lik for alle - veldig verdifullt, unngår forskjeller i oppsett - Alt kjører i isolerte kontainere, så man unngår at ulikheter i oppsett på PCene påvirker systemet - Ser at denne refererer til de andre repositoriene, slik at når man endrer noe der, vil dette reflekteres i de kjørende containerne
# docker-compose.yml
jenkins:
image: jenkins
links:
- registry
volumes:
- /home/jenkins/:/var/jenkins_home
ports:
- "8080:8080"
registry:
image: registry:2.0
volumes:
- /home/registry:/tmp/registry-dev
ports:
- "5000:5000"
- Det finnes Docker images for både Jenkins og Registry på Docker Hub
- Dermed veldig enkelt å sette opp både Jenkins og Registry med en
docker-compose fil
- Du vil typisk legge denne fila i et Git repository og klone repoet på en
server hvor Docker er installert
- Da er det bare å kjøre docker-compose up, så har du alt oppe å kjøre på få
sekunder
# Build script executed by Jenkins # Build and run tests docker-compose build docker-compose run myapi nosetests # Where to push image IMAGE_LOCATION=localhost:5000/myapi:master-$BUILD_NUMBER # Tag and push the image to our Docker registry docker tag myapi:latest $IMAGE_LOCATION docker push $IMAGE_LOCATION- Jenkins har plugins for å bygge og publisere Docker images, men det er nesten vel så enkelt å gjøre det med et script - Ser at vi bruker branch og byggenummer som tag på imagene - Her har vi hardkodet image og branch for hver jobb. For å gjøre det mer generelt, kan man bruke navnet på byggejobben og byggenummer som tag. Da kan man gjenbruke samme script for alle jobbene.
But this is often "good enough" for non-critical systems, or during the initial project phase