├── .gitignore
├── docker
├── 2-Dockerfile-simples
│ ├── Dockerfile
│ ├── index.html
│ └── README.md
├── 3-Dockerfile-multi-stage
│ ├── my-container-app
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ ├── my-container-app.csproj
│ │ ├── WeatherForecast.cs
│ │ ├── Dockerfile
│ │ ├── Program.cs
│ │ ├── Properties
│ │ │ └── launchSettings.json
│ │ ├── Controllers
│ │ │ └── WeatherForecastController.cs
│ │ ├── Startup.cs
│ │ ├── .gitignore
│ │ └── .dockerignore
│ └── README.md
├── 4-Publicando-imagem-acr
│ └── README.md
└── 1-Rodando-um-Container-localmente
│ └── README.md
├── Tutorial-Docker-Kubernetes.pdf
├── kubernetes
├── 1-Criando-um-Namespace
│ ├── my-namespace.yaml
│ └── README.md
├── 4-Rodando-um-Service
│ ├── pod-info-service.yaml
│ ├── pod-info-service-load-balancer.yaml
│ └── README.md
├── 5-Escalando-horizontalmente-um-deployment
│ ├── pod-info-hpa.yaml
│ └── README.md
├── 2-Rodando-uma-Pod
│ ├── getting-started.yaml
│ └── README.md
├── 3-Rodando-um-Deployment
│ ├── pod-info-deployment.yaml
│ └── README.md
└── 6-Publicando-nossa-aplicacao
│ ├── aplicacao-completa.yaml
│ └── README.md
├── ambiente
└── 1-Criando-um-cluster-AKS
│ └── README.md
├── README.md
└── LICENSE
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode
2 |
--------------------------------------------------------------------------------
/docker/2-Dockerfile-simples/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx
2 | COPY index.html /usr/share/nginx/html/index.html
3 | RUN echo Olá mundo
--------------------------------------------------------------------------------
/Tutorial-Docker-Kubernetes.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreracz/TutorialDockerKubernetes/HEAD/Tutorial-Docker-Kubernetes.pdf
--------------------------------------------------------------------------------
/docker/2-Dockerfile-simples/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Meu container
4 | Esse é meu container! Está rodando no Docker!
5 |
6 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/appsettings.Development.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft": "Warning",
6 | "Microsoft.Hosting.Lifetime": "Information"
7 | }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft": "Warning",
6 | "Microsoft.Hosting.Lifetime": "Information"
7 | }
8 | },
9 | "AllowedHosts": "*"
10 | }
11 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/my-container-app.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netcoreapp3.1
5 | my_container_app
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/kubernetes/1-Criando-um-Namespace/my-namespace.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recurso
2 | kind: Namespace # Tipo de objeto a ser criado
3 | metadata:
4 | name: my-namespace #Nome do Namespace
5 | labels: # Labels a serem aplicados, podem ter quaisquer nomes e valores
6 | label1: a
7 | label2: b
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/WeatherForecast.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace my_container_app
4 | {
5 | public class WeatherForecast
6 | {
7 | public DateTime Date { get; set; }
8 |
9 | public int TemperatureC { get; set; }
10 |
11 | public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
12 |
13 | public string Summary { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS build
2 | WORKDIR /app
3 |
4 | # copy csproj and restore as distinct layers
5 | COPY *.csproj ./
6 | RUN dotnet restore
7 |
8 | # copy everything else and build app
9 | COPY . ./
10 | RUN dotnet publish -c Release -o out
11 |
12 | FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine AS runtime
13 | WORKDIR /app
14 | EXPOSE 80
15 | COPY --from=build /app/out ./
16 | ENTRYPOINT ["dotnet", "my-container-app.dll"]
17 |
--------------------------------------------------------------------------------
/kubernetes/4-Rodando-um-Service/pod-info-service.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
2 | kind: Service # Tipo de objeto a ser criado
3 | metadata:
4 | name: pod-info-service # Nome do service
5 | spec:
6 | type: ClusterIP # Tipo de Serviço. Os mais comuns são ClusterIP e LoadBalancer
7 | selector: # Indica quais pods serão roteadas por este service
8 | app: pod-info
9 | ports: # Portas que o serviço irá expor
10 | - protocol: TCP # Protocolo (TCP ou UDP)
11 | port: 80 # Porta que será exposta para o mundo
12 | targetPort: 9898 # Porta da pod que será roteada
--------------------------------------------------------------------------------
/kubernetes/4-Rodando-um-Service/pod-info-service-load-balancer.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
2 | kind: Service # Tipo de objeto a ser criado
3 | metadata:
4 | name: pod-info-service # Nome do service
5 | spec:
6 | type: LoadBalancer # Tipo de Serviço. Os mais comuns são ClusterIP e LoadBalancer
7 | selector: # Indica quais pods serão roteadas por este service
8 | app: pod-info
9 | ports: # Portas que o serviço irá expor
10 | - protocol: TCP # Protocolo (TCP ou UDP)
11 | port: 80 # Porta que será exposta para o mundo
12 | targetPort: 9898 # Porta da pod que será roteada
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Microsoft.AspNetCore.Hosting;
6 | using Microsoft.Extensions.Configuration;
7 | using Microsoft.Extensions.Hosting;
8 | using Microsoft.Extensions.Logging;
9 |
10 | namespace my_container_app
11 | {
12 | public class Program
13 | {
14 | public static void Main(string[] args)
15 | {
16 | CreateHostBuilder(args).Build().Run();
17 | }
18 |
19 | public static IHostBuilder CreateHostBuilder(string[] args) =>
20 | Host.CreateDefaultBuilder(args)
21 | .ConfigureWebHostDefaults(webBuilder =>
22 | {
23 | webBuilder.UseStartup();
24 | });
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json.schemastore.org/launchsettings.json",
3 | "iisSettings": {
4 | "windowsAuthentication": false,
5 | "anonymousAuthentication": true,
6 | "iisExpress": {
7 | "applicationUrl": "http://localhost:9028",
8 | "sslPort": 44384
9 | }
10 | },
11 | "profiles": {
12 | "IIS Express": {
13 | "commandName": "IISExpress",
14 | "launchBrowser": true,
15 | "launchUrl": "weatherforecast",
16 | "environmentVariables": {
17 | "ASPNETCORE_ENVIRONMENT": "Development"
18 | }
19 | },
20 | "my_container_app": {
21 | "commandName": "Project",
22 | "launchBrowser": true,
23 | "launchUrl": "weatherforecast",
24 | "applicationUrl": "https://localhost:5001;http://localhost:5000",
25 | "environmentVariables": {
26 | "ASPNETCORE_ENVIRONMENT": "Development"
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/kubernetes/5-Escalando-horizontalmente-um-deployment/pod-info-hpa.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: autoscaling/v2 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
2 | kind: HorizontalPodAutoscaler # Tipo de recurso (HPA)
3 | metadata:
4 | name: pod-info-hpa #Nome do recurso
5 | spec: # Especificação do recurso
6 | scaleTargetRef: # Referencia a objeto que será escalado
7 | apiVersion: apps/v1 # API do objeto a ser escalado
8 | kind: Deployment # Tipo do objeto a ser escalado
9 | name: pod-info-deployment # Nome do objeto a ser escalado
10 | minReplicas: 4 # Numero minimo de replicas, deve ser o mesmo do numero de replicas do deployment
11 | maxReplicas: 10 # Numero máximo de replicas
12 | metrics: # Metrica usada para escalar
13 | - type: Resource # Tipo de métrica
14 | resource: # Recurso usado
15 | name: cpu # Escalar por CPU, quando a utilização média estiver acima de 50%
16 | target:
17 | type: Utilization
18 | averageUtilization: 50
19 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/Controllers/WeatherForecastController.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Microsoft.AspNetCore.Mvc;
6 | using Microsoft.Extensions.Logging;
7 |
8 | namespace my_container_app.Controllers
9 | {
10 | [ApiController]
11 | [Route("[controller]")]
12 | public class WeatherForecastController : ControllerBase
13 | {
14 | private static readonly string[] Summaries = new[]
15 | {
16 | "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
17 | };
18 |
19 | private readonly ILogger _logger;
20 |
21 | public WeatherForecastController(ILogger logger)
22 | {
23 | _logger = logger;
24 | }
25 |
26 | [HttpGet]
27 | public IEnumerable Get()
28 | {
29 | var rng = new Random();
30 | return Enumerable.Range(1, 5).Select(index => new WeatherForecast
31 | {
32 | Date = DateTime.Now.AddDays(index),
33 | TemperatureC = rng.Next(-20, 55),
34 | Summary = Summaries[rng.Next(Summaries.Length)]
35 | })
36 | .ToArray();
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/kubernetes/2-Rodando-uma-Pod/getting-started.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
2 | kind: Pod # Tipo de objeto a ser criado
3 | metadata:
4 | name: getting-started #Nome da pod
5 | labels: # Labels a serem aplicados, podem ter quaisquer nomes e valores
6 | role: myrole
7 | spec: # contém as especificações da pod, como os containers que irão rodar, recursos, discos, etc...
8 | containers: # Lista de containers da POD
9 | - name: web # Nome do container dentro da POD
10 | image: docker/getting-started # Imagem do Docker que será utilizado
11 | ports: # portas que a POD expões para o cluster. Essa porta não é acessível fora do cluster
12 | - name: web # Nome da porta
13 | containerPort: 80 # PORTA
14 | protocol: TCP # Tipo de protocolo (TCP ou UDP)
15 | resources: # Recursos que a POD usa (CPU, memória, etc...)
16 | limits: # Limite máximo de recursos
17 | cpu: 500m # 500 milis cpus (meia CPU) é o limite máximo que este container pode usar
18 | memory: 200Mi # 200 MB de memória é o o limite máximo que este container pode usar
19 | requests: # limite mínimo que o container precisa
20 | cpu: 100m # 100 milis cpis (0,1 CPU) é o mínimo que este container precisa ter reservado
21 | memory: 100Mi # 100 MB de memória é o mínimimo que este container precisa ter reservado
--------------------------------------------------------------------------------
/docker/4-Publicando-imagem-acr/README.md:
--------------------------------------------------------------------------------
1 | Publicando uma imagem no ACR
2 | ============================
3 |
4 | Após gerar a imagem local, podemos publicar ela no nosso ACR, para que outras pessoas possam utilizá-la, para isso, dever-se rodar o comando:
5 |
6 | ```docker tag my-container-app:1.0 meuacrunico.azurecr.io/my-container-app```
7 |
8 | Esse comando tageia o container com o endereço do nosso ACR (meuacrunico.azurecr.io). Ele também coloca a tag latest, pois não colocamos versão.
9 |
10 | Listando as imagens com ```docker image list``` obtemos algo do tipo:
11 |
12 | ```txt
13 | REPOSITORY TAG IMAGE ID CREATED SIZE
14 | my-container-app 1.0 13078efe0b7d 46 hours ago 105MB
15 | meuacrunico.azurecr.io/my-container-app latest 13078efe0b7d 46 hours ago 105MB
16 | meu-container 1.0 fe8a3acc83f6 2 days ago 133MB
17 | d52c90084304 2 days ago 133MB
18 | docker/getting-started latest 1f32459ef038 2 months ago 26.8MB
19 | ```
20 |
21 | Para enviar a imagem para o servidor, temos que rodar:
22 |
23 | ```docker push meuacrunico.azurecr.io/my-container-app```
24 |
25 | Pronto! a imagem está no servidor e pode ser utilizada por quem tem acesso a ela!
26 |
--------------------------------------------------------------------------------
/docker/2-Dockerfile-simples/README.md:
--------------------------------------------------------------------------------
1 | Dockerfile simples
2 | ==================
3 |
4 | Para este tutorial, vamos mostrar como cadastrar passo a passo um Dockerfile simples, para rodar um servidor web. Para isso, vamos utilizar o NGINX, servidor web muito popular.
5 |
6 | Começamos entrando no [Docker Hub](https://hub.docker.com/) e procurando a imagem do NGINX. O nome da imagem base é [nginx](https://hub.docker.com/_/nginx).
7 |
8 | O Dockerfile que usaremos, está detalhado abaixo:
9 |
10 | ```Dockerfile
11 | FROM nginx
12 | COPY index.html /usr/share/nginx/html/index.html
13 | RUN echo Olá mundo
14 | ```
15 |
16 | Os comandos que utilizamos em nosso Dockerfile foram:
17 |
18 | - ```FROM nginx```: Determina o container base, do qual o nosso deriva.
19 | - ```COPY index.html /usr/share/nginx/html/index.html```: Copia um arquivo do diretório atual para o diretório do container
20 | - ```RUN echo Olá mundo```: Roda um comando dentro do container durante a construção da imagem. Em geral é utilizado para construir a aplicação dentro do container.
21 |
22 | Para fazer o build do container, utilizamos o comando:
23 |
24 | ```Powershell
25 | docker build --tag meu-container:1.0 .
26 | ```
27 |
28 | Este comando faz faz o build do diretório corrente e nomeia o container com o nome: meu-container, e a "versão" 1.0.
29 |
30 | Após rodar, podemos usar o comando: ```docker image list``` para listar as imagens presentes no nosso registro local. Para executar a aplicação, rodarmos:```docker run -d -p 3000:80 meu-container:1.0```
31 |
--------------------------------------------------------------------------------
/kubernetes/1-Criando-um-Namespace/README.md:
--------------------------------------------------------------------------------
1 |
2 | Criando um namespace
3 | ====================
4 |
5 | Um namespace é uma subdivisão no cluster kubernetes onde os outros objetos são deployados. Em geral, os objetos dentro de um mesmo namespace são acessíveis entre si.
6 |
7 | Vamos mostrar duas formas de criar um namespace, uma usando somente linha de comando e outra usando arquivos YAML.
8 |
9 | Para criar um namespace usando apenas a linha de comando, o comando é:
10 |
11 | ```Powershell
12 | kubectl create namespace my-first-namespace
13 | ```
14 |
15 | O comando acima cria um namespace chamado my-first-namespace, que pode ser listado com o comando:
16 |
17 | ```Powershell
18 | kubectl get namespace
19 | ```
20 |
21 | Para criar um Namespace utilizando arquivos YAML, o arquivo deve ter os seguintes dados, veja os comentários para saber o que cada campo significa:
22 |
23 | ```YAML
24 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recurso
25 | kind: Namespace # Tipo de objeto a ser criado
26 | metadata:
27 | name: my-namespace #Nome do Namespace
28 | labels: # Labels a serem aplicados, podem ter quaisquer nomes e valores
29 | label1: a
30 | label2: b
31 | ```
32 |
33 | Para criar o namespace, deve-se utilizar o seguinte comando:
34 |
35 | ```Powershell
36 | kubectl apply -f my-namespace.yaml
37 | ```
38 |
39 | O Comando apply cria ou altera um recurso, de acordo com o arquivo passado. Pode-se utilizar também o comando create, que apenas cria um objeto, não modificando caso ele exista.
40 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/Startup.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Microsoft.AspNetCore.Builder;
6 | using Microsoft.AspNetCore.Hosting;
7 | using Microsoft.AspNetCore.HttpsPolicy;
8 | using Microsoft.AspNetCore.Mvc;
9 | using Microsoft.Extensions.Configuration;
10 | using Microsoft.Extensions.DependencyInjection;
11 | using Microsoft.Extensions.Hosting;
12 | using Microsoft.Extensions.Logging;
13 |
14 | namespace my_container_app
15 | {
16 | public class Startup
17 | {
18 | public Startup(IConfiguration configuration)
19 | {
20 | Configuration = configuration;
21 | }
22 |
23 | public IConfiguration Configuration { get; }
24 |
25 | // This method gets called by the runtime. Use this method to add services to the container.
26 | public void ConfigureServices(IServiceCollection services)
27 | {
28 | services.AddControllers();
29 | }
30 |
31 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
32 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
33 | {
34 | if (env.IsDevelopment())
35 | {
36 | app.UseDeveloperExceptionPage();
37 | }
38 |
39 | app.UseHttpsRedirection();
40 |
41 | app.UseRouting();
42 |
43 | app.UseAuthorization();
44 |
45 | app.UseEndpoints(endpoints =>
46 | {
47 | endpoints.MapControllers();
48 | });
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/kubernetes/5-Escalando-horizontalmente-um-deployment/README.md:
--------------------------------------------------------------------------------
1 | Escalando Horizontalmente um deployment
2 | =======================================
3 |
4 | Vamos agora mostrar como um HorizontalPodAutoscaler (HPA) pode ser utilizado para escalar o deployment automaticamente por métricas como CPU, memória, etc...
5 |
6 | A criação de Services é feita utilizando-se arquivos YAML, como o que está listado a seguir:
7 |
8 | ```YAML
9 | apiVersion: autoscaling/v2 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
10 | kind: HorizontalPodAutoscaler # Tipo de recurso (HPA)
11 | metadata:
12 | name: pod-info-hpa #Nome do recurso
13 | spec: # Especificação do recurso
14 | scaleTargetRef: # Referencia a objeto que será escalado
15 | apiVersion: apps/v1 # API do objeto a ser escalado
16 | kind: Deployment # Tipo do objeto a ser escalado
17 | name: pod-info-deployment # Nome do objeto a ser escalado
18 | minReplicas: 4 # Numero minimo de replicas, deve ser o mesmo do numero de replicas do deployment
19 | maxReplicas: 10 # Numero máximo de replicas
20 | metrics: # Metrica usada para escalar
21 | - type: Resource # Tipo de métrica
22 | resource: # Recurso usado
23 | name: cpu # EScalar por CPU, quando a utilização média estiver acima de 50%
24 | target:
25 | type: Utilization
26 | averageUtilization: 50
27 | ```
28 |
29 | Para aplicar esse arquivo no cluster, deve-se usar o comando apply, passando-se o arquivo e o nome do namespace onde será rodado.
30 |
31 | ```Powershell
32 | kubectl apply -f pod-info-hpa.yaml --namespace=my-namespace
33 | ```
34 |
35 | Para listar o recurso criado, deve-se rodar o comando:
36 |
37 | ```Powershell
38 | kubectl get hpa --namespace=my-namespace
39 | ```
40 |
--------------------------------------------------------------------------------
/docker/1-Rodando-um-Container-localmente/README.md:
--------------------------------------------------------------------------------
1 | Rodando um Container Localmente
2 | ===============================
3 |
4 | Para rodar um container localmente, deve-se utilizar o seguinte comando:
5 |
6 | ```PowerShell
7 | docker run -d -p 3000:80 docker/getting-started
8 | ```
9 |
10 | Este comando faz o dowload da imagem *docker/getting-started* do Docker HUB, roda ela localmente no docker em modo detached, mapeando a porta 3000 do seu computador para a porta 80 do container.
11 |
12 | Explicando o comando:
13 |
14 | - ```docker```: Roda o comando Docker
15 | - ```run```: Subcomando para indicar que um container novo deve ser rodado
16 | - ```-d```: Rodar em modo dettached (em background)
17 | - ```-p 3000:80```: Mapeia a porta 3000 do seu computador para a porta 80 do container
18 | - ```docker/getting-started```: Imagem a ser rodada
19 |
20 | Listando os containers rodando
21 | ------------------------------
22 |
23 | O subcomando ps lista os containers rodando:
24 |
25 | ```PowerShell
26 | docker ps
27 | ```
28 |
29 | Este comando retorna algo do tipo:
30 |
31 | ```text
32 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33 | df651be259f3 docker/getting-started "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 0.0.0.0:3000->80/tcp frosty_spence
34 | ```
35 |
36 | Matando um container
37 | --------------------
38 |
39 | O subcomando stop para um container que esteja rodando, usando seu ID, mas o container continua registrado:
40 |
41 | ```PowerShell
42 | docker stop df651be259f3
43 | ```
44 |
45 | Se rodarmos ```docker ps``` novamente, veremos que o container não está mais rodando, mas rodando ```docker ps -a```, o container será listado.
46 |
47 | Para apagarmos o container precisar rodar o comando: ```docker rm df651be259f3```, onde o segundo parametro é o ID do container.
48 |
--------------------------------------------------------------------------------
/kubernetes/3-Rodando-um-Deployment/pod-info-deployment.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
2 | kind: Deployment # Tipo de objeto a ser criado
3 | metadata:
4 | name: pod-info-deployment # Nome do deployment
5 | labels: # Labels a serem aplicados, podem ter quaisquer nomes e valores
6 | role: pod-info
7 | spec: # contém as especificações do deployment pod, como os containers que irão rodar, quantidade de pods, etc..
8 | selector: # Indica como o Deployment vai saber quais pods gerenciar
9 | matchLabels: # Busca pods por labels
10 | app: pod-info # Pods que tenham o label app = getting-started
11 | replicas: 2 #roda duas replicas da pod
12 | template: # Template da pod que será criada
13 | metadata:
14 | labels: # Labels. Devem ser iguais à MATCH EXPRESSION acima
15 | app: pod-info
16 | spec:
17 | containers: # Lista de containers da POD
18 | - name: web # Nome do container dentro da POD
19 | image: stefanprodan/podinfo # Imagem do Docker que será utilizado
20 | ports: # portas que a POD expões para o cluster. Essa porta não é acessível fora do cluster
21 | - name: web # Nome da porta
22 | containerPort: 9898 # PORTA
23 | protocol: TCP # Tipo de protocolo (TCP ou UDP)
24 | resources: # Recursos que a POD usa (CPU, memória, etc...)
25 | limits: # Limite máximo de recursos
26 | cpu: 500m # 500 milis cpus (meia CPU) é o limite máximo que este container pode usar
27 | memory: 200Mi # 200 MB de memória é o o limite máximo que este container pode usar
28 | requests: # limite mínimo que o container precisa
29 | cpu: 100m # 100 milis cpis (0,1 CPU) é o mínimo que este container precisa ter reservado
30 | memory: 100Mi # 100 MB de memória é o mínimimo que este container precisa ter reservado
--------------------------------------------------------------------------------
/ambiente/1-Criando-um-cluster-AKS/README.md:
--------------------------------------------------------------------------------
1 | Comandos para montagem de cluster AKS e registro ACR
2 | ====================================================
3 |
4 | Windows
5 | -------
6 | Para montar o ambiente, os seguinte comandos devem ser rodados no powershell, com o Azure Cli instalado:
7 |
8 | 1. Obter o id da subscrion atual: ```$subscription = (az account show | ConvertFrom-Json).id```
9 | 2. Escolha um nome único para o seu ACR: ```$acrName="meuacrunico"```
10 | 3. Escolha um nome para o seu resource group: ```$resouceGroupName="tutorial-kube"```
11 | 4. Escolha um nome para o seu cluster AKS: ```$aksName="tutorial-kube-aks"```
12 | 5. Criar resource group: ```az group create --location eastus --name $resouceGroupName```
13 | 6. Criar ACR: ```az acr create -g $resouceGroupName --name $acrName --sku basic```
14 | 7. Criar AKS: ```az aks create -g $resouceGroupName --name $aksName --node-count 1 --attach-acr $acrName --generate-ssh-keys```
15 | 8. Conectar com o AKS localmente: ```az aks get-credentials -g $resourceGroupName --name $aksName```
16 | 9. Conectar com o ACR localmente: ```az acr login --name $acrName```
17 | 10. Testar a conexão com o AKS: ```kubectl get namespace```, deverá listar os namespaces
18 |
19 |
20 | Linux (ou WSL)
21 | --------------
22 | Para montar o ambiente, os seguinte comandos devem ser rodados no bash, com o Azure Cli e o jq instalado:
23 |
24 | 1. Obter o id da subscrion atual: ```SUBSCRIPTION=$(az account show | jq -r .id)```
25 | 2. Escolha um nome único para o seu ACR: ```ACRNAME=meuacrunico```
26 | 3. Escolha um nome para o seu resource group: ```RESOURCEGROUPNAME=tutorial-kube```
27 | 4. Escolha um nome para o seu cluster AKS: ```AKSNAME=tutorial-kube-aks```
28 | 5. Criar resource group: ```az group create --location eastus --name $RESOURCEGROUPNAME```
29 | 6. Criar ACR: ```az acr create -g $RESOURCEGROUPNAME --name $ACRNAME --sku basic --admin-enabled true```
30 | 7. Criar AKS: ```az aks create -g $RESOURCEGROUPNAME --name $AKSNAME --node-count 1 --attach-acr $ACRNAME --generate-ssh-keys```
31 | 8. Conectar com o AKS localmente: ```az aks get-credentials -g $RESOURCEGROUPNAME --name $AKSNAME --file ~/.kube/config --overwrite-existing```
32 | 9. Obter o token do ACR: ```ACRTOKEN=$(az acr credential show -n $ACRNAME | jq -r .passwords[0].value)```
33 | 10. Logar no docker: ```docker login $ACRNAME.azurecr.io --username $ACRNAME --password $ACRTOKEN```
34 | 11. Testar a conexão com o AKS: ```kubectl get namespace```, deverá listar os namespaces
35 |
--------------------------------------------------------------------------------
/kubernetes/4-Rodando-um-Service/README.md:
--------------------------------------------------------------------------------
1 | Rodando um Service
2 | ==================
3 |
4 | Um service expõe um conjunto de Pods ou deployment como um serviço único, seja para o Cluster ou para o mundo exterior.
5 |
6 | A criação de Services é feita utilizando-se arquivos YAML, como o que está listado a seguir:
7 |
8 | ```YAML
9 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
10 | kind: Service # Tipo de objeto a ser criado
11 | metadata:
12 | name: pod-info-service # Nome do service
13 | spec:
14 | type: ClusterIP # Tipo de Serviço. Os mais comuns são ClusterIP e LoadBalancer
15 | selector: # Indica quais pods serão roteadas por este service
16 | app: pod-info
17 | ports: # Portas que o serviço irá expor
18 | - protocol: TCP # Protocolo (TCP ou UDP)
19 | port: 80 # Porta que será exposta para o mundo
20 | targetPort: 9898 # Porta da pod que será roteada
21 | ```
22 |
23 | Para aplicar esse arquivo no cluster, deve-se usar o comando apply, passando-se o arquivo e o nome do namespace onde será rodado.
24 |
25 | ```Powershell
26 | kubectl apply -f pod-info-service.yaml --namespace=my-namespace
27 | ```
28 |
29 | Para listar os serviços, deve-se rodar o comando:
30 |
31 | ```Powershell
32 | kubectl get service --namespace=my-namespace
33 | ```
34 |
35 | Por ter o tipo ClusterIP, o serviço só está exposto para dentro do cluster:
36 |
37 | ```
38 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
39 | pod-info-service ClusterIP 10.0.45.23 80/TCP 19s
40 | ```
41 |
42 | O serviço está expondo a porta 80, porém para acessá-la de fora é necessário criar um port-forward, utilizando-se o comando:
43 |
44 | ```Powershell
45 | kubectl port-forward service/pod-info-service 3004:80 --namespace=my-namespace
46 | ```
47 |
48 | Assim, expomos a porta 80 do service como a porta 3004 do computador local.
49 |
50 | Podemos também alterar o Service para que ele crie um Load Balancer em um IP Externo, assim não temos que fazer o port forward. Para isso, modificamos o Type para "LoadBalancer" e rodamos o commando apply:
51 |
52 | ```Powershell
53 | kubectl apply -f pod-info-service-load-balancer.yaml --namespace=my-namespace
54 | ```
55 |
56 | Listando novamente o serviço com o comando ```kubectl get service --namespace=my-namespace```, obtemos o IP Externo:
57 |
58 | ```
59 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
60 | pod-info-service LoadBalancer 10.0.45.23 52.224.196.160 80:31710/TCP 12m
61 | ```
62 |
63 | Podemos acessar pelo IP na porta 80.
64 |
--------------------------------------------------------------------------------
/kubernetes/2-Rodando-uma-Pod/README.md:
--------------------------------------------------------------------------------
1 | Rodando uma pod
2 | ===============
3 |
4 | Uma Pod é um conjunto de containers, que rodam isolados no cluster. Os containers rodam em conjunto e tem acesso ao mesmo sistema de arquivos.
5 |
6 | A criação de pods é feita utilizando-se arquivos YAML, como o que está listado a seguir:
7 |
8 | ```YAML
9 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
10 | kind: Pod # Tipo de objeto a ser criado
11 | metadata:
12 | name: getting-started #Nome da pod
13 | labels: # Labels a serem aplicados, podem ter quaisquer nomes e valores
14 | role: myrole
15 | spec: # contém as especificações da pod, como os containers que irão rodar, recursos, discos, etc...
16 | containers: # Lista de containers da POD
17 | - name: web # Nome do container dentro da POD
18 | image: docker/getting-started # Imagem do Docker que será utilizado
19 | ports: # portas que a POD expões para o cluster. Essa porta não é acessível fora do cluster
20 | - name: web # Nome da porta
21 | containerPort: 80 # PORTA
22 | protocol: TCP # Tipo de protocolo (TCP ou UDP)
23 | resources: # Recursos que a POD usa (CPU, memória, etc...)
24 | limits: # Limite máximo de recursos
25 | cpu: 500m # 500 milis cpus (meia CPU) é o limite máximo que este container pode usar
26 | memory: 200Mi # 200 MB de memória é o o limite máximo que este container pode usar
27 | requests: # limite mínimo que o container precisa
28 | cpu: 100m # 100 milis cpis (0,1 CPU) é o mínimo que este container precisa ter reservado
29 | memory: 100Mi # 100 MB de memória é o mínimimo que este container precisa ter reservado
30 | ```
31 |
32 | Para aplicar esse arquivo no cluster, deve-se usar o comando apply, passando-se o arquivo e o nome do namespace onde será rodado.
33 |
34 | ```Powershell
35 | kubectl apply -f getting-started.yaml --namespace=my-namespace
36 | ```
37 |
38 | Para listar as Pods, deve-se rodar o comando:
39 |
40 | ```Powershell
41 | kubectl get pod --namespace=my-namespace
42 | ```
43 |
44 | A Pod está expondo a porta 80 para o cluster, porém para acessá-la de fora é necessário criar um port-forward, utilizando-se o comando:
45 |
46 | ```Powershell
47 | kubectl port-forward getting-started 3001:80 --namespace=my-namespace
48 | ```
49 |
50 | Assim, expomos a porta 80 do container como a porta 3001 do computador local.
51 |
52 | Por fim, para limpar o ambiente, podemos apagar a pod, com o comando:
53 |
54 | ```Powershell
55 | kubectl delete pod getting-started --namespace=my-namespace
56 | ```
57 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/README.md:
--------------------------------------------------------------------------------
1 | Dockerfile Multi-Stage
2 | ======================
3 |
4 | Para este tutorial, vamos mostrar como usar um Dockerfile com multiplos passos, para rodar um serviço .Net Core.
5 |
6 | O projeto está criado no diretório ```my-container-app``` e os comandos abaixo devem ser rodados neste diretório.
7 |
8 | Usamos Dockerfile multi-stage em geral quando temos versões diferentes de containers para construção da aplicação e para rodar ela,por exemplo para projetos .Net Core, usamos uma imagem com o SDK completo para fazer o build, e uma imagem com apenas o Runtime para fazer a execução. Com isso, nossa imagem de execução é menor e mais segura, pois não precisa ter o código fonte.
9 |
10 | O Dockerfile que usaremos, está detalhado abaixo:
11 |
12 | ```Dockerfile
13 | FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS build
14 | WORKDIR /app
15 |
16 | # copy csproj and restore as distinct layers
17 | COPY *.csproj ./
18 | RUN dotnet restore
19 |
20 | # copy everything else and build app
21 | COPY . ./
22 | RUN dotnet publish -c Release -o out
23 |
24 | FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine AS runtime
25 | WORKDIR /app
26 | EXPOSE 80
27 | COPY --from=build /app/out ./
28 | ENTRYPOINT ["dotnet", "my-container-app.dll"]
29 | ```
30 |
31 | Os comandos que utilizamos em nosso Dockerfile foram:
32 |
33 | - Container de Build:
34 | - ```FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS build```: Determina o container base, do qual o nosso deriva, e coloca o nome do stage como build. Esse container será usado somente para a construção, sendo depois descartado.
35 | - ```WORKDIR /app```: Muda o diretório de trabalho para o diretório /app do container.
36 | - ```COPY *.csproj ./```: Copia apenas o arquivo CSPROJ, para depois poder restaurar as dependencias. Apenas esse arquivo é copiado, pois conseguimos otimizar as versões intermediárias em cache, diminuindo o espaço em disco.
37 | - ```RUN dotnet restore```: Restaura as bibliotecas no container de build.
38 | - ```COPY . ./```: Copia o restante do código fonte.
39 | - ```RUN dotnet publish -c Release -o out```: Gera o build, no perfil Release
40 | - Container de Runtime:
41 | - ```FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine AS runtime```: Cria uma novo container, com apelido de "runtime", usando apenas o runtime do .Net.
42 | - ```WORKDIR /app```: Muda o diretório de trabalho para /app
43 | - ```EXPOSE 80```: Determina qual porta o Container expõe
44 | - ```COPY --from=build /app/out ./```: Copia os arquivos do diretório /app/out do container de build para o container de runtime
45 | - ```ENTRYPOINT ["dotnet", "my-container-app.dll"]```: Determina o comando que vai ser rodado quando o container subir, para rodar a aplicação.
46 |
47 | Para fazer o build do container, utilizamos o comando:
48 |
49 | ```Powershell
50 | docker build --tag my-container-app:1.0 .
51 | ```
52 |
53 | Este comando faz faz o build do diretório corrente e nomeia o container com o nome: my-container-app, e a "versão" 1.0.
54 |
55 | Após rodar, podemos usar o comando: ```docker image list``` para listar as imagens presentes no nosso registro local. Para executar a aplicação, rodarmos:```docker run -d -p 3000:80 my-container-app:1.0```
56 |
57 | Para acessar, use a URL: http://localhost:3000/weatherforecast
58 |
--------------------------------------------------------------------------------
/kubernetes/6-Publicando-nossa-aplicacao/aplicacao-completa.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
2 | kind: Deployment # Tipo de objeto a ser criado
3 | metadata:
4 | name: weather-forecast-deployment # Nome do deployment
5 | labels: # Labels a serem aplicados, podem ter quaisquer nomes e valores
6 | role: weather-forecast
7 | spec: # contém as especificações do deployment pod, como os containers que irão rodar, quantidade de pods, etc..
8 | selector: # Indica como o Deployment vai saber quais pods gerenciar
9 | matchLabels: # Busca pods por labels
10 | app: weather-forecast # Pods que tenham o label app = getting-started
11 | replicas: 1 #roda uma replica da pod
12 | template: # Template da pod que será criada
13 | metadata:
14 | labels: # Labels. Devem ser iguais à MATCH EXPRESSION acima
15 | app: weather-forecast
16 | spec:
17 | containers: # Lista de containers da POD
18 | - name: web # Nome do container dentro da POD
19 | image: meuacrunico.azurecr.io/my-container-app # Imagem do Docker que será utilizado
20 | ports: # portas que a POD expões para o cluster. Essa porta não é acessível fora do cluster
21 | - name: web # Nome da porta
22 | containerPort: 80 # PORTA
23 | protocol: TCP # Tipo de protocolo (TCP ou UDP)
24 | resources: # Recursos que a POD usa (CPU, memória, etc...)
25 | limits: # Limite máximo de recursos
26 | cpu: 500m # 500 milis cpus (meia CPU) é o limite máximo que este container pode usar
27 | memory: 200Mi # 200 MB de memória é o o limite máximo que este container pode usar
28 | requests: # limite mínimo que o container precisa
29 | cpu: 100m # 100 milis cpis (0,1 CPU) é o mínimo que este container precisa ter reservado
30 | memory: 100Mi # 100 MB de memória é o mínimimo que este container precisa ter reservado
31 |
32 | ---
33 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
34 | kind: Service # Tipo de objeto a ser criado
35 | metadata:
36 | name: weather-forecast-service # Nome do service
37 | spec:
38 | type: LoadBalancer # Tipo de Serviço. Os mais comuns são ClusterIP e LoadBalancer
39 | selector: # Indica quais pods serão roteadas por este service
40 | app: weather-forecast
41 | ports: # Portas que o serviço irá expor
42 | - protocol: TCP # Protocolo (TCP ou UDP)
43 | port: 80 # Porta que será exposta para o mundo
44 | targetPort: 80 # Porta da pod que será roteada
45 |
46 | ---
47 | apiVersion: autoscaling/v2 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
48 | kind: HorizontalPodAutoscaler # Tipo de recurso (HPA)
49 | metadata:
50 | name: weather-forecast-hpa #Nome do recurso
51 | spec: # Especificação do recurso
52 | scaleTargetRef: # Referencia a objeto que será escalado
53 | apiVersion: apps/v1 # API do objeto a ser escalado
54 | kind: Deployment # Tipo do objeto a ser escalado
55 | name: weather-forecast-deployment # Nome do objeto a ser escalado
56 | minReplicas: 1 # Numero minimo de replicas, deve ser o mesmo do numero de replicas do deployment
57 | maxReplicas: 5 # Numero máximo de replicas
58 | metrics: # Metrica usada para escalar
59 | - type: Resource # Tipo de métrica
60 | resource: # Recurso usado
61 | name: cpu # EScalar por CPU, quando a utilização média estiver acima de 50%
62 | target:
63 | type: Utilization
64 | averageUtilization: 50
65 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Tutorial Docker e Kubernetes
2 | ============================
3 |
4 | Este repositório é um tutorial sobre Docker e Kubernetes, ele traz os principais comandos utilizados e alguns conceitos na apresentação. Ele foi criado para o Bootcamp que a Avanade criou para formação de Devs, e pode ser utilizado ou copiado livremente. Apenas peço que dê o crédito se for copiar.
5 |
6 | Este tutorial foi pensado para profissionais de desenvolvimento de sitemas, que querem conhecer Docker e Kubernetes, então temas como instalação e operação não são cobertos.
7 |
8 | Os slides que eu uso para passar os conceitos principais sobre Docker e Kubernetes estão disponíveis [aqui](Tutorial-Docker-Kubernetes.pdf).
9 |
10 | Pré-Requisitos
11 | --------------
12 |
13 | Para rodar estes exemplos, é necessário:
14 |
15 | 1. Ter uma conta no Azure, com créditos disponíveis (a opção de [trial](https://azure.microsoft.com/pt-br/free/) gratuito funciona!)
16 | 2. Ter o [Azure Cli](https://docs.microsoft.com/pt-br/cli/azure/install-azure-cli?view=azure-cli-latest) instalado
17 | 3. Estar com o Azure cli logado na conta que deve ser utilizado e utilizando a subscription correta
18 | 4. Ter o [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) instalado
19 | 5. Ter o [Docker Desktop](https://www.docker.com/products/docker-desktop) instalado, e configurado no Windows, ou uma distribuição do Docker no Linux (pode ser o WSL).
20 | 6. Se for Windows, garantir que seu Docker está configurado para rodar [Containers Linux](https://docs.docker.com/docker-for-windows/#switch-between-windows-and-linux-containers)
21 | 7. [Criar um cluster AKS e registro ACR](ambiente/1-Criando-um-cluster-AKS/README.md)
22 |
23 |
24 | Tutoriais sobre Docker
25 | ------------------
26 |
27 | 1. [Rodando um Container Localmente](docker/1-Rodando-um-Container-localmente/README.md)
28 | 2. [Dockerfile simples](docker/2-Dockerfile-simples/README.md)
29 | 3. [Dockerfile multi-stage](docker/3-Dockerfile-multi-stage/README.md)
30 | 4. [Publicando uma imagem no ACR](docker/4-Publicando-imagem-acr/README.md)
31 |
32 | Tutoriais sobre Kubernetes
33 | ----------------------
34 |
35 | 1. [Criando um namespace](kubernetes/1-Criando-um-Namespace/README.md)
36 | 2. [Rodando uma Pod](kubernetes/2-Rodando-uma-Pod/README.md)
37 | 3. [Rodando um deployment com mais de uma Pod](kubernetes/3-Rodando-um-Deployment/README.md)
38 | 4. [Rodando um service](kubernetes/4-Rodando-um-Service/README.md)
39 | 5. [Escalando horizontalmente um deployment](kubernetes/5-Escalando-horizontalmente-um-deployment/README.md)
40 | 6. [Publicando nossa aplicação](kubernetes/6-Publicando-nossa-aplicacao/README.md)
41 |
42 | Desenvolvimento Futuro
43 | ----------------------
44 |
45 | Lista de tópicos que eu pretendo adicionar a este tutorial, e que podem ser úteis para quem quiser aprofundar os estudos:
46 |
47 | - Como utilizar quotas para restringir um namespace
48 | - Explicação detalhada sobre Deployment e ReplicaSet
49 | - Probes (readiness, liveness)
50 | - Utilização de Ingress
51 | - Utilização de Services para mapear serviços externos
52 | - Utilização de Persistent Volume e Persistent Volume Claims
53 | - Utilização de StatefulSet para criar serviços persistentes
54 | - Utilização de Secrets
55 | - Segurança: Network Policy
56 | - Segurança: Controle de Acesso
57 | - Pods com mais de um container (Sidecar, etc...)
58 | - Ferramentas de template (Helm / Kustomize)
59 | - Uso de Jobs
60 | - Uso de Init Containers
61 | - Uso do KEDA para escalar por filas
62 | - Uso de Node Pools
63 | - Uso de Node Affinity e Node Anti-affinity para controlar onde roda um serviço
64 | - Container Windows e Linux rodando no mesmo cluster
65 | - Monitoramento do AKS com App Insights
66 |
67 | Agradecimentos
68 | --------------
69 |
70 | Gostaria de agradece ao stefanprodan, que publicou a excelente imagem docker [podinfo](https://github.com/stefanprodan/podinfo) que foram utilizadas em alguns demos.
71 |
--------------------------------------------------------------------------------
/kubernetes/3-Rodando-um-Deployment/README.md:
--------------------------------------------------------------------------------
1 | Rodando um Deployment
2 | =====================
3 |
4 | Um deployment roda um conjunto (cluster) de pods, mantendo sempre o número de cópias (replicas) necessários para rodar, conforme especificado.
5 |
6 | A criação de pods é feita utilizando-se arquivos YAML, como o que está listado a seguir:
7 |
8 | ```YAML
9 | apiVersion: apps/v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
10 | kind: Deployment # Tipo de objeto a ser criado
11 | metadata:
12 | name: pod-info-deployment #Nome do deployment
13 | labels: # Labels a serem aplicados, podem ter quaisquer nomes e valores
14 | role: pod-info
15 | spec: # contém as especificações do deployment pod, como os containers que irão rodar, quantidade de pods, etc..
16 | selector: # Indica como o Deployment vai saber quais pods gerenciar
17 | matchLabels: # Busca pods por labels
18 | app: pod-info # Pods que tenham o label app = getting-started
19 | replicas: 2 #roda duas replicas da pod
20 | template: # Template da pod que será criada
21 | metadata:
22 | labels: # Labels. Devem ser iguais à MATCH EXPRESSION acima
23 | app: pod-info
24 | spec:
25 | containers: # Lista de containers da POD
26 | - name: web # Nome do container dentro da POD
27 | image: stefanprodan/podinfo # Imagem do Docker que será utilizado
28 | ports: # portas que a POD expões para o cluster. Essa porta não é acessível fora do cluster
29 | - name: web # Nome da porta
30 | containerPort: 9898 # PORTA
31 | protocol: TCP # Tipo de protocolo (TCP ou UDP)
32 | resources: # Recursos que a POD usa (CPU, memória, etc...)
33 | limits: # Limite máximo de recursos
34 | cpu: 500m # 500 milis cpus (meia CPU) é o limite máximo que este container pode usar
35 | memory: 200Mi # 200 MB de memória é o o limite máximo que este container pode usar
36 | requests: # limite mínimo que o container precisa
37 | cpu: 100m # 100 milis cpis (0,1 CPU) é o mínimo que este container precisa ter reservado
38 | memory: 100Mi # 100 MB de memória é o mínimimo que este container precisa ter reservado
39 | ```
40 |
41 | Para aplicar esse arquivo no cluster, deve-se usar o comando apply, passando-se o arquivo e o nome do namespace onde será rodado.
42 |
43 | ```Powershell
44 | kubectl apply -f pod-info-deployment.yaml --namespace=my-namespace
45 | ```
46 |
47 | Para listar as Pods, deve-se rodar o comando:
48 |
49 | ```Powershell
50 | kubectl get pod --namespace=my-namespace
51 | ```
52 |
53 | Podemos ver, que estamos rodando duas instancias da pod, por exemplo:
54 |
55 | ```
56 | NAME READY STATUS RESTARTS AGE
57 | pod-info-deployment-7945c979c7-bm8r9 1/1 Running 0 23s
58 | pod-info-deployment-7945c979c7-gt4q5 1/1 Running 0 21s
59 | ```
60 |
61 | Ambas as Pods estão expondo a porta 9898 para o cluster, porém para acessá-la de fora é necessário criar um port-forward, utilizando-se os comandos em duas janelas separadas:
62 |
63 | ```Powershell
64 | kubectl port-forward pod-info-deployment-7945c979c7-bm8r9 3002:9898 --namespace=my-namespace
65 | kubectl port-forward pod-info-deployment-7945c979c7-gt4q5 3003:9898 --namespace=my-namespace
66 | ```
67 |
68 | Assim, expomos a porta 9898 do container como a porta 3002 do computador local.
69 |
70 | Podemos também alterar diretamente o número de pods de um deployment, com o comando:
71 |
72 | ```Powershell
73 | kubectl scale --replicas=4 deployment/pod-info-deployment --namespace=my-namespace
74 | ```
75 |
76 | Se apagarmos uma pod, podemos ver que o Kubernetes automaticamente sobe mais um, por exemplo:
77 |
78 | ```Powershell
79 | kubectl delete pod pod-info-deployment-7945c979c7-bm8r9 --namespace=my-namespace
80 | ```
81 |
82 | Vamos deixar o nosso deployment rodando para podermos utilizar no próximo exemplo.
83 |
--------------------------------------------------------------------------------
/kubernetes/6-Publicando-nossa-aplicacao/README.md:
--------------------------------------------------------------------------------
1 | Publicando nossa aplicação
2 | ==========================
3 |
4 | Para publicar a aplicação que criamos localmente no nosso cluster AKS, podemos gerar um YAML completo com todos os artefatos que precisamos, como abaixo (a separação de recursos é feita utilizando-se os caracteres ```---```):
5 |
6 | ```YAML
7 | apiVersion: apps/v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
8 | kind: Deployment # Tipo de objeto a ser criado
9 | metadata:
10 | name: weather-forecast-deployment # Nome do deployment
11 | labels: # Labels a serem aplicados, podem ter quaisquer nomes e valores
12 | role: weather-forecast
13 | spec: # contém as especificações do deployment pod, como os containers que irão rodar, quantidade de pods, etc..
14 | selector: # Indica como o Deployment vai saber quais pods gerenciar
15 | matchLabels: # Busca pods por labels
16 | app: weather-forecast # Pods que tenham o label app = getting-started
17 | replicas: 1 #roda uma replica da pod
18 | template: # Template da pod que será criada
19 | metadata:
20 | labels: # Labels. Devem ser iguais à MATCH EXPRESSION acima
21 | app: weather-forecast
22 | spec:
23 | containers: # Lista de containers da POD
24 | - name: web # Nome do container dentro da POD
25 | image: meuacrunico.azurecr.io/my-container-app # Imagem do Docker que será utilizado
26 | ports: # portas que a POD expões para o cluster. Essa porta não é acessível fora do cluster
27 | - name: web # Nome da porta
28 | containerPort: 80 # PORTA
29 | protocol: TCP # Tipo de protocolo (TCP ou UDP)
30 | resources: # Recursos que a POD usa (CPU, memória, etc...)
31 | limits: # Limite máximo de recursos
32 | cpu: 500m # 500 milis cpus (meia CPU) é o limite máximo que este container pode usar
33 | memory: 200Mi # 200 MB de memória é o o limite máximo que este container pode usar
34 | requests: # limite mínimo que o container precisa
35 | cpu: 100m # 100 milis cpis (0,1 CPU) é o mínimo que este container precisa ter reservado
36 | memory: 100Mi # 100 MB de memória é o mínimimo que este container precisa ter reservado
37 |
38 | ---
39 | apiVersion: v1 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
40 | kind: Service # Tipo de objeto a ser criado
41 | metadata:
42 | name: weather-forecast-service # Nome do service
43 | spec:
44 | type: LoadBalancer # Tipo de Serviço. Os mais comuns são ClusterIP e LoadBalancer
45 | selector: # Indica quais pods serão roteadas por este service
46 | app: weather-forecast
47 | ports: # Portas que o serviço irá expor
48 | - protocol: TCP # Protocolo (TCP ou UDP)
49 | port: 80 # Porta que será exposta para o mundo
50 | targetPort: 80 # Porta da pod que será roteada
51 |
52 | ---
53 | apiVersion: autoscaling/v2 # Obrigatorio, versão da API do Kubernetes que contém esse recursos
54 | kind: HorizontalPodAutoscaler # Tipo de recurso (HPA)
55 | metadata:
56 | name: weather-forecast-hpa #Nome do recurso
57 | spec: # Especificação do recurso
58 | scaleTargetRef: # Referencia a objeto que será escalado
59 | apiVersion: apps/v1 # API do objeto a ser escalado
60 | kind: Deployment # Tipo do objeto a ser escalado
61 | name: weather-forecast-deployment # Nome do objeto a ser escalado
62 | minReplicas: 1 # Numero minimo de replicas, deve ser o mesmo do numero de replicas do deployment
63 | maxReplicas: 5 # Numero máximo de replicas
64 | metrics: # Metrica usada para escalar
65 | - type: Resource # Tipo de métrica
66 | resource: # Recurso usado
67 | name: cpu # EScalar por CPU, quando a utilização média estiver acima de 50%
68 | target:
69 | type: Utilization
70 | averageUtilization: 50
71 | ```
72 |
73 | Para aplicar esse arquivo no cluster, deve-se usar o comando apply, passando-se o arquivo e o nome do namespace onde será rodado.
74 |
75 | ```Powershell
76 | kubectl apply -f aplicacao-completa.yaml --namespace=my-namespace
77 | ```
78 |
79 | Para listar os recursos criado, pode-se usar os comandos:
80 |
81 | ```Powershell
82 | kubectl get pod --namespace=my-namespace
83 | kubectl get service --namespace=my-namespace
84 | kubectl get deployment --namespace=my-namespace
85 | kubectl get hpa --namespace=my-namespace
86 | ```
87 |
88 | Com isso terminamos nosso tutorial básico sobre Kubernetes!
89 |
90 | Para lipar tudo, podemos remover o namespace criado completamente, com o comando: ```kubectl delete namespace my-namespace``` . Isso remove todos os objetos do namespace.
91 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Creative Commons Legal Code
2 |
3 | CC0 1.0 Universal
4 |
5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12 | HEREUNDER.
13 |
14 | Statement of Purpose
15 |
16 | The laws of most jurisdictions throughout the world automatically confer
17 | exclusive Copyright and Related Rights (defined below) upon the creator
18 | and subsequent owner(s) (each and all, an "owner") of an original work of
19 | authorship and/or a database (each, a "Work").
20 |
21 | Certain owners wish to permanently relinquish those rights to a Work for
22 | the purpose of contributing to a commons of creative, cultural and
23 | scientific works ("Commons") that the public can reliably and without fear
24 | of later claims of infringement build upon, modify, incorporate in other
25 | works, reuse and redistribute as freely as possible in any form whatsoever
26 | and for any purposes, including without limitation commercial purposes.
27 | These owners may contribute to the Commons to promote the ideal of a free
28 | culture and the further production of creative, cultural and scientific
29 | works, or to gain reputation or greater distribution for their Work in
30 | part through the use and efforts of others.
31 |
32 | For these and/or other purposes and motivations, and without any
33 | expectation of additional consideration or compensation, the person
34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35 | is an owner of Copyright and Related Rights in the Work, voluntarily
36 | elects to apply CC0 to the Work and publicly distribute the Work under its
37 | terms, with knowledge of his or her Copyright and Related Rights in the
38 | Work and the meaning and intended legal effect of CC0 on those rights.
39 |
40 | 1. Copyright and Related Rights. A Work made available under CC0 may be
41 | protected by copyright and related or neighboring rights ("Copyright and
42 | Related Rights"). Copyright and Related Rights include, but are not
43 | limited to, the following:
44 |
45 | i. the right to reproduce, adapt, distribute, perform, display,
46 | communicate, and translate a Work;
47 | ii. moral rights retained by the original author(s) and/or performer(s);
48 | iii. publicity and privacy rights pertaining to a person's image or
49 | likeness depicted in a Work;
50 | iv. rights protecting against unfair competition in regards to a Work,
51 | subject to the limitations in paragraph 4(a), below;
52 | v. rights protecting the extraction, dissemination, use and reuse of data
53 | in a Work;
54 | vi. database rights (such as those arising under Directive 96/9/EC of the
55 | European Parliament and of the Council of 11 March 1996 on the legal
56 | protection of databases, and under any national implementation
57 | thereof, including any amended or successor version of such
58 | directive); and
59 | vii. other similar, equivalent or corresponding rights throughout the
60 | world based on applicable law or treaty, and any national
61 | implementations thereof.
62 |
63 | 2. Waiver. To the greatest extent permitted by, but not in contravention
64 | of, applicable law, Affirmer hereby overtly, fully, permanently,
65 | irrevocably and unconditionally waives, abandons, and surrenders all of
66 | Affirmer's Copyright and Related Rights and associated claims and causes
67 | of action, whether now known or unknown (including existing as well as
68 | future claims and causes of action), in the Work (i) in all territories
69 | worldwide, (ii) for the maximum duration provided by applicable law or
70 | treaty (including future time extensions), (iii) in any current or future
71 | medium and for any number of copies, and (iv) for any purpose whatsoever,
72 | including without limitation commercial, advertising or promotional
73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74 | member of the public at large and to the detriment of Affirmer's heirs and
75 | successors, fully intending that such Waiver shall not be subject to
76 | revocation, rescission, cancellation, termination, or any other legal or
77 | equitable action to disrupt the quiet enjoyment of the Work by the public
78 | as contemplated by Affirmer's express Statement of Purpose.
79 |
80 | 3. Public License Fallback. Should any part of the Waiver for any reason
81 | be judged legally invalid or ineffective under applicable law, then the
82 | Waiver shall be preserved to the maximum extent permitted taking into
83 | account Affirmer's express Statement of Purpose. In addition, to the
84 | extent the Waiver is so judged Affirmer hereby grants to each affected
85 | person a royalty-free, non transferable, non sublicensable, non exclusive,
86 | irrevocable and unconditional license to exercise Affirmer's Copyright and
87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the
88 | maximum duration provided by applicable law or treaty (including future
89 | time extensions), (iii) in any current or future medium and for any number
90 | of copies, and (iv) for any purpose whatsoever, including without
91 | limitation commercial, advertising or promotional purposes (the
92 | "License"). The License shall be deemed effective as of the date CC0 was
93 | applied by Affirmer to the Work. Should any part of the License for any
94 | reason be judged legally invalid or ineffective under applicable law, such
95 | partial invalidity or ineffectiveness shall not invalidate the remainder
96 | of the License, and in such case Affirmer hereby affirms that he or she
97 | will not (i) exercise any of his or her remaining Copyright and Related
98 | Rights in the Work or (ii) assert any associated claims and causes of
99 | action with respect to the Work, in either case contrary to Affirmer's
100 | express Statement of Purpose.
101 |
102 | 4. Limitations and Disclaimers.
103 |
104 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
105 | surrendered, licensed or otherwise affected by this document.
106 | b. Affirmer offers the Work as-is and makes no representations or
107 | warranties of any kind concerning the Work, express, implied,
108 | statutory or otherwise, including without limitation warranties of
109 | title, merchantability, fitness for a particular purpose, non
110 | infringement, or the absence of latent or other defects, accuracy, or
111 | the present or absence of errors, whether or not discoverable, all to
112 | the greatest extent permissible under applicable law.
113 | c. Affirmer disclaims responsibility for clearing rights of other persons
114 | that may apply to the Work or any use thereof, including without
115 | limitation any person's Copyright and Related Rights in the Work.
116 | Further, Affirmer disclaims responsibility for obtaining any necessary
117 | consents, permissions or other rights required for any use of the
118 | Work.
119 | d. Affirmer understands and acknowledges that Creative Commons is not a
120 | party to this document and has no duty or obligation with respect to
121 | this CC0 or use of the Work.
122 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Aa][Rr][Mm]/
27 | [Aa][Rr][Mm]64/
28 | bld/
29 | [Bb]in/
30 | [Oo]bj/
31 | [Ll]og/
32 |
33 | # Visual Studio 2015/2017 cache/options directory
34 | .vs/
35 | # Uncomment if you have tasks that create the project's static files in wwwroot
36 | #wwwroot/
37 |
38 | # Visual Studio 2017 auto generated files
39 | Generated\ Files/
40 |
41 | # MSTest test Results
42 | [Tt]est[Rr]esult*/
43 | [Bb]uild[Ll]og.*
44 |
45 | # NUNIT
46 | *.VisualState.xml
47 | TestResult.xml
48 |
49 | # Build Results of an ATL Project
50 | [Dd]ebugPS/
51 | [Rr]eleasePS/
52 | dlldata.c
53 |
54 | # Benchmark Results
55 | BenchmarkDotNet.Artifacts/
56 |
57 | # .NET Core
58 | project.lock.json
59 | project.fragment.lock.json
60 | artifacts/
61 |
62 | # StyleCop
63 | StyleCopReport.xml
64 |
65 | # Files built by Visual Studio
66 | *_i.c
67 | *_p.c
68 | *_h.h
69 | *.ilk
70 | *.meta
71 | *.obj
72 | *.iobj
73 | *.pch
74 | *.pdb
75 | *.ipdb
76 | *.pgc
77 | *.pgd
78 | *.rsp
79 | *.sbr
80 | *.tlb
81 | *.tli
82 | *.tlh
83 | *.tmp
84 | *.tmp_proj
85 | *_wpftmp.csproj
86 | *.log
87 | *.vspscc
88 | *.vssscc
89 | .builds
90 | *.pidb
91 | *.svclog
92 | *.scc
93 |
94 | # Chutzpah Test files
95 | _Chutzpah*
96 |
97 | # Visual C++ cache files
98 | ipch/
99 | *.aps
100 | *.ncb
101 | *.opendb
102 | *.opensdf
103 | *.sdf
104 | *.cachefile
105 | *.VC.db
106 | *.VC.VC.opendb
107 |
108 | # Visual Studio profiler
109 | *.psess
110 | *.vsp
111 | *.vspx
112 | *.sap
113 |
114 | # Visual Studio Trace Files
115 | *.e2e
116 |
117 | # TFS 2012 Local Workspace
118 | $tf/
119 |
120 | # Guidance Automation Toolkit
121 | *.gpState
122 |
123 | # ReSharper is a .NET coding add-in
124 | _ReSharper*/
125 | *.[Rr]e[Ss]harper
126 | *.DotSettings.user
127 |
128 | # JustCode is a .NET coding add-in
129 | .JustCode
130 |
131 | # TeamCity is a build add-in
132 | _TeamCity*
133 |
134 | # DotCover is a Code Coverage Tool
135 | *.dotCover
136 |
137 | # AxoCover is a Code Coverage Tool
138 | .axoCover/*
139 | !.axoCover/settings.json
140 |
141 | # Visual Studio code coverage results
142 | *.coverage
143 | *.coveragexml
144 |
145 | # NCrunch
146 | _NCrunch_*
147 | .*crunch*.local.xml
148 | nCrunchTemp_*
149 |
150 | # MightyMoose
151 | *.mm.*
152 | AutoTest.Net/
153 |
154 | # Web workbench (sass)
155 | .sass-cache/
156 |
157 | # Installshield output folder
158 | [Ee]xpress/
159 |
160 | # DocProject is a documentation generator add-in
161 | DocProject/buildhelp/
162 | DocProject/Help/*.HxT
163 | DocProject/Help/*.HxC
164 | DocProject/Help/*.hhc
165 | DocProject/Help/*.hhk
166 | DocProject/Help/*.hhp
167 | DocProject/Help/Html2
168 | DocProject/Help/html
169 |
170 | # Click-Once directory
171 | publish/
172 |
173 | # Publish Web Output
174 | *.[Pp]ublish.xml
175 | *.azurePubxml
176 | # Note: Comment the next line if you want to checkin your web deploy settings,
177 | # but database connection strings (with potential passwords) will be unencrypted
178 | *.pubxml
179 | *.publishproj
180 |
181 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
182 | # checkin your Azure Web App publish settings, but sensitive information contained
183 | # in these scripts will be unencrypted
184 | PublishScripts/
185 |
186 | # NuGet Packages
187 | *.nupkg
188 | # The packages folder can be ignored because of Package Restore
189 | **/[Pp]ackages/*
190 | # except build/, which is used as an MSBuild target.
191 | !**/[Pp]ackages/build/
192 | # Uncomment if necessary however generally it will be regenerated when needed
193 | #!**/[Pp]ackages/repositories.config
194 | # NuGet v3's project.json files produces more ignorable files
195 | *.nuget.props
196 | *.nuget.targets
197 |
198 | # Microsoft Azure Build Output
199 | csx/
200 | *.build.csdef
201 |
202 | # Microsoft Azure Emulator
203 | ecf/
204 | rcf/
205 |
206 | # Windows Store app package directories and files
207 | AppPackages/
208 | BundleArtifacts/
209 | Package.StoreAssociation.xml
210 | _pkginfo.txt
211 | *.appx
212 | *.appxbundle
213 | *.appxupload
214 |
215 | # Visual Studio cache files
216 | # files ending in .cache can be ignored
217 | *.[Cc]ache
218 | # but keep track of directories ending in .cache
219 | !?*.[Cc]ache/
220 |
221 | # Others
222 | ClientBin/
223 | ~$*
224 | *~
225 | *.dbmdl
226 | *.dbproj.schemaview
227 | *.jfm
228 | *.pfx
229 | *.publishsettings
230 | orleans.codegen.cs
231 |
232 | # Including strong name files can present a security risk
233 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
234 | #*.snk
235 |
236 | # Since there are multiple workflows, uncomment next line to ignore bower_components
237 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
238 | #bower_components/
239 |
240 | # RIA/Silverlight projects
241 | Generated_Code/
242 |
243 | # Backup & report files from converting an old project file
244 | # to a newer Visual Studio version. Backup files are not needed,
245 | # because we have git ;-)
246 | _UpgradeReport_Files/
247 | Backup*/
248 | UpgradeLog*.XML
249 | UpgradeLog*.htm
250 | ServiceFabricBackup/
251 | *.rptproj.bak
252 |
253 | # SQL Server files
254 | *.mdf
255 | *.ldf
256 | *.ndf
257 |
258 | # Business Intelligence projects
259 | *.rdl.data
260 | *.bim.layout
261 | *.bim_*.settings
262 | *.rptproj.rsuser
263 | *- Backup*.rdl
264 |
265 | # Microsoft Fakes
266 | FakesAssemblies/
267 |
268 | # GhostDoc plugin setting file
269 | *.GhostDoc.xml
270 |
271 | # Node.js Tools for Visual Studio
272 | .ntvs_analysis.dat
273 | node_modules/
274 |
275 | # Visual Studio 6 build log
276 | *.plg
277 |
278 | # Visual Studio 6 workspace options file
279 | *.opt
280 |
281 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
282 | *.vbw
283 |
284 | # Visual Studio LightSwitch build output
285 | **/*.HTMLClient/GeneratedArtifacts
286 | **/*.DesktopClient/GeneratedArtifacts
287 | **/*.DesktopClient/ModelManifest.xml
288 | **/*.Server/GeneratedArtifacts
289 | **/*.Server/ModelManifest.xml
290 | _Pvt_Extensions
291 |
292 | # Paket dependency manager
293 | .paket/paket.exe
294 | paket-files/
295 |
296 | # FAKE - F# Make
297 | .fake/
298 |
299 | # CodeRush personal settings
300 | .cr/personal
301 |
302 | # Python Tools for Visual Studio (PTVS)
303 | __pycache__/
304 | *.pyc
305 |
306 | # Cake - Uncomment if you are using it
307 | # tools/**
308 | # !tools/packages.config
309 |
310 | # Tabs Studio
311 | *.tss
312 |
313 | # Telerik's JustMock configuration file
314 | *.jmconfig
315 |
316 | # BizTalk build output
317 | *.btp.cs
318 | *.btm.cs
319 | *.odx.cs
320 | *.xsd.cs
321 |
322 | # OpenCover UI analysis results
323 | OpenCover/
324 |
325 | # Azure Stream Analytics local run output
326 | ASALocalRun/
327 |
328 | # MSBuild Binary and Structured Log
329 | *.binlog
330 |
331 | # NVidia Nsight GPU debugger configuration file
332 | *.nvuser
333 |
334 | # MFractors (Xamarin productivity tool) working folder
335 | .mfractor/
336 |
337 | # Local History for Visual Studio
338 | .localhistory/
339 |
340 | # BeatPulse healthcheck temp database
341 | healthchecksdb
342 |
343 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
344 | MigrationBackup/
345 |
346 | ##
347 | ## Visual studio for Mac
348 | ##
349 |
350 |
351 | # globs
352 | Makefile.in
353 | *.userprefs
354 | *.usertasks
355 | config.make
356 | config.status
357 | aclocal.m4
358 | install-sh
359 | autom4te.cache/
360 | *.tar.gz
361 | tarballs/
362 | test-results/
363 |
364 | # Mac bundle stuff
365 | *.dmg
366 | *.app
367 |
368 | # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
369 | # General
370 | .DS_Store
371 | .AppleDouble
372 | .LSOverride
373 |
374 | # Icon must end with two \r
375 | Icon
376 |
377 |
378 | # Thumbnails
379 | ._*
380 |
381 | # Files that might appear in the root of a volume
382 | .DocumentRevisions-V100
383 | .fseventsd
384 | .Spotlight-V100
385 | .TemporaryItems
386 | .Trashes
387 | .VolumeIcon.icns
388 | .com.apple.timemachine.donotpresent
389 |
390 | # Directories potentially created on remote AFP share
391 | .AppleDB
392 | .AppleDesktop
393 | Network Trash Folder
394 | Temporary Items
395 | .apdisk
396 |
397 | # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
398 | # Windows thumbnail cache files
399 | Thumbs.db
400 | ehthumbs.db
401 | ehthumbs_vista.db
402 |
403 | # Dump file
404 | *.stackdump
405 |
406 | # Folder config file
407 | [Dd]esktop.ini
408 |
409 | # Recycle Bin used on file shares
410 | $RECYCLE.BIN/
411 |
412 | # Windows Installer files
413 | *.cab
414 | *.msi
415 | *.msix
416 | *.msm
417 | *.msp
418 |
419 | # Windows shortcuts
420 | *.lnk
421 |
422 | # JetBrains Rider
423 | .idea/
424 | *.sln.iml
425 |
426 | ##
427 | ## Visual Studio Code
428 | ##
429 | .vscode/*
430 | !.vscode/settings.json
431 | !.vscode/tasks.json
432 | !.vscode/launch.json
433 | !.vscode/extensions.json
434 |
--------------------------------------------------------------------------------
/docker/3-Dockerfile-multi-stage/my-container-app/.dockerignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Aa][Rr][Mm]/
27 | [Aa][Rr][Mm]64/
28 | bld/
29 | [Bb]in/
30 | [Oo]bj/
31 | [Ll]og/
32 |
33 | # Visual Studio 2015/2017 cache/options directory
34 | .vs/
35 | # Uncomment if you have tasks that create the project's static files in wwwroot
36 | #wwwroot/
37 |
38 | # Visual Studio 2017 auto generated files
39 | Generated\ Files/
40 |
41 | # MSTest test Results
42 | [Tt]est[Rr]esult*/
43 | [Bb]uild[Ll]og.*
44 |
45 | # NUNIT
46 | *.VisualState.xml
47 | TestResult.xml
48 |
49 | # Build Results of an ATL Project
50 | [Dd]ebugPS/
51 | [Rr]eleasePS/
52 | dlldata.c
53 |
54 | # Benchmark Results
55 | BenchmarkDotNet.Artifacts/
56 |
57 | # .NET Core
58 | project.lock.json
59 | project.fragment.lock.json
60 | artifacts/
61 |
62 | # StyleCop
63 | StyleCopReport.xml
64 |
65 | # Files built by Visual Studio
66 | *_i.c
67 | *_p.c
68 | *_h.h
69 | *.ilk
70 | *.meta
71 | *.obj
72 | *.iobj
73 | *.pch
74 | *.pdb
75 | *.ipdb
76 | *.pgc
77 | *.pgd
78 | *.rsp
79 | *.sbr
80 | *.tlb
81 | *.tli
82 | *.tlh
83 | *.tmp
84 | *.tmp_proj
85 | *_wpftmp.csproj
86 | *.log
87 | *.vspscc
88 | *.vssscc
89 | .builds
90 | *.pidb
91 | *.svclog
92 | *.scc
93 |
94 | # Chutzpah Test files
95 | _Chutzpah*
96 |
97 | # Visual C++ cache files
98 | ipch/
99 | *.aps
100 | *.ncb
101 | *.opendb
102 | *.opensdf
103 | *.sdf
104 | *.cachefile
105 | *.VC.db
106 | *.VC.VC.opendb
107 |
108 | # Visual Studio profiler
109 | *.psess
110 | *.vsp
111 | *.vspx
112 | *.sap
113 |
114 | # Visual Studio Trace Files
115 | *.e2e
116 |
117 | # TFS 2012 Local Workspace
118 | $tf/
119 |
120 | # Guidance Automation Toolkit
121 | *.gpState
122 |
123 | # ReSharper is a .NET coding add-in
124 | _ReSharper*/
125 | *.[Rr]e[Ss]harper
126 | *.DotSettings.user
127 |
128 | # JustCode is a .NET coding add-in
129 | .JustCode
130 |
131 | # TeamCity is a build add-in
132 | _TeamCity*
133 |
134 | # DotCover is a Code Coverage Tool
135 | *.dotCover
136 |
137 | # AxoCover is a Code Coverage Tool
138 | .axoCover/*
139 | !.axoCover/settings.json
140 |
141 | # Visual Studio code coverage results
142 | *.coverage
143 | *.coveragexml
144 |
145 | # NCrunch
146 | _NCrunch_*
147 | .*crunch*.local.xml
148 | nCrunchTemp_*
149 |
150 | # MightyMoose
151 | *.mm.*
152 | AutoTest.Net/
153 |
154 | # Web workbench (sass)
155 | .sass-cache/
156 |
157 | # Installshield output folder
158 | [Ee]xpress/
159 |
160 | # DocProject is a documentation generator add-in
161 | DocProject/buildhelp/
162 | DocProject/Help/*.HxT
163 | DocProject/Help/*.HxC
164 | DocProject/Help/*.hhc
165 | DocProject/Help/*.hhk
166 | DocProject/Help/*.hhp
167 | DocProject/Help/Html2
168 | DocProject/Help/html
169 |
170 | # Click-Once directory
171 | publish/
172 |
173 | # Publish Web Output
174 | *.[Pp]ublish.xml
175 | *.azurePubxml
176 | # Note: Comment the next line if you want to checkin your web deploy settings,
177 | # but database connection strings (with potential passwords) will be unencrypted
178 | *.pubxml
179 | *.publishproj
180 |
181 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
182 | # checkin your Azure Web App publish settings, but sensitive information contained
183 | # in these scripts will be unencrypted
184 | PublishScripts/
185 |
186 | # NuGet Packages
187 | *.nupkg
188 | # The packages folder can be ignored because of Package Restore
189 | **/[Pp]ackages/*
190 | # except build/, which is used as an MSBuild target.
191 | !**/[Pp]ackages/build/
192 | # Uncomment if necessary however generally it will be regenerated when needed
193 | #!**/[Pp]ackages/repositories.config
194 | # NuGet v3's project.json files produces more ignorable files
195 | *.nuget.props
196 | *.nuget.targets
197 |
198 | # Microsoft Azure Build Output
199 | csx/
200 | *.build.csdef
201 |
202 | # Microsoft Azure Emulator
203 | ecf/
204 | rcf/
205 |
206 | # Windows Store app package directories and files
207 | AppPackages/
208 | BundleArtifacts/
209 | Package.StoreAssociation.xml
210 | _pkginfo.txt
211 | *.appx
212 | *.appxbundle
213 | *.appxupload
214 |
215 | # Visual Studio cache files
216 | # files ending in .cache can be ignored
217 | *.[Cc]ache
218 | # but keep track of directories ending in .cache
219 | !?*.[Cc]ache/
220 |
221 | # Others
222 | ClientBin/
223 | ~$*
224 | *~
225 | *.dbmdl
226 | *.dbproj.schemaview
227 | *.jfm
228 | *.pfx
229 | *.publishsettings
230 | orleans.codegen.cs
231 |
232 | # Including strong name files can present a security risk
233 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
234 | #*.snk
235 |
236 | # Since there are multiple workflows, uncomment next line to ignore bower_components
237 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
238 | #bower_components/
239 |
240 | # RIA/Silverlight projects
241 | Generated_Code/
242 |
243 | # Backup & report files from converting an old project file
244 | # to a newer Visual Studio version. Backup files are not needed,
245 | # because we have git ;-)
246 | _UpgradeReport_Files/
247 | Backup*/
248 | UpgradeLog*.XML
249 | UpgradeLog*.htm
250 | ServiceFabricBackup/
251 | *.rptproj.bak
252 |
253 | # SQL Server files
254 | *.mdf
255 | *.ldf
256 | *.ndf
257 |
258 | # Business Intelligence projects
259 | *.rdl.data
260 | *.bim.layout
261 | *.bim_*.settings
262 | *.rptproj.rsuser
263 | *- Backup*.rdl
264 |
265 | # Microsoft Fakes
266 | FakesAssemblies/
267 |
268 | # GhostDoc plugin setting file
269 | *.GhostDoc.xml
270 |
271 | # Node.js Tools for Visual Studio
272 | .ntvs_analysis.dat
273 | node_modules/
274 |
275 | # Visual Studio 6 build log
276 | *.plg
277 |
278 | # Visual Studio 6 workspace options file
279 | *.opt
280 |
281 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
282 | *.vbw
283 |
284 | # Visual Studio LightSwitch build output
285 | **/*.HTMLClient/GeneratedArtifacts
286 | **/*.DesktopClient/GeneratedArtifacts
287 | **/*.DesktopClient/ModelManifest.xml
288 | **/*.Server/GeneratedArtifacts
289 | **/*.Server/ModelManifest.xml
290 | _Pvt_Extensions
291 |
292 | # Paket dependency manager
293 | .paket/paket.exe
294 | paket-files/
295 |
296 | # FAKE - F# Make
297 | .fake/
298 |
299 | # CodeRush personal settings
300 | .cr/personal
301 |
302 | # Python Tools for Visual Studio (PTVS)
303 | __pycache__/
304 | *.pyc
305 |
306 | # Cake - Uncomment if you are using it
307 | # tools/**
308 | # !tools/packages.config
309 |
310 | # Tabs Studio
311 | *.tss
312 |
313 | # Telerik's JustMock configuration file
314 | *.jmconfig
315 |
316 | # BizTalk build output
317 | *.btp.cs
318 | *.btm.cs
319 | *.odx.cs
320 | *.xsd.cs
321 |
322 | # OpenCover UI analysis results
323 | OpenCover/
324 |
325 | # Azure Stream Analytics local run output
326 | ASALocalRun/
327 |
328 | # MSBuild Binary and Structured Log
329 | *.binlog
330 |
331 | # NVidia Nsight GPU debugger configuration file
332 | *.nvuser
333 |
334 | # MFractors (Xamarin productivity tool) working folder
335 | .mfractor/
336 |
337 | # Local History for Visual Studio
338 | .localhistory/
339 |
340 | # BeatPulse healthcheck temp database
341 | healthchecksdb
342 |
343 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
344 | MigrationBackup/
345 |
346 | ##
347 | ## Visual studio for Mac
348 | ##
349 |
350 |
351 | # globs
352 | Makefile.in
353 | *.userprefs
354 | *.usertasks
355 | config.make
356 | config.status
357 | aclocal.m4
358 | install-sh
359 | autom4te.cache/
360 | *.tar.gz
361 | tarballs/
362 | test-results/
363 |
364 | # Mac bundle stuff
365 | *.dmg
366 | *.app
367 |
368 | # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
369 | # General
370 | .DS_Store
371 | .AppleDouble
372 | .LSOverride
373 |
374 | # Icon must end with two \r
375 | Icon
376 |
377 |
378 | # Thumbnails
379 | ._*
380 |
381 | # Files that might appear in the root of a volume
382 | .DocumentRevisions-V100
383 | .fseventsd
384 | .Spotlight-V100
385 | .TemporaryItems
386 | .Trashes
387 | .VolumeIcon.icns
388 | .com.apple.timemachine.donotpresent
389 |
390 | # Directories potentially created on remote AFP share
391 | .AppleDB
392 | .AppleDesktop
393 | Network Trash Folder
394 | Temporary Items
395 | .apdisk
396 |
397 | # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
398 | # Windows thumbnail cache files
399 | Thumbs.db
400 | ehthumbs.db
401 | ehthumbs_vista.db
402 |
403 | # Dump file
404 | *.stackdump
405 |
406 | # Folder config file
407 | [Dd]esktop.ini
408 |
409 | # Recycle Bin used on file shares
410 | $RECYCLE.BIN/
411 |
412 | # Windows Installer files
413 | *.cab
414 | *.msi
415 | *.msix
416 | *.msm
417 | *.msp
418 |
419 | # Windows shortcuts
420 | *.lnk
421 |
422 | # JetBrains Rider
423 | .idea/
424 | *.sln.iml
425 |
426 | ##
427 | ## Visual Studio Code
428 | ##
429 | .vscode/*
430 | !.vscode/settings.json
431 | !.vscode/tasks.json
432 | !.vscode/launch.json
433 | !.vscode/extensions.json
434 |
--------------------------------------------------------------------------------