20201012のdockerに関する記事は15件です。

Windows10 HomeでDocker + VSCodeによるhaskellの環境構築

はじめに

いままでインタプリタ型・動的型付けの言語を使う機会の方が多かったです。

ただ、触っていくうちに「かっちりさ」に欠ける 気がしてしまったんです。
「70%の完成度でリリースできる」という言葉を聞いたことがあるくらいですからそれほど厳密さには焦点を絞っていないのだと思います。

もちろん、それがいいところだし、実社会ではその方がスピード感のあるリリースが可能になる分強いと思います。

ただ、コンパイラ型・静的型付けの言語も触ってみて両者の違いをつかんでみたいなという気持ちが湧いてきたんです。
(かっちりしてるものの方が扱いやすい気がするという好みの問題もあるんですが)

しかも、オブジェクト指向に関してもJavaScript, Python, PHPと触っていくうちに雰囲気がつかめてきた(分かったとは言ってない)ので関数型なるものを触ってみたいという好奇心もあります。

そこでHaskellを勉強してみることにしました。

コードも綺麗になるというし、嬉しい副作用にも期待ですね。

しかし、いざ始めようとすると意外とWindows10 Homeでの環境構築の記事が断片的にしかありませんでした(Proは結構あったんですけど)。

ということで、Windows10 Homeでのhaskell環境構築についてまとめていきます。

環境

  • Windows10 Home
  • Docker (インスト―ルから合わせて紹介します)

Dockerを使った場合

まずはDockerでhaskellイメージをプルしてコマンドプロンプトから実行できるやり方を説明します。

Windows10 HomeでDockerを使う手順から始めます。そのまま一気にhaskellを実行できるところまでいきますね。

①「Windows用Linuxサブシステム」の有効化

コントロールパネル → プログラム → Windowsの機能の有効化または無効化

サブシステム.png

で「Windows用Linuxサブシステム」を有効化します。(その後PCを再起動します)

②Docker Desktop on Windows Homeをインストール

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

「Get stable」をクリック。

③Dockerを起動

Dockerを起動すると「Linuxカーネルをアップデートしろ」と叱られるので、

https://docs.microsoft.com/en-us/windows/wsl/install-win10

の手順4に従って、アップデート。晴れてDockerが動くようになります。

step4.png

(※別の環境構築の際にいじっていてぼくだけこの操作で済んだ可能性があります。でも、上のページは分かりやすくまとまっているのでそれを順番に実行していけばいい気がします)

④Haskellイメージをpullする

コマンドプロンプトを開き、適当なディレクトリで次を実行。

$ docker pull haskell

でhaskellイメージをもらってきます。

その後、

$ docker run -it haskell

でコンテナを起動すると、勝手にコンテナの中に入ってくれます。(要するにすぐhaskell使える状態になります)

haskell.png

こんな感じで Prelude> と出れば成功。

すぐに実行できます。

haskell例.png

Docker + VSCodeを使った方法

実はVSCodeを使えばエディタを使ってhaskellをいじることができます。

つまり、コマンドプロンプトを使わずしてVSCode上からコンテナ内のhsファイルを編集したり、ターミナルを立ち上げたりできます。

①VSCodeをインストール

VScodeインスト―ル.png

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

上記のリンクからVSCodeをインストールします。

②Remote-Containersをインストール

vscode拡張.png

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

上記のリンクからVSCodeの拡張機能「Remote-Containers」をインストールします。

③コンテナを立ち上げる

適当なディレクトリを作って、VSCodeで開きます。

そこで「.devcontainer.json」というファイルを作り、以下の記載をします。

.devcontainer.json
{
    "name" : "haskell",
    "images" : "haskell",
    "extensions" : "haskell.haskell"
}

このファイルでpullするDockerイメージやその設定を管理しています。要するにDockerfileの代わりですね。

VSCodeは設定系をjsonファイルで管理するようですね。

その後、画像の順に「左下の緑のボタン」->「Remote-Containers: Open Folder Container...」と押します。

container実行.png

これで勝手にDockerイメージをpullするところからコンテナを立ち上げるところまで勝手にやってくれます。

2回目以降は右下でコンテナを立ち上げるか聞いてきます。「Reopen in Container」を押せばまた再開できます。

devcontainer.png

以上を実行すると、勝手にコンテナに入ってしかもターミナルまで勝手に立ち上げてくれます。VSCode便利ですね。

(最初かなり混乱したんですが、コマンドプロンプトはWindowsの、ターミナルはLinuxのCLIですね。ややこしや。Windowsのパワーシェルはコマンドプロンプトを基礎に機能を拡張したものだそうですね)

devcontainer立ち上げ.png

④haskellを実行

ここまでくるともうhaskellを使えます。

下に出てきたターミナルで、

$ stack ghci

を実行します。これで、コマンドプロンプトでやった時と同じように対話式でhaskellを実行できます。

実行.png

ちなみに、ghciは「Glasgow Haskell Compiler Interface」の略だそうです。haskellはグラスゴー大学というイギリス北部にある大学で開発されたそうですね。

⑤hsファイルを編集&実行

対話形式で実行するのもいいですが、せっかくエディタを使ってるんですからファイルにコードを書いて読み込みたいですね。

haskellではhsファイルにコードを書いて管理します。

たとえば、「hello_world.hs」というファイルを作って以下のコードを書き込みます。

hello_world.hs
main = putStrLn "Hello world!"

その後、ターミナルにて

$ stack runghc hello_world.hs

を実行します。そうすると、コンパイルから実行まで勝手にやってくれます。

hello.png

これで晴れてhaskellを実行できましたね!

さいごに

今回はhaskellをWindows10 Homeで実行する手順についてでした。ほぼDockerの動かし方でしたね。

これから趣味でいじっていくと思うんで、haskellネタはちょくちょく書くかもです。

そのうち数学ネタも書きたいな~

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

golandとDocker設定

golandを使う人への参考記事まとめです。

GolandでDockerを使う

Docker - 公式ヘルプ | GoLand
公式ページ。これだけでもいい人もいるはず。日本語が少し不自然。

GolandでDocker上のサーバーをRemote Debug - Qiita
リモートデバッグの解説が日本語で書かれていて読みやすい。

Docker上のGo製Webアプリケーションをリモートデバッグする - Qiita
実際に使用しているコードがわかります。

golandの設定

GoglandでオススメのGo快適開発環境構築方法 - Qiita
基本的なgolandの使い方、dockerはの解説はありません。

【Go言語】Airでホットリロードをする方法 | Awesome Blog
golandでホットリロードってなによ?ってときに読みましょう

DockerでGo言語の開発環境

DockerでGoの開発環境を構築する - Qiita
dockerのみでgolandの解説はありませんが、基本を振り返る時に最適

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DynamoDB localをDockerで構築する

背景

現在担当しているプロダクトではAppSyncを使っており、バックエンドにLambdaを使うことが多いです。その際にLambdaのロジックに対する単体テストを書くのですがDynamoDBとのやり取りについては保留していました。
開発が進むにつれていろんな処理が入ってきたこともあり、「実際にアクセスしてみないと分からない」という状況では色々不都合が出てきたのでそろそろテストを入れようと思って調べたことをまとめています。

この記事に掲載しているコードの全体はyu-croco/DynamoDB-local-Sampleにアップロードしていますので、ご自由にお使いください。

追記

投稿後に気づいたので追記です。
Circle CI上に建てたDockerコンテナに対して、Circle CIのローカル上からアクセスする(例:http://localhost:8000 )のは無理っぽいので、Circle CI上でこの記事のようにDocker化したDynamoDB localを使う場合には、GolangのリソースもDocker化してください。

DynamoDB local

DynamoDB localとはAWSが提供しているローカル上で起動できるDynamoDBのことです。
AWS公式のSetting Up DynamoDB Localによると、

ダウンロード可能なバージョンの Amazon DynamoDB では、DynamoDB ウェブサービスにアクセスせずに、アプリケーションを開発してテストすることができます。代わりに、データベースはコンピュータ上で自己完結型となります。アプリケーションを本番稼働環境にデプロイする準備ができたら、コード内のローカルエンドポイントを削除します。その後、これは DynamoDB ウェブサービスを指します。

このローカルバージョンを使用することで、スループットやデータストレージ、データ転送料金を節約しやすくなります。また、アプリケーションを開発している間インターネットに接続しておく必要はありません。

とのことです。
「いちいちDynamoDB叩くと面倒だよね」というので、よりハンディなものを提供してくれている感じです。

今回はこれを使います。

Docker化してみる

CI上で利用したいこともあり、毎回DynamoDB localを直接インストールしたくはありません。幸い、DynamoDB localはAWSが公式でDocker Hubにイメージを公開しているので今回はこれを使います。
amazon/dynamodb-local - Docker Hub

Dockerfileはこんな感じです。オプションなどは公式を参照頂くとよいかと思います。
DynamoDB Local Usage Notes

FROM amazon/dynamodb-local

CMD ["-jar", "DynamoDBLocal.jar", "-sharedDb", "-dbPath", ".", "-optimizeDbBeforeStartup"]
$ docker build -t dynamodb_sample .
$ docker run -p 8000:8000 -v dynamodb:/home/dynamodblocal dynamodb_sample

みたいにすれば、ざっと動きます。

DynamoDBにデータを入れる

起動したDynamoDB localにテーブル作成やデータ投入をします。
このためにわざわざコードを書くのは面倒なので、今回はAWS CLI経由でデータを入れます。
AWS CLI用のコンテナを起動し、以下のようなスクリプトを実行することでDynamoDB localのコンテナに対してテーブル操作を行います。

テーブル作成用

#!/usr/bin/env bash

aws dynamodb \
  --region ap-northeast-1 \
  --endpoint-url http://dynamodb:8000 \
    create-table \
  --table-name SampleTable \
  --attribute-definitions \
    AttributeName=userId,AttributeType=N \
    AttributeName=userName,AttributeType=S \
  --key-schema \
    AttributeName=userId,KeyType=HASH AttributeName=userName,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST

データ投入用

#!/usr/bin/env bash

aws dynamodb \
  --region ap-northeast-1 \
  --endpoint-url http://dynamodb:8000 \
    put-item \
  --table-name SampleTable \
  --item '
    {
      "userId": {
        "N": "1"
       },
      "userName": {
        "S": "山田太郎"
      },
      "age": {
        "N": "29"
      },
      "contactNumber": {
        "S": "080-1234-5678"
      }
    }
  '

およその全体像

最終的にはざっくり以下の感じになります。

Dockerfile(AWS CLI用)

FROM amazon/aws-cli:2.0.56

ENV AWS_ACCESS_KEY_ID=fake_access_key\
    AWS_SECRET_ACCESS_KEY=fake_secret_access_key\
    DYNAMODB_REGION=ap-northeast-1
# AWS CLIから実行したい処理をbin配下にshellscriptで作っておく
COPY bin bin

docker-compose.yml

version: '3'
services:
  dynamodb:
    image: amazon/dynamodb-local
    command: -jar DynamoDBLocal.jar -sharedDb -dbPath . -optimizeDbBeforeStartup
    volumes:
      - dynamodb:/home/dynamodblocal
    ports:
      - 8000:8000
  awscli:
    build: .
    entrypoint: [""]
    tty: true
    command:
      - /bin/sh
volumes:
  dynamodb:
    driver: local

これでdocker-compose upしてDynamoDB localとAWS CLIのそれぞれのコンテナを起動します。その後binファイルに入っているshellscriptを叩いてテーブル作成などを行います。

コンテナ起動後に自動でテーブル作成などできればいいですが、それはまた別の機会にでも。

セッションの設定

Golangの場合ではDynamoDBへのセッションを定義する処理でEndpointを http://0.0.0.0:8000 とすれば既存のDynamoDBの処理が動くようになるかと思います。

const region = "ap-northeast-1"
var svc = dynamodb.New(session.New(&aws.Config{
        Region:   aws.String(region),
        Endpoint: aws.String("http://0.0.0.0:8000"),
    })
)

まとめ

DynamoDBへのアクセス処理に関するテストを行うためにDynamoDB localを使いました。DynamoDB localへのテストデータの投入は面倒なので、AWS CLI用のDockerを起動してそこからDynamoDB localへデータを投入するのがおすすめです(CI上とかでも使えるので)。

それでは幸せなDynamoDB生活を!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今更ansible+dockerを始めたら最初からつまづいたけど、何とか起動出来た話

概要

Excelの手順書通りに操作せよ!という現実を変えるのに、ansibleが使えそうだとどこかのサイトで見たので、dockerとの組み合わせで検証してみた。
そしてコンテナへの接続方法に「Docker connection plugin for Ansible」ってのを使えばssh不要と検証途中で知ったので、変更した上で接続出来るようになるまでのメモ。

環境

os: centos7
ansible: 2.9.13
docker: 19.03.13
docker-compose: 1.26.2

各ミドルのインストールは色んな方が公開されているので割愛。

失敗してた時の設定

コンテナ側

  • DockerFile
# OS
FROM centos:centos7

# pkg install
RUN yum install -y epel-release && \
    yum update -y  && \
    yum install -y openssh-server openssh-clients sshpass && \
    yum install -y net-tools vim

ENV LANG ja_JP.UTF-8

# root password
RUN echo password | passwd --stdin root

# # sshd_config edit
RUN sed -ri "s/#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
RUN systemctl enable sshd.service

CMD ["/sbin/init"]

ansibleで接続用のコンテナを準備する(最初はssh使おうとしてたので作った)

  • docker-compose
version: '3.7'

services:
  srv1:
    build:
     context: .
     dockerfile: srv-dockerfile
    hostname: srv1
    container_name: srv1
    environment:
      - TZ=Asia/Tokyo
    restart: always
    tty: true
    networks:
      app_net:
        ipv4_address: 172.16.238.101

  srv2:
    build:
     context: .
     dockerfile: srv-dockerfile
    hostname: srv2
    container_name: srv2
    environment:
      - TZ=Asia/Tokyo
    restart: always
    tty: true
    networks:
      app_net:
        ipv4_address: 172.16.238.102

# 固定IP付与用のNW設定
networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.238.0/24

sshするのに便利そうだなと 固定IP を付与した。

コンテナ起動

# docker-compose up -d
Starting srv1 ... done
Starting srv2 ... done

ansible側

  • hosts
[testGrp]
172.16.238.101
172.16.238.102
  • yaml
- name: start up a docker container
  hosts: localhost
  tasks:
    - name: start up a docker container by running bash
      command: docker-compose -f /srv/ansible/docker-compose.yml up -d
  tags:
    - never # docker-composeで「alwaus: restart」としているので、普段は動作しないようにした

- name: connection test
  hosts: testGrp
  connection: docker #connection plugin利用の指定
  tasks:
  - name: ping
    ping:

playbook実行結果

# ansible-playbook -i hosts test-ansible.yml --check --diff

PLAY [start up a docker container] ***********************************************************************************************************************************

PLAY [connection test] ***********************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************
fatal: [172.16.238.101]: UNREACHABLE! => {"changed": false, "msg": "Failed to create temporary directory.In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\", for more error information use -vvv. Failed command was: ( umask 77 && mkdir -p \"` echo ~/.ansible/tmp `\"&& mkdir \"` echo ~/.ansible/tmp/ansible-tmp-1602479114.98-3164-90901945313893 `\" && echo ansible-tmp-1602479114.98-3164-90901945313893=\"` echo ~/.ansible/tmp/ansible-tmp-1602479114.98-3164-90901945313893 `\" ), exited with result 1", "unreachable": true}
fatal: [172.16.238.102]: UNREACHABLE! => {"changed": false, "msg": "Failed to create temporary directory.In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\", for more error information use -vvv. Failed command was: ( umask 77 && mkdir -p \"` echo ~/.ansible/tmp `\"&& mkdir \"` echo ~/.ansible/tmp/ansible-tmp-1602479115.05-3165-268763785818242 `\" && echo ansible-tmp-1602479115.05-3165-268763785818242=\"` echo ~/.ansible/tmp/ansible-tmp-1602479115.05-3165-268763785818242 `\" ), exited with result 1", "unreachable": true}

PLAY RECAP ***********************************************************************************************************************************************************
172.16.238.101             : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
172.16.238.102             : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   

無事失敗した。
エラーメッセージにtmpフォルダの権限が無いかもってあったけど、pingで権限不足とかそんなことはあるまい、、、と放置。

# docker-compose ps
Name    Command     State   Ports
---------------------------------
srv1   /sbin/init   Up           
srv2   /sbin/init   Up
# docker inspect srv1 | grep IPv4Address
                        "IPv4Address": "172.16.238.101"
# ping 172.16.238.101
PING 172.16.238.101 (172.16.238.101) 56(84) bytes of data.
64 bytes from 172.16.238.101: icmp_seq=1 ttl=64 time=0.133 ms
64 bytes from 172.16.238.101: icmp_seq=2 ttl=64 time=0.134 ms

念の為、ping単体で実行したが、こっちは成功したので、コンテナ自体は問題ないと判断。

成功時の設定

  • hosts
[testGrp]
#172.16.238.101
#172.16.238.102
srv1
srv2

参考になる記事を色々見ていたら、どの記事もプラグインを利用するときは「ホスト名」で指定していることに今更ながらに気付く(この時点で半日経過)。
ので、ターゲットの指定方法を「IP」から「コンテナ名」に変更。
※他にもdockerfileからssh消したりしてますが、成功には関係ないので割愛

実行結果

# ansible-playbook -i hosts test-ansible.yml --check --diff

PLAY [start up a docker container] ***********************************************************************************************************************************

PLAY [connection test] ***********************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************
ok: [srv2]
ok: [srv1]

TASK [ping] **********************************************************************************************************************************************************
ok: [srv2]
ok: [srv1]

PLAY RECAP ***********************************************************************************************************************************************************
srv1                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
srv2                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

成功!

まとめ

  • 「Docker connection plugin for Ansible」を利用するとコンテナ内にsshdが要らない
  • pluginを利用して接続する場合は、playbookで「connection: docker」を指定する
  • ホストの指定方法は必ず「コンテナ名」で指定する

よくよく見なくてもと公式も含め「コンテナ名」とか「ホスト名」って書いてあるんですよね。
ssh接続の検証から入って、ひとまずIP固定化したしIP指定接続出来るなって思い込みで進めてた結果の失敗でした。。。

残課題

  • ansibleのコンテナ化

ホントはansibleも含めて全部コンテナで起動させたかったんですが、コンテナ化すると該当のプラグインを経由して他のコンテナにアクセスできず、ひとまずホストに直接インストールしているため。
DooD使えば出来るって記事があったんですが、なぜかコンテナに認識されず、dockerコマンドが利用できなかったんですよね。。。
まあメインはそこじゃないので、後々ですが。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker経由でMinecraft資源(Spigot)サーバーを立てる

WSL2の真骨頂

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

Minecraft触るのは何年ぶりだろう。
(ボートがぶつかるとすぐ壊れてた頃)
創った建築物をクリーパーに破壊されて辞めたのは覚えてる。

久々に触ってみようということになり、
どうせなら複数サーバーでサーバー間移動できるようにしておきたいと、
Minecraftサーバーを立てる遊びを始める
(なにやってんねん (・ω・) )

折角WSL2が入ってるし、
Linux上にインストールしてみよう。
ビルドがいるらしいからdocker使おう。
MODも使えるようにしよう。
サーバーも複数立てれるようにしよう。
と仕様が欲張りになり、
時間だけが過ぎていくことに。

なんとか形になったからここに残す。


------------------- ↓ 本題はここから ↓-------------------

事前準備

Minecraftをインストールするのは当然。
Java Edition(Windows版)でいいと思う。
(無料じゃないよ!)

WSL2とUbuntu、dockerが入ってるのが前提
この辺でも見て入れといて。

WSL2+docker+PHPのWindows開発環境構築(1) WSL2編
WSL2+docker+PHPのWindows開発環境構築(2) docker編

PowerShellから以下のようにコマンドが通れば成功

PS C:\> wsl -d Ubuntu-20.04
$ docker --version
Docker version 19.03.13, build 4484c46d9d

データ保存用にディレクトリを切っておく

$ mkdir ~/minecraft_data

dockerからコンテナ生成

SpigotというサーバーMODがあるそうな。
(よくわかってない)
spigotのdockerは別のが見つかるが、
よく使われる方にパラメータだけで設定できそうだからこちらを採用

itzg/minecraft-server

$ docker run -d -v ~/minecraft_data:/data -p 25565:25565 -e TYPE=SPIGOT -e EULA=TRUE --name mc itzg/minecraft-server

起動はすぐだけど、
追加のダウンロードとかバイオーム生成とか諸々かかるので、
3分ぐらい待つ
( ˘ω˘ )スヤァ…

起動確認

Minecraftを起動してMultiplayerから「Direct Connection」で接続を試す。

Minecraft 1.16.3 2020_10_09 9_04_25_r.png

Minecraft 1.16.3 2020_10_09 9_04_13_r.png

Minecraft 1.16.3 2020_10_09 9_14_31_r.png

接続を確認してみる。

Minecraft 1.16.3 - Multiplayer (3rd-party Server) 2020_10_09 15_32_31_r.png

よしログインでけた (`・ω・´)キリッ

別ワールド生成

プラグイン追加

プラグインに関する詳細説明は後書きにするとして、
ここでは必要な分だけ書いておこう。

$ docker stop mc
$ cd ~/minecraft_data/plugins
$ wget http://ci.onarandombox.com/job/Multiverse-Core/Release%20Build/artifact/target/Multiverse-Core-4.2.2.jar # マルチワールド管理
$ wget http://ci.onarandombox.com/job/Multiverse-Portals/Release%20Build/artifact/target/Multiverse-Portals-4.2.0.jar # ワールド間移動
$ wget https://ci.lucko.me/job/LuckPerms/lastStableBuild/artifact/bukkit/build/libs/LuckPerms-Bukkit-5.1.107.jar # プラグイン権限管理
$ docker start mc

( ˘ω˘ )スヤァ…

( ゚д゚)ハッ!

プラグイン権限調整

ユーザー名をDozoとすると

$ docker exec -i mc rcon-cli
> lp user Dozo permission set luckperms.* true
> lp user Dozo permission set minecraft.command.* true
> lp user Dozo permission set multiverse.* true
> ^C (ctrl+c)

コンソールからは無反応だがユーザー名さえ間違ってなければこれでよい

マイクラにログインして以下のコマンドを実行

/gamerule doDaylightCycle false

実行できていれば成功
これは時間停止コマンドで作業中に夜が来てゾンビにやられることを防げる

ワールド生成

すべての準備ができたのでワールド生成といこう。
rcon-cli上でも生成はできるが、
実感が薄いのでマイクラ上で行う

/mv create asset NORMAL
Starting creation of world 'asset'...
Complete!

これでassetという名称の新しいワールドが生成された
移動は以下のコマンド

/mvtp asset

試しにネザーを創って移動してみると

Minecraft 1.16.3 - Multiplayer (3rd-party Server) 2020_10_10 12_58_03_r.png

よし!成功だ! (`・ω・´)キリッ


------------------- ↓ 後書はここから ↓-------------------

プラグイン設定

保存用ディレクトリにpluginsというのがあるが、
ここにビルド済みのプラグインファイル(jar)を置くことで、
プラグインを追加することができる
記事の頭の方にちょろっとあったデータ保存用ディレクトリがここで利いてくる。

cloneしてmavenでビルドという流れだが、
ビルド済みなものを直接使う方が簡単でいい。

書くプラグイン製作者はJenkinsを公開しているようで、
そちらから拝借しよう。
その際、最新のビルドではなく安定のビルドから取得

Multiverse-Core [Jenkins] - Vivaldi 2020_10_09 12_43_58_rr.png

マルチワールド

Multiverse

Multiverse was created at the dawn of Bukkit multiworld support. It has since then grown into a complete world management solution including special treatment of your nether worlds with Multiverse NetherPortals.

In the second delivery of Multiverse, we've broken it up into several smaller plugins that are each feature packed but not bloated! Multiverse provides the easiest to use world management solution for your Minecraft server, big or small, and with great addons like Portals and NetherPortals, what's not to love!

Multiverse is here and works for the latest server build! Is your server a Multiverse?
https://dev.bukkit.org/projects/multiverse-core/

複数のサーバーを管理するプラグイン。ワールドの作成、再生成、サーバー間の移動など複数サーバーによるメリットを享受することができる。
各種プラグインは

名称 詳細 Jenkins URL
Multiverse-core マルチサーバーのコアシステム http://ci.onarandombox.com/view/Multiverse/job/Multiverse-Core/
Multiverse-Portals サーバー間移動のポータルを構築 http://ci.onarandombox.com/view/Multiverse/job/Multiverse-Portals/
Multiverse-NetherPortals 上記のネザー用 http://ci.onarandombox.com/view/Multiverse/job/Multiverse-NetherPortals/
Multiverse-Inventories サーバー間のインベントリ管理 http://ci.onarandombox.com/view/Multiverse/job/Multiverse-Inventories/

どうせなら全部入れとくか。

$ cd ~/minecraft_data/plugins
$ wget http://ci.onarandombox.com/job/Multiverse-Core/Release%20Build/artifact/target/Multiverse-Core-4.2.2.jar
$ wget http://ci.onarandombox.com/job/Multiverse-Portals/Release%20Build/artifact/target/Multiverse-Portals-4.2.0.jar
$ wget http://ci.onarandombox.com/job/Multiverse-NetherPortals/Release%20Build/artifact/target/Multiverse-NetherPortals-4.2.1.jar
$ wget http://ci.onarandombox.com/job/Multiverse-Inventories/Release%20Build/artifact/target/Multiverse-Inventories-4.2.1.jar

ワールド生成のパラメータはこちら
https://github.com/Multiverse/Multiverse-Core/wiki/World-properties

コマンドはマイクラ上かRCON上で。

$  docker exec -i mc rcon-cli
> mvlist
§d====[ Multiverse World List ]====
§fworld§f§f - §aNORMAL
§fworld_the_end§f§f - §bTHE_END
§fworld_nether§f§f - §cNETHER

> mv create asset NORMAL
Starting creation of world 'asset'...
Complete!

> mv modify set weather false asset
§aSuccess!§f Property §bweather§f was set to §afalse

> mv modify set time false asset
§cSet the time to whatever you want! (Will NOT freeze time)

> mv modify add creeper monsters asset
§aSuccess! §bcreeper§f was §cremoved from §amonsters

> mv create farm NORMAL -t FLAT
Starting creation of world 'farm'...
Complete!

> mv modify set gamemode creative farm
§aSuccess!§f Property §bgamemode§f was set to §acreative

> mv modify set difficulty hard farm
§aSuccess!§f Property §bdifficulty§f was set to §ahard

> mv modify set hunger false farm
§aSuccess!§f Property §bhunger§f was set to §afalse

サーバー管理

LuckPerms

LuckPerms is a permissions plugin for Minecraft servers. It allows server admins to control what features players can use by creating groups and assigning permissions.
https://luckperms.net

サーバーの権限などを管理するプラグイン

名称 詳細 Jenkins URL
LuckPerms https://ci.lucko.me/job/LuckPerms/
$ cd ~/minecraft_data/plugins
$ wget https://ci.lucko.me/job/LuckPerms/lastStableBuild/artifact/bukkit/build/libs/LuckPerms-Bukkit-5.1.107.jar

LuckPermsプラグインはデフォルトで管理ユーザーを設定していないので、
再起動後、minecraftコンソールにアクセスしてユーザー登録をする。
ユーザー名をDozoとすると

$ docker restart mc
$ docker exec -i mc rcon-cli
> lp user Dozo permission set luckperms.* true
ctrl+C

バグなのかわからないが入力しても反応はないが、
ちゃんと機能はしている。
動作確認をするためクライアントで接続する

/lp editor

Minecraft 1.16.3 - Multiplayer (3rd-party Server) 2020_10_09 20_50_45_r.png

記載のURLをクリックしてアクセスするとパーミッション変更のWeb UIに移動するので、
各種設定を行うことができる。
とりあえずこのぐらい設定して微調整という感じで。

グループ名 権限
Admin minecraft.command.ban minecraft.command.pardon some.cool.admin.perm someplugin.vanish
Mod minecraft.command.mute minecraft.command.unmute some.cool.mod.perm chatcolor.bold
Default minecraft.command.say minecraft.command.me

参考:
Using WSL2 in a Docker Linux container on Windows to run a Minecraft Java Edition

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

INTERNAL ERROR: cannot create temporary directory! : Docker環境

RubyとRspecを学習中のゆーたです!

久しぶりに、自身のポートフォリオサイトを開いてみたら、本番環境で見たくない画面になっていました。
ただ、githubのdockerのissueにこの問題が上がっていたので、割と簡単に問題解決できました。

スクリーンショット 2020-10-12 9.27.51.png

また、AWSでRDSを使っていたので、データベースは安全でした。
RDSは、コストが高いですが、精神的によろしいですね!!

環境

  • Docker 19.03.5
  • docker-compose 1.25.2
  • nginx 1.15.8

解決方法

解決方法は、コンテナのイメージを削除することです。
ただ、コンテナの中身の情報は、消えるかもしれないです...
そこは、情報があいまいでした。

$ docker rm $(docker ps -a -q)
$ docker rm -f $(docker ps -a -q)
$ docker-compose build --no-cache

原因

docker-composeのディスクのスペースが少なくなってくるとdocker-composeが起動しなくなるようです。

つまり、docker-composeファイルで、データを維持したり、処理をまとめすぎるとキャッシュが溜まっていき、docker-composeのディスク領域がなくなり、INTERNAL ERROR: cannot create temporary directory!が起きるみたいです。

参照

https://github.com/docker/compose/issues/3262

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【ミライトデザイン社内勉強会#5】docker-compose.ymlとDockerFileを一行づつ読んでみる

最強のLaravel開発環境をDockerを使って構築する【新編集版】 - Qiita
で使用されている docker-composer.yml と dockerfileが何をしているのかを一行づつ見てみる

https://github.com/ucan-lab/docker-laravel

docker-compose.yml

version: "3.8" # ① docker file で使用するバージョンを指定
volumes: # ② VMの中にボリュームする領域を確保している
  db-store:
  php-fpm-socket:
services: # ③ サービス1つ1つがコンテナ
  app: # ④ サービスの名前(任意でつけて大丈夫)
    build: ./docker/php # ⑤ ここにあるdockerファイルでビルドしろっていってる
    volumes:
      - php-fpm-socket:/var/run/php-fpm # ⑥ VM本体の領域に、コンテナの中の/var/run/php-fpmがマウントしている
      - ../backend:/work/backend

  web:
    build: ./docker/nginx
    ports:
      - 80:80
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ../backend:/work/backend

  db:
    build: ./docker/mysql
    volumes:
      - db-store:/var/lib/mysql
    ports:
      - 3306:3306

ファイルバージョン3リファレンスを作成する| Dockerドキュメント
このバージョンの指定によってファイルの書き方が変わってくる

② Docker for mac の中にVMがありコンテナのデータをマウントする領域を確保している
VMにマウントすることでコンテナを削除してもデータが消えない
名前は任意につけて大丈夫。

  • サービス
docker-compose ps
        Name                      Command               State                 Ports              
-------------------------------------------------------------------------------------------------
docker-laravel_app_1   docker-php-entrypoint php-fpm    Up      9000/tcp                         
docker-laravel_db_1    docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
docker-laravel_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp    

DockerFile

MySQL

https://github.com/ucan-lab/docker-laravel/blob/master/infra/docker/mysql/Dockerfile

# ① dockerhub からmysql8.0のイメージを取得している
FROM mysql:8.0
# ② LABELを設定している
LABEL maintainer="ucan-lab <yes@u-can.pro>"

# ③ OSの環境変数に値を追加している
ENV TZ=UTC \ # タイムゾーン
  # MYSQLが指定している環境変数を指定している
  MYSQL_DATABASE=laravel_local \
  MYSQL_USER=phper \
  MYSQL_PASSWORD=secret \
  MYSQL_ROOT_PASSWORD=secret

# ④ ホストのファイルをコンテナにコピーしている
COPY ./my.cnf /etc/my.cnf
  • https://hub.docker.com/_/mysqlからimageを取得している
    • :8.0 を記述しないとlatestのバージョンを持ってくる
  • ② Fromの後にlabelでmaintainerをかく観衆があるよ
  • ③ mysqlのイメージに環境変数を渡せば、公式のイメージが勝手に設定してくれる
  • ④ 左がホストで右がコンテナのパス
    • ホストに存在するファイルをコンテナの指定したパスにコピーしてる

buildする

13:01:24 ❯ docker build -t mysql_image .
Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM mysql:8.0
 ---> 0d64f46acfd1
Step 2/4 : LABEL maintainer="ucan-lab <yes@u-can.pro>"
 ---> Using cache
 ---> ef5acb641867
Step 3/4 : ENV TZ=UTC   MYSQL_DATABASE=laravel_local   MYSQL_USER=phper   MYSQL_PASSWORD=secret   MYSQL_ROOT_PASSWORD=secret
 ---> Using cache
 ---> 3eb31d9f4c84
Step 4/4 : COPY ./my.cnf /etc/my.cnf
 ---> Using cache
 ---> c064e3fa414a
Successfully built c064e3fa414a
Successfully tagged mysql_image:latest
  • buildに成功すると、dockerimageができる
13:08:35 ❯ docker images                
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
mysql_image          latest              f9666eb795b6        8 seconds ago       544MB
  • imageを元にコンテナが作成される
    • imageを使っているコンテナがあるとimage消せない

コンテナを立ち上げてみる

docker hub の ubuntu を立ち上げてみる

13:08:43 ❯ docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
54ee1f796a1e: Pull complete 
f7bfea53ad12: Pull complete 
46d371e02073: Pull complete 
b66c17bbf772: Pull complete 
Digest: sha256:31dfb10d52ce76c5ca0aa19d10b3e6424b830729e32a89a7c6eee2cda2be67a5
Status: Downloaded newer image for ubuntu:latest
root@d9d9fe415292:/# exit
exit
  • コンテナの削除
$ docker rm <CONTAINER ID>
  • imageの削除
$ docker rmi <IMAGE ID>

参考記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【ミライトデザイン社内勉強会#5】docker-compose.ymlとDockerfileを一行づつ読んでみる

最強のLaravel開発環境をDockerを使って構築する【新編集版】 - Qiita
で使用されている docker-composer.yml と Dockerfileが何をしているのかを一行づつ見てみる

https://github.com/ucan-lab/docker-laravel

docker-compose.yml

version: "3.8" # ① docker file で使用するバージョンを指定
volumes: # ② VMの中にボリュームする領域を確保している
  db-store:
  php-fpm-socket:
services: # ③ サービス1つ1つがコンテナ
  app: # ④ サービスの名前(任意でつけて大丈夫)
    build: ./docker/php # ⑤ ここにあるdockerファイルでビルドしろっていってる
    volumes:
      - php-fpm-socket:/var/run/php-fpm # ⑥ VM本体の領域に、コンテナの中の/var/run/php-fpmがマウントしている
      - ../backend:/work/backend

  web:
    build: ./docker/nginx
    ports:
      - 80:80
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ../backend:/work/backend

  db:
    build: ./docker/mysql
    volumes:
      - db-store:/var/lib/mysql
    ports:
      - 3306:3306

ファイルバージョン3リファレンスを作成する| Dockerドキュメント
このバージョンの指定によってファイルの書き方が変わってくる

② Docker for mac の中にVMがありコンテナのデータをマウントする領域を確保している
VMにマウントすることでコンテナを削除してもデータが消えない
名前は任意につけて大丈夫。

  • サービス
docker-compose ps
        Name                      Command               State                 Ports              
-------------------------------------------------------------------------------------------------
docker-laravel_app_1   docker-php-entrypoint php-fpm    Up      9000/tcp                         
docker-laravel_db_1    docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
docker-laravel_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp    

Dockerfile

MySQL

https://github.com/ucan-lab/docker-laravel/blob/master/infra/docker/mysql/Dockerfile

# ① dockerhub からmysql8.0のイメージを取得している
FROM mysql:8.0
# ② LABELを設定している
LABEL maintainer="ucan-lab <yes@u-can.pro>"

# ③ OSの環境変数に値を追加している
ENV TZ=UTC \ # タイムゾーン
  # MYSQLが指定している環境変数を指定している
  MYSQL_DATABASE=laravel_local \
  MYSQL_USER=phper \
  MYSQL_PASSWORD=secret \
  MYSQL_ROOT_PASSWORD=secret

# ④ ホストのファイルをコンテナにコピーしている
COPY ./my.cnf /etc/my.cnf
  • https://hub.docker.com/_/mysqlからimageを取得している
    • :8.0 を記述しないとlatestのバージョンを持ってくる
  • ② Fromの後にlabelでmaintainerをかく観衆があるよ
  • ③ mysqlのイメージに環境変数を渡せば、公式のイメージが勝手に設定してくれる
  • ④ 左がホストで右がコンテナのパス
    • ホストに存在するファイルをコンテナの指定したパスにコピーしてる

buildする

13:01:24 ❯ docker build -t mysql_image .
Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM mysql:8.0
 ---> 0d64f46acfd1
Step 2/4 : LABEL maintainer="ucan-lab <yes@u-can.pro>"
 ---> Using cache
 ---> ef5acb641867
Step 3/4 : ENV TZ=UTC   MYSQL_DATABASE=laravel_local   MYSQL_USER=phper   MYSQL_PASSWORD=secret   MYSQL_ROOT_PASSWORD=secret
 ---> Using cache
 ---> 3eb31d9f4c84
Step 4/4 : COPY ./my.cnf /etc/my.cnf
 ---> Using cache
 ---> c064e3fa414a
Successfully built c064e3fa414a
Successfully tagged mysql_image:latest
  • buildに成功すると、dockerimageができる
13:08:35 ❯ docker images                
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
mysql_image          latest              f9666eb795b6        8 seconds ago       544MB
  • imageを元にコンテナが作成される
    • imageを使っているコンテナがあるとimage消せない

コンテナを立ち上げてみる

docker hub の ubuntu を立ち上げてみる

13:08:43 ❯ docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
54ee1f796a1e: Pull complete 
f7bfea53ad12: Pull complete 
46d371e02073: Pull complete 
b66c17bbf772: Pull complete 
Digest: sha256:31dfb10d52ce76c5ca0aa19d10b3e6424b830729e32a89a7c6eee2cda2be67a5
Status: Downloaded newer image for ubuntu:latest
root@d9d9fe415292:/# exit
exit
  • コンテナの削除
$ docker rm <CONTAINER ID>
  • imageの削除
$ docker rmi <IMAGE ID>

参考記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitLab構築

DockerForWindowsでGitLab・Mattermostを構築する

はじめに

 MattermostAPIを使って色々試してみたいと思い、サクッとGitLab環境を構築しようと思ったら思いの外ハマりまくったので、やったことを残しておきます。
やりたいこととしては、DockerForWindowsを用いてGitLab環境を構築する、です。

動くもの

GitHub上に置いています。(https://github.com/shimi58/CentOS8_GitLab)

ただし、Mattermost設定に関しては構築する毎に変わってくるので後述の手順が必要。

動作確認環境 バージョン
Windows10 Home Edition バージョン2004
Docker for Windows 2.4.0.0

※GitLabのDockerは、DockerForWindows公式サポート外なんですよねぇ。。ポートフォワーディングがうまく行かず(80→80はうまくいくけど、8080→80とかだと繋がらなくなる)、そういうことかなぁと。
image.png

環境構築

Docker上でCentOS8構築

Dockerfileに記述していきます。

出来上がりは以下のとおり。

FROM centos:8

# 日本語化
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial && \
    dnf -y upgrade && \
    dnf -y install glibc-locale-source && \
    dnf clean all && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# Gitlabインストール用にLANGをC.UTF-8に変更しておく
ENV LANG="C.UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8"

# rootパスワード設定
RUN echo "root:root" | chpasswd

# =====
# BASE packages
# =====
RUN dnf install -y  openssl openssl-devel openssh openssh-server wget sudo unzip  which tree git firewalld

# =====
# GitLab CEをインストール
# =====
RUN curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

RUN dnf install -y gitlab-ce

docker-compose.yml
version: '3'
services:
  centos8:
    container_name: "centos8"
    build: ./
    tty: true
    privileged: true
    command: /sbin/init   
    ports:
      - "2222:22"
      - "9080:9080" #GitLab用
      - "9081:9081" #GitLabMattermost用
      - '10443:443'
    volumes:
      # 公式に則って永続化
      - './srv/gitlab/config:/etc/gitlab'   #GitLab定義ファイルを配置
      - './srv/gitlab/logs:/var/log/gitlab' #GItLabログファイル出力
      - './srv/gitlab/data:/var/opt/gitlab' #GItLabデータ格納

補足

  • 日本語環境設定

    # 日本語化
    RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial && \
        dnf -y upgrade && \
        dnf -y install glibc-locale-source && \
        dnf clean all && \
        localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
        ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    
    # Gitlabインストール用にLANGをC.UTF-8に変更しておく
    ENV LANG="C.UTF-8" \
        LANGUAGE="ja_JP:ja" \
        LC_ALL="ja_JP.UTF-8"
    

    こちら(https://qiita.com/polarbear08/items/e5c00869c7566db5f7b8 )を参考にさせていただきました。
    LANGをC.UTF-8にしておかないと、「gitlab-ctl reconfigure」のDBマイグレーションあたりで止まるので要注意。

  • GitLab CEをインストール

    RUN curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
    
    RUN dnf install -y gitlab-ce
    

    こちらは公式にある手順の通りです。(公式だとサンプルはgitlab-eeになっているので注意)

  • データ永続化

    docker-compose.yml
        volumes:
          # 公式に則って永続化
          - './srv/gitlab/config:/etc/gitlab'   #GitLab定義ファイルを配置
          - './srv/gitlab/logs:/var/log/gitlab' #GItLabログファイル出力
          - './srv/gitlab/data:/var/opt/gitlab' #GItLabデータ格納
    

    こちらを設定しておくと、コンテナを落としてもデータが保持された状態になる

構築手順

  1. 前述のDockerfile、docker-compose.ymlを任意のディレクトリに配置する

  2. 配置したディレクトリに移動し、コンテナを起動する

    docker-compose up -d
    
  3. gitlab.rbを所定のフォルダに配置する

    srv
    └─gitlab
        ├─config
        │      gitlab.rb
        │
        ├─data
        └─logs
    

    このファイルはこちら(https://github.com/shimi58/CentOS8_GitLab )に。

    ※最初は後述のMattermostの設定をコメントアウトしたほうがいいかも。(Applicationsに出てこなくなったり、手順通りできなくなる可能性あり)

  4. GitLabのポートを設定する

    gitlab.rb
    external_url 'http://localhost:9080'
    
  5. GitLab Mattermostを有効化する

    gitlab.rb
    mattermost_external_url 'http://localhost:9081'
    mattermost['enable'] = true
    
  6. コンテナにログインする

    docker exec -it centos8 bash
    

    ※DockerForWindowsのCLIからログインすると、LANG設定まわりが反映されないので、powershellからログインしている
    image.png
    ※LANG設定が期待通り

  7. GitLab設定を反映する

    sudo /opt/gitlab/embedded/bin/runsvdir-start &
    gitlab-ctl reconfigure
    

    ※「gitlab-ctl reconfigure」単独だと途中で止まるので、こちら(https://teratail.com/questions/229107 )を参考に、runsvdir-start をバックグラウンド実行してから reconfigure。

    初回は5分弱はかかります。

  8. 反映が終わったら、GitLabにアクセス

    http://localhost:9080
    

    ※ログインできることを確認する

- このタイミングでMattermostも表示できる

    ```url
    http://localhost:9081
    ```

補足

  • 以降はMattermostのSSO連携の手順となる
  1. パスワード初期設定を終え、ログイン

    image.png
    ※初期IDは「root」

  2. Mattermostの設定を確認する

    • 「Admin Area」→「Applications」に移動
    • すでにMattermost用の定義があればそれを使用し、なければ新規に作成する(手順通りやると最初から項目が出てくるはず、、)

    image.png

    ※こちら(https://qiita.com/TomoyukiSugiyama/items/0d828ee2325095a7f247 )を参考にさせていただきました。

  3. 上述で確認した、「Application ID」、「Secret」をgitlab.rbに反映する
    あわせて、必要な設定を追加する

    gitlab.rb
    mattermost['gitlab_enable'] = true #SSO有効化
    mattermost['gitlab_id'] = "5e7f43cdf588e92c8b0ca589832c64dd5094969c5848667a09e50ffe4834c065"      #Application ID
    mattermost['gitlab_secret'] = "23791f7219f6782f38c9c1f462c5e715e88216ee13d3513a122dc9c302ba130b"  #secret
    mattermost['gitlab_auth_endpoint'] = "http://localhost:9080/oauth/authorize" #GitLabのURLを記載する
    mattermost['gitlab_token_endpoint'] = "http://localhost:9080/oauth/token"    #GitLabのURLを記載する
    mattermost['gitlab_user_api_endpoint'] = "http://localhost:9080/api/v4/user" #GitLabのURLを記載する
    
  4. GitLab設定を反映する

    gitlab-ctl reconfigure
    
  5. Mattermostから、「Sign in with GitLab」を選択し、ログインする

    image.png
    ※うまく疎通が通ったらこの画面に移行するので、「Anthorize」を選択。

  6. Mattermost画面に遷移することを確認する

    image.png

さいごに

 今回構築したGitLabですが、COREi7、メモリ16Gでもめちゃんこ重たいです。
image.png
※CPUメモリともにめっちゃ頑張ってます。。
ということで、ようやくMattermostAPIが触れる下地ができたので、次はAPI触っていきたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerForWindowsでGitLab・Mattermostを構築する

DockerForWindowsでGitLab・Mattermostを構築する

はじめに

 MattermostAPIを使って色々試してみたいと思い、サクッとGitLab環境を構築しようと思ったら思いの外ハマりまくったので、やったことを残しておきます。
やりたいこととしては、DockerForWindowsを用いてGitLab環境を構築する、です。

動くもの

GitHub上に置いています。(https://github.com/shimi58/CentOS8_GitLab)

ただし、Mattermost設定に関しては構築する毎に変わってくるので後述の手順が必要。

動作確認環境 バージョン
Windows10 Home Edition バージョン2004
Docker for Windows 2.4.0.0

※GitLabのDockerは、DockerForWindows公式サポート外なんですよねぇ。。ポートフォワーディングがうまく行かず(80→80はうまくいくけど、8080→80とかだと繋がらなくなる)、そういうことかなぁと。
image.png

環境構築

Docker上でCentOS8構築

Dockerfileに記述していきます。

出来上がりは以下のとおり。

FROM centos:8

# 日本語化
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial && \
    dnf -y upgrade && \
    dnf -y install glibc-locale-source && \
    dnf clean all && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# Gitlabインストール用にLANGをC.UTF-8に変更しておく
ENV LANG="C.UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8"

# rootパスワード設定
RUN echo "root:root" | chpasswd

# =====
# BASE packages
# =====
RUN dnf install -y  openssl openssl-devel openssh openssh-server wget sudo unzip  which tree git firewalld

# =====
# GitLab CEをインストール
# =====
RUN curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

RUN dnf install -y gitlab-ce

docker-compose.yml
version: '3'
services:
  centos8:
    container_name: "centos8"
    build: ./
    tty: true
    privileged: true
    command: /sbin/init   
    ports:
      - "2222:22"
      - "9080:9080" #GitLab用
      - "9081:9081" #GitLabMattermost用
      - '10443:443'
    volumes:
      # 公式に則って永続化
      - './srv/gitlab/config:/etc/gitlab'   #GitLab定義ファイルを配置
      - './srv/gitlab/logs:/var/log/gitlab' #GItLabログファイル出力
      - './srv/gitlab/data:/var/opt/gitlab' #GItLabデータ格納

補足

  • 日本語環境設定

    # 日本語化
    RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial && \
        dnf -y upgrade && \
        dnf -y install glibc-locale-source && \
        dnf clean all && \
        localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
        ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    
    # Gitlabインストール用にLANGをC.UTF-8に変更しておく
    ENV LANG="C.UTF-8" \
        LANGUAGE="ja_JP:ja" \
        LC_ALL="ja_JP.UTF-8"
    

    こちら(https://qiita.com/polarbear08/items/e5c00869c7566db5f7b8 )を参考にさせていただきました。
    LANGをC.UTF-8にしておかないと、「gitlab-ctl reconfigure」のDBマイグレーションあたりで止まるので要注意。

  • GitLab CEをインストール

    RUN curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
    
    RUN dnf install -y gitlab-ce
    

    こちらは公式にある手順の通りです。(公式だとサンプルはgitlab-eeになっているので注意)

  • データ永続化

    docker-compose.yml
        volumes:
          # 公式に則って永続化
          - './srv/gitlab/config:/etc/gitlab'   #GitLab定義ファイルを配置
          - './srv/gitlab/logs:/var/log/gitlab' #GItLabログファイル出力
          - './srv/gitlab/data:/var/opt/gitlab' #GItLabデータ格納
    

    こちらを設定しておくと、コンテナを落としてもデータが保持された状態になる

構築手順

  1. 前述のDockerfile、docker-compose.ymlを任意のディレクトリに配置する

  2. 配置したディレクトリに移動し、コンテナを起動する

    docker-compose up -d
    
  3. gitlab.rbを所定のフォルダに配置する

    srv
    └─gitlab
        ├─config
        │      gitlab.rb
        │
        ├─data
        └─logs
    

    このファイルはこちら(https://github.com/shimi58/CentOS8_GitLab )に。

    ※最初は後述のMattermostの設定をコメントアウトしたほうがいいかも。(Applicationsに出てこなくなったり、手順通りできなくなる可能性あり)

  4. GitLabのポートを設定する

    gitlab.rb
    external_url 'http://localhost:9080'
    
  5. GitLab Mattermostを有効化する

    gitlab.rb
    mattermost_external_url 'http://localhost:9081'
    mattermost['enable'] = true
    
  6. コンテナにログインする

    docker exec -it centos8 bash
    

    ※DockerForWindowsのCLIからログインすると、LANG設定まわりが反映されないので、powershellからログインしている
    image.png
    ※LANG設定が期待通り

  7. GitLab設定を反映する

    sudo /opt/gitlab/embedded/bin/runsvdir-start &
    gitlab-ctl reconfigure
    

    ※「gitlab-ctl reconfigure」単独だと途中で止まるので、こちら(https://teratail.com/questions/229107 )を参考に、runsvdir-start をバックグラウンド実行してから reconfigure。

    初回は5分弱はかかります。

  8. 反映が終わったら、GitLabにアクセス

    http://localhost:9080
    

    ※ログインできることを確認する

- このタイミングでMattermostも表示できる

    ```url
    http://localhost:9081
    ```

補足

  • 以降はMattermostのSSO連携の手順となる
  1. パスワード初期設定を終え、ログイン

    image.png
    ※初期IDは「root」

  2. Mattermostの設定を確認する

    • 「Admin Area」→「Applications」に移動
    • すでにMattermost用の定義があればそれを使用し、なければ新規に作成する(手順通りやると最初から項目が出てくるはず、、)

    image.png

    ※こちら(https://qiita.com/TomoyukiSugiyama/items/0d828ee2325095a7f247 )を参考にさせていただきました。

  3. 上述で確認した、「Application ID」、「Secret」をgitlab.rbに反映する
    あわせて、必要な設定を追加する

    gitlab.rb
    mattermost['gitlab_enable'] = true #SSO有効化
    mattermost['gitlab_id'] = "5e7f43cdf588e92c8b0ca589832c64dd5094969c5848667a09e50ffe4834c065"      #Application ID
    mattermost['gitlab_secret'] = "23791f7219f6782f38c9c1f462c5e715e88216ee13d3513a122dc9c302ba130b"  #secret
    mattermost['gitlab_auth_endpoint'] = "http://localhost:9080/oauth/authorize" #GitLabのURLを記載する
    mattermost['gitlab_token_endpoint'] = "http://localhost:9080/oauth/token"    #GitLabのURLを記載する
    mattermost['gitlab_user_api_endpoint'] = "http://localhost:9080/api/v4/user" #GitLabのURLを記載する
    
  4. GitLab設定を反映する

    gitlab-ctl reconfigure
    
  5. Mattermostから、「Sign in with GitLab」を選択し、ログインする

    image.png
    ※うまく疎通が通ったらこの画面に移行するので、「Anthorize」を選択。

  6. Mattermost画面に遷移することを確認する

    image.png

さいごに

 今回構築したGitLabですが、COREi7、メモリ16Gでもめちゃんこ重たいです。
image.png
※CPUメモリともにめっちゃ頑張ってます。。
ということで、ようやくMattermostAPIが触れる下地ができたので、次はAPI触っていきたいと思います。

追記

永続化効かないかも。。また調べます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeでホストのネットワークの好きなIPを指定して立ち上げる

やりたいこと

docker-compose up ホストのネットワークの好きなIPアドレスを指定して立ち上げる

なんの意味があるの?

基本は不要でnginx-proxyやtreafikなどのサービスディスカバリを使うのが正しい方法だと思う。
とはいえ、それじゃできないまれな↓みたいなユースケースもあると思うので備忘録として残しておく。

  • 社内インフラなどIPを固定にしたいとき
  • IPをずらして、ポートのブッキングを回避したいとき
    • 8080,8081,8082...みたく、どのポートが空いているのかバトルにならないように

やりかた

macvlan のnetwork driverを使う。

docker-compose.yml
version: "3.8"

services:
  web01:
    image: nginx
    networks:
      macvlan:
        ipv4_address: 192.168.1.10
    # ports
    #  - "80:80" dockerのhostネットワークみたく、指定したIPでポートが全開放なので基本は不要
    ...etc

  web01:
    image: nginx
    networks:
      macvlan:
        ipv4_address: 192.168.1.20
    # ports
    #  - "80:80" IPが違うのでポートがブッキングしない
    ...etc

...etc

networks:
  macvlan:
    driver: macvlan
    driver_opts:
      parent: eno1 # 端末のネットワーク・インターフェースを指定する
    ipam:
      config:
        - subnet: 192.168.1.0/24
          gateway: 192.168.1.1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】dockerのコンテナからホストにファイルをコピーする

はじめに

dockerのコンテナからファイルをローカルに持ってきたい場面があった。そこで調査したことをメモとして残しておく。

手順

  1. docker psコマンドを使用し、ファイルをコピーしたいdockerコンテナを調べる
  2. docker cpコマンドを使用し、コンテナからホストにファイルをコピーする

実際にhttpdコンテナの設定ファイルであるhttpd.confをコンテナからローカル(ホスト)にコピーする手順を例として示す。

1.ファイルをコピーしたいdockerコンテナを調べる。

以下のコマンドを実行し、コンテナIDを調べる。

$ docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                               NAMES
1c8caa876b98        httpd:2-alpine         "httpd-foreground"       24 hours ago        Up 24 hours         0.0.0.0:8080->80/tcp                fluentd_docker_httpd_1

上記コマンドより、コンテナIDが1c8caa876b98 とわかった。

2. コンテナからホストにファイルをコピーする

以下のコマンドを実行し、ファイルをコピー

//docker cp [コンテナID]:[コピーしたいファイルパス] [ローカルにコピーしたいパス]
$ docker cp 1c8caa876b98:/usr/local/apache2/conf/httpd.conf conf/

$ ls conf/
./      ../     httpd.conf

コピーできた!

まとめ

  • dockerコンテナからホストにコピーする
    • docker cpコマンドを使用する
docker cp [コンテナID]:[コピーしたいファイルパス] [ローカルにコピーしたいパス]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで[An HTTP request took too long to complete.]のエラーが出た際の対処法。

はじめに

Dockerを使用しており、docker-compose up -dでコンテナを起動しようとした際に、[An HTTP request took too long to complete.]のエラーが出た際の解決法です。

エラー文

今まではコンテナを起動させてもエラーは出なかったが、いきなり同じコマンドでエラーが出た。

ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).

解決方法

結論から言うと、Docker for Windowsを再起動すれば直りました。
・画面右上のDockerのアイコン(クジラのアイコン)をクリック。
Quit Docker Desktopをクリック。
・アプリが終了したら、Docker for Windowsを再起動させます。
docker-compose up -dでコンテナの起動。
無事、Dockerが起動しました。

最後に

最近Dockerを使いはじめたばかりだったので、少し焦りましたが冷静に対処すれば簡単な解決方法でした。備忘録として載せておきます。最後まで読んでいただきありがとうございます:grin:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerのMySQLでdumpファイルを読み込む

目的

  • DockerのMySQLにdumpファイルを読み込む方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
dumpファイル作成MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする
dumpファイル読み込みMySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提条件

  • dumpファイルが自分のPCのローカルに用意されていること。
  • MySQLのコンテナが起動していること。

前提情報

概要

  1. dumpファイルの移動
  2. 読み込み
  3. 確認

詳細

  1. dumpファイルの移動

    1. dumpファイルが設置されているディレクトリまで$ cdコマンドで移動する。
    2. 下記コマンドを実行してdockerコンテナの中にdumpファイルをコピーする。

      $ docker cp dumpファイル名 コンテナ名:/コピー先のdumpファイル名
      
    3. 例えばローカルの~/Downloads直下にあるmy_dump.sqlをコンテナ名「docker_mysql_1」のルートディレクトリ直下にコピーしたい場合は下記のようになる。

      $ docker cp ~/Downloads/my_dump.sql docker_mysql_1:/my_dump.sql
      
  2. 読み込み

    1. 下記コマンドを実行してMySQLのコンテナに入る。

      $ docker exec -it コンテナ名 bash
      
    2. 下記コマンドを実行してdumpファイルを読み込ませる。

      $ mysql -u MySQLユーザ名 -pMySQLのユーザ名に紐付いたパスワード dumpファイルを読み込むDB名 < dumpファイル名
      
  3. 確認

    1. MySQLのコンテナ内で下記コマンドを実行してMySQLにログインする。

      $ mysql -u root -p
      
    2. 下記SQLを実行してdumpファイルの内容が正常に読み込まれテーブルなどが存在していることを確認する。

      use dumpを読み込んだDB;
      show tables;
      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker環境構築してUbuntuコンテナを起動・停止するまで

環境構築がめんどくさいし、仮想環境はISO落としたりインストールしたりめんどくさいし
vagrantというので簡単に仮想環境も作れるみたいなんだけど
Hyper-VとかVM wareとか重いしどうしようと思っているときに
dockerの話を聞いたのでとりあえず入れてみようと思いました。

わりとコンテナ化というワードをきくし、
わざわざリソース割り振るのも面倒なのでWindowsにdocker入れてコンテナの勉強。

困ったことがあればquora( https://jp.quora.com/ )とかで聞けばいいのかな。

ゴール

  • ubuntuをdockerで立ち上げる

インストール

https://www.docker.com/why-docker
+ Download Docker Desktopをクリック
+ DockerDesktop for windowsをクリック
+ GetStableをクリック
・・・407MBダウンロード・・・結局重い。
私のゴミみたいなネットワーク環境では環境ではダウンロードに5分。

  • OKクリック image.png
  • インストール待ち(時間かかる) image.png
  • Windows再起動
    image.png

  • 再起動したらエラーが出ました。Linuxのカーネルがインストールされていないようです。

  • dockerはubuntuやnginx、nodejsなどが動くコンテナを作れるが、それを動かすベースとなるLinuxのカーネルが必要という認識です。
    image.png

  • https://aka.ms/wsl2kernel/
    image.png

  • リンクからWSL2 Linuxカーネル更新プログラムwsl_update_x64.msi をダウンロードしてインストール。

  • ついでに、Linuxカーネルと仮想マシン機能を有効にしておきます。以下のコマンドです。(参考:https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • docker起動 image.png

ubuntuインストール

作ったイメージを上げることも想定していないので、dockerHUBアカウントは作らない。PowerShellやコマンドプロンプトを使いながら以下の流れでコンテナを作って操作

  • ubuntuのイメージをDLコマンド
  • コンテナの作成コマンド
  • コンテナ操作コマンド

dockerにイメージがあるかを確認

docker images

ubuntuのイメージをDL

docker pull ubuntu

dockerのコンテナを作成

docker run -it --name test ubuntu

コンテナの一覧を表示

docker ps -a

コンテナの停止

docker stop test

コンテナの開始

docker start test

コンテナの中に入ってコマンドを打つ

docker exec -it test bash

コンテナを削除

docker rm test

ubuntuをつかえたけど。

ifconfigip address showも使えなかった。
イメージで何ができるかは明確にしておく必要がある。

まとめ

  • dockerのざっくりしたコマンドは理解。オプションはひとまずpull, run , exec, start, stopを覚える。
  • 落してきたイメージはできること、できないことが決まっている。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む