Start z kontenerami Docker dla .NET, GO, Python, Java Spring i NodeJs i gdzie w tym Kubernetes

Cezary Walenciuk

Start z kontenerami Docker dla
.NET, GO, Python, Java Spring i NodeJs i gdzie w tym Kubernetes

@walenciukC

Speaker
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © Cezary Walenciuk
blog
Copyright © 2020 Cezary Walenciuk
blog
Copyright © 2020 Cezary Walenciuk
blog
Copyright © 2020 Cezary Walenciuk
blog
Copyright © 2020 Cezary Walenciuk

Jak to wygląda ? Jeśli mówimy tylko o Docker

Docker tworzy obraz
Uruchomiony obraz to kontener
Co to oznacza, że aplikacja jest skonteneryzowana
Zamiast gadać to lepiej to pokazać
Zbudujmy coś
Zbudujmy statyczną stronę na serwerze Apache
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Dockerfile file dla statycznych plików

                    
                        FROM httpd:2.4

                        COPY ./index.html /usr/local/apache2/htdocs/index.html
                        COPY ./bakcground.jpg /usr/local/apache2/htdocs/bakcground.jpg
                        COPY ./wordart.png /usr/local/apache2/htdocs/wordart.png
                    
                

Dockerfile file dla statycznych plików

                    
                        FROM httpd:2.4

                        COPY ./* /usr/local/apache2/htdocs/
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Swoją drogą używanie Dockera/Kubernetesa do statycznych plików to idiotyzm

Co konteryzować?

Co nie konteryzować?

Problemy z budowaniem obrazu ?
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Po co są tagi ?
blog
Copyright © 2020 Diagram
Czy mogę wybrać inny port?
blog
Copyright © 2020 Diagram
Zbudujmy aplikację Go
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

go.mod

                    
                        module helloapp

                        go 1.15
                    
                

main.go

                    
                        package main 

                        import (
                            "fmt"
                            "log"
                            "net/http"
                        )
                        
                        func handler(w http.ResponseWriter, r *http.Request) {
                        
                            fmt.Fprintln(w, "Cześć");
                        }
                        
                        func main() {
                            http.HandleFunc("/",handler)
                            fmt.Println("server started")
                            log.Fatal(http.ListenAndServe(":8090", nil))
                        }
                    
                

Dockerfile

                    
                        FROM golang:latest

                        #ustawia pracujący folder
                        WORKDIR /helloApp
                        
                        #kopiuje to pliki na kontener
                        ADD . .
                        
                        #budujemy aplikacje
                        RUN go build -o main .
                        
                        EXPOSE 8090
                        
                        CMD ["/helloApp/main"]
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Argumenty

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Co można zrobić lepiej?

Co można zrobić lepiej?

Dockerfile fixed

                    
                        FROM golang:1.13-alpine AS build

                        #ustawia pracujący folder
                        WORKDIR /src
                        
                        COPY main*.go go.* ./
                        
                        #budujemy aplikacje
                        RUN CGO_ENABLED=0 go build -o /bin/example2_2
                        
                        FROM scratch
                        COPY --from=build /bin/example2_2 /bin/example2_2
                        
                        EXPOSE 8090
                        
                        CMD ["/bin/example2_2"]
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zbudujmy obraz .NET Core 3.1
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Program.cs

                    

                        class Program
                        {
                            static async Task Main(string[] args)
                            {
                                var counter = 0;
                                var max = args.Length != 0 
                                ? Convert.ToInt32(args[0]) : -1;

                                while (max == -1 || counter < max)
                                {
                                    
                                    Console.WriteLine($"Counter: {++counter}");
                                    await Task.Delay(1000);
                                }
                            }
                        }
                    
                

Byle jaki Docker file dla .NET Core 3.1

                    
                        FROM mcr.microsoft.com/dotnet/aspnet:3.1
                        
                        COPY bin/Release/netcoreapp3.1/publish/ App/
                        WORKDIR /App
                        ENTRYPOINT ["dotnet", "NetCore.DockerTest.dll"]
                    
                

Ten docker file zakłada

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zobaczmy jak zrobić dobry docker file dla .NET Core
Przykład .NET na tym GitHub
https://github.com/dotnet/dotnet-docker
blog
Copyright © 2020 Diagram

Dobry Docker file dla ASP.NET CORE for .Net 5

                    

                        # https://hub.docker.com/_/microsoft-dotnet
                        FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
                        WORKDIR /source
                        
                        # copy csproj and restore as distinct layers
                        COPY *.sln .
                        COPY aspnetapp/*.csproj ./aspnetapp/
                        RUN dotnet restore
                        
                        # copy everything else and build app
                        COPY aspnetapp/. ./aspnetapp/
                        WORKDIR /source/aspnetapp
                        RUN dotnet publish -c release -o /app --no-restore
                        
                        # final stage/image
                        FROM mcr.microsoft.com/dotnet/aspnet:5.0
                        WORKDIR /app
                        COPY --from=build /app ./
                        ENTRYPOINT ["dotnet", "aspnetapp.dll"]
                    
                

blog
Copyright © 2020 Diagram

Docker file dla kilku aplikacji w projekcie

                    
                        # https://hub.docker.com/_/microsoft-dotnet
                        FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
                        WORKDIR /source
                        
                        # copy csproj and restore as distinct layers
                        COPY complexapp/*.csproj complexapp/
                        COPY libfoo/*.csproj libfoo/
                        COPY libbar/*.csproj libbar/
                        RUN dotnet restore complexapp/complexapp.csproj
                        
                        # copy and build app and libraries
                        COPY complexapp/ complexapp/
                        COPY libfoo/ libfoo/
                        COPY libbar/ libbar/
                        WORKDIR /source/complexapp
                        RUN dotnet build -c release --no-restore
                        
                        # test stage -- exposes optional entrypoint
                        # target entrypoint with: docker build --target test
                        FROM build AS test
                        WORKDIR /source/tests
                        COPY tests/ .
                        ENTRYPOINT ["dotnet", "test", "--logger:trx"]
                        
                        FROM build AS publish
                        RUN dotnet publish -c release --no-build -o /app
                        
                        # final stage/image
                        FROM mcr.microsoft.com/dotnet/runtime:5.0
                        WORKDIR /app
                        COPY --from=publish /app .
                        ENTRYPOINT ["dotnet", "complexapp.dll"]
                    
                

Zbudujmy obraz Java Spring
..ale zaraz ja nie znam Javy xD
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

DemoApplication.java

                    
                        package com.example.demo;

                        import org.springframework.boot.SpringApplication;
                        import org.springframework.boot.autoconfigure.SpringBootApplication;
                        
                        @SpringBootApplication
                        public class DemoApplication {
                        
                            public static void main(String[] args) {
                                SpringApplication.run(DemoApplication.class, args);
                            }
                        
                        }
                        
                    
                

HelloController.java

                    
                        package com.example.demo;

                        import org.springframework.web.bind.annotation.RestController;
                        import org.springframework.web.bind.annotation.RequestMapping;
                        
                        @RestController
                        public class HelloController {
                        
                            @RequestMapping("/")
                            public String index() {
                                return "Pozdrowienia z Spring Boot!";
                            }
                        
                        }
                    
                

Docker file for Java Spring

                    
                        #pierwszy etap budowania aplikacji użyje obrazu rodzica maven 3.6.1
                        FROM maven:3.6.1-jdk-8-alpine AS MAVEN_BUILD 

                        # kopiowanie pom i src do kontenera
                        COPY ./ ./  

                        # pakowanie kodu naszej aplikacji
                        RUN mvn clean package 

                        #drugi etap budowania aplikacji używając jdk 8 na alpine 3.9
                        FROM openjdk:8-jre-alpine3.9 

                        # skopiuj tylko to co potrzebujemy z pierwszego etapu, a wszystko inne odrzuć
                        COPY --from=MAVEN_BUILD /target/demo-0.0.1-SNAPSHOT.jar /demo.jar 

                        # ustaw polecenie startowe aby uruchomić JAR
                        CMD ["java", "-jar", "/demo.jar"]
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zbudujmy obraz Python
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Docker file for Python

                    
                        FROM python:3

                        ADD my_script.py /
                        
                        RUN pip install pystrich
                        
                        CMD [ "python", "./my_script.py" ]
                    
                

myscript.py

                    
                        from pystrich.datamatrix import DataMatrixEncoder

                        encoder = DataMatrixEncoder('This is a DataMatrix.')
                        encoder.save('./datamatrix_test.png')
                        print(encoder.get_ascii())
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Przykład dobrego dockerfile na podstawie NodeJS
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
1 . Kolejność instrukcji czyli co warto wsadzić w cache
blog
Copyright © 2020 Diagram
2 . Bardziej specyficzne kopiowanie
blog
Copyright © 2020 Diagram
3 . Łączenie poleceń
blog
Copyright © 2020 Diagram
4 . Usuń zbędne rzeczy
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
5. Ustal konkretną wersje obrazu i wbierz najmniejszą
blog
Copyright © 2020 Diagram

Podsumowanie Docker

Podsumowanie Docker

Pogadajmy o Kubernetes