Install Docker Compose
sudo curl -L “https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
<script type=”text/javascript” src=”https://platform.linkedin.com/badges/js/profile.js” async defer></script>
<div class=”LI-profile-badge” data-version=”v1″ data-size=”medium” data-locale=”en_US” data-type=”horizontal” data-theme=”dark” data-vanity=”markshay”><a class=”LI-simple-link” href=’https://www.linkedin.com/in/markshay?trk=profile-badge’>Mark Shay</a></div>
#Clean up
docker ps -aq
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
docker system prune
docker container prune
docker image prune
docker volume prune
docker network prune
cd ..
cd compose-sample-2
docker-compose up
Control-C
docker-compose up -d
docker-compose logs
docker-compose ps
docker-compose top
docker-compose down
nano docker-compose.yml
# create your drupal and postgres config here, based off the last assignment
version: ‘2’
services:
drupal:
image: drupal
ports:
– “8080:80”
volumes:
– drupal-modules:/var/www/html/modules
– drupal-profiles:/var/www/html/profiles
– drupal-sites:/var/www/html/sites
– drupal-themes:/var/www/html/themes
postgres:
image: postgres
ports:
– “5432:5432”
environment:
– POSTGRES_PASSWORD=mypasswd
volumes:
drupal-modules:
drupal-profiles:
drupal-sites:
drupal-themes:
#cleanup
docker-compose down -v
#cleanup local images
docker-compose down –rmi local
#DockerFile
#create your custom drupal image here, based of official drupal
FROM drupal:8.2
RUN apt-get update && apt-get install -y git \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /var/www/html/themes
RUN git clone –branch 8.x-3.x –single-branch –depth 1 https://git.drupal.org/project/bo$
&& chown -R www-data:www-data bootstrap
WORKDIR /var/www/html
#Docker Swarm
git clone https://github.com/BretFisher/udemy-docker-mastery
docker info
docker swarm init –advertise-addr 127.0.0.1
docker node ls
docker service create alpine ping 8.8.8.8
docker service ls
docker service ps reverent_goldberg
docker service update j9lrdop3by0d –replicas 3
docker service ps reverent_goldberg
docker container ls
docker container rm -f reverent_goldberg.3.p1ks7ok0w1sm1y7ikvh3gndow
docker service ls
docker service ps reverent_goldberg
docker service rm reverent_goldberg
docker service ls
docker container ls
docker swarm init
#Build Docker Swarm
#Manager Server
docker swarm init –advertise-addr 192.168.10.2
docker swarm join –token SWMTKN-1-6aynyb5mmgyb1qy6ofikeny5axuhzk303bau9vdncnpigkclcf-500wa21q29k5rl9pw3dbllimp 192.168.10.2:2377
#Node1
docker swarm join –token SWMTKN-1-6aynyb5mmgyb1qy6ofikeny5axuhzk303bau9vdncnpigkclcf-500wa21q29k5rl9pw3dbllimp 192.168.10.2:2377
#Node2
docker swarm join –token SWMTKN-1-6aynyb5mmgyb1qy6ofikeny5axuhzk303bau9vdncnpigkclcf-500wa21q29k5rl9pw3dbllimp 192.168.10.2:2377
#Manager Server # promote Node 1
docker node ls
docker node update –role manager worker1
docker node ls
docker swarm join-token manager
#Node3 # Join as Manager by default
docker swarm join –token SWMTKN-1-6aynyb5mmgyb1qy6ofikeny5axuhzk303bau9vdncnpigkclcf-d3j1ol33vs16ythghosga20n9 192.168.10.2:2377
#Manager Server
docker node ls
docker service create –replicas 3 alpine ping 8.8.8.8
docker service ls
docker node ps
docker node ps worker1
#Scaling Out with Overlay Networking
docker network create –driver overlay mydrupal
docker network ls
#Create Postgres Service on Swarm
#docker service create –name psql –network mydrupal -e POSTGRES_PASSWORD=mypass postgres
docker service create –name psql –network mydrupal –publish 5432:5432 -e POSTGRES_PASSWORD=mypass postgres
#Verify Image running
docker service ls
#Verify Node which is running Service
docker service ps psql
#Run to see if service is running on server
docker container logs psql.1.oey4ud9gbd87vvp7j8i11zv8b
#Create Drupal Service on Swarm
docker service create –name drupal –network mydrupal -p 80:80 drupal
docker service ls
#repeats command every 2 seconds
watch docker service ls
docker service ps drupal
# Scaling Out with Routing Mesh
docker service create –name search –replicas 3 -p 9200:9200 elasticsearch:2
docker service ps search
curl localhost:9200
#Create A Multi-Service Multi-Node Web App
docker node ls
docker ps -a
docker service ls
#Create Network backend
docker network create -d overlay backend
#Create Network frontend
docker network create -d overlay frontend
#Vote
docker service create –name vote -p 80:80 –network frontend –replicas 2 dockersamples/examplevotingapp_vote:before
#redis
docker service create —-name redis –network frontend –replicas 1 redis:3.2
#worker
docker service create –name worker –network frontend –network backend dockersamples/examplevotingapp_worker
#db
docker service create –name db –network backend –mount type=volume,source=db-data,target=/var/lib/postgresql/data postgres:9.4
#result
docker service create —name result —network backend -p 5001:80 dockersamples/examplevotingapp_vote:before:before
Docker service logs
#Swarm Stacks and Production Grade Compose
docker stack deploy -c example-voting-app-stack.yml voteapp
docker stack ls
docker stack ps voteapp
docker container ls
docker stack services voteapp
docker stack ps voteapp
docker network ls
nano example-voting-app-stack.yml
replicas: 5
docker stack deploy -c example-voting-app-stack.yml voteapp
#Secrets Storage for Swarm: Protecting Your Environment Variables
docker service create –name psql -e POSTGRES_USER_FILE=/run/secrets/psql_user -e POSTGRES_PASSWORD_FILE=/run/secrets/psql_pass postgres
docker secret ls
docker secret inspect psql_user
docker service ps psql
docker exec -it voteapp_db.1.e9oz0nv6nl41pk42lcridqv7p bash
ls /run/secrets/
cat /run/secrets/psql_user
docker container logs voteapp_db.1.e9oz0nv6nl41pk42lcridqv7p
#Using Secrets with Swarm Stacks
docker service create –name search –replicas 2 -p 9200:9200 elasticsearch:2
docker stack deploy -c docker-compose.yml mydb
docker stack rm mydb
# create your drupal and postgres config:
nano docker-compose.yml
version: ‘3.1’
# NOTE: move this answer file up a directory so it’ll work
services:
drupal:
image: drupal:8.2
ports:
– “8080:80”
volumes:
– drupal-modules:/var/www/html/modules
– drupal-profiles:/var/www/html/profiles
– drupal-sites:/var/www/html/sites
– drupal-themes:/var/www/html/themes
postgres:
image: postgres:12.1
ports:
– “5432:5432” environment:
– POSTGRES_PASSWORD_FILE=/run/secrets/psql-pw
secrets:
– psql-pw
volumes:
– drupal-data:/var/lib/postgresql/data
volumes:
– drupal-data:/var/lib/postgresql/data
volumes:
drupal-data:
drupal-modules:
drupal-profiles:
drupal-sites:
drupal-themes:
secrets:
psql-pw:
external: true
echo “oagy938hs” | docker secret create psql-pw –
docker stack deploy -c docker-compose.yml drupal
#Swarm App Lifecycle
cd secrets-sample-2
docker node ls
docker-compose up -d
docker-compose exec psql cat /run/secrets/psql_user
#Full App Lifecycle: Dev, Build and Deploy With a Single Compose
docker-compose up -d
docker-compose -f docker-compose.yml -f docker-compose.test.yml up -d
docker-compose -f docker-compose.yml -f docker-compose.prod.yml config
docker-compose -f docker-compose.yml -f docker-compose.prod.yml config > output.yml
#Service Updates: Changing Things In Flight
docker service create -p 8088:80 –name web nginx:1.13.7
docker service scale web=5
docker service update –image nginx:1.13.6 web
docker service update –publish-rm 8080 –publish-add 9090:80
#Health checks in Dockerfiles
docker container run –name p1 -d postgres
docker container ls
docker container run –name p2 -d –health-cmd=”pg_isready -U postgress|| exit 1″ postgres
docker container ls
docker container inspect p2
docker service create –name psql –network mydrupal –publish 5432:5432 -e POSTGRES_PASSWORD=mypass postgres
docker service create –name psql –network mydrupal –publish 5432:5432 -e POSTGRES_PASSWORD=mypass postgres –health-cmd=”pg_isready -U postgres || exit 1″ postgres
#Run a Private Docker Registry
docker container run -d -p 5000:5000 –name registry registry
docker container ls
docker image ls
docker pull hello-world
docker run hello-world
docker tag hello-world 127.0.0.1:5000/hello-world
docker image ls
docker push 127.0.0.1:5000/hello-world
docker image remove hello-world
docker image remove 127.0.0.1:5000/hello-world
docker pull 127.0.0.1:5000/hello-world
docker container rm registry -f
docker container run -d -p 5000:5000 –name registry -v $(pwd)/registry-data:/var/lib/registry registry
docker image ls
docker push 127.0.0.1:5000/hello-world
ll registry-data
#Docker Registry With Swarm
docker node ls
docker service create –name registry –publish 5000:5000 registry
docker service ps registry
docker pull hello-world
docker tag hello-world 127.0.0.1:5000/hello-world
docker push 127.0.0.1:5000/hello-world
docker pull nginx
docker tag nginx 127.0.0.1:5000/nginx
docker push 127.0.0.1:5000/nginx
docker service create –name nginx -p 80:80 127.0.0.1:5000/nginx
#Install Kubernetes
#Install & Configure MicroK8s Ubuntu
sudo snap install microk8s –classic –channel=1.17/stable
sudo usermod -a -G microk8s vagrant
nano .bashrc
alias kubectl=’microk8s.kubectl’
microk8s.enable dns
microk8s.status
#Our First Pod With kubectl run
kubectl version
kubectl run my-nginx –image nginx
# Pre Version 1.18
kubectl get pods
#Clean up
kubectl delete deployment my-nginx
kubectl get all
# Scaling ReplicaSets
kubectl run my-apache –image httpd
kubectl get all
kubectl scale deploy/my-apache –replicas 2 #kubectl scale deployment my-apache —replicas 2
kubectl get all
kubectl logs deployment/my-apache
kubectl logs deployment/my-apache –follow –tail 1
kubectl logs -l run=my-apache
kubectl get pods
kubectl describe pod/my-apache-5d589d69c7-jmbmh
#Watch Commmand
#Terminal Window 1
kubectl get pods -w
#Terminal Window 2
kubectl delete pod/my-apache-5d589d69c7-jmbmh
kubectl get pods
#Clean up
kubectl delete deployment my-apache
# K8s Services
#Creating a ClusterIP Service
#Terminal Window 1
kubectl get pods -w
#Terminal Window 2
kubectl create deployment httpenv –image=bretfisher/httpenv
kubectl scale deployment/httpenv –replicas=5
kubectl expose deployment/httpenv –port 8888
kubectl get service
kubectl run –generator run-pod/v1 tmp-shell –rm -it –image bretfisher/netshoot — bash
curl httpenv:8888
#Alternative method from Ubuntu
kubectl get service
curl 10.152.183.202:8888
#Creating a NodePort and LoadBalancer Service
kubectl get all
kubectl expose deployment/httpenv –port 8888 –name httpenv-np –type NodePort
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpenv ClusterIP 10.152.183.202 <none> 8888/TCP 13m
httpenv-np NodePort 10.152.183.136 <none> 8888:31585/TCP 70s
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 3h26m
kubectl expose deployment/httpenv –port 8888 –name httpenv-lb –type LoadBalancer
kubectl get services
curl 10.152.183.147:8888
#Clean up
kubectl delete service/httpenv service/httpenv-np
kubectl delete service/httpenv-lb deployment/httpenv
#Kubernetes Services DNS
kubectl get namespaces
#Run, Expose, and Create Generators
kubectl create deployment test –image nginx –dry-run
kubectl create deployment test –image nginx –dry-run -o yaml
kubectl create job test –image nginx –dry-run -o yaml
kubectl create deployment test –image nginx
kubectl expose deployment/test –port 80 –dry-run -o yaml
#Clean up
kubectl delete deployment test
#Moving to Declarative Kubernetes YAML
#Building Your YAML Files
kubectl api-resources
kubectl api-versions
#Building Your YAML Spec
kubectl explain services –recursive
kubectl explain services.spec
kubectl explain services.spec.type
kubectl explain deployment.spec.template.spec.volumes.nfs.server
# Dry Runs and Diff’s
kubectl apply -f app.yml –dry-run
kubectl apply -f app.yml
kubectl apply -f app.yml –server-dry-run
kubectl diff -f app.yml
nano app.yml
metadata:
name: app-nginx-deployment
servers: dmz
spec:
replicas: 2
kubectl diff -f app.yml
# Clean up
kubectl get all
kubectl delete deployment.apps/app-nginx-deployment
kubectl delete service/app-nginx-service
#Namespaces and Context
kubectl get namespaces
kubectl get all –all-namespaces
kubectl config get-contexts