Docker
Gilson Filho
Alert!
Slides with this ↑
show updates about Docker and your ecosystem
What is
Docker Begins
What is Docker ?
Docker is an open platform for building, shipping and running distributed applications.
docker.io
What is Docker ?
An open framework to assemble specialized container systems
without reinventing the wheel.
Moby
Going forward, Docker will be assembled using Moby, see Moby and Docker for more details.
Moby
What is Docker Moby ?
Back to THE 90's
MY APP
+
A REAL Server
=
VIRTUAL MACHINEs
VIRTUAL MACHINEs
VIRTUAL MACHINEs
Docker containers
Docker containers
Docker containers
VM
Docker
LXC =
OS-level virtualization for running multiple isolated Linux systems
"LINUX CONTAINERS"
cgroups =
Linux kernel feature that limits and isolates the resource usage
(CPU, disk I/O, network, etc.)
"CONTROL GROUPS"
AUFs =
Filesystem which is based on images where every modification is a diff from the previous one (Like commits in git)
"Adv. multi layered Unification FS"
Docker > 1.11
Engine is now built on runC and containerd
How to Install
HOW TO INSTALL ?
http://docs.docker.com/installation
HOW TO INSTALL ?
http://docs.docker.com/installation
Linux
Debian
Fedora
Ubuntu
Windows e OS X
Windows
OS X
Docker HUB
Over 1.2B Pulls
from Docker Hub
5.6M
65
240K
Pulls per Day
Pulls per Second
Repositories on Docker Hub
Docker Store
next generation of Docker Hub
Docker Store
next generation of Docker Hub
Dictionary
Image
An image is a lightweight, stand-alone, executable package that includes everything needed to run a piece of software, including the code, a runtime, libraries, environment variables, and config files.
Container
A container is a runtime instance of an image – what the image becomes in memory when actually executed. It runs completely isolated from the host environment by default, only accessing host files and ports if configured to do so.
Docker
Commands
Docker Search
~ $ docker search -h
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
--automated=false Only show automated builds
--no-trunc=false Don't truncate output
-s, --stars=0 Only displays with at least x stars
Docker Search
~ $ docker search hello-world
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
hello-world Hello World! (an example of minimal Docker... 24 [OK]
tutum/hello-world Image to test docker deployments. Has Apac... 12 [OK]
marcells/aspnet-hello-world ASP.NET vNext - Hello World 1 [OK]
vegasbrianc/docker-hello-world 1 [OK]
diegomarangoni/devops-hello-world-app Example application for deploying using Co... 1 [OK]
nirmata/hello-world 0 [OK]
crccheck/hello-world Hello World web server in under 2.5 MB 0 [OK]
poojathote/hello-world this is 3rd POC 0 [OK]
adamkdean/hello-world 0 [OK]
davelesser/hello-world 0 [OK]
milkyway/java-hello-world Java Hello World Test Docker Image 0 [OK]
rcarun/hello-world 0 [OK]
suryasumukh/hello-world A docker auto build test application 0 [OK]
sixeyed/coreclr-hello-world A simple Hello World sample, running as a ... 0 [OK]
keithchambers/docker-hello-world 0 [OK]
fermayo/hello-world 0 [OK]
craigbarrau/docker-java-hello-world This is an automated build of docker java-... 0 [OK]
svlapin/docker-hello-world Hello world automated build 0 [OK]
jaimalchohan/hello-world-node-docker A simple hello world app 0 [OK]
Docker pull
~ $ docker pull -h
Usage: docker pull [OPTIONS] NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
Pull an image or a repository from the registry
-a, --all-tags=false Download all tagged images in the repository
--disable-content-trust=true Skip image verification
Docker pull
~ $ docker pull hello-world
latest: Pulling from hello-world
535020c3e8ad: Pull complete
af340544ed62: Pull complete
Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c
Status: Downloaded newer image for hello-world:latest
~ $
RUN Command
~ $ docker run -h
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
-a, --attach=[] Attach to STDIN, STDOUT or STDERR
--add-host=[] Add a custom host-to-IP mapping (host:ip)
--blkio-weight=0 Block IO weight (relative weight)
-c, --cpu-shares=0 CPU shares (relative weight)
[...]
RUN Command
~ $ docker run ubuntu:latest echo "Docker is awesome"
Unable to find images 'ubuntu:latest' locally
latest: Pulling from ubuntu
d3a1f33e8a5a: Pull complete
c22013c84729: Pull complete
d74508fb6632: Pull complete
91e54dfb1179: Pull complete
ubuntu:latest: The image you are pulling has been verified.
Digest: sha256:73fbe2308f5f5cb6e343425831b8ab44f10bbd77070ecdfbe4081daa4dbe3ed1
Status: Downloaded newer image for ubuntu:latest
Docker is awesome
~ $
~ $ docker run -it ubuntu:latest /bin/bash
root@b91b6d0cf193:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@b91b6d0cf193:/# exit
exit
~ $
RUN Command
~ $ docker run ubuntu:latest echo "Docker is awesome"
Unable to find images 'ubuntu:latest' locally
latest: Pulling from ubuntu
d3a1f33e8a5a: Pull complete
c22013c84729: Pull complete
d74508fb6632: Pull complete
91e54dfb1179: Pull complete
ubuntu:latest: The image you are pulling has been verified.
Digest: sha256:73fbe2308f5f5cb6e343425831b8ab44f10bbd77070ecdfbe4081daa4dbe3ed1
Status: Downloaded newer image for ubuntu:latest
Docker is awesome
~ $
images & rmi command
~ $ docker images -h
Usage: docker images [OPTIONS] [REPOSITORY]
List images
-a, --all=false Show all images (default hides intermediate images)
--digests=false Show digests
-f, --filter=[] Filter output based on conditions provided
--help=false Print usage
--no-trunc=false Don't truncate output
-q, --quiet=false Only show numeric IDs
images & rmi command
~ $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest 91e54dfb1179 16 minutes ago 188.4 MB
hello-world latest af340544ed62 4 minutes ago 960 B
images & rmi command
~ $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest 91e54dfb1179 16 minutes ago 188.4 MB
hello-world latest af340544ed62 4 minutes ago 960 B
~ $ docker rmi -f hello-world
Untagged: hello-world:latest
Deleted: af340544ed62de0680f441c71fa1a80cb084678fed42bae393e543faea3a572c
Deleted: 535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912
~ $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest 91e54dfb1179 16 minutes ago 188.4 MB
PS & RM command
~ $ docker ps -h
Usage: docker ps [OPTIONS]
List containers
-a, --all=false Show all containers (default shows just running)
--before="" Show only container created before Id or Name
-f, --filter=[] Filter output based on conditions provided
-l, --latest=false Show the latest created container, include non-running
-n=-1 Show n last created containers, include non-running
--no-trunc=false Don't truncate output
-q, --quiet=false Only display numeric IDs
-s, --size=false Display total file sizes
--since="" Show created since Id or Name, include non-running
--format=[] Pretty-print containers using a Go template
PS & RM command
~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89951e446cf0 postgres:latest "/docker-entrypoint. 8 seconds ago Up 7 seconds 5432/tcp pensive
dd5fe50ab712 ubuntu:latest "sleep 20000000" 41 seconds ago Up 40 seconds adoring
eea75a0a071f ubuntu:latest "/bin/bash" About a minute ago Up About a minute insane
~ $
PS & RM command
~ $ docker rm -f 89951e446cf0
89951e446cf0
~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd5fe50ab712 ubuntu:latest "sleep 20000000" 41 seconds ago Up 40 seconds adoring
eea75a0a071f ubuntu:latest "/bin/bash" About a minute ago Up About a minute insane
~ $
~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89951e446cf0 postgres:latest "/docker-entrypoint. 8 seconds ago Up 7 seconds 5432/tcp pensive
dd5fe50ab712 ubuntu:latest "sleep 20000000" 41 seconds ago Up 40 seconds adoring
eea75a0a071f ubuntu:latest "/bin/bash" About a minute ago Up About a minute insane
~ $
exec command
~ $ docker exec -h
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
-d, --detach=false Detached mode: run command in the background
-i, --interactive=false Keep STDIN open even if not attached
-t, --tty=false Allocate a pseudo-TTY
-u, --user= Username or UID (format: <name|uid>[:<group|gid>])
exec command
~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89951e446cf0 postgres:latest "/docker-entrypoint. 8 seconds ago Up 7 seconds 5432/tcp pensive
dd5fe50ab712 ubuntu:latest "sleep 20000000" 41 seconds ago Up 40 seconds adoring
eea75a0a071f ubuntu:latest "/bin/bash" About a minute ago Up About a minute insane
~ $
exec command
~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89951e446cf0 postgres:latest "/docker-entrypoint. 8 seconds ago Up 7 seconds 5432/tcp pensive
dd5fe50ab712 ubuntu:latest "sleep 20000000" 41 seconds ago Up 40 seconds adoring
eea75a0a071f ubuntu:latest "/bin/bash" About a minute ago Up About a minute insane
~ $
~ $ docker exec -it dd5fe50ab712 /bin/bash
root@dd5fe50ab712:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@dd5fe50ab712:/# exit
exit
~ $
Docker Volume
A data volume is a specially-designated directory within one or more containers that bypasses the Union File System.
Docker Volume
~ $ ls /Users/baptou/myDirectory
file1 file2 file3
~ $ docker run -it -v /Users/baptou/myDirectory:/opt ubuntu:latest /bin/bash
root@29088b02f260:/# ls /opt
file1 file2 file3
root@29088b02f260:/# rm /opt/file2
root@29088b02f260:/# ls /opt
file1 file3
root@29088b02f260:/# exit
exit
~ $ ls /Users/baptou/myDirectory
file1 file3
~ $
Docker COMMIT
~ $ docker commit -h
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
-a, --author="" Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change=[] Apply specified Dockerfile instructions while committing the image
-m, --message="" Commit message
-p, --pause=true Pause container during commit
Docker COMMIT
~ $ docker run -d ubuntu /bin/bash -c "apt-get install -y hello"
009e8061df58b8b123ee
~ $ docker commit -m "My first container with a Commit" 009e8061df58b8b123ee gilson/hello
b88f9422f14dc055427d39bf6971f8415511fdaa3182a37869c14c4893664c43
~ $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
gilson/hello latest b88f9422f14d 7 seconds ago 189.3 MB
feedbackfront latest 34cd8b4a3d8b 4 weeks ago 163 MB
offer/feedbackfront latest 63a5a64ddc7a 4 weeks ago 163 MB
offer/feedback-front latest 63a5a64ddc7a 4 weeks ago 163 MB
~ $ docker run gilson/hello
Reading package lists...
Building dependency tree...
Reading state information...
hello is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
~ $ docker run -it gilson/hello /bin/bash
root@df8d31633a9a:/# hello
Hello, world!
root@df8d31633a9a:/# exit
exit
~ $
Docker push
~ $ docker push -h
Usage: docker push NAME[:TAG]
Push an image or a repository to the registry
--disable-content-trust=true Skip image signing
Docker push
~ $ docker push baptwaels/hello
The push refers to a repository [baptwaels/hello] (len: 1)
b88f9422f14d: Image push failed
Please login prior to push:
Username: baptwaels
Password:
Email: bwaels@gmail.com
WARNING: login credentials saved in /Users/baptou/.dockercfg.
Login Succeeded
The push refers to a repository [baptwaels/hello] (len: 1)
b88f9422f14d: Image already exists
91e54dfb1179: Image successfully pushed
d74508fb6632: Image successfully pushed
c22013c84729: Image successfully pushed
d3a1f33e8a5a: Image successfully pushed
Digest: sha256:d659f9011eab6d04b3d9fd9f6324e23505bd1299c52d295c4b04ebe3e58878ce
~ $
Docker push
FROM ubuntu:latest
RUN apt-get install vim -y
Docker build
Dockerfile
~ $ docker build -t myubuntu .
~ $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
myubuntu latest 4b205af179df 5 seconds ago 188.9 MB
Shell
Docker system
Usage: docker system COMMAND
Manage Docker
Options:
--help Print usage
Commands:
df Show docker disk usage
events Get real time events from the server
info Display system-wide information
prune Remove unused data
Run 'docker system COMMAND --help' for more information on a command.
Docker system
~ $ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 8 5 1.296GB 729.3MB (56%)
Containers 6 1 408B 345B (84%)
Local Volumes 4 4 168.6MB 0B (0%)
system df
Docker system
~ $ docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED ago (...)
pen_banco latest 8e40d6a09c39 About an hour ago
postgres 9.3 0dd7d39ff91b 2 days ago
postgres latest ca3a55649cfc 2 days ago
docker_apoiador-banco latest 556796db6132 4 days ago
mdillon/postgis 9.5 95ef56d0b84b 6 days ago
rabbitmq 3-management 281ee777b811 12 days ago
hello-world latest 48b5124b2768 4 months ago
jhipster/jhipster-registry v2.5.4 f5ac510b0620 6 months ago
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES (...)
b484a4673c73 postgres:latest "docker-entrypoint..." 0
00515c9b728a docker_banco-teste "docker-entrypoint..." 1
25e7b744d869 docker_apoiador-banco "docker-entrypoint..." 1
8bb66b298716 rabbitmq:3-management "docker-entrypoint..." 1
6718c15a2bde jhipster/jhipster-registry:v2.5.4 "java -Djava.secur..." 1
ff1de954a916 hello-world "/hello" 0
Local Volumes space usage:
VOLUME NAME LINKS SIZE
31f5e396aefc175501357305306bbb691243f9f41a98bb1aeca36d129d36c97f 1 2.597MB
dc091727d965df0debed796e5381c47001ab8881141fde44fa578bb2a169850b 1 151.7kB
e60cb462042b9b52800f019b13af1e7d49856d3f57ea7515d02eba5741960254 1 82.96MB
09212ad7c68f115564f0e5f06248df66458cf5618f814d17af67a400bc7aba52 1 82.93MB
system df -v
Docker system
~ $ docker system prune
WARNING! This will remove:
- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images
Are you sure you want to continue? [y/N]
system prune
Dockerfile
A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image.
FROM ubuntu:latest
# (...)
Dockerfile
Command FROM
Sets the Base Image for subsequent instructions. As such, a valid Dockerfile must have FROM as its first instruction. The image can be any valid image – it is especially easy to start by pulling an image from the Public Repositories.
FROM ubuntu:latest
MAINTAINER Gilson Filho <me@gilsondev.in>
# (...)
Dockerfile
Command MAINTAINER
The MAINTAINER instruction allows you to set the Author field of the generated images.
FROM ubuntu:latest
# MAINTAINER ...
RUN apt-get update
# Other dependencies...
RUN apt-get install -y mysql-server
# Configure database and user...
RUN ["mysql", "-u", "root", "-p"]
Dockerfile
Command RUN
The RUN instruction will execute any commands in a new layer on top of the current image and commit the results. The resulting comitted image will be used for the next step in the Dockerfile.
FROM ubuntu:latest
# MAINTAINER ...
RUN apt-get update
# Other dependencies...
RUN apt-get install -y mysql-server
# Configure database and user...
CMD ["mysqld"]
Dockerfile
Command CMD
The main purpose of a CMD is to provide defaults for an executing container. There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.
FROM ubuntu:latest
# MAINTAINER ...
RUN apt-get update
# Other dependencies...
RUN apt-get install -y mysql-server
# Configure database and user...
EXPOSE 3306
CMD ["mysqld"]
Dockerfile
Command EXPOSE
The EXPOSE instruction informs Docker that the container listens on the specified network ports at runtime. EXPOSE does not make the ports of the container accessible to the host.
FROM ubuntu:latest
# MAINTAINER ...
ENV MYSQL_MAJOR 5.7
RUN apt-get update
# Other dependencies...
RUN apt-get install -y mysql-server
# (...)
Dockerfile
Command ENV
The ENV instruction sets the environment variable <key> to the value <value>. This value will be in the environment of all “descendant” Dockerfile commands and can be replaced inline in many as well.
FROM ubuntu:latest
# MAINTAINER ...
ENV MYSQL_MAJOR 5.7
RUN apt-get update
# Other dependencies...
RUN apt-get install -y mysql-server
# Configure database and user...
ADD custom.conf /var/lib/mysql
# (...)
Dockerfile
Command ADD
The ADD instruction copies new files, directories or remote file URLs from <src> and adds them to the filesystem of the container at the path <dest>.
FROM ubuntu:latest
# MAINTAINER ...
ENV MYSQL_MAJOR 5.7
RUN apt-get update
# Other dependencies...
RUN apt-get install -y mysql-server
# Configure database and user...
COPY custom.conf /var/lib/mysql
# (...)
Dockerfile
Command COPY
The COPY instruction copies new files or directories from <src> and adds them to the filesystem of the container at the path <dest>.
FROM ubuntu:latest
# MAINTAINER ...
RUN apt-get update
RUN apt-get install -y python-pip
RUN pip install ipython
ENTRYPOINT ["ipython"]
Dockerfile
Command ENTRYPOINT
An ENTRYPOINT allows you to configure a container that will run as an executable.
CMD or ENTRYPOINT?
-
Dockerfile should specify at least one of CMD or ENTRYPOINT commands.
-
ENTRYPOINT should be defined when using the container as an executable.
-
CMD should be used as a way of defining default arguments for an ENTRYPOINT command or for executing an ad-hoc command in a container.
-
CMD will be overridden when running the container with alternative arguments.
FROM ubuntu:latest
# (...)
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
Dockerfile
Command VOLUME
The VOLUME instruction creates a mount point with the specified name and marks it as holding externally mounted volumes from native host or other containers.
The docker run command initializes the newly created volume with any data that exists at the specified location within the base image.
FROM ubuntu:latest
RUN mkdir -p /var/whoami
RUN chmod -R 777 /var/whoami
RUN whoami >> /var/whoami/root.txt
# Criando usuario
RUN useradd basis -p 1234
USER basis
RUN whoami >> /var/whoami/basis.txt
Dockerfile
Command USER
The USER instruction sets the user name or UID to use when running the image and for any RUN, CMD and ENTRYPOINT instructions that follow it in the Dockerfile.
FROM ubuntu:latest
RUN pwd
WORKDIR /opt
RUN pwd
RUN touch file_opt.txt
WORKDIR /var
RUN pwd
RUN touch file_var.txt
Dockerfile
Command WORKDIR
The WORKDIR instruction sets the working directory for any RUN, CMD, ENTRYPOINT, COPY and ADD instructions that follow it in the Dockerfile. If the WORKDIR doesn’t exist, it will be created even if it’s not used in any subsequent Dockerfile instruction.
FROM ubuntu:latest
# Other configurations...
ONBUILD RUN echo "Echo message made by image base"
Dockerfile
Command ONBUILD
The ONBUILD instruction adds to the image a trigger instruction to be executed at a later time, when the image is used as the base for another build. The trigger will be executed in the context of the downstream build, as if it had been inserted immediately after the FROM instruction in the downstream Dockerfile.
FROM ubuntu:latest
# Other configurations...
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
Dockerfile
Command HEALTHCHECK
The HEALTHCHECK instruction tells Docker how to test a container to check that it is still working. This can detect cases such as a web server that is stuck in an infinite loop and unable to handle new connections, even though the server process is still running.
Other commands
Orquestration
App
Database
link
App
link
Storage
link
Storage
link
link
App
Database
link
App
link
Storage
link
Storage
link
link
Docker Host
Docker Host
Docker Host
Docker Host
Docker Host
Orquestration
Orchestration is a broad term that refers to the container scheduling, cluster management, and possibly the provision of additional hosts.
Tools
- Docker Swarm
- Fleet
- Kubernetes
- Mesos
Docker Compose
Compose is a tool for defining and running multi-container Docker applications.
Docker Compose
-
Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
-
Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
-
Lastly, run docker-compose up and Compose will start and run your entire app.
version: '2'
services:
db:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
links:
- db
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
docker-compose.yml
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: redis
Versions
Compose files using the version 2 syntax must indicate the version number at the root of the document. Compose files that do not declare a version are considered “version 1”.
docker-compose.yml
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: redis
Version 1
Version 2
web:
build: .
# (...)
Command BUILD
Configuration options that are applied at build time. Can be specified either as a string containing a path to the build context, or an object with the path specified under context and optionally dockerfile and args.
docker-compose.yml
version: '2'
services:
web:
build:
context: ./app
dockerfile: Dockerfile-alternate
# (...)
version: '2'
services:
web:
# hub.docker.com/_/ubuntu:latest
image: ubuntu:latest
# (...)
Command IMAGE
Specify the image to start the container from. Can either be a repository/tag or a partial image ID.
docker-compose.yml
version: '2'
services:
web:
image: example-registry.com:4000/postgresql
# (...)
Command VOLUME
Mount paths or named volumes, optionally specifying a path on the host machine (HOST:CONTAINER), or an access mode (HOST:CONTAINER:ro).
docker-compose.yml
# (...)
web:
image: mysql:5.1
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql
# Specify an absolute path mapping
- /opt/data:/var/lib/mysql
# Path on the host, relative to the Compose file
- ./cache:/tmp/cache
# User-relative path
- ~/configs:/etc/configs/:ro
# Named volume
- datavolume:/var/lib/mysql
Command VOLUME_FROM
Mount paths or named volumes, optionally specifying a path on the host machine (HOST:CONTAINER), or an access mode (HOST:CONTAINER:ro).
docker-compose.yml
# (...)
web:
image: mysql:5.1
volumes:
- /var/lib/mysql
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
Command ENVIRONMENT
Add environment variables. You can use either an array or a dictionary.
docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
version: '2'
services:
db:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=wordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
Command LINKS
Link to containers in another service. Either specify both the service name and a link alias (SERVICE:ALIAS), or just the service name.
docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
environment:
- MYSQL_ROOT_PASSWORD=wordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
redis:
# (...)
web:
image: wordpress:latest
links:
- db
- redis
Command DEPENDS_ON
Express dependency between services, which has two effects:
-
docker-compose up will start services in dependency order. In the following example, db and redis will be started before web.
-
docker-compose up SERVICE will automatically include SERVICE’s dependencies. In the following example, docker-compose up web will also create and start db and redis.
docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7
# (...)
web:
image: wordpress:latest
depends_on:
- redis
- db
Command PORTS
Expose ports. Either specify both ports (HOST:CONTAINER), or just the container port (a random host port will be chosen).
docker-compose.yml
version: '2'
services:
wordpress:
image: wordpress:latest
ports:
- "8000:80"
version: '2'
services:
wordpress:
image: wordpress:latest
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
Command COMMAND
Override the default command.
docker-compose.yml
version: '2'
services:
wordpress:
image: wordpress:latest
# Override 'CMD ["apache2-foreground"]' of wordpress Dockerfile
command: bash
ports:
- "8000:80"
Command ENTRYPOINT
Override the default entrypoint.
docker-compose.yml
version: '2'
services:
wordpress:
image: wordpress:latest
# Override 'CMD ["./entrypoint.sh"]' of wordpress Dockerfile
entrypoint: ./custom-entrypoint.sh
ports:
- "8000:80"
Command ENV_FILE
Add environment variables from a file. Can be a single value or a list.
docker-compose.yml
version: '2'
services:
wordpress:
image: wordpress:latest
ports:
- "8000:80"
env_file: .env
version: '2'
services:
wordpress:
image: wordpress:latest
ports:
- "8000:80"
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
Command EXPOSE
Expose ports without publishing them to the host machine - they’ll only be accessible to linked services. Only the internal port can be specified.
docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
expose:
- "3306"
Command EXTENDS
Extend another service, in the current file or another, optionally overriding configuration.
docker-compose.yml
web:
extends:
file: common-services.yml
service: webapp
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"
common-services.yml
docker-compose.yml
Resources
(dica do Eustáquio ♥️)
Examples
Getting Started
Questions?
Forked on: http://slides.com/baptwaels/docker
Docker Workshop
By Gilson Filho
Docker Workshop
Apresentação baseada nos slides de docker do usuário baptwaels, abordando o básico do docker.
- 1,652