如何运行 Kong API 网关使用docker 容器?

How to run Kong API Gateway using docker containers?

我对 Kong API 网关还很陌生,目前正在尝试 运行 使用 PostgreSQL 作为我的数据库容器的 Kong 容器。

我怎样才能做到这一点?

您检查过以下代码库了吗?

https://github.com/Mashape/docker-kong

1.启动你的数据库:

 $ docker run -d --name kong-database \
                  -p 5432:5432 \
                  -e "POSTGRES_USER=kong" \
                  -e "POSTGRES_DB=kong" \
                  postgres:9.4

2。启动孔:

启动一个 Kong 容器并link它到你的数据库容器,用 postgres 配置 KONG_DATABASE 环境变量。

$ docker run -d --name kong \
              --link kong-database:kong-database \
              -e "KONG_DATABASE=postgres" \
              -e "KONG_PG_HOST=kong-database" \
              -p 8000:8000 \
              -p 8443:8443 \
              -p 8001:8001 \
              -p 7946:7946 \
              -p 7946:7946/udp \
              kong

3.Verify空是运行:

$ curl http://127.0.0.1:8001

你可以关注Kong installation guide。它按预期对我有用。

第 1 步:启动 Postgres 容器

docker run -d --name kong-database \
          -p 5432:5432 \
          -e "POSTGRES_USER=kong" \
          -e "POSTGRES_DB=kong" \
          postgres:9.5

第二步:迁移数据库

docker run --rm \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations up

第 3 步:启动 Kong

docker run -d --name kong \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
-e "KONG_ADMIN_LISTEN_SSL=0.0.0.0:8444" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest

第 4 步:验证

curl -i http://localhost:8001/

回答@StefanWalther 的问题,这里有一个关于如何让它与 docker-compose 一起工作的例子:

version: "2.1"
services:
  kong:
    image: kong:latest
    depends_on:
      kong-database:
        condition: service_healthy
    healthcheck:
      test:
        - CMD
        - nc
        - -z
        - localhost
        - "8443"
      retries: 10
    links:
      - kong-database:kong-database
    command: 
      - "kong"
      - "start"
      - "--vv"
    environment:
      - KONG_DATABASE=cassandra
      - KONG_CASSANDRA_CONTACT_POINTS=kong-database
      - KONG_ADMIN_LISTEN=0.0.0.0:8001
      - KONG_ADMIN_LISTEN_SSL=0.0.0.0:8444
      - KONG_NGINX_DAEMON=off
    ports:
      - "443:8443"
      - "8001:8001"
    restart: always
    network_mode: "bridge"
  kong-database:
    image: cassandra:3
    healthcheck:
      test:
        - "CMD-SHELL"
        - "[ $$(nodetool statusgossip) = running ]"
    volumes:
      - ~/kong-database/cassandra:/var/lib/cassandra
    expose:
      - "9042"
    restart: always
    network_mode: "bridge"

此外,您还可以添加 kongfig 以重新配置实例:

  kong-configurer:
    image: mashupmill/kongfig
    depends_on:
      kong:
        condition: service_healthy
    links:
      - kong:kong
    volumes:
      - ~/config.yml:/config.yml:ro
    command: --path /config.yml --host kong:8001
    network_mode: "bridge"

您可以转储要在最后一个容器中使用的配置:

kongfig dump --host localhost:8001 > ~/config.yml

有关 Kongfig 的更多信息,here

干杯。

这是我自己的 docker compose,它运行完美(来自 github 上的 kong docker 项目,我使用的是 kong-oidc,你可以选择你喜欢的任何版本)。

kong:
    image: kong:1.3.0-alpine-oidc
    container_name: kong
    depends_on:
      - kong-db
    healthcheck:
      test: ["CMD", "kong", "health"]
      interval: 10s
      timeout: 10s
      retries: 10
    restart: on-failure
    ports:
      - "8000:8000" # Listener
      - "8001:8001" # Admin API
      - "8443:8443" # Listener  (SSL)
      - "8444:8444" # Admin API (SSL)
    environment:
      KONG_DATABASE:         postgres
      KONG_PG_HOST:          kong-db
      KONG_PG_PORT:          5432
      KONG_PG_DATABASE:      api-gw
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG:  /dev/stderr
      KONG_ADMIN_ERROR_LOG:  /dev/stderr
      KONG_PROXY_LISTEN:     0.0.0.0:8000, 0.0.0.0:8443 ssl
      KONG_ADMIN_LISTEN:     0.0.0.0:8001, 0.0.0.0:8444 ssl
      KONG_PLUGINS:          bundled,oidc
      KONG_LOG_LEVEL:        debug

  kong-migrations:
    image: kong:1.3.0-alpine-oidc
    command: kong migrations bootstrap
    container_name: kong-migrations
    depends_on:
      - kong-db
    environment:
      KONG_DATABASE: postgres
      KONG_PG_DATABASE: api-gw
      KONG_PG_HOST: kong-db
      KONG_PG_PASSWORD:
      KONG_PG_USER: kong
    links:
      - kong-db:kong-db
    restart: on-failure

  kong-migrations-up:
    image: kong:1.3.0-alpine-oidc
    container_name: kong-migrations-up
    command: kong migrations up && kong migrations finish
    depends_on:
      - kong-db
    environment:
      KONG_DATABASE: postgres
      KONG_PG_DATABASE: api-gw
      KONG_PG_HOST: kong-db
      KONG_PG_PASSWORD:
      KONG_PG_USER: kong
    links:
      - kong-db:kong-db
    restart: on-failure

2020 年更新

  1. 创建桥接网络让容器可以互相访问
docker network create my-net
  1. 启动kong数据库容器
docker run -d --name kong-database --network my-net  -p 5432:5432  -e "POSTGRES_USER=kong" -e "POSTGRES_HOST_AUTH_METHOD=trust" -e "POSTGRES_DB=kong"  postgres:alpine
  1. 运行 用于初始化 kong-database 数据的临时容器
docker run --rm \
    --network my-net \
    -e "KONG_DATABASE=postgres" \
    -e "KONG_PG_HOST=kong-database" \
    kong:latest kong migrations bootstrap
  1. 运行 香港集装箱
docker run -d --name kong \
    --network my-net \
    -e "KONG_DATABASE=postgres" \
    -e "KONG_PG_HOST=kong-database" \
    -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
    -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
    -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
    -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
    -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
    -e "KONG_ADMIN_LISTEN_SSL=0.0.0.0:8444" \
    -p 8000:8000 \
    -p 8443:8443 \
    -p 8001:8001 \
    -p 8444:8444 \
    kong:latest
  1. 验证
curl http://127.0.0.1:8001