web-dev-qa-db-ja.com

Traefik DockerイメージはWindowsでは機能せず、MacOSでは機能しますか?

MacOSで開発されているいくつかのDockerイメージで構成されるアプリケーションがあり、Windowsでそれを開始しようとしています。ほとんどは機能しているようですが、機能していないTraefikロードバランサーがあります。

MacOSでは動作しますが、Windowsでは、アクセスするURLが何であっても、実際のコンテンツである404が「404ページが見つかりません」です。

Traefikの構成は次のようになります。

logLevel = "INFO"
defaultEntryPoints = ["http", "https"]
[entryPoints]
  [entryPoints.http]
   address = ":80"
  [entryPoints.https]
   address = ":443"
    [entryPoints.https.tls]
    [entryPoints.https.tls.defaultCertificate]
      certFile = "/certs/cert.pem"
      keyFile = "/certs/cert.pem"
# Connection to docker Host system (docker.sock)
[docker]
watch = true
domain = "localhost"
[file]
 [backends]
  [backends.backend-mixpanel]
     [backends.backend-mixpanel.servers]
      [backends.backend-mixpanel.servers.mixpanel]
        url = "https://api.mixpanel.com"
        weight = 10
  [backends.backend-yieldify]
     [backends.backend-yieldify.servers]
      [backends.backend-yieldify.servers.yieldify]
        url = "https://td.yieldify.com/"
        weight = 0
 [frontends]
     [frontends.frontend-mixpanel]
       backend = "backend-mixpanel"
      [frontends.frontend-mixpanel.routes.one]
        rule = "HostRegexp:localhost,{catchall:.*};Path:/mixpanel/{.*};PathPrefixStripRegex:/{mixpanel}"
        priority=10
     [frontends.frontend-yieldify]
       backend = "backend-yieldify"
      [frontends.frontend-yieldify.routes.two]
        rule = "HostRegexp:localhost,{catchall:.*};Path:/yieldify/{.*}"
        priority=0

Dockerfileには以下が含まれます。

FROM traefik:Alpine

RUN apk add --update openssl

RUN mkdir -p /certs

RUN openssl req -x509 -newkey rsa:2048 -keyout key.pem -out ca.pem -days 1080 -nodes -subj '/C=UK/ST=London/L=London/O=ProjectX/OU=Engineering team/CN=local.wif'

RUN cat key.pem ca.pem > /certs/cert.pem

関連するdocker-compose.ymlセクションには以下が含まれます:

  lb:
    image: load-balancer
    build: ${WORKSPACE}/go-home/load_balancer
    ports:
    - 80:80
    - 443:443
    links:
    - wifi-ui-dev
    - wifi-ui-prod
    - portal
    - wifi-api
    env_file:
    - .env
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro,delegated
    - ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated

そして404を取得すると、そのDockerイメージのコンソール(stdoutおよびstderr)には何も送信されません。

何が起こっているのか、それが機能しない理由に近づく方法はありますか?

私の心配の1つはソケットのボリュームでした:

- /var/run/docker.sock:/var/run/docker.sock:ro,delegated

実行中のコンテナを確認すると、ファイルはソケットのように見えます。

/ # ls -laF /var/run/docker.sock
srw-rw----    1 root     root             0 Sep  2 11:04 /var/run/docker.sock=

念のため、その行を次のように置き換えてみました。

- //./pipe/docker_engine:/var/run/docker.sock

または:

- type: npipe
  source: ////./pipe/docker_engine
  target: /var/run/docker.sock
  consistency: delegated

どちらの場合も、ソケットはディレクトリのように見えます。

/ # ls -laF /var/run/docker.sock
total 4
drwxr-xr-x    2 root     root            40 Sep  3 14:52 ./
drwxr-xr-x    1 root     root          4096 Sep  3 14:57 ../
9
pupeno

わかりました、私はあなたの多くの問題であなたを指導するよう努めます。

  • 404が見つかりません(ちょうど文のように)-通常、traefik構成の問題です。通常のWebサイト404ではありません。これは、Traefikコンテナのログで確認できます。
  • Traefikが正しい順序で開始されなかったとき、404で同様の問題がありました。 TraefikをDocker(Swarm)スタックの外部に個別にデプロイすることがあります。次に、スタック(または他のコンポーネント)をデプロイします。注文は、たとえばdocker-compose.ymlファイル。この 'depends_on'は、コンポーネントが起動されたかどうかをテストするだけであり、アプリケーションとして完全に起動されていないため、正確ではありません。
  • 構成はMacで実行されるため、Traefik 404はDocker(Traefik)ネットワーク構成によるものではないと想定しています。
  • Treafikの使用するバージョンを確認してください。 Traefic 2以降、いくつかの重要な変更がありました。私は使用します:traefik:v1.7.11-Alpine。
  • 「traefik.enable」が明示的にtrueに設定されていることを確認してください。この設定が必要な場合は、環境ごとに異なることがわかりました。
  • 実行中のWebサイトを展開する場合、Traefikコンソール(ポート8080経由)を使用して、構成内容を確認できます。フロントエンドルールとバックエンドが表示されます。
  • 環境ファイルは「.env」です。 Windowsにドットファイルを配置するには、特別なアクションが必要です。 cygwinまたはGit bash経由。ファイルが存在することを前提としています。

取り付けとdocker.sockについて?

  • 共有してください。 Windowsでは、Dockerデスクトップを開き、[共有ドライブ]タブに移動します。ドライブを追加します。 DまたはK。例として、Kをマッピングしました。 K:\ data。
  • 以下にdocker-compose.ymlファイルの例をいくつか示します。これらの例では、共有「K => k:/ data」を使用しています。

最初の例は、Docker for Windowsで完全なJenkins環境を開始する方法を示しています。 Jenkins環境内からDocker Engineへの参照が作成されるため、Windowsではdocker.sockへの参照が作成されます。これがDocker for Windows環境での私は毎日使用していますです。うまくいきます!

version: '3'
services:
  jenkins:
    image: docker-jenkins-maven-npm-oc:latest
    ports:
      - "8888:8080"
    volumes:
      - //k/data/var/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
  geosolschmea:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=somedatabase
      - MYSQL_USER=johan
      - MYSQL_PASSWORD=bladibladibla
    volumes:
      - //k/data/var/mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"

Windows上のdocker-compose.ymlファイル内の別のSpringブートアプリケーション:

  geosolutionapp:
    image: myuser/geosolutions:latest
    build:
      context: ./
      dockerfile: Dockerfile
    depends_on:
      - geosolschmea
    environment:
      - SCDATALIMIT=100000
    ports:
      - 8080:8080
    volumes:
      - //k/data/spring-boot-app:/data/spring-boot-app
    networks:
      - geosolutionsnet

Traefikの場合、docker-compose.ymlは次のようになります(Linuxでは、Amazon EC2)。これにより、Traefikダッシュボードを表示することもできます。これを使用して、使用しているフロントエンドとバックエンドを確認します。ボリュームを少し変更すると、Docker for Windowsで実行されます。

Treafikファイルへのパスを変更すると、Docker for Windowsでこれを簡単に実行できます。

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - //k/data/traefik/traefik.toml:/traefik.toml
      - //k/data/traefik/acme.json:/acme.json

Linuxで毎日実行される完全な動作(ライブ)の例は次のとおりです。

version: '3'
services:
  traefik:
    image: traefik:v1.7.11-Alpine
    container_name: traefik
    restart: always
    networks:
      - geosolutionsnet
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/ec2-user/traefik/traefik.toml:/traefik.toml
      - /home/ec2-user/traefik/acme.json:/acme.json
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    labels:
      - "traefik.docker.network=geosolutionsnet"
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:yourwebsite.nl;PathPrefix:/traefik"
      - "traefik.port=8080"
      - "traefik.protocol=http"
      - "traefik.backend=traefik"

Docker for WindowsでTraefikを使用する場合、これを使用してtraefik.tomlファイルのdocker Engineに接続します。

[docker]
  endpoint = "unix:///var/run/docker.sock"
  domain = "yourwebsite.nl"
  watch = true
  exposedByDefault = false

Windows用のDockerでTraefikのルーティング作業がうまくいかない場合は、これをスケルトンとして使用し、「docker hello world」の例から始めて、Treafikからアクセスできるようにします。 Windows用のDockerでTraefikを動作させる基本的なルートを取得したら、実際のアプリケーションを段階的に追加できます。これは長い道のりとして感じられるかもしれませんが、私たちの経験ではこれは速く機能します。

もちろん、すべてのポートが外部から見える必要はありません。 docker-compose.ymlファイルの新しいバージョンを使用できます。

Treafikを使用する別のコンポーネントは次のようになります。

  geosolutionapp:
    image: myuser/myproduct:latest
    environment:
      - slackBotToken=xyz-etc
    ports:
      - 8080
    networks:
      - geosolutionsnet
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=geosolutionsnet"
      - "traefik.frontend.rule=Host:myapplication.nl"
      - "traefik.port=8080"
      - "traefik.protocol=http"

そして別の例:

slackbotsimple:
    image: myuser/slackbotsimple:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - traefik
    environment:
      - slackBotToken=xoxb-etc-etc-etc

まだdocker.sockにスタックしていますか?

  • 上記が役に立たない場合は、次のようなアプローチも使用できます:docker run -v //var/run/docker.sock:/var/run/docker.sock ...
  • PowerShell:$ Env:COMPOSE_CONVERT_WINDOWS_PATHS = 1を実行します
  • Git bash:$ export COMPOSE_CONVERT_WINDOWS_PATHS = 1
    $ docker-compose down && docker-compose up -d
  • /var/run/docker.sockに適切な権限があることを確認してください。場合によっては、次のようにして手動でアクセス許可を設定する必要があります:$ docker exec -u 0 -it bash ...次に#chmod 777 /var/run/docker.sock

これらのヒントが問題の解決に役立つことを願っています!大成功!さらにサポートが必要な場合は、質問してください。

1
tm1701

LinuxベースのDockerイメージをWindowsで実行するには、満たす必要のあるいくつかの要件があります。Hyper-Vサポートが有効になっているWindows 10 Pro以降。

また、「Hyper-V VM」という名前の「Hyper-V VM」をセットアップするマネージャーアプリである「Docker for Windows.exe」もインストールする必要があります。お役に立てば幸いです。

0
Elgayed

docker-compose.ymlに問題があるようです

この行:

- ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated

そしてこれ:

build: ${WORKSPACE}/go-home/load_balancer

システム変数の代わりに相対パスを使用できますか?いくつかの説明が書かれています ここ

0