Быстро создайте среду разработки Go с помощью Docker за пять минут

Go
Быстро создайте среду разработки Go с помощью Docker за пять минут

Я написал статью некоторое время назадDockerСтатьи по построению среды разработки LNMP:Создайте среду разработки Laravel с помощью Docker, в котором подробно описываетсяnginx,mysqlиphpНа три контейнераdocker-composeхореографияLNMPШаги среды разработки, как ее использовать сегодняDockerБыстрая сборкаGoСреда разработки языковых проектов.

потому чтоGoСама стандартная библиотека может обеспечить высокую производительностьHTTPСервер, его купили незнакомые студенты, ошибаюсь, ошибаюсь, посмотрите на него:Глубокое погружение в написание HTTP-серверов в Go. так что используйтеDockerПостроитьGoСреда разработки намного проще, чем сборка среды разработки LNMP.Если требований к настройке не слишком много, то даже писать не нужноDockerfileСоздайте зеркало самостоятельно и используйте официальное напрямуюgolangПросто зеркально отразите.

Получить образ Docker

Мы используем официальную последнюю стабильную версию зеркалаgolang:latest, Перед получением образа убедитесь, что у вас запущен компьютерDockerКлиент, если у вас его нет, перейдите на официальный сайт, чтобы скачать его, и я не буду здесь больше говорить.

скачатьdockerHubНа зеркале напрямую используйте команду:

docker pull golang

После загрузки образа запустите контейнер с образом:

docker run --rm -it --name go-http-demo golang bash

Приведенная выше команда использует зеркалированиеgolangсоздалgo-http-demoконтейнер, в котором создается контейнерBashсессия.--rmПараметр указывает на автоматическое удаление контейнера после его выхода.

После запуска вышеуказанной команды мы входим в работающий контейнер и запускаемgo versionПроверьте следующееgoверсия:

root@965425c5bdcf:/go# go version 
go version go1.13.6 linux/amd64
root@965425c5bdcf:/go# 

Вы можете в соответствии с вашими потребностями вhttps://hub.docker.com/_/golangНайдите нужную версиюgolangОбраз запускает контейнер.

Запуск проекта Go в контейнере

Мы используем"Глубокое погружение в написание HTTP-серверов в Go"Последняя поддержка изящного отключения сервисов, написанная наHTTPServer, вставь этоDockerКонтейнер обслуживает запросы от хоста.HTTP ServerИсходный код выглядит следующим образом.Если вы хотите изучить, как реализован код, просто прочитайте статью по ссылке.

package main

import (
	"context"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
)

func main() {
	mux := http.NewServeMux()
	mux.Handle("/", &helloHandler{})

	server := &http.Server{
		Addr:    ":8080",
		Handler: mux,
	}

	// 创建系统信号接收器
	done := make(chan os.Signal)
	signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
	go func() {
		<-done

		if err := server.Shutdown(context.Background()); err != nil {
			log.Fatal("Shutdown server:", err)
		}
	}()

	log.Println("Starting HTTP server...")
	err := server.ListenAndServe()
	if err != nil {
		if err == http.ErrServerClosed {
			log.Print("Server closed under request")
		} else {
			log.Fatal("Server closed unexpected")
		}
	}
}

type helloHandler struct{}

func (*helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello World")
}

Поместите исходный код на локальный компьютер/Code/go/src/example.com/http-demo/main.goВ каталоге файлов напишите путь в соответствии с вашей ситуацией, когда вы это делаете.

Следующий шаг — поместить этот код в контейнер для запуска, переключиться в каталог кода и выполнить следующую команду:

docker run --rm -it --name go-http-demo \
  -v $PWD:/go/src/example.com/go-http-demo \
  -p 8000:8080
  golang

-vопция позволяет нам монтировать несколько локальных каталогов или томов данных в контейнер, изменения будут синхронизированы друг с другом внутри и снаружи контейнера, приведенная выше команда будет/Code/go/src/example.com/go-http-demo/крепится к контейнеру/go/src/example.com/go-http-demo.

-pУкажите сопоставление портов хоста и контейнера, потому что кодHTTPслужба слушает8080порт, поэтому мы будем размещать8000порт и контейнер8080Порты отображаются.

После выполнения вышеуказанной команды переключаемся на контейнерBashСессия, переключитесь в каталог кода для запускаgo run main.goПосле этого откройте браузер на своем компьютере, чтобы посетитьhttp:localhost:8080Вид страницы на рисунке ниже доказывает, что сервер нормально работает в контейнере.

Управление контейнерами с помощью docker-compose

Через вышеуказанный контент мы использовалиDockerпостроилGoсреде разработки, но каждый раз, когда вы вводите эту кучу команд, вам нужно войти в контейнер для выполненияgoКоманда запуска программы слишком трудоемка, используемdocker-composeАвтоматизируйте эти процессы выше.

Создан в корневом каталоге кода проектаdocker-compose.yml:

version: '3'
services:
  app:
    image: golang:latest
    working_dir: /go/src/example.com/http_demo
    volumes:
      - /$GOPATH/src/example.com/http_demo:/go/src/example.com/http_demo
      - /$GOPATH/src:/go/src
    ports:
      - "8000:8080"
    environment:
      WORKING_DIR: /go/src/example.com/http_demo
    command: go run /go/src/example.com/http_demo/main.go

Если вы не разрешаете это в своем проекте, найдите каталог, в который можно поместить этот файл. У меня есть отдельный каталог с несколькими проектами.Dockerконфигурационный файл сPHPЕсть также проектыGoПроект.

Приведенный выше файл аранжировки определяет только один файл с именемappслужбы, и другие легко понять.Я не буду говорить об этом.Единственное, на что следует обратить внимание, это то, что еслиymlфайл вне проектаvolumesИзмените конфигурацию в нем на абсолютный путь и не используйте его.$PWDохватывать

Следующий стартdocker-compose:

docker-compose up -d

Если запуск не удался, не запускайтеdaemonработать в режиме-dУдалите его, вы можете увидеть конкретную ошибку, подождите, пока отладка пройдет нормально, а затем запустите ее в фоновом режиме.

После модификации кода нужно перекомпилировать проект и выполнить следующую команду для нашего контейнера

docker-compose restart

Чтобы войти в работающий контейнер для выполнения операции, используйте команду:

docker exec -it <container name> bash

создан для насappОтправитьgo testКоманда Пусть она выполняется внутри контейнера:

docker-compose exec app go test

Недавно я хочу попробовать заменить старый проект наgo modУправление, проект все еще используетсяgo1.12Поэтому я использую сначалаDockerМожно возиться со средой, в которой изолирован контейнер. Среда разработки, которую я сделал сегодня, по-прежнему очень проста и бесполезна.Dockerfileсоздать собственное зеркало,docker-composeНастройки в конфигурационном файле также очень просты, и я добавлю их позже, если они не просты в использовании. Следующие две старые статьи посвященыDockerЗеркальное отображениеdocker-composeОна более подробная, и примеров много, если интересно, можете глянуть.

Научу вас, как сделать желаемый образ PHPDocker

Создайте среду разработки Laravel с помощью Docker

Если вы столкнулись с какими-либо проблемами при сборке окружения самостоятельно, вы можете оставить сообщение здесь для обратной связи, или вы можете оставить сообщение для обратной связи в моем официальном аккаунте.