Skip to content

Instantly share code, notes, and snippets.

@dnaprawa
Last active July 13, 2020 09:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dnaprawa/8eecb1a92c13d3afcfe7b21d7da5517a to your computer and use it in GitHub Desktop.
Save dnaprawa/8eecb1a92c13d3afcfe7b21d7da5517a to your computer and use it in GitHub Desktop.

CDW - 4x4h sessions in 06.2020

  • przed warsztatami upewnij się, że:
    • masz zainstalowanego i działającego (!) Dockera
      • sprawdź to za pomocą docker version lub docker container ls
  • Dobrze byłoby również mieć:
    • zainstalowanego git'a
    • jakiś edytor tekstu (polecane: VSCode)

TL;DR; 🙈

  • 👨‍ tutaj (w komentarzach) pojawiać będą się fragmenty poleceń/kodu wykorzystywane w warsztatach
  • 🥛 przewidujemy krótkie przerwy (żeby rozprostować kości/uzupełnić płyny)
  • szkolenie nie będzie nagrywane
@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

Docker Enterprise

  • Ile RAM JEST potrzebne - wysłać info

@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

Parking

  • Zaglądnąć do obrazu / jak to zrobić

  • Problem z pushem do Docker Hub'a

  • Serwis w docker-compose bez sieci

    • nie znalazłem takiej możliwości
    • pojedynczy kontener docker container run --net=none
  • network driver host i wiele interfejsów

    • docker network create -d host host2 Error response from daemon: only one instance of "host" network is allowed
  • network macvlan - czy można mieć statyczny IP

    • docker container run --ip <IP_ADDRESS>
    • docker container run --ip6 <IP_ADDRESS>
  • merged (brak katalogu) w drugiej warstwie

    • na ten moment brak informacji
  • pomimo wyłączenia swapa, nadal nie ubija kontenera -> ubuntu:16.04 + ubuntu:20.04

@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

Uruchamianie usług

  • nginx docker image pull nginx:1.17.1
  • postgres docker container run -d -e POSTGRES_USER=user1 -e POSTGRES_PASSWORD=pass123 -p 5454:5432 postgres:9.6

@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

Modyfikacja danych kontenera

  • docker container exec -it mynginx bash
  • apt-get update && apt-get install -y vim
  • vim /usr/share/nginx/html/index.html
  • zmieniam coś

Zapisanie kontenera do obrazu

  • docker container commit mynginx mynginx:v1

@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

Rozszerzenia istniejących obrazów

  • git clone https://github.com/dnaprawa/first_app_in_docker.git
  • docker image build -t custom-nginx:v1 .

Publikacja na Docker Hub

  • docker image tag custom-nginx:v1 TWOJA_NAZWA_UZYTKOWNIKA/custom-nginx:v1
  • docker login
  • docker image push TWOJA_NAZWA_UZYTKOWNIKA/custom-nginx:v1

@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

Ciekawostki

@dnaprawa
Copy link
Author

dnaprawa commented Jun 9, 2020

Komunikacja między kontenerami

  • docker network create -d bridge wordpress
  • docker container run -d --name mysqldb -e MYSQL_DATABASE=exampledb -e MYSQL_USER=exampleuser -e MYSQL_PASSWORD=examplepass -e MYSQL_RANDOM_ROOT_PASSWORD=1 --network=wordpress --restart=always mysql:5.7
  • docker container run -d -p 9000:80 -e WORDPRESS_DB_HOST=mysqldb:3306 -e WORDPRESS_DB_USER=exampleuser -e WORDPRESS_DB_PASSWORD=examplepass -e WORDPRESS_DB_NAME=exampledb --network=wordpress --restart=always wordpress:latest

DOCKER-COMPOSE

DOCKERIZE APPLICATION and run with docker-compose

git clone https://github.com/dnaprawa/AspNetCoreMVC-SQLServer-DockerCompose

@dnaprawa
Copy link
Author

dnaprawa commented Jun 10, 2020

Docker image deep dive

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive:latest <IMAGE_TO_INVESTIGATE>

@dnaprawa
Copy link
Author

dnaprawa commented Jun 18, 2020

Komunikacja po HTTP

{
  
    "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]  
}

Bezpieczna komunikacja po HTTP

https://docs.docker.com/engine/security/https/

@dnaprawa
Copy link
Author

dnaprawa commented Jun 18, 2020

/etc/systemd/system/docker.service.d/docker.conf

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

systemctl restart docker

@dnaprawa
Copy link
Author

  1. Na lokalnej maszynie generujemy pare kluczy - prywatny i publiczny
    a. ssh-keygen -t rsa -b 4096
  2. Klucza prywatnego nie dajemy nikomu!!!
  3. Kopiujemy klucz publiczny z lokalnej maszyny na serwer do lokalizacji:
  4. Na windowsie klucz publiczny znajduje się C:\Users\moja_nazwa_uzytkownika.ssh\id_rsa.pub
    a. echo <public_key_string> >> ~/.ssh/authorized_keys
    // Wkleić zamiast <public_key_string> zawartość C:\Users\dnaprawa.ssh\id_rsa.pub
  5. Powinno działac :)

Uwaga: Jeśli katalog .ssh lub plik authorized_keys nie istnieje - tworzymy go.
Następnie dodajemy uprawnienia:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

@dnaprawa
Copy link
Author

dnaprawa commented Jun 18, 2020

Lokalne Docker Registry

sudo mkdir -p /var/myregistry/data

docker container run -d -p 5000:5000 \
--name registry \
-v /var/myregistry/data:/var/lib/registry \
--restart always \
registry:2

/etc/docker/daemon.json

"insecure-registries": ["domain_name:5000"]

Uwierzytelnianie do Docker Registry

sudo mkdir -p /var/myregistry/auth
sudo docker run --entrypoint htpasswd registry:2 \
-Bbn user password123 > /var/myregistry/auth/htpasswd
docker run -p 5000:5000 -d \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_PATH=auth/htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM=realm \
-v /var/myregistry/data:/var/lib/registry \
-v /var/myregistry/auth:/auth \
--name registry registry:2
docker login -u user -p password123 localhost:5000

@dnaprawa
Copy link
Author

dnaprawa commented Jun 18, 2020

Narzędzia

Portainer

docker run -d -p 9000:9000 -p 8000:8000 \
--name portainer --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/portainer/portainer_data:/data portainer/portainer

Dry

docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
moncho/dry

@dnaprawa
Copy link
Author

dnaprawa commented Jun 18, 2020

Limitowanie

docker run --memory 50m --memory-swap 50m --rm -it progrium/stress --vm 1 --vm-bytes 62914560 --timeout 3s

@dnaprawa
Copy link
Author

dnaprawa commented Jun 18, 2020

Tricks

Odpalam kontener docker container run -it ubuntu bash

CTRL + P + Q ---> dettach --> w tło

A w drugą stronę, jeśli mam odpalony w tle to mogę zrobić docker container attach <id_lub_nazwa>

@dnaprawa
Copy link
Author

dnaprawa commented Jun 18, 2020

Security

https://github.com/dnaprawa/secure-nodejs-reactjs-docker

Docker Host Security

git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
./docker-bench-security.sh

@dnaprawa
Copy link
Author

dnaprawa commented Jun 23, 2020

TO DO

Podesłać Marcinowi listę poleceń, które były po przerwie

Dodatkowe tematy

  • CI/CD

@dnaprawa
Copy link
Author

dnaprawa commented Jun 23, 2020

Docker Compose Stacks

  1. Stwórz plik docker-compose.stack.yml na node1

  2. wypełnij go zawartością docker-compose.stack.yml

  3. Utwórz stack o nazwie app
    docker stack deploy --compose-file docker-compose.stack.yml app

  4. Dodaj dodatkowe trzy instancje do serwisu app_vote
    docker service scale app_vote=5

  5. Wprowadź takie polecenie, które pozwoli na wyświetlenie wszystkich kontenerów dla serwisu app_vote

  6. Wyświetl wszystkie serwisy.
    docker service ls

  7. Na ten moment, powinieneś mieć zbliżony rezultat:

  8. Otwórz aplikację visualizer w przeglądarce. W tym celu,
    przejdź do środowiska Play-With-Docker.
    W górnym rogu przeglądarki kliknij na 8080.
    Spowoduje to otwarcie nowej karty z aplikacją visualizer.

  9. Przejdź z powrotem do terminala node1 i sprawdź, jakie kontenery działają
    na poszczególnych maszynach.

  10. Z poziomu przeglądarki, za pomocą przycisku DELETE,
    usuń node4 oraz node5 i jeszcze raz sprawdź stan klastra.

  11. Odłącz node4 oraz node5 od klastra. Zaobserwuj zmiany.

  12. Usuń stack app.

docker stack rm app

  1. Zaobserwuj zmiany.
version: "3"
services:

  redis:
    image: redis:alpine
    networks:
      - frontend
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
  db:
    image: postgres:9.4
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    depends_on:
      - db
      - redis
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment