Rumah > pembangunan bahagian belakang > Golang > Hands On Docker Untuk Pemula Golang Dev

Hands On Docker Untuk Pemula Golang Dev

Susan Sarandon
Lepaskan: 2024-11-04 05:36:29
asal
938 orang telah melayarinya

Jadual Kandungan

  1. Ikhtisar
  2. Prasyarat
  3. Fail Docker
  4. Karang Docker
    • Nginx
    • Mysql
    • Berhijrah
    • API
    • Tersuai
  5. Rujukan

Gambaran keseluruhan

Artikel ini tidak akan menerangkan cara Docker berfungsi pada hud, sebaliknya Artikel ini akan menerangkan tujuan pada setiap kod yang ditulis pada fail Dockerfile dan docker-compose.yml supaya kami boleh menulis konfigurasi Docker kami untuk projek lain.

Prasyarat

Kami memerlukan beberapa projek dengan Dockerfile dan docker-compose sebagai contoh, di sini kami akan menggunakan Projek Golang bernama Ecom sebagai contoh. Untuk menggunakan Dockerfile anda perlu menyediakan Pangkalan Data Tempatan seperti yang dinyatakan pada README.


Dockerfile

Fail Docker digunakan untuk mencipta imej bekas.(6)

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

    COPY go.mod go.sum ./
    RUN go mod download

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • DARI golang:1.23.0 SEBAGAI peringkat binaan ini ialah Imej untuk Apl kami, ia sama seperti kami memuat turun enjin Go ke Mesin kami, Docker memerlukan Imej khusus untuk menjalankan Kod kami.(1)(2)

  • WORKDIR /app ini ialah direktori kerja yang kami mahu Kod kami dilaksanakan di /app.

  • SALIN go.mod go.sum ./ kod ini akan menyalin fail go.mod dan go.sum daripada mesin tempatan ke direktori ./ pada Docker.

  • RUN go mod muat turun ini akan melaksanakan arahan go mod muat turun pada Docker

  • SALINAN . . kod ini akan menyalin semua projek fail dan folder daripada mesin tempatan ke Docker.

  • RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go kod ini akan melaksanakan arahan untuk membina aplikasi Golang pada OS linux ke folder /api pada Docker.

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • DARI awal SEBAGAI gores peringkat binaan realease digunakan untuk mencipta imej minimum yang mengandungi hanya perkara yang diperlukan oleh aplikasi.

  • WORKDIR / kami akan menggunakan root / sebagai direktori kerja.

  • SALINAN --from=build-stage /api /api ini akan menyalin direktori /api daripada imej build-stage ke /api pada build-realease-stage.

  • DEDAHKAN 8080 ini akan mendedahkan port 8080 supaya kami boleh mengakses API dengan port 8080 di luar Docker.

  • ENTRYPOINT [ "/api" ] ini akan menetapkan lalai boleh laku pada /api

Mari cuba fail Docker kami.

sudo docker build .
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

bina buruh pelabuhan untuk membina projek kami menjadi Imej. Anda boleh menambah tag -t project-ecom untuk mengenal pasti Imej yang anda bina dengan lebih mudah.(3)

Hands On Docker For Beginners Golang Dev

Anda boleh menyemak senarai Imej dengan arahan sudo docker image ls

Hands On Docker For Beginners Golang Dev

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

    COPY go.mod go.sum ./
    RUN go mod download

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kemudian Jalankan Imej Docker kami
--rm untuk mengeluarkan bekas apabila dihentikan
--hos rangkaian untuk menyambungkan aplikasi docker ke mesin localhost (4),(5)
--env-file .env untuk mengakses nilai persekitaran melalui fail .env
ID imej docker 98bc0128576e

Hands On Docker For Beginners Golang Dev

tahniah

Anda kini boleh menguji Menggunakan API dengan Posmen atau apl lain.

Hands On Docker For Beginners Golang Dev


Karang Docker

Docker Compose digunakan untuk membuat berbilang perkhidmatan kontena dan menjalankannya di dalam Docker. Dalam projek docker-compose.yml ini terdapat 4 perkhidmatan yang akan kami terangkan.

Proksi Nginx

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

    COPY go.mod go.sum ./
    RUN go mod download

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • nginx: ini ialah nama perkhidmatan
  • imej: nginxproxy/nginx-proxy:1.6 ini ialah Imej yang akan kami gunakan, serupa dengan FROM di Dockerfile.
  • rangkaian: ini ialah rangkaian di dalam Docker yang akan digunakan oleh perkhidmatan.
  • port: ini adalah untuk menetapkan port untuk perkhidmatan untuk menggunakan : , 80 ialah port lalai untuk HTTP
  • jilid: ini adalah Jilid berterusan untuk menyimpan data untuk perkhidmatan ini, : :ro (baca sahaja).
  • persekitaran: ini adalah untuk menggunakan pembolehubah persekitaran.(8)

Mysql

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • db: ini ialah nama perkhidmatan
  • imej: mysql:8.0 perkhidmatan ini menggunakan Imej mysql versi 8.0
  • rangkaian: perkhidmatan ini menggunakan rangkaian tersuai dinamakan baharu kemudian rangkaian baharu menggunakan pangkalan data nama alias
  • healthcheck: ini adalah untuk menyemak operasi perkhidmatan dengan menjalankan ujian, ujian: mysqladmin ping -h pangkalan data -u ${DB_USER} --password=${DB_PASSWORD} ujian ini ping pangkalan data mysql.
  • jilid: ini adalah untuk menyimpan data berterusan di dalam volum.
  • port: ini adalah port yang akan digunakan oleh perkhidmatan, dalam perkhidmatan ini kami menggunakan 3308 sebagai port mesin tempatan kerana port 3306 sudah digunakan untuk mysql pada mesin tempatan kami.
  • persekitaran: ini adalah untuk menggunakan pembolehubah persekitaran, dalam perkhidmatan mysql ini kita memerlukan kata laluan akar dan nama pangkalan data.(7)

Berhijrah

sudo docker build .
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • migrate-up: ini ialah nama perkhidmatan
  • imej: pindahkan/pindah perkhidmatan ini gunakan pindahkan Imej
  • rangkaian: perkhidmatan ini menggunakan rangkaian baru sama seperti perkhidmatan db
  • jilid: data migrasi daripada ./cmd/migrate/migration setempat telah disalin ke direktori perkhidmatan /migrasi
  • arahan: ini adalah untuk menjalankan arahan pada perkhidmatan ini, ["-path", "/migrations", "-database", "${CONNECT_DB}", "-verbose", "up"] arahan ini serupa dengan migrate -path /migrations -database mysql://root:some-secret-password@tcp(database:3306)/ecom -verbose up. (9)
  • pautan: ini untuk memautkan perkhidmatan kepada perkhidmatan lain, perkhidmatan pindah ini dipautkan kepada perkhidmatan db
  • depends_on: ini untuk membuat perkhidmatan ini dilaksanakan selepas syarat tertentu, db: condition: service_healthy min perkhidmatan pindah ini akan dilaksanakan apabila ujian perkhidmatan db mendapat keputusan service_healthy.

API

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

    COPY go.mod go.sum ./
    RUN go mod download

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • api: ini ialah nama perkhidmatan
  • rangkaian: ini adalah rangkaian untuk perkhidmatan ini, perkhidmatan ini menggunakan rangkaian baharu supaya ia boleh menyambung ke perkhidmatan db, juga menyambung ke lalai rangkaian yang digunakan oleh perkhidmatan nginx.
  • bina: ini adalah untuk membina perkhidmatan, perkhidmatan ini menggunakan Dockerfile.
  • mulakan semula: perkhidmatan ini akan dimulakan semula apabila perkhidmatan gagal
  • jilid: ini ialah data berterusan yang disimpan pada volum /go/src/api.
  • ports: port untuk perkhidmatan ini.
  • persekitaran: nilai persekitaran perkhidmatan ini diperlukan.
  • pautan: perkhidmatan ini dipautkan kepada perkhidmatan db kerana ia perlu menggunakan pangkalan data mysql.
  • depende_on: perkhidmatan ini akan dilaksanakan pada beberapa syarat, apabila berpindah: sudah service_completed_successfully, apabila keputusan ujian db adalah service_healthy, dan apabila nginx service_started

Adat

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • jilid: volum tersuai yang dibuat ini dinamakan db_data:
  • rangkaian: ini mencipta rangkaian tersuai yang dinamakan baharu

Jom cuba Docker Compose kami

sudo docker build .
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Arahan ini akan mencipta imej untuk setiap perkhidmatan dan menjalankan setiap bekas.

Hands On Docker For Beginners Golang Dev


sudo docker run --rm --network host --env-file .env 98bc0128576e
Salin selepas log masuk

Anda boleh menyemak bekas docker-compose.yml kami yang dibuat.

Hands On Docker For Beginners Golang Dev


  nginx:
    image: nginxproxy/nginx-proxy:1.6
    networks:
      - default
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      HTTPS_METHOD: nohttps
Salin selepas log masuk

Anda boleh menyemak kelantangan docker-compose.yml kami yang dibuat.

Hands On Docker For Beginners Golang Dev


  db:
    image: mysql:8.0
    networks:
      new:
        aliases:
          - database
    healthcheck:
      test: mysqladmin ping -h database -u ${DB_USER} --password=${DB_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3308:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
Salin selepas log masuk

Anda boleh menyemak imej docker-compose.yml kami yang dibuat.

Hands On Docker For Beginners Golang Dev


tahniah

Anda boleh menguji Consume API daripada projek kami berdasarkan dokumentasi pada README dengan Posman atau apl lain.

jika anda telah melakukannya, anda boleh menghentikan bekas dengan,

  migrate-up:
    image: migrate/migrate
    networks:
      - new
    volumes:
      - ./cmd/migrate/migrations:/migrations
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    command: ["-path", "/migrations", "-database", "${CONNECT_DB}", "-verbose", "up"]
    links:
      - db
    depends_on:
      db:
        condition: service_healthy
Salin selepas log masuk

Hands On Docker For Beginners Golang Dev

Atau jika anda mahu memadamkan semua perkhidmatan kontena di dalam karang buruh pelabuhan, anda boleh jalankan,

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

    COPY go.mod go.sum ./
    RUN go mod download

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Hands On Docker For Beginners Golang Dev


Rujukan

(1)Rujukan Fail Docker
(2)Imej Pangkalan Docker
(3) Binaan Docker
(4)Tutorial Rangkaian Docker
(5)Pemacu Rangkaian Docker
(6)Menulis Fail Docker
(7)Docker Hub Mysql
(8)Dokumen Proksi Nginx
(9)Golang Berhijrah

Atas ialah kandungan terperinci Hands On Docker Untuk Pemula Golang Dev. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan