Help us understand the problem. What is going on with this article?

centos7で、dockerを使って、nginxのリバースプロキシからverdaccioを使う

More than 1 year has passed since last update.

はじめに

2017年1月くらいの時は、verdaccioに関する記事も少なくて、導入にとても苦労したんですよ。
でも、今となってはdockerもあるし、便利になりましたね。
でも苦労したんだけどね!

やりたいこと

  • dockerでverdaccioを立ち上げる
  • nginxのリバースプロキシでアクセスする
    • たとえば「http://your-ip-addr:4873/ではなく、http://your-ip-addr/verdaccioでアクセスする」ということ。

環境

CentOS Linux release 7.5.1804
verdaccio dockerのimageでverdaccio/verdaccio:latestを指定(2018/6の執筆時点では3.2.0)
Nginx dockerのimageでnginxを指定(2018/6の執筆時点では1.15.0)

dockerとverdaccioの組み合わせについて

本家のexampleに例が準備されています。

これを参考にします。

本家の例をそのまま起動してみる

まずは何も考えずに起動してみます。

git cloneとかしてローカルに持ってきた本家のexampleのディレクトリに移動して、docker-compose up -dをします。

そして、ブラウザからlocalhost:4873/にアクセスすると、verdaccioが起動しています。
※必要に応じて、localhostはipとかurlとかに書き換えてください。

この時、後々のためにverdaccioコンテナのファイルをコピーしてきます。

$ docker cp <ImageId>:/verdaccio/ ./verdaccio

終わったら落とします。

$ docker-compose down

本家の例を書き換える

docker-compose.yamlファイルを書き換える

exampleに入っていたyamlファイルを書き換えます。

docker-compose.yaml
version: '2'

services:
  verdaccio:
    image: verdaccio/verdaccio:latest
    container_name: verdaccio
    ports:
      - "4873:4873"
    volumes:
      - ./volumes:/verdaccio

  nginx:
    restart: always
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./data/conf.d:/etc/nginx/conf.d

変更点は以下の通り。

  • verdaccioのvolumesを、docker-composeと同改装のディレクトリにマウント。
    • このために先ほどコンテナからデータをコピーしてきました。
  • nginxのimageはtutum/nginxではなくnginxを利用する。
    • 後々nginxはリバースプロキシ用に別docker-composeにする構想があったので、どうせなら更新されている新しいものを使おうという理由です。(tutum/nginxは最後にpushされたのが2年前)
  • nginxのvolumesもdocker-composeのディレクトリにマウント。

verdaccioのconfig.yamlに追記する

先ほどコピーしたvolumesフォルダの中の、conf/config.yamlに一文を追加します。

url_prefix: http://your-ip-addr/verdaccio/

この一文の意味は、verdaccioのgitのfull.yamlというファイルの中に説明が載っています。

# if you use nginx with custom path, use this to override links
#url_prefix: https://dev.company.local/verdaccio/

nginxのconf.dに追記する

docker-compose.yamlがあるディレクトリの中に以下のファイルを追加します。

./data/conf.d
server {
  listen 80 default_server;
  access_log /var/log/nginx/verdaccio.log;
  charset utf-8;
  location /verdaccio {
    rewrite ^/verdaccio/(.+) $1 break;
    proxy_pass  http://your-ip-addr:4873/$1;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_ssl_session_reuse off;
    proxy_set_header Host $http_host;
    proxy_redirect off;
  }
}

必要だったらserver_nameを指定するのもお忘れなく。

起動!

以上の変更を行った後は以下のコマンドで起動。

$ docker-compose up -d

そして、http://your-ip-addr/verdaccioでアクセスできることを確認する。

備忘録

ファイアウォールの設定

http://your-ip-addr:4873でやった時はつながったのに、
http://your-ip-addr/verdaccioではつながらなくて以下のログが出ている。
※ipとか、適宜変えてます。

$ docker-compose logs
proxy    | 2018/06/21 06:37:56 [error] 7#7: *3 connect() failed (113: No route to host) while connecting to upstream, client: from-ip-addr, server: hoge.jp, request: "GET /verdaccio/ HTTP/1.1", upstream: "http://your-ip-addr:4873/", host: "your-ip-addr"
proxy    | from-ip-addr - - [21/Jun/2018:06:37:56 +0000] "GET /verdaccio/ HTTP/1.1" 502 575 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" "-"

色々調べたらファイアウォールの設定を見直した方が良いらしい。
そこで見直してみる。

firewalldを解除して、iptablesを使う。

色々やるが、つながらない。

iptables -nLコマンドとかを打って、よくよく確認してみたら、INPUTに4873へのACCEPTが存在しなかったので、以下のコマンドで追加する。
でも、そもそもこのコマンドを打たないといけない事態っていったい…
dockerさんが勝手に追加してくれると思っていたのに…

iptables -I INPUT 5 -p tcp --dport 4873 -j ACCEPT
103ma2
2020/1現在、ReactとかC#とか触れています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away