A certain engineer "COMPLEX"

開発メモ その176 Docker Jenkins in Synology NAS

Introduction


JenkinsをSynology NASに構築したのでメモ。
Slaveノードは別マシンに構築します。

How to?


用意するもの

jenkinsのディレクトリを用意します。
これらはdockerコンテナにマウントされます。
今回は下記をマウントします。

  • /docker/jenkins/jenkins_home
  • /docker/jenkins/share/jenkins
  • /docker/jenkins/share/jenkins/ref

そして権限を変更します。


$ sudo chown -R 1000 /volume1/docker/jenkins

Jenkinsのダウンロード

dockerの場合、コンテナ内のデータは破棄されてしまうため、Jenkins本体をマウントする形にすることでアップデートできるようにします。

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

Generic Java package (.war)をダウンロードし、Jenkins.war/docker/jenkins/share/jenkinsにコピーします。

キーストアの作成

HTTPSで接続するために作成します。既にLet's Encryptで証明書は発行済みであるものとします。
HTTPで良い場合は、必要ありません。

Javaをインストールする必要があるのでパッケージ センターからインストールします。

パッケージ センター

インストール後のパス

続いて、下記のシェルをsudoで実行します。


#!/bin/bash

KEYROOT=/usr/syno/etc/certificate/system/default
KEY_PEM=${KEYROOT}/privkey.pem
CERT_PEM=${KEYROOT}/cert.pem
JAVA_HOME=/var/packages/Java7/target/j2sdk-image/jre/bin
KEYSTORE=/volume1/docker/jenkins/jenkins_home/keystore

openssl rsa -des3 -in $KEY_PEM -out key.encrypted.pem
openssl pkcs12 -inkey key.encrypted.pem -in $CERT_PEM -export -out keys.encrypted.pkcs12
${JAVA_HOME}/keytool -importkeystore -srckeystore keys.encrypted.pkcs12 -srcstoretype pkcs12 -destkeystore $KEYSTORE

下記のように実行します。
パスワードの空文字は許容されません。


$ sudo ./generate_jenkins_keystore.sh
writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Enter pass phrase for key.encrypted.pem:
Enter Export Password:
Verifying - Enter Export Password:
Importing keystore keys.encrypted.pkcs12 to /volume1/docker/jenkins/keystore_...
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Entry for alias 1 successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelled

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /volume1/docker/jenkins/keystore_ -destkeystore /volume1/docker/jenkins/keystore_ -deststoretype pkcs12".

コンテナの作成

キーストア作成の時に入力したパスワードを指定してコンテナの起動を実行します。
ホスト側のポートは適宜変更します。
HTTPで良い場合は、--httpから始まる引数を削除します。


$ sudo docker run -v /volume1/docker/jenkins/jenkins_home:/var/jenkins_home \
-v /volume1/docker/jenkins/share/jenkins:/usr/share/jenkins \
-p 38080:8443 \
-p 50003:50000 \
--name jenkins \
jenkins/jenkins:alpine \
--httpPort=-1 \
--httpsPort=8443 \
--httpsKeyStore=/var/jenkins_home/keystore \
--httpsKeyStorePassword=

コンソールが流れてしばらくするとadminの初期パスワードが表示されますのでメモしておきます。


*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

b0c58624703945a3ba1517b556b0f1bc

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

初期設定

ブラウザからアクセスします。

Jenkinsのアンロック。メモした初期パスワードを入力

Jenkinsのアンロック

プラグインのインストール。Install suggested plugins を選択

インストール中

ユーザ登録。入力後、Save and Finish

準備完了

開発メモ その175 Docker Registry in Synology NAS

Introduction


Dockerイメージを保存するプライベートなDocker RegistryをSynology NASに構築したのでメモ。
Docker Registryもdockerコンテナとして動作します。

How to?


用意するもの

設定ファイル、イメージを格納するディレクトリを用意します。
これらはdockerコンテナにマウントされます。
今回は下記をマウントします。

  • /docker/registry/config/config.yml
  • /docker/registry/config/htpasswd
  • /docker/registry/images
  • /docker/registry/certs

/docker/registry/config/config.yml


version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true # open delete api
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
auth:
htpasswd:
realm: basic-realm
path: /auth/htpasswd # use apache basic-auth

/docker/registry/config/htpasswd

registryへのログインパスワードを格納するファイルです。
下記のようにdockerコンテナに作らせます。


$ docker run --rm -ti xmartlabs/htpasswd > htpasswd

/docker/registry/images

dockerイメージの保存先です。
ただのフォルダです。

/docker/registry/certs

sslのための証明書、.crt、.keyを格納しておきます。
Let's Encryptが更新されたらここを更新します。

HTTPSでregistryにアクセスするのが基本です。ここを設定しなくても利用はできますが、dockerの設定で信頼できないregistryにアクセスできるよう設定を追加する必要があるので、ここはきちんと設定しておきます。

コンテナ作成

registryをpullします

pullできました

コンテナを作成します

詳細設定のボリューム

詳細設定のポート設定

詳細設定の環境

以上で完成です。

動作確認

コンテナを起動後、dockerからログインできるかどうかを確認します。
ポート番号を確認し下記のように確認しておきます。
usernameとpasswordは最初に作ったhtpasswdファイルで作成した情報になります。


> docker login https://hogehoge:28009/
Username: xxxxxx
Password:
Login Succeeded

もしssl設定をしていない場合は下記のようになりますので、クライアント側でdockerの設定を変更しておきます。


> docker login http://192.168.11.17:28009
Username: xxxxxx
Password:
Error response from daemon: Get https://192.168.11.17:28009/v2/: http: server gave HTTP response to HTTPS client

開発メモ その174 WindowsコンテナとLinuxコンテナを共存させる

Introduction


前回はシステムで利用するコンテナをWindowsからLinuxコンテナ、その逆と切り替えてみました。

How to


まずWindowsコンテナに切り替えます。
そしてExperimentalを有効化します。

Linux イメージを動かしてみる

alpineコンテナが動いています。
ホストのディレクトリもマウントできています。


> docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.24)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:28:48 2019
OS/Arch: windows/amd64
Experimental: true
> docker run --rm -v c:/Users:/data alpine ls /data
All Users
Default
Default User
DefaultAppPool
Public
TAKUYA
desktop.ini

Windowsイメージ

Windows Server Corealpineが表示されています。


>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nvidia/cuda 10.0-cudnn7-devel-ubuntu16.04 c963dc0723b7 8 days ago 3.17GB
nvidia/cuda 9.2-cudnn7-devel-ubuntu16.04 fa48202870f2 8 days ago 3.09GB
mcr.microsoft.com/windows/servercore 1809-amd64 43c05724e30b 2 weeks ago 4.56GB
ubuntu 16.04 2a697363a870 3 weeks ago 134MB
alpine latest 055936d39205 4 weeks ago 6.28MB

まとめ

Windowsコンテナに切り替えればイメージを共存されることができました。
ドライブの共有も問題なしです。

開発メモ その173 WindowsコンテナとLinuxコンテナを切り替える

Introduction


Docker for Windowsでコンテナを切り替えてみました。
環境はこんな感じです。

How to


特に難しいことはありません。
タスクトレイのSwitch to Windows containers...をクリックするだけです。

Linux から Windows へ

切り替えた直後です。
イメージが消えています。ちょっと驚きます。


>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.24)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:28:48 2019
OS/Arch: windows/amd64
Experimental: false

C:\Users\TAKUYA>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE

Windows から Linux へ

戻してみます。
イメージが戻っています。


>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: true

C:\Users\TAKUYA>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/core/sdk 2.1-bionic 28d5b1e8a03b 2 weeks ago 1.7GB
mcr.microsoft.com/dotnet/core/runtime 2.1-bionic 51c475cc6ed8 2 weeks ago 194MB
ubuntu latest 7698f282e524 3 weeks ago 69.9MB
nvidia/cuda 10.0-cudnn7-devel-centos6 1d245213a2c9 2 months ago 2.88GB
nvidia/cuda 10.0-cudnn7-devel-ubuntu16.04 e1d637677e0d 2 months ago 3.08GB
centos 7 9f38484d220f 2 months ago 202MB
ubuntu 16.04 7e87e2b3bf7a 4 months ago 117MB
ubuntu 14.04 5dbc3f318ea5 4 months ago 188MB
ubuntu 18.04 20bb25d32758 4 months ago 87.5MB
alpine edge dacde26455ab 5 months ago 5.28MB
alpine latest 3f53bb00af94 5 months ago 4.41MB
nvidia/cuda 9.2-cudnn7-devel-ubuntu16.04 7affc4c2ce61 6 months ago 2.9GB
nvidia/cuda 9.2-cudnn7-devel-centos6 b26377b9a39a 7 months ago 2.82GB
docker4w/nsenter-dockerd latest 2f1c802f322f 7 months ago 187kB
centos 6.10 30e66b619e9f 8 months ago 194MB

まとめ

イメージを共存することはできませんが、切り替えたからと言って前の環境に戻せなくなる、ということはありません。

開発メモ その172 Synology GitLabでLFSを使ってみる

Introduction


自宅のNASでGitLabをDockerで運用していますが、LFSを有効にするのに苦労したのでメモ。

How to


URL変更

Dockerの環境変数でGITLAB_HOSTを変更します。
既定ではlocalhostになっているので変更します。

HTTPS有効

これは私の環境では有効だったのでスキップ。
ただ、Dockerの環境変数でGITLAB_PORTに対応するGitLabのポートが80のため、ここを443に変更します。

プロジェクトでLFSを有効

General SettingsPermissionsからGit Large File Storageを有効にします。
これは各プロジェクトで有効にします。

クローン&プッシュ


git clone https://hogehoge.com/data/test.git
cd test
git lfs install
git lfs track *.jpg
git add *.jpg
git add .gitattributes
git commit -m "initial commit"
git config --add lfs.url "https://hogehoge.com/data/test.git/info/lfs/"
git config lfs.contenttype false
git push origin master

git config lfs.contenttype falseがミソです。
これは

### Summary Cannot push to a large repository (around ~3800 files, totalling ~1.6GB) with Git LFS. ### Steps to reproduce 1. Start a new Docker GitLab CE (wi...

に書いてありました。