Today I Learn - 45


Golang with Docker Image

sudo apt install golang
高さバーを設定します.
mkdir go-hello && cd go-hello
ディレクトリを作成し、goファイルを生成し、viでコードを記述してHello Goを表示します.
hello.go
package main

import "fmt"
func main() {
  fmt.Println("Hello Go!")
}
go run hello.go
エンコードされたファイル表示を実行します.
go build -o hello hello.go 
エンコードされたファイルを生成します.
Dockerfile
FROM scratch
COPY hello /hello
CMD ["/hello"]
docker build -t gohello .
docker run gohello
DOKERファイルを作成し、高符号化ファイルを実行する画像を生成します.

Multi Stage Docker Build

FROM golang
ADD main.go /root
WORKDIR /root
RUN go build -o /root/mainAPP /root/main.go

#FROM alpine:latest
FROM scratch
WORKDIR /root
COPY --from=0 /root/mainApp .
CMD ["./mainApp"]
  • C言語静的構築--マルチステージ-->画像の作成
  • FROM gcc
    WORKDIR /usr/local/src
    ADD hello.c .
    RUN gcc hello.c --static -o hello
    
    FROM scratch
    COPY --from=0 /usr/local/src/hello /hello
    CMD ["./hello"]
  • Go言語---マルチステージ-->画像の作成
  • FROM golang as gobuilder
    WORKDIR /go/src
    ADD hello.go .
    RUN go build -o hello hello.go
    
    FROM scratch
    COPY --from=gobuilder /go/src/hello /hello
    CMD ["./hello"]

    Go with Web

    package main
    
    import (
    	"fmt"
    	"net/http"
    )
    
    func main() {
    	http.HandleFunc("/", HelloServer)
    	http.ListenAndServe(":3000", nil)
    }
    
    func HelloServer(w http.ResponseWriter, r *http.Request) {
    	fmt.Fprintf(w, "Hello world\n")
    }
    FROM golang as gobuilder
    ENV CGO_ENABLED 0
    WORKDIR /go/src
    ADD web.go .
    RUN go build -o web web.go
    
    FROM scratch
    COPY --from=gobuilder /go/src/web /web
    CMD ["./web"]
    EXPOSE 3000

    .dockerignore


    https://docs.docker.com/engine/reference/builder/#dockerignore-file
    ADDまたはCOPYの指定時に除外するファイル
  • ログ
  • 機密認証/情報ファイル
  • パッケージ
  • mkdir logs
    touch logs/web.log
    touch logs/err.log
    mkdir temp
    touch temp/abc.txt temp/xyz.txt
    touch hello.go
    touch a b c
    Dockerfile
    FROM ubuntu:focal
    RUN mkdir /source
    WORKDIR /source
    ADD . .
    .dockerignore
    Dockerfile
    logs/
    temp/
    *.go
    docker build --no-cache -t ignore .
    docker run -it ignore bash
    > ls -a

    Docker Client with Mac

    wget https://download.docker.com/mac/static/stable/x86_64/docker-20.10.6.tgz
    tar xf docker-20.10.6.tgz
    sudo cp docker/docker /usr/local/bin

    Docker Client and Remote Daemon with Windows

    choco install docker-cli
    systemctl status docker
    cat /etc/systemd/system/multi-user.target.wants/docker.service
    Docker Client --> Socket File --> Docker Daemon
    /run/containerd/containerd.sock
    /var/run/docker.sock
    sudo vi /etc/systemd/system/multi-user.target.wants/docker.service
    13: ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    >>
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    systemctl status docker -l
    Windowsで...
    docker -H tcp://192.168.100.10:2375 ps
    setx DOCKER_HOST "tcp://192.168.100.10:2375"
    docker ps

    Docker Compose


    Docker Compose Install


    https://docs.docker.com/compose/install/#install-compose-on-linux-systems
    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose

    Docker Compose with Wordpress

    mkdir wp-compose && cd wp-compose
    https://hub.docker.com/_/wordpress
    vi docker-compose.yml
    version: '3.1'
    
    services: # docker run
      wordpress:
        image: wordpress
        restart: always
        ports: # -p
          - 80:80
        environment: # -e
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wpadmin
          WORDPRESS_DB_PASSWORD: qwer1234
          WORDPRESS_DB_NAME: wp
        volumes: # -v
          - wordpress:/var/www/html
        networks: # --network
          - wp-net
    
      db:
        image: mysql:5.7
        restart: always
        environment:
          MYSQL_DATABASE: wp
          MYSQL_USER: wpadmin
          MYSQL_PASSWORD: qwer1234
          MYSQL_ROOT_PASSWORD: qwer1234
        volumes:
          - db:/var/lib/mysql
        networks:
          - wp-net
    
    volumes: # docker volume create
      wordpress: # docker volume create wordpress
      db:		 # docker volume create db
      
    networks: # docker network create
      wp-net: # docker network create wp-net
    docker-compose up -d
    docker-compose ps
    docker ps
    docker volume ls
    docker network ls
    docker-compose down

    Docker Compose with Dockerfile Image Build

    mkdir ~/go-web-compose
    web.go
    package main
    
    import (
            "fmt"
            "net/http"
    )
    
    func main() {
            http.HandleFunc("/", HelloServer)
            http.ListenAndServe(":3000", nil)
    }
    
    func HelloServer(w http.ResponseWriter, r *http.Request) {
            fmt.Fprintf(w, "Hello world\n")
    }
    Dockerfile
    FROM golang as gobuilder
    ENV CGO_ENABLED 0
    WORKDIR /go/src
    ADD web.go .
    RUN go build -o web web.go
    
    FROM scratch
    COPY --from=gobuilder /go/src/web /web
    CMD ["./web"]
    EXPOSE 3000
    docker-compose.yml
    version: '3.1'
    
    services:
      goweb:
        build: .
        ports:
          - 80:3000
    docker-compose up -d
    docker-compose ps
    docker ps
    docker-compose down

    Docker Compose Scaling

    mkdir compose-scaling
    cd compose-scaling
    docker-compose.yml
    version: '3.1'
    
    services:
      web:
        image: httpd
    docker-compose up -d
    docker-compose ps
    docker-compose scale web=10
    docker-compose ps
    docker ps	
    docker-compose down