Docker
Little demo
- Hello world
- Let's build something
- Let's run it
$> docker run alpine echo "Hello Cambas"
$> docker run -d alpine tail -f /dev/null
$> docker run -v $(pwd):/app alpine ls /app
$> docker run -v $(pwd):/app alpine touch myfile.txt
Now let's build something
$> mkdir cowsays
$> cd cowsays
$> touch Dockerfile
>> FROM alpine
>> CMD ["echo", "The cow Says MUUUU"]
$> docker build -t cowsays .
$> docker run cowsays
$> docker ps
$> docker ps -a
$> docker images
$> docker history cowsays
Now let's build something that works
$> cd
$> git clone https://github.com/timoteoponce/namer.git
$> cd namer
$> docker run -v $(pwd):/app --workdir /app
\ maven:3-jdk8-alpine mvn clean package
$> docker run -v $(pwd):/app --workdir /app
\ java:8-jre-alpine java -jar target/namer.jar
$> docker run -it -v $(pwd):/app --workdir /app
\ java:8-jre-alpine java -jar target/namer.jar
Port mapping
$> docker run -p 8000:80 nginx
$> docker run -p 9000:80 httpd:alpine
Used commands
- run
- run -d
- images
- ps
- stop
- rm
- rmi
(not (= Docker VM))
Containers vs VMs
Container vs VMs
Container vs VMs
Architecture
Workshop
Little REST API
Clone the project
$> git clone https://github.com/timoteoponce/simple-rest.git
Build it
$> cd simple-rest.git
$> docker run -v $(pwd):/app --workdir /app \
maven:3-jdk-8-alpine mvn clean package
Run it
$> docker run -v $(pwd):/app --workdir /app \
-p 4000:4567 \
java:8-jre-alpine java -jar target/docker-workshop-1.0-SNAPSHOT.jar
http://localhost:4000
Dockerize it
$> touch Dockerfile
$> code Dockerfile
FROM java:jre-8-alpine
ADD target/docker-workshop-1.0-SNAPSHOT.jar /app/.
CMD ["java", "-jar", "/app/docker-workshop-1.0-SNAPSHOT.jar"]
Dockerfile
Dockerize it
$> docker build -t ypfb/simple-rest .
$> docker run -d -p 4000:4567 ypfb/simple-rest
$> docker images
Dockerized environment
- Isolated component
- Completely self-contained
- Runs whenever docker is present
- Can run many at the same time without conflicts
Complex REST
Database
$> docker run -d -e POSTGRES_USER=docker \
-e POSTGRES_PASSWORD=docker \
-e POSTGRES_DB=docker \
--name dockerdb postgres:9-alpine
$> docker run -it --link dockerdb governmentpaas/psql
\ psql -U docker -h dockerdb
Complex REST
$> git checkout step3
$> code .
$> docker run -v $(pwd):/app --workdir /app \
maven:3-jdk-8-alpine mvn clean package
Complex REST
$> docker run -v $(pwd):/app --workdir /app \
--link dockerdb -p 4010:4567 \
java:8-jre-alpine java -jar target/docker-workshop-1.0-SNAPSHOT.jar
Backup a dockerized db
$> docker run -d -e POSTGRES_USER=docker \
-e POSTGRES_PASSWORD=docker \
-e POSTGRES_DB=docker \
--name dockerdb postgres:9-alpine
$> docker exec dockerdb \
pg_dump -U docker -d docker > dockerdb_20171016.sql
Backup an image
$> docker save -o <OUTPUT_TAR_FILE> <IMAGE_NAME>
$> docker save -o ./simple-rest.tar ypfb/simple-rest
Restore an image
Download from https://goo.gl/ikno6M
$> docker load -i ./simple-rest-step2.tar
$> docker images
Run the restored image
$> docker run -d -p 9100:4567 ypfb/simple-rest
Docker-compose
Docker compose
- Simplified container setup
- Centralized
- Standard
docker-compose demo
$> sudo pip install docker-compose
$> mkdir docker-compose-demo
$> cd docker-compose-demo
$> touch docker-compose.yml
$> code .
docker-compose.yml
demo:
image: tutum/hello-world
ports:
- 8888: 80
Run it
$> docker-compose up
Docker compose
- up/down: the processes
- start/stop/restart: the services
Docker-compose our app
Docker-compose
$> git clone https://github.com/timoteoponce/simple-rest.git
$> cd simple-rest
$> git checkout step3
$> docker run \
-v $(pwd):/app -v m2:/root/.m2 \
--workdir /app \
maven:3-jdk-8-alpine mvn clean package
$> docker build -t ypfb/simple-rest-step3 .
Docker-compose
$> mkdir docker-compose-rest
$> cd docker-compose-rest
$> touch docker-compose.yml
$> code .
Docker-compose
database:
image: postgres:9-alpine
environment:
- POSTGRES_DB=docker
- POSTGRES_USER=docker
- POSTGRES_PASSWORD=docker
rest:
image: ypfb/simple-rest-step3
links:
- database:postgres
ports:
- 9000:4567
Docker-compose
$> docker-compose up
Docker-compose
database:
image: postgres:9-alpine
environment:
- POSTGRES_DB=docker
- POSTGRES_USER=docker
- POSTGRES_PASSWORD=docker
rest:
image: ypfb/simple-rest-step3
restart: always
links:
- database:postgres
ports:
- 9000:4567
Let's add some complexity
Multiple services
$> mkdir proxy
$> touch proxy/Dockerfile proxy/nginx.conf
$> code proxy
Multiple services
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
Multiple services
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
proxy_pass http://rest:4567/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header Host $http_host;
}
}
}
Multiple services
database:
image: postgres:9-alpine
environment:
- POSTGRES_DB=docker
- POSTGRES_USER=docker
- POSTGRES_PASSWORD=docker
rest:
image: ypfb/simple-rest-step3
restart: always
links:
- database:postgres
proxy:
build: ./proxy
restart: always
links:
- rest
port:
- 80:80
Multiple services
$> docker-compose rm
$> docker-compose up --build
JEE dockerized application
Create the project
$> git clone https://github.com/timoteoponce/jee-docker
$> cd jee-docker
$> docker run -v $(pwd):/app \
-v ~/.m2:/root/.m2 \
maven:3-jdk-8-alpine mvn clean package
Define environment
FROM timoteoponce/docker-wildfly-postgres
ADD target/jee-docker.war ${DEPLOYMENT_DIR}
Build and run it
$> docker build -t swissbytes/jee-docker .
$> docker run -d -p 8080:8080 \
--name jee-wildfly swissbytes/jee-docker
Full-profile JEE app
Switch to the project
$> git checkout full-profile
$> docker run -v $(pwd):/app \
-v ~/.m2:/root/.m2 \
maven:3-jdk-8-alpine mvn clean package
Build it
$> docker build -t swissbytes/jee-docker .
Create docker compose for it
database:
.....
rest:
.....
Create docker compose for it
$> docker-compose up
docker-workshop
By Timoteo Ponce
docker-workshop
Docker workshop
- 437