Docker notes
Dockerfile
An example from docs.docker.com:
# Use an official Python runtime as a base image FROM python:2.7-slim # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed packages specified in requirements.txt RUN pip install -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"]
Dockerfile reference and
Dockerfile best practices
on docker docs.
install order
Install things in the order of how frequently they are likely to change.
Build
docker build -t <image tag> .
docker build -f Dockerfile.my # specify dockerfile name
Containers
Run (for web app):
docker run -p 4000:80 <image tag>
In background (detached mode):
docker run -d <image tag>
List containers:
docker ps # running docker ps -a # all containers
Stop:
docker stop <container id> docker kill <container id> # force stop
Remove (from current machine):
docker rm <container id> docker rm $(docker ps -a -q) # remove all containers
Images
List images:
docker images -a
Remove (from current machine):
docker rmi <image id> docker rmi $(docker images -q) # remove all images
Networks
List networks:
docker network ls
Inspect:
docker network inspect <network name>
Create:
docker network create -d <driver> <network name>
Running containers inside a network:
docker run --net=my_network ...
Troubleshooting
In case of failed image build, use --debug key:
image build --debug
sh into the image:
docker run -it <container id> bash
On OSX I have an error when I run shub image build for first time: Detected error connecting to Docker daemon's host.
Try this to solve it:
docker-machine restart default eval $(docker-machine env default)
AWS ECS (EC2 Container Service)
Cluster -> instance -> image -> task definition -> service
Vocabulary
Service
A container in production.
Codifies the way the image runs (which ports to use, how many replicas we need).
docker-compose.yaml
example:
version: "3" services: web: image: username/repository:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "80:80" networks: - webnet networks: webnet:
version: "3" services: app: build: context: . dockerfile: Dockerfile depends_on: - postgres environment: - DB_HOST=postgres - DB_PASSWORD=abc123 - API_HOST=app - PYTHONDONTWRITEBYTECODE=1 volumes: - ./src:/src - ./tests:/tests posrts: - "5005:80" postgres: image: postgres:9.6 environment: - POSTGRES_USER=allocation - POSTGRES_PASSWORD=abc123 ports: - "54321:5432"
PYTHONDONTWRITEBYTECODE
- instructs not to write .pyc
files.
Swarm
A swarm is a group of machines that are running Docker and have been joined into a cluster.
Dagger
Dagger is an integrated platform to orchestrate the delivery of applications to the cloud from start to finish. The Dagger Platform includes the Dagger Engine, Dagger Cloud, and the Dagger SDKs.