En este post se incluyen una revisión muy sencilla y un conjunto de comandos y acciones relacionadas con el uso de Docker. Para más información, consultar en:
https://docs.docker.com/engine/docker-overview/
https://veggiemonk.github.io/awesome-docker/
Containers
Running a container
1 |
docker container run hello-world |
Pull an image from the Docker registry
1 |
docker image pull alpine |
List the content of the downloaded Docker images
1 |
docker image ls |
Run commands on a launched container
1 2 |
docker container run alpine ls -l </code><code>docker container run alpine echo "hello from alpine" |
Launch container in interactive mode
1 |
docker container run -it alpine /bin/sh |
List running containers (and ran)
1 2 |
docker container ls docker container ls -a |
Images
Inspect an image
1 |
docker image inspect alpine |
Download and run image in one goal
1 |
docker container run -d seqvence/static-site |
Stop and remove container
1 2 3 |
docker container stop <container-id> docker container rm <container-id> docker container rm -f <container-id> |
Run container in detached mode and provide details
1 2 |
docker container run --name static-site -e AUTHOR="Your Name" -d -P seqvence/static-site docker container run --name static-site -e AUTHOR="Your Name" -d –p 8888:80 seqvence/static-site |
--name -->
Name to the container
-e -->
Pass variables
-d
--> detached mode
-P
--> publish ports to docker container host
-p 8888:80 -->
Relate port 80 to 8888 in docker host
Image types
Base
- OS images
Child
- Based on a base image
Official
- Certified by Docker
User
- User created images (from base, usually)
Create a new image (user image)
Create a docker file (Dockerfile)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# our base image FROM alpine:edge # Install python and pip RUN apk add --update py2-pip # install Python modules needed by the Python app COPY requirements.txt /usr/src/app/ RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt # copy files required for the app to run COPY app.py /usr/src/app/ COPY templates/index.html /usr/src/app/templates/ # tell the port number the container should expose EXPOSE 5000 # run the application CMD ["python", "/usr/src/app/app.py"] |
Build the image
1 |
docker image build -t <YOUR_USERNAME>/myfirstapp . |
-t –> image tag
. –> directory where Dockerfile is present
Swarm stack
Init swarm manager
1 |
docker swarm init --advertise-addr $(hostname -i) |
Docker compose files (docker-compose.yml)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
version:<code> </code>"3" </code>services:<code></code><code> </code> web:<code></code><code> </code># replace username/repo:tag with your name and image details<code></code><code> </code>image:<code> </code>username/repository:tag<code></code><code> </code>deploy:<code> replicas:<code> </code>5 </code>resources: </code>limits:<code></code><code> </code>cpus:<code> </code>"0.1"<code></code><code> </code>memory:<code> </code>50M<code> restart_policy:<code></code><code> </code>condition:<code> </code>on-failure<code></code><code> </code>ports:<code></code><code> </code>-<code> </code>"80:80"<code></code><code> </code>networks:<code></code><code> </code>-<code> </code>webnet </code>networks:<code></code><code> </code>webnet:<code> |
Deploy the stack
1 2 3 |
docker stack deploy -c docker-compose.yml <stack_name> docker-compose up -d |
Join swarm
1 2 |
docker swarm join <ip>:<port> |
List nodes
1 2 |
docker node ls |
List services
1 2 |
docker stack services <stack_name> docker-compose ps |
Inspect services
1 |
docker service inspect <service_name> |
Scale up or down the service
1 2 3 |
docker service scale <service_name>=<service_number> docker-compose scale <service_name>=<service_number> docker service update --replicas <service_number> <service_name> |
Disable/Enable nodes
1 2 3 |
docker node update --availability drain <node_name> docker node update --availability active <node_name> docker node inspect <node_name> --pretty |
List deployed tasks
1 |
docker stack ps <stack_name> |
Leave the swarm
1 |
docker swarm leave |
Remove stack
1 2 |
docker swarm rm <stack_name></code> docker-compose down |
Inspect the container
1 2 |
docker container inspect <container_name> docker container inspect --format "{{ .Config.Hostname }}" <container_name> |
Persist de data
In the host, via de docker-compose file:
1 2 3 4 5 6 |
redis:<code> image:<code> </code>redis<code> ports:<code> -<code> </code>"6379:6379"<code></code><code> </code>volumes:<code> -<code> </code>./data:/data |
Via de Docker file:
1 |
VOLUME ["/data"] |
The /data will be created on the host as well:
1 |
docker container inspect -f "{{ json .Mounts }}" c2 | python -m json.tool |
1 2 3 4 5 6 7 8 9 10 11 12 |
[ { "Destination": "/data", "Driver": "local", "Mode": "", "Name": "2f5b7c6b77494934293fc7a09198dd3c20406f05272121728632a4aab545401c", "Propagation": "", "RW": true, "Source": "/graph/volumes/2f5b7c6b77494934293fc7a09198dd3c20406f05272121728632a4aab545401c/_data", "Type": "volume" } ] |
Using the –v option
- Create and mount
- Mount
1 2 |
docker container run --name c3 -d -v /data alpine sh -c 'ping 8.8.8.8 > /data/ping.txt' </code><code>docker container run -v HOST_PATH:CONTAINER_PATH [OPTIONS] IMAGE [CMD] |
Using the Volume API
- Create the volumen on the host
1 2 3 4 5 6 7 8 9 10 11 12 13 |
docker volume create --name <vol_name> docker volume inspect html [ { "Driver": "local", "Labels": {}, "Mountpoint": "/graph/volumes/html/_data", "Name": "html", "Options": {}, "Scope": "local" } ] |
Mount it and use it within a container
1 |
docker container run --name www -d -p 8080:80 -v html:/usr/share/nginx/html nginx |
Docker network drivers (default and created)
- Bridge support only a single node
- Overlay support multiple nodes
1 |
docker network ls |
Create overlay network
1 |
docker network create -d overlay <network_name> |
Inspect network
1 |
docker network inspect <network_name> |
Run container within network
1 2 |
docker run -d --net=<network_name> --name <container_name> <image_name> |
By default, bridge network driver is used
1 |
docker run -d --name <container_name> <image_name> <command> |
Connect an existent container to an existent network
1 |
docker network connect <network_name> <container_name> |
Service discovery
1 |
docker ps |
Docker info
1 |
docker info |
Use Docker API to communicate with Docker
1 |
docker-machine env <node_name> --> apply docker commands on that node (alternative, use DOCKER_HOST variable) |
Upgrade/downgrade to/from manager
1 2 |
docker node promote <node_name_or_id> docker node demote <node_name_or_id> |
Docker swarm visualizer
http://jpetazzo.github.io/orchestration-workshop/#118