mirror of
https://github.com/batonogov/learn-devops.git
synced 2025-11-29 00:33:02 +00:00
Update docker readme (#17)
Co-authored-by: Fedor Batonogov <f.batonogov@yandex.ru>
This commit is contained in:
committed by
GitHub
parent
52a3d0eb3b
commit
d6db5a4e6a
@@ -1,5 +1,5 @@
|
|||||||
# Используем официальный образ Golang
|
# Используем официальный образ Golang
|
||||||
FROM golang:1.22.5-alpine AS builder
|
FROM golang:1.23.2-alpine AS builder
|
||||||
# Устанавливаем рабочую директорию
|
# Устанавливаем рабочую директорию
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
# Копируем исходный код приложения в контейнер
|
# Копируем исходный код приложения в контейнер
|
||||||
@@ -8,7 +8,7 @@ COPY ./ ./
|
|||||||
RUN CGO_ENABLED=0 go build main.go
|
RUN CGO_ENABLED=0 go build main.go
|
||||||
|
|
||||||
# Отдельный этап сборки для уменьшения размера образа
|
# Отдельный этап сборки для уменьшения размера образа
|
||||||
FROM alpine:3.20.1 AS runner
|
FROM alpine:3.20.3 AS runner
|
||||||
# Определяем аргумент для имени пользователя
|
# Определяем аргумент для имени пользователя
|
||||||
ARG USERNAME=appuser
|
ARG USERNAME=appuser
|
||||||
ARG GROUPNAME=appgroup
|
ARG GROUPNAME=appgroup
|
||||||
|
|||||||
@@ -26,10 +26,22 @@ go build main.go
|
|||||||
Сервер запущен на порту 8080...
|
Сервер запущен на порту 8080...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Проверка
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
Вывод
|
||||||
|
|
||||||
|
```output
|
||||||
|
Имя узла: MacBook-Pro-Fedor.local
|
||||||
|
```
|
||||||
|
|
||||||
### Запуск в контейнере
|
### Запуск в контейнере
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker build -t test . && docker run test
|
docker build -t test . && docker run --hostname my_container --publish 8080:8080 test
|
||||||
```
|
```
|
||||||
|
|
||||||
Вывод
|
Вывод
|
||||||
@@ -38,24 +50,61 @@ docker build -t test . && docker run test
|
|||||||
Сервер запущен на порту 8080...
|
Сервер запущен на порту 8080...
|
||||||
```
|
```
|
||||||
|
|
||||||
### Запуск при помощи docker compose
|
Проверка
|
||||||
|
|
||||||
Запуск
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker compose --profile blue up --wait --remove-orphans --scale web-blue=5
|
curl localhost:8080
|
||||||
```
|
```
|
||||||
|
|
||||||
Вывод
|
Вывод
|
||||||
|
|
||||||
```output
|
```output
|
||||||
✔ Network docker_default Created 0.0s
|
Имя узла: my_container
|
||||||
✔ Container docker-nginx-proxy-1 Healthy 0.1s
|
```
|
||||||
✔ Container docker-web-blue-2 Healthy 0.1s
|
|
||||||
✔ Container docker-web-blue-4 Healthy 0.1s
|
### Запуск при помощи docker compose
|
||||||
✔ Container docker-web-blue-3 Healthy 0.0s
|
|
||||||
✔ Container docker-web-blue-5 Healthy 0.1s
|
Запуск
|
||||||
✔ Container docker-web-blue-1 Healthy 0.1s
|
|
||||||
|
```sh
|
||||||
|
docker compose --profile blue up --wait --remove-orphans --scale web-blue=3
|
||||||
|
```
|
||||||
|
|
||||||
|
Вывод
|
||||||
|
|
||||||
|
```output
|
||||||
|
✔ Network docker_default Created
|
||||||
|
✔ Container docker-web-blue-1 Healthy
|
||||||
|
✔ Container docker-nginx-proxy-1 Healthy
|
||||||
|
✔ Container docker-web-blue-3 Healthy
|
||||||
|
✔ Container docker-web-blue-2 Healthy
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка
|
||||||
|
|
||||||
|
Поскольку запущено несколько реплик сервиса, то при повторной проверке мы можем увидеть разное имена узлов
|
||||||
|
|
||||||
|
```sh
|
||||||
|
declare -A responses
|
||||||
|
count=0
|
||||||
|
|
||||||
|
while [ ${#responses[@]} -lt 3 ]; do
|
||||||
|
response=$(curl -s localhost:8080)
|
||||||
|
|
||||||
|
if [[ -z "${responses[$response]}" ]]; then
|
||||||
|
responses["$response"]=1
|
||||||
|
count=$((count + 1))
|
||||||
|
echo "Уникальный ответ $count: $response"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
Вывод
|
||||||
|
|
||||||
|
```output
|
||||||
|
Уникальный ответ 1: Имя узла: eeec60605b3c
|
||||||
|
Уникальный ответ 2: Имя узла: 1a0e8d8f0d64
|
||||||
|
Уникальный ответ 3: Имя узла: d5822762eab6
|
||||||
```
|
```
|
||||||
|
|
||||||
### Сине-зеленое развертывание
|
### Сине-зеленое развертывание
|
||||||
@@ -71,12 +120,14 @@ bash ./deploy.sh
|
|||||||
```output
|
```output
|
||||||
Список контейнеров
|
Список контейнеров
|
||||||
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
|
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
|
||||||
docker-nginx-proxy-1 nginxproxy/nginx-proxy:1.5.2-alpine "/app/docker-entrypo…" nginx-proxy 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:80->80/tcp
|
docker-nginx-proxy-1 nginxproxy/nginx-proxy:1.6.2-alpine "/app/docker-entrypo…" nginx-proxy 22 seconds ago Up 22 seconds (healthy) 0.0.0.0:80->80/tcp
|
||||||
docker-web-blue-1 docker-web-blue "./main" web-blue 7 seconds ago Up 6 seconds (healthy) 8080/tcp
|
docker-web-green-1 docker-web-green "./main" web-green 6 seconds ago Up 6 seconds (healthy) 8080/tcp
|
||||||
docker-web-blue-2 docker-web-blue "./main" web-blue 7 seconds ago Up 6 seconds (healthy) 8080/tcp
|
docker-web-green-2 docker-web-green "./main" web-green 6 seconds ago Up 6 seconds (healthy) 8080/tcp
|
||||||
docker-web-blue-3 docker-web-blue "./main" web-blue 7 seconds ago Up 6 seconds (healthy) 8080/tcp
|
docker-web-green-3 docker-web-green "./main" web-green 6 seconds ago Up 6 seconds (healthy) 8080/tcp
|
||||||
Журналы запуска web-blue
|
Журналы запуска web-green
|
||||||
web-blue-1 | Сервер запущен на порту 8080...
|
web-green-3 | Сервер запущен на порту 8080...
|
||||||
web-blue-3 | Сервер запущен на порту 8080...
|
web-green-2 | Сервер запущен на порту 8080...
|
||||||
web-blue-2 | Сервер запущен на порту 8080...
|
web-green-1 | Сервер запущен на порту 8080...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
[Проверка](README.md#L83)
|
||||||
|
|||||||
@@ -25,11 +25,9 @@ services:
|
|||||||
|
|
||||||
# NGINX-прокси
|
# NGINX-прокси
|
||||||
nginx-proxy:
|
nginx-proxy:
|
||||||
image: nginxproxy/nginx-proxy:1.6.0-alpine
|
image: nginxproxy/nginx-proxy:1.6.2-alpine
|
||||||
expose:
|
|
||||||
- 80
|
|
||||||
ports:
|
ports:
|
||||||
- 80:80 # Проксируем порт 80 на хосте
|
- 8080:8080 # Проксируем порт 8080 на хосте
|
||||||
healthcheck:
|
healthcheck:
|
||||||
# Периодичность проверки состояния (5 секунд)
|
# Периодичность проверки состояния (5 секунд)
|
||||||
interval: 5s
|
interval: 5s
|
||||||
@@ -40,7 +38,7 @@ services:
|
|||||||
# Время ожидания перед началом проверок (3 секунды)
|
# Время ожидания перед началом проверок (3 секунды)
|
||||||
start_period: 3s
|
start_period: 3s
|
||||||
# Команда для выполнения теста
|
# Команда для выполнения теста
|
||||||
test: curl -f http://localhost/ || exit 1
|
test: curl -f http://localhost:8080/ || exit 1
|
||||||
volumes:
|
volumes:
|
||||||
# Монтируем сокет Docker
|
# Монтируем сокет Docker
|
||||||
- /var/run/docker.sock:/tmp/docker.sock:ro
|
- /var/run/docker.sock:/tmp/docker.sock:ro
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Отправляем имя хоста в ответ
|
// Отправляем имя хоста в ответ
|
||||||
fmt.Fprintf(w, "Hostname Hostname: %s\n", hostname)
|
fmt.Fprintf(w, "Имя узла: %s\n", hostname)
|
||||||
})
|
})
|
||||||
|
|
||||||
// Запуск веб-сервера на порту 8080
|
// Запуск веб-сервера на порту 8080
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ upstream {{ $host }} {
|
|||||||
|
|
||||||
# конфигурация веб-сервера
|
# конфигурация веб-сервера
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 8080;
|
||||||
|
|
||||||
|
server_tokens off;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
proxy_pass http://{{ $host }};
|
proxy_pass http://{{ $host }};
|
||||||
|
|||||||
Reference in New Issue
Block a user