Coder Social home page Coder Social logo

docker-workshop's Introduction

harbur.io Docker Workshop Gitter chat

The Workshop is separated in three sections

Preparations:

  • Install Docker
  • Clone this repo: git clone https://github.com/harbur/docker-workshop (Some code examples require files located here)
  • Warm-up the images:
docker pull ubuntu
docker pull nginx

Assumptions:

  • During workshop the following ports are used 4000-4010. If they are not available on your machine, adjust the CLI commands accordingly.

CLI Basics

Version

Check you have latest version of docker installed:

docker version
  • If you don't have docker installed, check here
  • If you're not on the latest version, it will prompt you to update
  • If you're not on docker group you might need to prefix commands with sudo. See here for details about it.

Commands

Check the available docker commands

docker
  • Whenever you don't remember a command, just type docker
  • For more info, type docker help COMMAND (e.g. docker help run)

RUN a "Hello World" container

docker run ubuntu echo "Hello World"
  • If the Image is not cached, it pulls it automatically
  • It prints Hello World and exits

RUN an interactive Container

docker run -it ubuntu bash
  cat /etc/os-release
  • -i: Keep stdin open even if not attached
  • -t: Allocate a pseudo-tty

RUN a Container with pipeline

cat /etc/resolv.conf | docker run -i ubuntu wc -l

SEARCH a Container

docker search -s 10 nginx
  • -s: Only displays with at least x stars

RUN a Container and expose a Port

docker run -d -p 4000:80 nginx
google-chrome localhost:4000
  • -d: Detached mode: Run container in the background, print new container id
  • -p: Publish a container's port to the host (format: hostPort:containerPort)
  • For more info about the container, see nginx

RUN a Container with a Volume

docker run -d -p 4001:80 -v $(pwd)/hello-world/site/:/usr/share/nginx/html:ro nginx
google-chrome localhost:4001
  • -v: Bind mount a volume (e.g., from the host: -v /host:/container, from docker: -v /container)
  • The volume is linked inside the container. Any external changes are visible directly inside the container.
  • This example breaks the immutability of the container, good for debuging, not recommended for production (Volumes should be used for data, not code)

Workshop 1 (10 mins)

  • Build a static website
  • Run it on your machine
  • Share your (non-localhost) url on Chat room Gitter chat

Dockerfile Basics

BUILD a Git Client Container

Create a Git Container manually:

docker run -it --name git ubuntu bash
  apt-get update
  apt-get -y install git
  git version
  exit
docker commit git docker-git
docker rm git
docker run --rm -it docker-git git version
docker rmi docker-git
  • --name: Assign a name to the container
  • commit: Create a new image from a container's changes
  • rm: Remove one or more containers
  • rmi: Remove one or more images
  • --rm: Automatically remove the container when it exits

Create a Git Container with Dockerfile:

cd docker-git
docker build -t docker-git .
docker run -it docker-git git version
  • build: Build an image from a Dockerfile

docker-git/Dockerfile

FROM ubuntu:14.04
RUN apt-get update
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -qqy install git
  • The FROM instruction sets the Base Image for subsequent instructions
  • The RUN instruction will execute any commands in a new layer on top of the current image and commit the results
  • The ENV instruction sets the environment variable to the value

BUILD an Apache Server Container

Create an Apache Server Container with Dockerfile:

cd docker-apache2
docker build -t docker-apache2 .
docker run -d -p 4003:80 docker-apache2
google-chrome localhost:4003

docker-apache2/Dockerfile

FROM ubuntu:14.04
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get -qqy install apache2
EXPOSE 80
CMD apachectl start; tail -f /var/log/apache2/access.log
  • The EXPOSE instructions informs Docker that the container will listen on the specified network ports at runtime
  • The CMD instruction sets the command to be executed when running the image

BUILD a Static website Image

cd hello-world
docker build -t hello-world .
docker run -d --name hello -P hello-world
google-chrome $(docker port hello 80)
  • -P: Publish all exposed ports to the host interfaces
  • port: Lookup the public-facing port that is NAT-ed to PRIVATE_PORT

hello-world/Dockerfile

FROM nginx:1.7.1
ADD site /usr/local/nginx/html
  • The ADD instruction will copy new files from and add them to the container's filesystem at path

Workshop 2 (10 mins)

  • Build your website with Dockerfile
  • Run an instance
  • Share your (non-localhost) url on Chat room Gitter chat

PUSH Image to a Registry

REGISTRY=localhost:5000
docker tag hello-world $REGISTRY/spiddy/hello-world
docker push $REGISTRY/spiddy/hello-world
  • tag: Tag an image into a repository
  • push: Push an image or a repository to a Docker registry server

Workshop 3 (10 mins)

  • Push your website to the local Registry (use your github username)
  • Push your website image
  • Share your image name on Chat room Gitter chat

PULL Image from a Repository

docker pull $REGISTRY/spiddy/hello-world
docker run -d -P --name=registry-hello $REGISTRY/spiddy/hello-world
google-chrome $(docker port registry-hello 80)
  • pull: Pull an image or a repository from a Docker registry server

Docker Patterns

docker run --rm --name redis dockerfile/redis
docker run -it --rm --link redis:server dockerfile/redis bash -c 'redis-cli -h $SERVER_PORT_6379_TCP_ADDR'
docker run -it --rm --link redis:redis relateiq/redis-cli
  set hello world
  get hello

host A (Server):

docker run -d --name redis dockerfile/redis
docker run -d --link redis:redis --name redis_ambassador -p 6379:6379 svendowideit/ambassador

host B (Client):

docker run -d --name redis_ambassador --expose 6379 -e REDIS_PORT_6379_TCP=tcp://188.226.255.31:6379 svendowideit/ambassador
docker run -i -t --rm --link redis_ambassador:redis relateiq/redis-cli
  set hello there
  get hello
docker run -d -p 4004:80 --name web -v /usr/local/nginx/html nginx
google-chrome localhost:4004
docker run --rm -it --volumes-from web ubuntu bash
  vi /usr/local/nginx/html/index.php
sudo vi /etc/default/docker
sudo service docker restart
docker run -d -p 172.17.42.1:53:53/udp --name skydns crosbymichael/skydns -nameserver 8.8.8.8:53 -domain docker
docker run -d -v /var/run/docker.sock:/docker.sock --name skydock crosbymichael/skydock -ttl 30 -environment dev -s /docker.sock -domain docker -name skydns
  • Redis Service
docker run -d --name redis1 crosbymichael/redis
docker run -d --name redis2 crosbymichael/redis
docker run -d --name redis3 crosbymichael/redis
docker run -t -i crosbymichael/redis-cli -h redis.dev.docker
  set hello world
  get hello
  • Service discovery with DNS:
dig @172.17.42.1 +short redis1.redis.dev.docker
dig @172.17.42.1 +short redis.dev.docker
  • Load Balancing with DNS
docker rm -f redis1
get hello
dig @172.17.42.1 +short redis.dev.docker

Helper Methods

Cleanup Stopped Containers:

docker rm $(docker ps -q -a)

Cleanup Untagged Images:

docker rmi $(docker images | grep "^<none>" | awk '{print $3}')

Credits

This workshop was prepared by harbur.io, under MIT License. Feel free to fork and improve.

docker-workshop's People

Contributors

dkapanidis avatar

Watchers

 avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.