Извините, я не смог понять, что происходит на вашей стороне, потому что информация иногда сбивает с толку, а иногда и неполная.Но Stackoverflow предоставляет отличное объяснение того, что считается хорошим вопросом: Как создать минимальный, полный и проверяемый пример , и поэтому я только что попытался реализовать минимальный пример системы, которую вы, вероятно, собираетесь использоватьbuild.
Ниже я предоставляю все файлы и покажу вам также тестовый запуск.
Файл № 1: docker-compose.yml
gogs:
image: gogs/gogs
web:
build: .
ports:
- 8000:80
links:
- gogs
Я устарелDocker на моем компьютере, и я не хочу беспокоиться о работе с сетями Docker, поэтому я только что связал оба контейнера, используя Docker links .Это самая важная часть, и ссылка гарантирует, что (1) наш контейнер web
зависит от gogs
;(2) мы можем ссылаться на gogs
IP изнутри web
как на gogs
.Docker преобразует имя в IP-адрес, назначенный контейнеру.
Поскольку я хочу минимальный пример, я пропустил все остальное как не относящееся к делу.Например, volume
.
Файл # 2: Dockerfile
Более новые версии Compose поддерживают config
опции, указанные прямо в docker-compose.yml
, но вместо этого мне нужен пользовательский Dockerfile
,Это тривиально:
FROM nginx:stable-alpine
COPY gogs.conf /etc/nginx/conf.d
Файл № 3: gogs.conf
И, наконец, нам нужна конфигурация Nginx для прокси:
server {
listen 80 default_server;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://gogs:3000;
}
}
Вы можете заметить, что мы имеем в видудругой контейнер просто по имени gogs
, и нам нужно знать, какой номер порта он предоставляет.Мы знаем: 3000.
Работает
$ docker-compose build
$ docker-compose up
Он работает и работает:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f74293df630 g_web "nginx -g 'daemon off" 2 minutes ago Up 26 seconds 0.0.0.0:8000->80/tcp g_web_1
dfa2dbaa6074 gogs/gogs "/app/gogs/docker/sta" 2 minutes ago Up 26 seconds 22/tcp, 3000/tcp g_gogs_1
web
Контейнер открыт для всего мира с номером порта 8000.
Тесты
по IP
Давайте запросить его по IP:
$ curl -si http://192.168.99.100:8000/
HTTP/1.1 302 Found
Server: nginx/1.14.0
Date: Sun, 07 Oct 2018 15:13:55 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 31
Connection: keep-alive
Location: /install
Set-Cookie: lang=en-US; Path=/; Max-Age=2147483647
Set-Cookie: i_like_gogits=50411f542e2ae8f8; Path=/; HttpOnly
Set-Cookie: _csrf=ZJxRPqnqayIbpAYgZ22zrPIOaSo6MTUzODkyNTIzNTQ2NTg5MDE1NA%3D%3D; Path=/; Expires=Mon, 08 Oct 2018 15:13:55 GMT; HttpOnly
<a href="/install">Found</a>.
Соответствующий файл журнала:
web_1 | 192.168.99.1 - - [07/Oct/2018:15:14:24 +0000] "GET / HTTP/1.1" 302 31 "-" "curl/7.61.1" "-"
gogs_1 | [Macaron] 2018-10-07 15:14:24: Started GET / for 192.168.99.1
gogs_1 | [Macaron] 2018-10-07 15:14:24: Completed GET / 302 Found in 199.519µs
gogs_1 | 2018/10/07 15:14:24 [TRACE] Session ID: 38d06d393a9e9d21
gogs_1 | 2018/10/07 15:14:24 [TRACE] CSRF Token: Xth986dFWhhj8w8vBdIqRZu4SbI6MTUzODkyNTI2NDYxMDYzNzAyNA==
Могупосмотрите из журнала, что (1) оба контейнера работают, и они были использованы для обработки запроса;(2) 192.168.99.1 - это IP-адрес моего хоста, что означает, что "gogs" успешно получает реальный IP-запрос через X-Forwarded-For
.
по доменному имени
ОК, давайте запросим, используя доменимя:
$ curl -H 'Host: g.example.com' -si http://192.168.99.100:8000/
Поверь мне, этого достаточно.Host
- заголовок протокола HTTP для передачи имени домена.И любой браузер будет делать то же самое под капотом.
и соответствующий файл журнала будет -
gogs_1 | [Macaron] 2018-10-07 15:32:49: Started GET / for 192.168.99.1
gogs_1 | [Macaron] 2018-10-07 15:32:49: Completed GET / 302 Found in 618.701µs
gogs_1 | 2018/10/07 15:32:49 [TRACE] Session ID: 81f64d97e9c3dd1e
gogs_1 | 2018/10/07 15:32:49 [TRACE] CSRF Token: X5QyHM4LMIfn8OSJD1gwSSEyXV46MTUzODkyNjM2OTgyODQyMjExMA==
web_1 | 192.168.99.1 - - [07/Oct/2018:15:32:49 +0000] "GET / HTTP/1.1" 302 31 "-" "curl/7.61.1" "-"
Без изменений, все работает как положено.