Docker上のsamba addc プライマリーセカンダリー設定方法（Rsync）

うまくいっていないけど、載せておく

Dockerを使用してコンテナ内にSamba Active Directory Domain Controller（Samba AD DC）をインストールする手順を以下に示します。

1. **Dockerのインストール**:
   もしまだDockerがインストールされていない場合、Ubuntuコンテナ内にDockerをインストールします。以下のコマンドを使用します：

   ```shell
   sudo apt update
   sudo apt install docker.io
   systemctl start docker
   systemctl enable docker
   ```
次に、下記を参考に設定
https://tech.librastudio.co.jp/entry/index.php/2018/07/14/post-1924/

dockerコマンドはデフォルトではroot権限なしには叩けないようになっています。 そこでdockerグループにユーザーを追加し、sudoなしでも叩けるようにしましょう。

まず以下を実行し、現在ログインしているユーザーをdockerグループへ追加。

```shell
sudo gpasswd -a $(whoami) docker
```
 

次にdocker.sock にグループでの書き込み権限を付与。一度ログインしなおす。
```shell
sudo chgrp docker /var/run/docker.sock
gnome-session-quit
```
 

最後にdocker daemonを再起動します。
```shell
sudo service docker restart
```

**以下はプライマリーでの設定**

1. **コンテナの作成と起動**:
   Dockerコンテナ内にUbuntu-sambaを作成し、それを起動します。

   ```shell
   docker run -it --name ubuntu-samba ubuntu /bin/bash
   ```

下記エラー
    ```shell
    docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create?name=ubuntu-samba": dial unix /var/run/docker.sock: connect: permission denied.
    ```
下記コマンドで対処
   ```shell
   sudo chmod 666 /var/run/docker.sock
   ```
https://qiita.com/Nw3965/items/8e75da0012cb7a451cc2

再度コンテナの作成



2. **コンテナ内でのSamba AD DCのインストール**:
   コンテナ内でSambaをインストールし、Samba AD DCをセットアップします。

   ```shell
    docker exec -it ubuntu-samba /bin/bash 
    # コンテナ内での作業
   apt update
   apt install -y samba
   samba-tool domain provision
   ```

   上記のコマンドを実行すると、Samba AD DCの設定ウィザードが開始され、必要な情報を入力するように求められます。適切な情報を提供して設定を進めてください。

下記エラー
ERROR(<class 'samba.provision.ProvisioningError'>): Provision failed - ProvisioningError: guess_names: 'realm =' was not specified in supplied /etc/samba/smb.conf.  Please remove the smb.conf file and let provision generate it
  File "/usr/lib/python3/dist-packages/samba/netcmd/domain.py", line 493, in run
    result = provision(self.logger,
  File "/usr/lib/python3/dist-packages/samba/provision/__init__.py", line 2231, in provision
    names = guess_names(lp=lp, hostname=hostname, domain=domain,
  File "/usr/lib/python3/dist-packages/samba/provision/__init__.py", line 625, in guess_names
    raise ProvisioningError("guess_names: 'realm =' was not specified in supplied %s.  Please remove the smb.conf file and let provision generate it" % lp.configfile)

https://qiita.com/u_89/items/b70313b542b39133082f

一度コンテナをexitした場合、下記を実行する
   ```shell
    sudo docker container start ubuntu-samba
   ```

コンテナ移動
https://qiita.com/u_89/items/a9cdbfda2be45178bbee

samba addc設定例
https://qiita.com/u_89/items/979160a3be8bd7487bab


3. **Samba AD DCのサービスを開始**:
   Samba AD DCのセットアップが完了したら、サービスを起動します。

   ```shell
    service smbd start
   ```

5. **サービスの自動起動設定**:
   サーバーが再起動された際にSamba AD DCサービスが自動的に起動するように設定します。

   ```shell
   service smbd enable
   ```

これで、Samba AD DCがコンテナ内でセットアップされました。他のコンピュータをこのSambaドメインに参加させることができます。セキュリティに注意して設定を行い、必要に応じてファイアウォールルールを設定してください。


6. **Samba AD DCの状態を確認**:
   サービスが正常に実行されているか確認します。
   ```shell
   service smbd status
   ```
結果
   ```shell
   root@[container_id]:/# service smbd status
 * smbd is running
   ```



注意: これは単純化された手順であり、特定のネットワーク環境やセキュリティ要件に合わせて設定を調整する必要があります。公式Sambaドキュメンテーションを参照して詳細な情報を取得してください。

**以下はRsyncのインストールコマンド**
rsyncはLinuxやUnix系のオペレーティングシステムで一般的に使用されており、通常は事前にインストールされています。ただし、インストールされていない場合は、以下の手順に従ってrsyncをインストールできます。 
   ```shell
    apt-get update
    apt-get install rsync
   ```
        

**以下はセカンダリーでの設定**

1. **コンテナの作成と起動**:
   Dockerコンテナ内にUbuntu-sambaを作成し、それを起動します。

   ```shell
   docker run -it --name ubuntu-samba2 ubuntu2 /bin/bash
   ```

2. **コンテナ内でのSamba AD DCのインストール**:
   コンテナ内でSambaをインストールし、Samba AD DCをセットアップします。

   ```shell
    # コンテナ内での作業
   apt update
   apt install -y samba
   ```

3. **コンテナ内でのSamba AD DCのインストール**:
    ```shell
    samba-tool domain join EXAMPLE.COM DC 
    -U"EXAMPLE\Administrator" --
    realm=EXAMPLE.COM --
    server=[プライマリーのIPアドレス]
    ```
下記エラー
    ```
    ERROR: Failed to find a writeable DC for domain 'EXAMPLE.COM': The object name is not found.
    bash: -UEXAMPLE\Administrator: command not found
    bash: --: command not found
    ```
コンテナ内でpingのインストール

```shell
apt-get install iputils-ping
```


4. サイト設定を変更して、2つのドメインコントローラーが異なるサイトに所属していることを確認します。 
   ```shell
   samba-tool drs showrepl
   ```
5. 必要に応じてDNS設定を確認および設定します。 
   ```shell
   cat /etc/resolv.conf
   ```
6. ファイル同期やレプリケーションの設定など、アクティブディレクトリ環境に関する他の設定を行います。 

**データの同期** 
コンテナ間のRsyncを使用してデータを同期する具体的な例を示します。以下の手順は、2つのDockerコンテナ（`ubuntu-samba`と`ubuntu-samba2`）間でデータを同期する方法を説明します。既にコンテナが存在する場合の例です。

**前提条件**:
1. Dockerがインストールされていること。
2. `rsync`が`ubuntu-samba`と`ubuntu-samba2`コンテナの両方にインストールされていること。

**1. `ubuntu-samba`コンテナと`ubuntu-samba2`コンテナが実行中であることを確認します。**

```bash
docker ps
```

このコマンドを実行して、`ubuntu-samba`コンテナと`ubuntu-samba2`コンテナが実行中であることを確認します。

**2. `ubuntu-samba2`コンテナから`ubuntu-samba`コンテナにデータを同期します。**

以下のコマンドは、`ubuntu-samba2`コンテナ内から`ubuntu-samba`コンテナにデータを同期する例です。

```bash
docker exec -it ubuntu-samba2 rsync -av /data/ ubuntu-samba:/data/
```

このコマンドは、`ubuntu-samba2`コンテナ内でrsyncを実行し、`ubuntu-samba2`コンテナの `/data/` ディレクトリから`ubuntu-samba`コンテナの `/data/` ディレクトリにデータを同期します。`-a` オプションはアーカイブモードで、ファイルの属性やタイムスタンプも保持してコピーします。`-v` オプションは詳細な出力を表示しますが、必要に応じて省略できます。

これで、`ubuntu-samba2`から`ubuntu-samba`にデータが同期されます。同様に、反対の方向でデータ同期を行うには、必要なrsyncコマンドを実行します。


反対の方向でデータを同期するには、`ubuntu-samba`コンテナから`ubuntu-samba2`コンテナにデータを同期する手順を実行します。以下がその例です：

**1. `ubuntu-samba`コンテナから`ubuntu-samba2`コンテナにデータを同期します。**

以下のコマンドは、`ubuntu-samba`コンテナ内から`ubuntu-samba2`コンテナにデータを同期する例です。

```bash
docker exec -it ubuntu-samba rsync -av /data/ ubuntu-samba2:/data/
```

このコマンドは、`ubuntu-samba`コンテナ内でrsyncを実行し、`ubuntu-samba`コンテナの `/data/` ディレクトリから`ubuntu-samba2`コンテナの `/data/` ディレクトリにデータを同期します。`-a` オプションはアーカイブモードで、ファイルの属性やタイムスタンプも保持してコピーします。`-v` オプションは詳細な出力を表示しますが、必要に応じて省略できます。

これにより、`ubuntu-samba`から`ubuntu-samba2`にデータが同期されます。必要に応じて、データ同期の対向方向をカスタマイズするためにrsyncのオプションを調整できます。


以上の手順に従うことで、Docker上で2台のSamba AD-DCサーバーをインストールし、rsyncを使用してデータを同期させることができます。データの整合性を保つために、適切なrsyncオプションを使用してください。