├── ansible ├── hosts └── identidock.yml ├── README.md ├── identidock ├── README.md ├── docker-compose.yml ├── Dockerfile ├── cmd.sh ├── prod.yml └── app │ ├── tests.py │ └── identidock.py ├── identiproxy ├── Dockerfile ├── entrypoint.sh └── default.conf ├── systemd ├── identidock.dnmonster.service ├── identidock.proxy.service ├── identidock.redis.service └── identidock.identidock.service ├── hosting ├── triton.yml ├── swarm.json └── ec2.json ├── deploy.sh └── LICENSE /ansible/hosts: -------------------------------------------------------------------------------- 1 | [identidock] 2 | 46.101.162.242 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Using Docker Code Examples 2 | ## "Deploying Containers" 3 | -------------------------------------------------------------------------------- /identidock/README.md: -------------------------------------------------------------------------------- 1 | identidock 2 | ========== 3 | 4 | Simple identicon server based on monsterid from Kevin Gaudin. 5 | 6 | From "Using Docker" by Adrian Mouat published by O'Reilly media. 7 | -------------------------------------------------------------------------------- /identiproxy/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.7 2 | 3 | COPY default.conf /etc/nginx/conf.d/default.conf 4 | COPY entrypoint.sh /entrypoint.sh 5 | 6 | ENTRYPOINT ["/entrypoint.sh"] 7 | CMD ["nginx", "-g", "daemon off;"] 8 | -------------------------------------------------------------------------------- /identiproxy/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | sed -i "s|{{NGINX_HOST}}|$NGINX_HOST|;s|{{NGINX_PROXY}}|$NGINX_PROXY|" \ 5 | /etc/nginx/conf.d/default.conf 6 | cat /etc/nginx/conf.d/default.conf 7 | exec "$@" 8 | -------------------------------------------------------------------------------- /identidock/docker-compose.yml: -------------------------------------------------------------------------------- 1 | identidock: 2 | image: amouat/identidock:1.0 3 | ports: 4 | - "5000:5000" 5 | - "9000:9000" 6 | environment: 7 | ENV: DEV 8 | links: 9 | - dnmonster 10 | - redis 11 | dnmonster: 12 | image: amouat/dnmonster:1.0 13 | redis: 14 | image: redis:3 15 | -------------------------------------------------------------------------------- /identidock/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.4 2 | 3 | FROM python:3.4 4 | 5 | RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi 6 | RUN pip install Flask==0.10.1 uWSGI==2.0.8 requests==2.5.1 redis==2.10.3 7 | WORKDIR /app 8 | COPY app /app 9 | COPY cmd.sh / 10 | 11 | EXPOSE 9090 9191 12 | USER uwsgi 13 | 14 | CMD ["/cmd.sh"] 15 | -------------------------------------------------------------------------------- /identidock/cmd.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$ENV" = 'DEV' ]; then 5 | echo "Running Development Server" 6 | exec python "identidock.py" 7 | elif [ "$ENV" = 'UNIT' ]; then 8 | echo "Running Unit Tests" 9 | exec python "tests.py" 10 | else 11 | echo "Running Production Server" 12 | exec uwsgi --http 0.0.0.0:9090 --wsgi-file /app/identidock.py \ 13 | --callable app --stats 0.0.0.0:9191 14 | fi 15 | -------------------------------------------------------------------------------- /identidock/prod.yml: -------------------------------------------------------------------------------- 1 | proxy: 2 | image: proxy:1.0 3 | links: 4 | - identidock 5 | ports: 6 | - "80:80" 7 | environment: 8 | - NGINX_HOST=45.55.251.164 9 | - NGINX_PROXY=http://identidock:9090 10 | identidock: 11 | image: amouat/identidock:1.0 12 | links: 13 | - dnmonster 14 | - redis 15 | environment: 16 | ENV: PROD 17 | dnmonster: 18 | image: amouat/dnmonster:1.0 19 | redis: 20 | image: redis:3 21 | -------------------------------------------------------------------------------- /systemd/identidock.dnmonster.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Redis Container for Identidock 3 | After=docker.service 4 | Requires=docker.service 5 | 6 | [Service] 7 | TimeoutStartSec=0 8 | Restart=always 9 | ExecStartPre=-/usr/bin/docker stop redis 10 | ExecStartPre=-/usr/bin/docker rm redis 11 | ExecStartPre=/usr/bin/docker pull redis 12 | ExecStart=/usr/bin/docker run --rm --name redis redis 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /systemd/identidock.proxy.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Redis Container for Identidock 3 | After=docker.service 4 | Requires=docker.service 5 | 6 | [Service] 7 | TimeoutStartSec=0 8 | Restart=always 9 | ExecStartPre=-/usr/bin/docker stop redis 10 | ExecStartPre=-/usr/bin/docker rm redis 11 | ExecStartPre=/usr/bin/docker pull redis 12 | ExecStart=/usr/bin/docker run --rm --name redis redis 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /systemd/identidock.redis.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Redis Container for Identidock 3 | After=docker.service 4 | Requires=docker.service 5 | 6 | [Service] 7 | TimeoutStartSec=0 8 | Restart=always 9 | ExecStartPre=-/usr/bin/docker stop redis 10 | ExecStartPre=-/usr/bin/docker rm redis 11 | ExecStartPre=/usr/bin/docker pull redis 12 | ExecStart=/usr/bin/docker run --rm --name redis redis 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /hosting/triton.yml: -------------------------------------------------------------------------------- 1 | proxy: 2 | image: amouat/proxy:1.0 3 | links: 4 | - identidock 5 | ports: 6 | - "80:80" 7 | environment: 8 | - NGINX_HOST=www.identidock.com 9 | - NGINX_PROXY=http://identidock:9090 10 | mem_limit: "128M" 11 | identidock: 12 | image: amouat/identidock:1.0 13 | links: 14 | - dnmonster 15 | - redis 16 | environment: 17 | ENV: PROD 18 | mem_limit: "128M" 19 | dnmonster: 20 | image: amouat/dnmonster:1.0 21 | mem_limit: "128M" 22 | redis: 23 | image: redis 24 | mem_limit: "128M" 25 | -------------------------------------------------------------------------------- /identiproxy/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name {{NGINX_HOST}}; 4 | 5 | location / { 6 | 7 | proxy_pass {{NGINX_PROXY}}; 8 | proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 9 | proxy_redirect off; 10 | proxy_buffering off; 11 | proxy_set_header Host {{NGINX_HOST}}; 12 | proxy_set_header X-Real-IP $remote_addr; 13 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | echo "Starting identidock system" 5 | 6 | docker run -d --restart=always --name redis redis:3 7 | docker run -d --restart=always --name dnmonster amouat/dnmonster:1.0 8 | docker run -d --restart=always \ 9 | --link dnmonster:dnmonster \ 10 | --link redis:redis \ 11 | -e ENV=PROD \ 12 | --name identidock amouat/identidock:1.0 13 | docker run -d --restart=always \ 14 | --name proxy \ 15 | --link identidock:identidock \ 16 | -p 80:80 \ 17 | -e NGINX_HOST=45.55.251.164 \ 18 | -e NGINX_PROXY=http://identidock:9090 \ 19 | amouat/proxy:1.0 20 | 21 | echo "Started" 22 | -------------------------------------------------------------------------------- /identidock/app/tests.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import identidock 3 | 4 | 5 | class TestCase(unittest.TestCase): 6 | 7 | def setUp(self): 8 | identidock.app.config["TESTING"] = True 9 | self.app = identidock.app.test_client() 10 | 11 | def test_get_mainpage(self): 12 | page = self.app.post("/", data=dict(name="Moby Dock")) 13 | assert page.status_code == 200 14 | assert 'Hello' in str(page.data) 15 | assert 'Moby Dock' in str(page.data) 16 | 17 | def test_html_escaping(self): 18 | page = self.app.post("/", data=dict(name='">TEST