Docker 初体验指南

Docker Compose 可用于配置一组相关的容器作为服务,以进行实验或在测试环境中运行。

Docker 不建议在生产环境中使用 Compose。

先决条件

  • 基于 Unix 的操作系统

  • Docker

  • Docker Compose

准备 hosts 文件

您需要在您的 /etc/hosts 文件中设置以下主机名

127.0.0.1   storage server db-single

生成自签名证书

  1. 在运行 Docker Compose 之前,在本地机器上创建一个目录 ~/.nom/ssc。以下 Compose 文件指定将此目录挂载到 Docker 容器中,以便生成的证书可用于 NOM 服务器和代理。

  2. 更改到 ~/.nom/ssc,并使用 server 作为通用名称 (CN) 和 DNS 名称,以及 127.0.0.1 作为 IP 地址,使用 openssl 生成自签名证书(详细信息请参见 此处)。

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -subj "/CN=server" \
      -addext "subjectAltName = DNS:server, IP:127.0.0.1" \
      -addext "keyUsage = critical, digitalSignature, keyEncipherment" \
      -addext "extendedKeyUsage = serverAuth" \
      -addext "authorityKeyIdentifier = keyid:always,issuer:always" \
      -keyout "server.key" \
      -out "server.cer"
    
    openssl pkcs12 -export \
      -inkey "server.key" \
      -in "server.cer" \
      -out "server.pfx" \
      -password "pass:changeit"

    这将创建 server.cerserver.keyserver.pfx

  3. 在接下来的部分中,使用为证书存储应用的密码(changeit)替换 <SSC_PASSWORD>

为了简化示例,生成的证书将用于 NOM 服务器和代理。

创建 Docker Compose 文件

以下是一个 Docker Compose 文件,可用于启动 NOM 服务器(包括其持久化)和一个由 NOM 管理的单个 Neo4j 企业版实例。在本地机器上的空目录中创建文件 docker-compose.yaml。此目录在本文档中之后被引用为 INSTALLATION_ROOT

docker-compose.yaml
networks:
  lan:

services:
  storage:
    hostname: storage
    image: neo4j:enterprise
    networks:
      - lan
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      NEO4J_ACCEPT_LICENSE_AGREEMENT: "yes"
      NEO4J_AUTH: neo4j/<PERSISTENCE_PASSWORD>
      NEO4J_server_default__advertised__address: storage
      NEO4J_server_http_listen__address: storage:9000
      NEO4J_server_bolt_listen__address: storage:9001
    healthcheck:
      test: [ "CMD-SHELL", "echo RETURN 1 | cypher-shell -a bolt://storage:9001 -u neo4j -p <PERSISTENCE_PASSWORD> || exit 1" ]

  server:
    hostname: server
    image: neo4j/neo4j-ops-manager-server
    depends_on:
      storage:
        condition: service_healthy
    networks:
      - lan
    ports:
      - "8080:8080"
      - "9090:9090"
    environment:
      SPRING_NEO4J_URI: bolt://storage:9001
      SPRING_NEO4J_AUTHENTICATION_USERNAME: neo4j
      SPRING_NEO4J_AUTHENTICATION_PASSWORD: <PERSISTENCE_PASSWORD>
      SERVER_SSL_KEY_STORE_TYPE: PKCS12
      SERVER_SSL_KEY_STORE: file:/certificates/server.pfx
      SERVER_SSL_KEY_STORE_PASSWORD: <SSC_PASSWORD>
      GRPC_SERVER_SECURITY_KEY_STORE_TYPE: PKCS12
      GRPC_SERVER_SECURITY_KEY_STORE: file:/certificates/server.pfx
      GRPC_SERVER_SECURITY_KEY_STORE_PASSWORD: <SSC_PASSWORD>
      CORS_ALLOWEDHEADERS: "*"
      CORS_ALLOWEDORIGINS: "http://localhost:[*],https://localhost:[*], http://server:[*]"
      GRPC_SERVER_SECURITY_TRUST_CERT_COLLECTION: file:/certificates/server.cer
    volumes:
      - type: bind
        source: ~/.nom/ssc
        target: /certificates
    entrypoint:
      - "sh"
      - "-c"
      - "java -jar app.jar"
  db-single:
    hostname: db-single
    image: neo4j:enterprise
    networks:
      - lan
    ports:
      - "10000:10000"
      - "10001:10001"
    environment:
      CONFIG_SERVER_GRPC_ADDRESS: "server:9090"
      CONFIG_SERVER_HTTP_ADDRESS: "https://server:8080"
      CONFIG_TLS_TRUSTED_CERTS: "/certificates/server.cer"
      CONFIG_TLS_CLIENT_CERT: "/certificates/server.cer"
      CONFIG_TLS_CLIENT_KEY: "/certificates/server.key"
      CONFIG_LOG_LEVEL: "debug"
      CONFIG_INSTANCE_1_NAME: "single-instance"
      CONFIG_INSTANCE_1_BOLT_URI: "bolt://db-single:10001"
      CONFIG_INSTANCE_1_BOLT_USERNAME: "neo4j"
      CONFIG_INSTANCE_1_BOLT_PASSWORD: <NEO4J_INSTANCE_PASSWORD>
      CONFIG_INSTANCE_1_QUERY_LOG_PORT: "9500"
      CONFIG_INSTANCE_1_LOG_CONFIG_PATH: "/var/lib/neo4j/conf/server-logs.xml"
      CONFIG_INSTANCE_1_QUERY_LOG_MIN_DURATION: "1"
      NEO4J_ACCEPT_LICENSE_AGREEMENT: "yes"
      NEO4J_AUTH: neo4j/<NEO4J_INSTANCE_PASSWORD>
      NEO4J_EDITION: "enterprise"
      NEO4J_server_default__advertised__address: db-single
      NEO4J_server_http_listen__address: db-single:10000
      NEO4J_server_bolt_listen__address: db-single:10001
      NEO4J_server_bolt_advertised__address: db-single:10001
      NEO4J_server_metrics_prometheus_enabled: "true"
      NEO4J_server_metrics_prometheus_endpoint: "localhost:2004"
      NEO4J_server_metrics_filter: "*"
    volumes:
       - type: bind
         source: ~/.nom/ssc
         target: /certificates
       - type: bind
         source: agent
         target: /agent
    healthcheck:
      test: [ "CMD-SHELL", "echo RETURN 1 | cypher-shell -a bolt://db-single:10001 -u neo4j -p <NEO4J_INSTANCE_PASSWORD> || exit 1" ]
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 5s

NOM 服务器 Docker 镜像的文档 此处

编辑 docker-compose.yaml 如下

  • 替换所有出现的 <SSC_PASSWORD> 为上面应用的证书存储密码。

  • 替换所有出现的 <PERSISTENCE_PASSWORD> 为安全密码。

  • 替换所有出现的 <NEO4J_INSTANCE_PASSWORD> 为安全密码。

下载 NOM 代理

部署中心 下载 NOM 代理二进制 TAR 文件,并在您的 INSTALLATION_ROOT 中执行以下命令

mkdir agent
tar -xvf <DOWNLOADED_AGENT_BINARIES_TAR> -C agent --strip-components=1

启动 Docker Compose 环境

在您的 INSTALLATION_ROOT 中运行以下命令

docker compose -f docker-compose.yaml up

查看输出,确保 Docker 容器 storageserverdb-single 成功启动。

启动 NOM 代理

INSTALLATION_ROOT 中,以自动注册模式启动代理

docker compose -f docker-compose.yaml exec db-single sh -c "/agent/bin/agent console -s"

注册代理的完整文档 此处

探索 NOM UI

  • 等待服务器容器启动,然后访问 https://server:8080

  • 使用 admin / passw0rd 登录并接受许可协议。

  • 单击右上角的设置图标,它会将您重定向到全局设置。

  • 确保代理在线。如果需要,重命名代理。

  • 返回主页面,等待 DBMS 出现 - 这可能需要几分钟。一旦 DBMS 显示在主页上,双击名称(最初是生成的字符串)进行编辑。双击 DBMS 以查看 DBMS 的指标、状态、安全面板、日志和升级页面。

控制 Docker 容器

停止

  • 要停止完整的 NOM 环境,在 Docker Compose 控制台和代理控制台上按 Ctrl-C

  • 要停止单个 Docker 容器,请运行 docker container stop <CONTAINER_NAME>。要列出容器,请使用 docker ps

由于 Docker 将持久化数据保留在容器卷中,因此重新启动的容器将保留先前状态。

重置

要使用空的 Neo4j 持久化和空的托管实例重新开始,请使用以下 Docker 命令(使用 docker ps -a 查找实际的容器名称)

docker container rm -v <STORAGE_CONTAINER_NAME> <SERVER_CONTAINER_NAME> <DB_SNGLE_CONTAINER_NAME>