Deployment Automation
Egor Pushkin
egor@glympse.com
Platform Architect
Glympse, Inc.
Docker
is
AWESOME
Docker
is not intended to
solve
EVERYTHING
Problem
Source
Code
Build
Config
Environment
Dependencies
Runtime
Config
Compute Instance
Terminology
Docker
Registry
Docker
Image
Docker
Daemon
Docker Instance
Docker
Image
Docker
Container
*
*
1
1
1
*
Storage backend
Local volume, S3, etc.
Registry Instance
Docker
Client
Docker
Client
Installation
Docker
Daemon
Linux
Docker
Client
MacOS
Docker
Client
Docker
Daemon
VM running Linux
$DOCKER_HOST
Flow
Docker
Registrypush image_x
dev. box / Jenkins / CD
InstanceSource Code
Env / Deps
Configuration
Instance
pull image_x
Docker
Image
run image_x
1 2
3
Image Anatomy
Base Image
Updates
Dependencies
Application
Base Image
Updates
Dependencies
Application
Images
bootfs
Base Image
Image
Image
Image
r/o
r/o
r/o
r/o
r/o
App I/O
r/w
Container
Union file system
Union mount
Parent
Linux Containers (LXC)
OS Kernel
...
Container
Container
Container
Docker
daemon
Multi CPU/core box
cgroups
Resource isolation
● CPU
● memory
● disk I/O
Namespace isolation
● process tree
● network
● user ids
● mounted file systems
OS Kernel
Docker
...
Container
Container
Container
There is no virtualization involved when
software runs within containers.
(2007)
Docker Registry
Docker
Registry
Docker
Image
dev / test / staging / production
*1
Storage backend
Local volume, S3, etc.TCP-based API
REST API
REST API
Docker
Daemon
Jenkins/CD/
automation
software
Containers
Containers
Containers
Registry Options
Docker Hub
Docker
daemon
Public Images
Private Images
Private Registry
Private Cloud
default
Private Registry
Registry container
nginx container
Docker Hub Not secure / unauthenticated
pull registry
pull nginx
SSL
Basic Auth
InternetVPC
Docker Instance
S3 Bucket
Starting Registry
docker run
--restart=always
-e SETTINGS_FLAVOR=s3
-e AWS_BUCKET= registry.docker.enterprise.glympse.com
-e STORAGE_PATH= /storage
-e AWS_KEY= AKIA...
-e AWS_SECRET= OEJ0...
-e SEARCH_BACKEND=sqlalchemy
-p 5000:5000
-d
registry
Registry container
Docker Instance
S3 Bucket
docker pull registry
:5000
:5000
Detailed Flow
Image
build
Source Code
Registry
Image
Container
tag
push
pull
run
rm
rmi
start
Daemon
ps
images
...
stop
FROM ubuntu:14.04
# Install Python Setuptools
RUN apt-get install -y python-setuptools
# Install pip
RUN easy_install pip
# Bundle app source
COPY . /src
# Add and install Python modules
RUN pip install -r /src/requirements.txt
# Set default container command
ENTRYPOINT ["python"]
# Run the app
CMD ["/src/server.py"]
Dockerfile /project
requirements.txt
server.py
Dockerfile
/usr/user
/src
req-s.txt
server.py
ubuntu
python-setuptools
pip
requirements
Project source code
docker build -t image_x .
image_x
Image
Storage
<none>
IMAGE
CHARACTERISTICS
Deterministic
Independent
docker run ... image_x
/usr/user
/src
req-s.txt
server.py
ubuntu
...
<none>
<none>
<none>
Container r/w layer
Running
Container
Walkthrough
docker build -t IMAGE_NAME .
docker tag IMAGE_ID REGISTRY_URL:PORT/IMAGE_NAME:TAG
docker push REGISTRY_URL:PORT/IMAGE_NAME:TAG
docker pull REGISTRY_URL:PORT/IMAGE_NAME:TAG
docker run --restart=always -d -p HOST_PORT:CONTAINER_PORT IMAGE_NAME:TAG
Build image from source
Tag image appropriately
Push image to the registry
Pull image from the registry
Run container based on the image
Dev box
Jenkins
CD
Prod
Staging
Test
Container Configuration
Docker Instance
Container
Container portHost port
/src/dir
Host FS
Container FS
/opt/dir
Configure port mapping
docker run ... -p HOST_PORT:CONTAINER_PORT
docker run ... -v HOST_DIR:CONTAINER_DIR
Mount a host directory as a data volume
Instance
En Route Deployment Demo
Admin Console
web app
Backend App
api servers
LB
Instance
App
LB
Instance
Instance
...
DB
feature/ec2_demo
user name
user@email
Logout
Admin Console
ip:pid
API Servers
/any/thing
http://169.254.169.254/
latest/meta-data/public-ipv4
OM
{
...
box: {
ip: IP,
pid: PID
}
}
os.getPid()
Instance Template
Dockerized Application
App PORT ->
Instance PORT
Instance
Docker
daemon
Container
Configuration
environment
variables
Registry
pull image
aws ec2 run-instances ...
EC2Connection.run_instances(...
CloudFormationConnection.
create_stack(...
{
"Parameters" : { ... },
"Resources" : {
...
},
"Outputs" : { ... }
}
AWS CLI
AWS SDK
AWS SDK
CloudFormatio
n
Cluster Operations
Load Balancer
App Instance
App Instance
App Instance
App Instance
App Instance
api - tracking - engine
web - tracking - admin
type NS app
cluster_create
cluster_delete
cluster_details
cluster_launch_instance
cluster_terminate_instance
cluster_register_instance
cluster_deregister_instance
Cluster Structure
Clusters
Operations
https://github.com/Glympse/CommonTools/tree/master/Docker
Cluster management scripts can be found here
Next
● Orchestration
● SSL / Authentication
● Configuration (identity, networking)
● Monitoring (health checks)
● Continuous delivery

Deployment Automation with Docker