Nexus Repository Manager on Docker Toolbox

#はじめに
DockerやMavenの成果物を格納するNexus Repository ManagerをDocker on Windows10 PCで構築してみました。
DockerHubからイメージをpullして立ち上げるだけのつもりだったのですが、Docker用リポジトリとして使うためには少し追加設定が必要でした。Maven用リポジトリとして使うのであれば、pullして立ち上げるだけですぐに使えます。

#1. 前提
以下の環境で動作した内容を記述しています。

Windows 10 Home (64bit)
VirtualBox 5.0.26
Docker Toolbox (Docker version 1.12.6, build 78d1802)

#2. 事前準備
##2.1 start.shの修正
C:\Program Files\Docker Toolbox\start.shの60行目あたりのcreate部分にパラメーター「 --engine-insecure-registry mydocker:10080」を追加します。"mydocker"の部分はは2.2で修正するhostsと同期をとる必要があります。

```
  "${DOCKER_MACHINE}" create --engine-insecure-registry mydocker:10080 -d virtualbox $PROXY_ENV "${VM}"
```

##2.2 hostsの修正
VirtualBoxで起動しているDocker Toolbox用Linuxのhostsに以下を追加します。
DockerHubのキャッシュとしてNexus Repository Managerを利用する際に必要です。
IPアドレスはDockerが割り当てたものに後で変更するので仮のIPで構いません。
※Maven用としてだけで使う場合は特に不要です
```
192.168.00.100 mydocker
```
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/a9d66f8d-e0d5-42a8-1afd-a87b94845222.png)

#3. Dockerイメージの取得と起動

以下のコマンドでNexus Repository ManagerのDockerイメージを取得し起動します。
今回は8081と10080ポートを利用します。用途は後ほど。
```
$docker run -d -p 8081:8081 -p 10080:10080 --name nexus sonatype/nexus3
```

![image](https://qiita-image-store.s3.amazonaws.com/0/131481/0132fe23-4a55-d4dc-f864-828198ea01d0.png)

#4. Nexus Repository Managerへログイン
管理画面に管理者IDでログインします。（ID:admin, Password:admin123)
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/574a776d-b4e9-c4df-b1f5-4c29fd957aac.png)

※IPアドレスはdocker-machine lsで調べられます。ポートは8081が割り当てられています。

```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.13.0
```

#5. DockerHub proxyの設定
設定メニューでCreate repositoryを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/be279290-caa2-12c8-42d3-3a5bb8ce9325.png)

Docker (proxy)を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/9a58525d-bc6e-0ab0-f9da-ae96479dffc6.png)

Name:DockerHub、 HTTP Connector:10080、Remote storage:https://registry-1.docker.io、 Docker Index:Use Docker Hubを入力し、画面下部までスクロールしCreate Repositoryをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/605ad5ca-a70d-fce7-e1a3-fdeb0ad920e5.png)

成功すると以下の行がリポジトリ一覧に追加されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/fe73aaaa-ff7c-a27b-cbf5-bededa7991dd.png)

#6. Docker Proxy経由でDockerイメージを取得
以下のコマンドでalpineをpullしてみます。

```
$ docker pull mydocker:10080/alpine
Using default tag: latest
latest: Pulling from alpine
0a8490d0dfd3: Already exists
Digest: sha256:dfbd4a3a8ebca874ebd2474f044a0b33600d4523d03b0df76e5c5986cb02d7e8
Status: Downloaded newer image for mydocker:10080/alpine:latest
```

※これを実行するには、事前準備で設定したhostsのIPアドレスとNexus Repository Managerが稼働しているIPアドレスが同じである必要があります。ローカルリポジトリとしてinsecureな(HTTP)接続をするためです。

Nexus Repository ManagerのComponentsを確認してみると、ちゃんとキャッシュされています。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/3f44e35f-a7d9-6f55-9cc3-6648f8d96a64.png)

#7. Maven Proxy経由でアーティファクトの取得
EclipseでMaven projectを作成し、pom.xmlを以下のように準備します。

```pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>sample</groupId>
	<artifactId>sample</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<repositories>
		<repository>
			<id>my-repo</id>
			<url>http://192.168.99.100:8081/repository/maven-central/</url>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<id>my-repo</id>
			<url>http://192.168.99.100:8081/repository/maven-central/</url>
		</pluginRepository>
	</pluginRepositories>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
	</dependencies>
</project>
```

Eclipseでmvn cleanを実行してみたところ、以下のようにproxy経由でプラグインなどが取得できました。

```
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building sample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] Downloading: http://192.168.99.100:8081/repository/maven-central/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom
[INFO] Downloaded: http://192.168.99.100:8081/repository/maven-central/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom (4 KB at 2.1 KB/sec)
[INFO] Downloading: http://192.168.99.100:8081/repository/maven-central/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom
[INFO] Downloaded: http://192.168.99.100:8081/repository/maven-central/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom (13 KB at 19.0 KB/sec)
[INFO] Downloading: http://192.168.99.100:8081/repository/maven-central/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.jar
[INFO] Downloaded: http://192.168.99.100:8081/repository/maven-central/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.jar (25 KB at 30.8 KB/sec)
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ sample ---
[INFO] Downloading: http://192.168.99.100:8081/repository/maven-central/org/codehaus/plexus/plexus-utils/3.0/plexus-utils-3.0.pom
[INFO] Downloaded: http://192.168.99.100:8081/repository/maven-central/org/codehaus/plexus/plexus-utils/3.0/plexus-utils-3.0.pom (4 KB at 7.4 KB/sec)
[INFO] Downloading: http://192.168.99.100:8081/repository/maven-central/org/sonatype/spice/spice-parent/16/spice-parent-16.pom
[INFO] Downloaded: http://192.168.99.100:8081/repository/maven-central/org/sonatype/spice/spice-parent/16/spice-parent-16.pom (9 KB at 13.7 KB/sec)
[INFO] Downloading: http://192.168.99.100:8081/repository/maven-central/org/sonatype/forge/forge-parent/5/forge-parent-5.pom
[INFO] Downloaded: http://192.168.99.100:8081/repository/maven-central/org/sonatype/forge/forge-parent/5/forge-parent-5.pom (9 KB at 13.2 KB/sec)
[INFO] Downloading: http://192.168.99.100:8081/repository/maven-central/org/codehaus/plexus/plexus-utils/3.0/plexus-utils-3.0.jar
[INFO] Downloaded: http://192.168.99.100:8081/repository/maven-central/org/codehaus/plexus/plexus-utils/3.0/plexus-utils-3.0.jar (221 KB at 132.8 KB/sec)
[INFO] Deleting C:\dev\eclipse-ws\sample\target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.543 s
[INFO] Finished at: 2017-01-29T22:46:56+09:00
[INFO] Final Memory: 6M/123M
[INFO] ------------------------------------------------------------------------
```

#8.終わりに
わざわざDockerでNexus Repository Managerを立てる必要もないかもしれませんが、今回設定した内容でDocker imageを作成しておけば、プロジェクト毎に使い回しがしやすかったりするかもしれません。

#メモ
本文とは関係ないですが、Dockerで起動しているnexusのOSにルートでログインする方法がわかったのでメモ。
login to nexus container with user id = 0 (root)
`$docker exec -u 0 -it nexus bash`


#参考ページ
[プライベートDocker-Registryにhttpで接続 [Docker-Toolbox Windows]](http://qiita.com/Ikumi/items/3af3d1df980c441d8498)
[さわって理解するDocker入門](https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part1.html)
[login to nexus container with user id = 0 (root)](https://github.com/sonatype/docker-nexus/issues/10)
[sonatype/nexus3](https://hub.docker.com/r/sonatype/nexus3/)
[Nexus RepositoryのDocker Registryを使ってオフラインでConcourse CIを使う](https://blog.ik.am/entries/400)