XserverVPS+Ubuntu+Docker Samba-DC

Samba DC

今回は検証目的で、通常はVPSで直接Dockerを公開するような運用はNGで、VMを経由する。

●●●=利用環境のグローバルIPアドレス

・ufw

ufw allow from ●●● to any port 9922,3306,53,88,135,139,389,445,464,636,3268,3269,49152:49252 proto tcp
ufw allow from ●●● to any port 53,88,123,137:138,389,464 proto udp

・フォルダ作成

cd /home
mkdir samba
cd samba
mkdir data
mkdir config

chmod 700 data
chmod 700 config

Docker

vim docker-compose.yml

・もし再実行で既にコンテナがあるようだったら

docker ps -a
docker compose down
※カレントディレクトリにdocker-compose.ymlがある状態で実行

・通常終了しない場合
docker ps -a
docker rm -f コンテナID

・バインドボリューム削除
rm -rf ./data/* && rm -rf ./config/*

※再起動の場合
docker restart samba-dc

※一時停止の場合
docker pause samba-dc
docker unpause samba-dc

・起動

docker compose up -d
※カレントディレクトリにdocker-compose.ymlがある状態で実行
※dはバックグランド実行

・停止
※もし自動で再起動を繰り返している場合止める
docker stop samba-dc

・初回のみエラー

53ポートが使用中とのことでエラー。

lsof -i :53

vim /etc/systemd/resolved.conf
DNSStubListener
>no
に変更する。
systemctl restart systemd-resolved

SambaRPCポート変更

※直接変更する方法
docker exec -it samba-dc vi /etc/samba/smb.conf

rpc server dynamic port range = 49152-49172

rpc server dynamic port range = 49152-49252
に変更。

docker exec -it samba-dc supervisorctl restart samba

※ポートが多すぎるコンテナ生成で失敗する。(タイムアウトしてしまう)
ポートが少なすぎるとADの同期で問題が発生する。

エラー確認

journalctl -u docker
docker logs -f samba-dc
docker exec -it samba-dc tail -f /var/log/samba/log.smbd
docker exec -it samba-dc tail -f /var/log/ntp

NTP変更

docker logs samba-dc | grep ntp
でntp系のエラー確認

・ntpサーバー確認
docker exec -it samba-dc ntpq -p
現在のntpサーバー(*)を確認しping
docker exec -it samba-dc sntp xxx.xxx.xxx.xxx

/etc/ntp.conf or /etc/ntpd.conf
使用されている方の調べ方(ps aux | grep ntpd)
を編集する。

docker exec -it samba-dc vi /etc/ntpd.conf

server ntp.nict.jp iburst prefer
を追加し、
ntpsigndsocket /usr/local/samba/var/lib/ntp_signd/

ntpsigndsocket /var/lib/samba/ntp_signd/
に変更する

docker exec -it samba-dc supervisorctl restart ntpd

・ntp.drift作成

docker exec -it samba-dc mkdir -p /var/lib/ntp
docker exec -it samba-dc touch /var/lib/ntp/ntp.drift
docker exec -it samba-dc chown ntp:ntp /var/lib/ntp
docker exec -it samba-dc chown ntp:ntp /var/lib/ntp/ntp.drift
docker exec -it samba-dc chmod 755 /var/lib/ntp
docker exec -it samba-dc chmod 664 /var/lib/ntp/ntp.drift

docker exec -it samba-dc supervisorctl restart ntpd

・一応確認

アクセス権限
cd /var/lib/ && ls -la
chown ntp:ntp /var/lib/ntp
chmod 755 /var/lib/ntp
になっていればOK。

ntpユーザがいるかどうか
id ntp

・usersharesフォルダ作成
docker exec -it samba-dc mkdir -p /var/lib/samba/usershares

SambaTool(DNS逆引き)

VPSアドレス[AAA.BBB.CCC.DDD]
から
samba-dc.xxx.local
を取得する方法

docker exec -it samba-dc samba-tool dns zonecreate localhost CCC.BBB.AAA.in-addr.arpa –username=administrator –password=xxx

docker exec -it samba-dc samba-tool dns add localhost CCC.BBB.AAA.in-addr.arpa DDD PTR samba-dc.xxx.local –username=administrator –password=xxx

docker exec -it samba-dc supervisorctl restart samba

Windowクライアント設定

Win11でNASにアクセスできなくなる対策と同じ設定。
(安全でないゲスト ログオン等)

ncpa.cpl
利用しているNICのDNSをVPSのIPアドレスにする。

sysdm.cpl
コンピュータ名タブ>変更
ドメインを選択しドメイン名を入力する。

ユーザーはadministrator
パスワードはdocker-compose
で指定したパスワードを入力する。

再起動したらログイン画面で
ドメイン名\administrator
のように入力しログインできる。初回ログイン時はかなり時間がかかる。

※アカウントもADに参加しないと以下コマンドは使えないが、このタイミングでローカルorMSアカウントを入力して、端末だけAD参加という状態も可能。

・Windows RSAT 有効化(ユーザー参加必須)

システム>オプション機能>機能表示>使用可能な機能を表示する
RSAT: ActiveDirectoryDomainServices およびライトウェイトディレクトリサービスツール
をチェックし追加すると、
Active Directory サイトとサービス
Active Directory ドメインと信頼関係
Active Directory ユーザーとコンピュータ
Active Directory 管理センター(Samba-DCでは利用不可)
が有効化される。

RSAT: グループポリシー管理ツール
をチェックし追加すると、
gpmc.msc
が有効化される。

・DNSが問題ないか確認する。

nslookup ドメイン
これでVPSのIPアドレスが返ってくればOK。

nslookup VPSのIPアドレス
これでドメイン名が返ってくればOK。

・接続状況(信頼関係)確認※管理者

nltest /sc_verify:ドメイン名
nltest /dsgetdc:ドメイン名

・時刻関係※管理者

w32tm /config /syncfromflags:domhier /update
※DCから取得に変更

w32tm /query /status
ソースを確認

w32tm /resync
同期実行

・gpupdate・

※コンピュータのみ更新場合
gpupdate /target:computer /force

エラーが発生した場合
eventvwr>アプリケーションとサービスログ>Microsoft>Windows>GroupPolicy
で確認する。

・\\xxx.local\sysvolアクセス時、このファイルは他のコンピュータから取得したものです。とついてしまう場合。

Win+R>inetcpl.cpl>セキュリティ>信頼済みサイト

\\xxx.local
を登録する。

・ドメインコントローラーへのポートテスト
Test-NetConnection “xxx.local” -Port 389

・接続テスト(ユーザダイアログ表示させる)

Test-ComputerSecureChannel -Repair -Verbose -Credential (Get-Credential)
※ドメイン\ユーザー名で入力する

・端末パスワードの更新
Reset-ComputerMachinePassword -Credential (Get-Credential)
※Smaba-DC内では、ユーザーと、端末、それぞれパスワードが存在するが端末のパスワードは自動で管理されユーザーが意識する必要はない。

※接続がうまくいかない場合sysdm.cplから一度抜けて再度登録すると直ることが多い。

・Win11ユーザープロファイルの削除

テストしているとプロファイルが多くできてしまう。
sysdm.cpl>詳細設定>ユーザープロファイル>設定
ここで不要なプロファイルを削除できる。

メモ:コンテナエントリポイントを調べて
スクリプトを追加する方法

※この方法だとinit.sh後の処理ができないので不採用。

・エントリポイントのスクリプトを調べる
docker exec -it samba-dc bash
cat /proc/1/cmdline

・作成

vim setup.sh

#!/bin/sh
sed -i ‘s|xxx|xxx|’ /etc/samba/smb.conf
sed -i ‘s|xxx|xxx|’ /etc/ntpd.conf

docker-composeで呼び出す。

volumes:
– ./setup.sh:/setup.sh
command: sh -c “/setup.sh && exec /init.sh”

メモ:シンボリックリンク

バインドしているexternalに保存
上記と同じように、エントリスクリプト内でcpできないエラーになる。

#!/bin/sh
ln -sf /etc/samba/external/smb.conf /etc/samba/smb.conf
ln -sf /etc/samba/external/ntpd.conf /etc/ntpd.conf

※lnコマンド
ln -sf [実体] [リンク]

ls -laの見え方
ntpd.conf(リンク) -> /etc/samba/external/my_ntpd.conf(実体)

メモ:Docker Network

docker network ls

・基本
xxx bridge bridge local
xxx host host local
xxx none null local

・削除方法
docker network rm samba_default

・種類
bridge
host:portsの設定は意味ない
macvlan:VPSだと難しい

メモ:SambaTool(DNSレコード)

・DBチェック
docker exec -it samba-dc samba-tool dbcheck –cross-ncs –fix –username=administrator –password=xxx

・ADに登録されている端末取得
docker exec -it samba-dc samba-tool computer list
docker exec -it samba-dc samba-tool computer show xxx

・ADに登録されているユーザー/PCリスト取得
docker exec -it samba-dc samba-tool user list
docker exec -it samba-dc samba-tool computer list

・PC追加

docker exec -it samba-dc samba-tool computer create PCNAME –user=administrator –password=xxx

・ゾーン一覧取得
docker exec -it samba-dc samba-tool dns zonelist localhost –username=administrator –password=xxx

xxx.localと_msdcs.xxxlocalが返ってくる。

・xxx.localのレコード一覧取得
docker exec -it samba-dc samba-tool dns query localhost xxx.local @ ALL –username=administrator –password=xxx

・_msdcs.xxx.localのレコード一覧取得
docker exec -it samba-dc samba-tool dns query localhost _msdcs.xxx.local @ ALL –username=administrator –password=xxx

・下位レコード取得
docker exec -it samba-dc samba-tool dns query localhost _msdcs.xxx.local gc ALL –username=administrator –password=xxx

・Aレコード削除
docker exec samba-dc samba-tool dns delete localhost xxx.local samba-dc A 172.19.0.2 -UAdministrator%xxx

・Aレコード登録
docker exec samba-dc samba-tool dns add localhost xxx.local samba-dc A サーバーIPアドレス -UAdministrator%xxx

メモ:アクセス制御リスト(ACL)

docker exec -it samba-dc samba-tool ntacl sysvolreset –username=administrator –password=xxx

docker exec -it samba-dc samba-tool ntacl sysvolcheck –username=administrator –password=xxx

docker exec -it samba-dc supervisorctl restart samba

・ACL権限関連リセット

samba-tool ntacl sysvolreset
samba-tool ntacl sysvolcheck

VPSで稼働しているサービス整理

安価なプランのIndigoVPSで色々なOSS運用していたが、1つにまとめることにした。今回はXserverVPS。すでにOSSは稼働状態なので、新しい環境と並行稼働してから切り替えることにした。

ssh

sudo vim /etc/ssh/sshd_config
Port
>9922

PasswordAuthentication
ChallengeResponseAuthentication
GSSAPIAuthentication
>no

sudo service ssh restart

ufw

※Xserverにもパケットフィルタがあるので要設定。

sudo vim /etc/default/ufw
>IPV6=no

sudo ufw allow from ●●●.●●●.●●●.●●● to any port 9922 proto tcp

sudo ufw enable
sudo ufw status

・メモ

削除
sudo ufw status numbered
sudo ufw delete [番号]

Docker

sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
“deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo “$VERSION_CODENAME”) stable” | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

MySQL

このMySQLは外部接続用で単独で使用。
今までは直接インストールしていたが今回はDocker。

sudo mkdir project_management
cd project_management

sudo mkdir data
sudo chown -R 999:999 ./data
sudo chmod 700 ./data

sudo mkdir conf.d
sudo chown -R 999:999 ./conf.d
sudo chmod 700 ./conf.d

sudo vim docker-compose.yml

sudo docker compose up d

cd conf.d
sudo touch external.cnf
sudo chown 999:999 external.cnf
sudo chmod 644 external.cnf

sudo vim external.cnf
[mysqld]
bind-address = 0.0.0.0
require_secure_transport = ON

sudo docker restart production_management

sudo ufw allow from ●●●.●●●.●●●.●●● to any port 3306 proto tcp
※Xserverのパケットフィルタも要設定。

dataフォルダの
client-cert.pem
client-key.pem
ca.pem
をダウンロード。

・pfx作成

pass=$(head /dev/urandom | tr -dc a-km-np-z1-9 | head -c 13);openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.pfx -passout pass:${pass};echo $pass;

メモ

コンテナ一覧
sudo docker ps

コンテナに入る
docker exec -it production_management bash

コンテナ再起動
sudo docker restart production_management

コンテナ削除
sudo docker rm -f production_management

MySQL設定ファイル
/etc/my.cnf

MySQL Workbench

Standard TCP/IPを選択。

・Parametersタブ
Hostname:IPアドレス
Port:3306
Username:DBユーザー
パスワード:DBパスワード

・SSLタブ
Use SSL:Require and Verify CA
SSL Key File:client-key.pem
SSL CERT File:client-cert.pem
SSL CA File:ca.pem
ダウンロードしたファイルを選択。登録後ファイルの移動はできない。

これでVPS上のDockerのMySQLに外部から接続することが可能。

MySQLバックアップ

cd /home/project_management
sudo mkdir backup
sudo chmod 700 backup

sudo vim backup.sh

weekday=date +%w
f=/home/project_management/backup/dump_${weekday}.sql
docker exec production_management mysqldump –single-transaction -u root -p●●● project_management > $f

sudo chmod 700 backup.sh

・cron

cd /etc/cron.d
sudo vim /etc/cron.d/mysql_backup

0 2 * * * root /home/project_management/backup.sh

sudo chmod 600 mysql_backup

sudo systemctl status cron

VPS+Docker Samba-DC

Dockerfile / DockerCompose メモ

ファイルの違い

Dockerfile:カスタマイズしたイメージを作成するためのファイル
docker-compose.yml:イメージからコンテナを作成し複数のコンテナを組み合わせて実行するdocker-composeのための設定ファイル

基本的な流れ

公開イメージをpull
公開イメージ+Dockerfileをbuildしオリジナルイメージを作成
オリジナルイメージをrunしてコンテナとして起動
(コンテナは一つのプロセスとして動作している)

Dockerコマンド

ビルド:
ベースイメージに対して機能を加えて独自のイメージを作り出す

docker build . -t イメージ名
カレントディレクトリのdockerfileを参照
tオプションで名前を指定する。

コンテナ実行:
docker run イメージ名
-d バックグラウンドで実行
–name コンテナに名前をつける(ハイフン*2)
-p ポートフォーワード(ホスト側:コンテナ側)

Dockerfileファイル命令

FROM:
ベースイメージの設定

MAINTAINER:
製作者

ENV:
環境変数
コンテナ用の環境変数

ARG:
環境変数
ビルド用(Dockerfile内)一時的な環境変数

WORKDIR:
作業ディレクトリ

RUN:
コマンド実行(イメージ作成時)

CMD:
コマンド実行(コンテナ実行時)

EXPOSE:
ポート解放
(docker run -p のみでポートは開く)

USER:
ユーザー切り替え

DockerCompose.yml命令

設定値は「:」
文字列は「’」「”」
複数の値は「-」
コメントは「#」

Docker Compoesごとに独立したネットワークになる。

version:
バージョン

services:
コンテナの名前定義

volumes:
コンテナが利用するボリューム定義

networks:
コンテナが利用するネットワーク定義

・サービスの命令

iamge
利用するイメージを指定する。

Dockerfileを利用する場合、build
(ymlから相対パスで指定)

volumes
ホスト:コンテナと記述する。

restart
docker run -d –restart
と同じ

depends_on
compose up/down
したときに指定したサービスが先に起動/終了するようになる。

environment
環境変数設定。

ports
ポートマッピング(ホスト:コンテナ)
(docker run -p xxx:xxxと同じ)

tty
docker run -it
の-tにあたる設定。

Volumes

バインドとボリュームがある。
ボリュームの場合、dockerエンジンの管理領域に永続化ストレージができる。

・ボリュームマウント

volumes:
 db_data:

ボリューム(パス指定のみ)
services:
 wordpress:
  volumes:
   - /var/www/html

WSLでの位置
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\ランダム\_data

名前付きボリューム
services:
 wordpress:
  volumes:
   - aaa:/var/www/html
volumes:
 aaa:

WSLでの位置
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\wordpressfolder_aaa\_data

・バインド

services:
 wordpress:
  volumes:
   - ./html:/var/www/html

.はdocker-compose.ymlのあるパスを指す。

WindowsのDockerDesktopの場合、
– C:\Users\mail\Desktop\html:/var/www/html
のように指定することもできる。
(~を利用するとWindowsからパスが見えなくなる)

WordPressを実行してみる

Win10でGUIのDockerDesktopを利用。

・docker-compose.yml作成

適当なフォルダを作成し、その中に、
docker-compose.yml
を作成する。
(フォルダ名がContainer/Apps名になる)

・Volumes,Containers/Apps作成

作成したフォルダに移動し、
docker-compose up -d
を実行する。

・docker-compose.ymlを修正した場合

Volumes,Containers/Appsをクリアしてコマンドを再実行する。
(docker-compose.ymlの場所を変えれば別のVolumes,Containers/Appsとして作成される)

・ブラウザのアクセス

http://localhost:8000

・エクスプローラのアクセス
(パス指定のみした場合のボリューム)

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes

・シェルのアクセス

docker ps
一覧を確認する。

docker exec -it wordpress1-wordpress-1 /bin/bash
接続する。

exit
終了する。

・未使用ボリューム一括削除

docker volume prune

Mattermostを実行してみる

git config –global core.autocrlf input
WSLで利用する場合、Winでcloneすると改行コードが変換されてしまうため。

確認
git config core.autocrlf

・評価版の場合

docker run –name mattermost-preview -d –publish 8065:8065 mattermost/mattermost-preview

***

本番の場合

・クローン

https://github.com/mattermost/mattermost-docker.git

・docker-compse.yamlを編集

args:
– edition=team
のコメントを外す。

・コンテナ作成

docker-compose up -d

Apache/MySQL/PHPを実行してみる

・フォルダ構成

php7.2-apache
└dockerfile
docker-compose.yml

・Dockerfile

FROM php:7.2-apache
RUN docker-php-ext-install pdo_mysql

・コマンド

docker-compose.ymlでビルドされるが、
もし単体でDockerfileをビルドする場合、
docker build . -t php7.2

・docker-compose.yml

・コマンド

docker-compose up -d

・イメージの名前を指定する場合

services:
 fuga:
  build: ここでdockerfileのフォルダ名
  image: 付けたい名前
(pullはされない)

コマンドで実行

ほぼDockerDesktopで作業しているが一部コマンドでやる場合。

・イメージ取得

プル
docker pull node

一覧
docker images

・コンテナ作成

(docker run [オプション] image [コマンド])
docker run -it –name container -p 81:80 -v C:\Users\mail\Desktop\test:/home node /bin/bash

–rm 利用後コンテナ削除
–name 作成するコンテナに名前をつける
-it 中に入れる
-d バックグラウンドで起動
-p ポートマッピング
-v バインド(ホスト:コンテナ)
ここでのコマンドは/bin/bashとなる。最初に実行するコマンド。

MySQL

・構成

dockerfile
my.cnf

・dockerfile

FROM mysql:8.0
ENV MYSQL_ROOT_PASSWORD passw0rd!
ADD my.cnf /etc/mysql/conf.d/my.cnf

・my.cnf

[mysqld]
character-set-server=utf8

・実行

docker build . -t mysql8
docker run -d –name mysql8 -p 49152:3306 mysql8

SQL Server

・構成

dockerfile

・dockerfile

FROM mcr.microsoft.com/mssql/server:2019-latest
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=passw0rd!
ENV MSSQL_PID=Express
ENV MSSQL_LCID=1041
ENV MSSQL_COLLATION=Japanese_CI_AS

※これでExpressを利用できる。

・イメージ、コンテナ作成

docker build . -t mssql2019
docker run –name mssql2019 -d -p 49153:1433 mssql2019

・コマンド説明

以下のbuild,runはcmdで実行してもDockerDesktopに反映される。

docker build -t [作成するオリジナルイメージ名]
(カレントディレクトリのdockerfileを利用する)

docker run –name mssql2022 -d -p 49153:1433 [利用するオリジナルイメージ名]
–name 作成するコンテナに名前をつける
-d バックグラウンドで起動
-p ポートマッピング

・接続
サーバー:localhost,49153
ログインID:sa
パスワード:passw0rd!

Media Wiki

・フォルダを作り、
docker-compose.yml
を作る。


/var/www/html
を最初からマウントしていると起動しない

・フォルダで、
docker-compose up -d
を実行。

・必要なイメージがダウンロードされ、コンテナが起動する。

・http://localhost:8080
にアクセス

DBはSQLiteを選んであとは、そのまま。
ウィキ名を付け、管理アカウントを指定する。
設定が完了すると、
LocalSettings.php
をダウンロードする。

・コンテナを削除

保存したLocalSettings.phpを移動。

docker-compose.ymlに以下追加。

・コンテナを再度作成

・フォルダ構成
C:\Users\USER\Desktop\MediaWiki
-www
–data
–html
-docker-compose.yml
-LocalSettings.php

DockerDesktop用Hyper-V の設定

DockerDesktopを実行している環境はHOME

optionalfeatures
を実行すると、下記の通り似た名前がでてくる。

・Hyper-V(Hyper-V プラットフォーム/Hyper-V 管理ツール)
仮想化ツール本体
※Hyper-Vだけ有効化しておけば以下は無効化でもOK。
※利用する場合、タスクマネージャからCPU>仮想化が有効かどうか確認。

・仮想マシンプラットフォーム
Hyper-Vのコア部分

・Windowsハイパーバイザープラットフォーム
VirtualBoxなど(Type2)の仮想化ソフトをHyper-V経由で使えるようにする。

・Linux用Windowsサブシステム
WSL

***

仮想マシンプラットフォームはHyper-Vとは違いHOMEでも有効になっており、WSLなど他の機能からも利用されている。

・確認方法

bcdedit /enum {current}
を実行し、
hypervisorlaunchtype
を確認し、Autoの場合、仮想マシンプラットフォームが起動している。

・停止
bcdedit /set hypervisorlaunchtype off
・有効
bcdedit /set hypervisorlaunchtype auto

VirtualBoxとの共存させる場合、仮想マシンプラットフォームを停止すると起動できる。

・フォーマット

OVA:オープンフォーマット
VDI:VirtualBox
VHD/VHDX:Microsoft
VMDK:VMware

・VDIからVHDの変換

“C:\Program FIles\oracle\VirtualBox\VBoxManage.exe” clonemedium disk “MSEdge – Win10-disk001.vdi” Win10.vhd -format VHD