389DSをdockerで動かしてみる.
使うコンテナは「389ds/dirsrv」https://hub.docker.com/r/389ds/dirsrv
データは「/srv/389ds/data」に設置して、docker内の389DSに/dataとして繋げる
ホスト名は「ds.sybyl.local」ですが、
その上で動くdockerコンテナは「ds.cluster.local」として動くとします. なのでドメインは「dc=cluster,dc=internal」
[root@ds ~]# cat /etc/redhat-release
Rocky Linux release 9.8 (Blue Onyx)
[root@ds ~]# dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
[root@ds ~]# dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
[root@ds ~]# systemctl enable --now docker
[root@ds ~]# docker version
:
Server: Docker Engine - Community
Engine:
Version: 29.7.2
:
[root@ds ~]# docker compose version
Docker Compose version v5.4.0
[root@ds ~]#まずはldapsに対応したいので自己認証局のCA証明書(ca.crt)とそれで署名されたサーバー証明書(server.crt)を準備します
流れとしては自己認証局を作って、CA証明書(ルート証明書)を準備します
[root@ds ~]# mkdir -p /srv/389ds/{certs/ca,data}
[root@ds ~]# cd /srv/389ds/certs
[root@ds certs]# openssl genrsa -out ca/ca.key 4096 <-- 認証局の秘密鍵を作成します
[root@ds certs]# ls -l ca/
total 4
-rw-------. 1 root root 3272 Jul 31 06:19 ca.key <-- 認証局の秘密鍵(CA秘密鍵)
[root@ds certs]#
(CA秘密鍵(ca.key)を使ってCA証明書(ca.crt)を作ります. オレオレ証明書です)
[root@ds certs]# openssl req -x509 -new -sha256 \
-key ca/ca.key \
-days 3650 \
-out ca/ca.crt \
-subj "/C=JP/O=cluster.internal/CN=cluster.internal 389DS CA" \
-addext "basicConstraints=critical,CA:TRUE" \
-addext "keyUsage=critical,keyCertSign,cRLSign" \
-addext "subjectKeyIdentifier=hash"
[root@ds certs]#
[root@ds certs]# ls -l ca/
total 8
-rw-r--r--. 1 root root 1980 Jul 31 06:22 ca.crt <--- CA証明書 もしくは ルート証明書と言います
-rw-------. 1 root root 3272 Jul 31 06:19 ca.key
[root@ds certs]#次に、自己認証局からサーバ証明書を作る。
正確にはサーバの秘密鍵からCSR(証明書の発行依頼書)を作って、CSRに自己認証局のCA証明書で署名(サイン)してもらい、サーバー証明書(server.crt)を発行する。
ただ、その際「SANを含む拡張設定」を含ませる. SAN[Subject Alternative Name](その証明書が有効な通信先(ドメイン名やIPアドレス)の追加リスト)。
以前ならCN(Common Name)だけで良かったが、最近ではSANに書かれている内容で真贋判定されるので。
[root@ds certs]# openssl genrsa -out server.key 4096 <--サーバの秘密鍵(server.key)を作成
(サーバの秘密鍵(server.key)から依頼書(server.csr)を作る)
[root@ds certs]# openssl req -new \
-key server.key \
-out server.csr \
-subj "/C=JP/O=cluster.internal/CN=ds.cluster.internal"
[root@ds certs]#
(SAN定義書を作る)
[root@ds certs]# cat > server-ext.cnf <<'_EOF_'
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[alt_names]
DNS.1=ds.cluster.internal
DNS.2=ds
_EOF_
(依頼書(server.csr)からSANをまぜつつ、CA証明書(ca.crt)とCA秘密鍵(ca.key) とで サーバ証明書(server.crt)を得る)
[root@ds certs]# openssl x509 -req \
-in server.csr \
-CA ca/ca.crt \
-CAkey ca/ca.key \
-CAcreateserial \
-out server.crt \
-days 825 \
-sha256 \
-extfile server-ext.cnf
[root@ds certs]#
[root@ds certs]# ls -l
total 16
drwxr-xr-x. 2 root root 48 Aug 1 00:40 ca
-rw-r--r--. 1 root root 2049 Aug 1 00:40 server.crt
-rw-r--r--. 1 root root 1651 Aug 1 00:19 server.csr
-rw-r--r--. 1 root root 250 Aug 1 00:38 server-ext.cnf
-rw-------. 1 root root 3272 Jul 31 06:25 server.key
[root@ds certs]#
[root@ds certs]# ls -l ca/
total 12
-rw-r--r--. 1 root root 1980 Jul 31 06:22 ca.crt
-rw-------. 1 root root 3272 Jul 31 06:19 ca.key
-rw-r--r--. 1 root root 41 Aug 1 00:40 ca.srl
[root@ds certs]#依頼書の「server.csr」は削除しても構わない。
CA秘密鍵の「ca/ca.key」とCAが発行した証明書の「シリアルナンバー(管理番号)の記録ファイル」(ca.srl)は別の場所に保管します
サーバー証明書(server.crt)の再発行や発行済み証明書の無効のために「ca.key」と「ca.srl」は必須なため.
[root@ds certs]# mkdir -p /root/389ds-ca-private
[root@ds certs]# mv ca/ca.key ca/ca.srl /root/389ds-ca-private
[root@ds certs]# rm -f server.csr一応確認
[root@ds certs]# openssl x509 -in ca/ca.crt -noout -text | grep -A2 'Basic Constraints'
X509v3 Basic Constraints: critical
CA:TRUE <-- ここ
X509v3 Key Usage: critical
[root@ds certs]# openssl x509 -in server.crt -noout -text | grep -A2 -E 'Basic Constraints|Subject Alternative Name'
X509v3 Basic Constraints: critical
CA:FALSE <-- ここ
X509v3 Key Usage: critical
--
X509v3 Subject Alternative Name:
DNS:ds.cluster.internal, DNS:ds <-- ここ
X509v3 Subject Key Identifier:
[root@ds certs]# openssl verify -CAfile ca/ca.crt server.crt <-- CA証明書(ca.crt)によるサーバ証明書(server.crt)の署名検証
server.crt: OK
[root@ds certs]# openssl pkey -in server.key -pubout -outform DER | sha256sum <--- 秘密鍵と証明書の一致確認
c92d01c60e712fe5d4c230b5054a8fe3e03f1945f765db3fa61910b3e1d76b84 -
[root@ds certs]#
[root@ds certs]# openssl x509 -in server.crt -pubkey -noout | openssl pkey -pubin -outform DER | sha256sum
c92d01c60e712fe5d4c230b5054a8fe3e03f1945f765db3fa61910b3e1d76b84 -
[root@ds certs]#compose.ymlは「/srv/389ds/compose.yml」として下記のようにします
services:
389ds:
image: 389ds/dirsrv:3.1
container_name: 389ds
hostname: ds.cluster.internal
restart: unless-stopped
environment:
DS_DM_PASSWORD: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
DS_SUFFIX_NAME: "dc=cluster,dc=internal"
ports:
- "389:3389"
- "636:3636"
volumes:
- /srv/389ds/data:/data:Z
- /srv/389ds/certs:/data/tls:ro,Zとして
[root@ds ~]# cd /srv/389ds/
[root@ds 389ds]# docker compose up -d
[root@ds 389ds]# firewall-cmd --add-service=ldap --add-service=ldaps --zone=public --permanent
[root@ds 389ds]# firewall-cmd --reload
[root@ds 389ds]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc6f77ab7a3b 389ds/dirsrv:3.1 "/usr/lib/dirsrv/dsc…" 3 seconds ago Up 3 seconds (health: starting) 0.0.0.0:389->3389/tcp, [::]:389->3389/tcp, 0.0.0.0:636->3636/tcp, [::]:636->3636/tcp 389ds
[root@ds 389ds]#
(接続テスト)
[root@ds 389ds]# dnf install openldap-clients
[root@ds 389ds]# LDAPTLS_CACERT=/srv/389ds/certs/ca/ca.crt ldapwhoami -H ldaps://ds:636 -D "cn=Directory Manager" -W <-- ldaps[636]で接続
Enter LDAP Password:
dn: cn=directory manager
[root@ds 389ds]# ldapwhoami -H ldap://ds:389 -D "cn=Directory Manager" -W <-- ldap[389]で接続
Enter LDAP Password:
dn: cn=directory manager
(コンテナの中に入って)
[root@ds 389ds]# docker exec -it 389ds bash
ds:/ # ldapwhoami -x -H ldap://ds:3389 -D "cn=Directory Manager" -W ldap通信
ds:/ # LDAPTLS_CACERT=/data/tls/ca/ca.crt ldapwhoami -x -H ldaps://ds:3636 -D "cn=Directory Manager" -W ldaps通信
ds:/ # ldapwhoami -x -H ldapi://%2Fdata%2Frun%2Fslapd-localhost.socket -D "cn=Directory Manager" -W ソケット通信
[root@ds 389ds]#注意 接続先となる「-H ldaps://ds:636」は、SAN定義書の「alt_names」のみ許可される. 記載のない対応するipアドレスで接続を試みると「ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)」と表示される
終了するには
[root@ds 389ds]# docker compose down
(稼働中にログをなら)
[root@ds 389ds]# docker compose logs -f 389ds一度起動に成功すると「/srv/389ds/data/」にコンテンツが作られる
[root@ds 389ds]# ls -l /srv/389ds/data/
total 4
drwxr-xr-x. 2 root root 6 Aug 1 02:07 bak
drwxr-xr-x. 3 root root 4096 Aug 1 06:03 config
drwxr-xr-x. 2 root root 54 Aug 1 02:07 db
drwxr-xr-x. 2 root root 6 Aug 1 02:07 ldif
drwxr-xr-x. 2 root root 172 Aug 1 02:07 logs
drwxr-xr-x. 4 root root 89 Aug 1 06:03 run
drwxr-xr-x. 2 root root 156 Aug 1 02:07 ssca
drwxr-xr-x. 2 root root 6 Aug 1 02:07 tls
[root@ds 389ds]#なので再度立ち上げても同じコンテンツが利用できるが、初期化したいならこのフォルダの中身を消す
[root@ds 389ds]# docker compose down
[root@ds 389ds]# rm -rf /src/389ds/data/*
(再調整後)
[root@ds 389ds]# docker compose up -dLDAP/Composeとは違って、389DS/dirsrvは、最低限まで作ってあとはldifか dsconf を作って形を作るって感じです.
まずはコンテナ内の dsconf コマンドでバックエンドを作成します
[root@ds 389ds]# docker exec -it 389ds dsconf localhost backend suffix list
No backends <-- バックエンドを持ってない
[root@ds 389ds]#
[root@ds 389ds]# docker exec 389ds \
dsconf localhost backend create \
--be-name userRoot \
--suffix "dc=cluster,dc=internal" \
--create-suffix
(確認)
[root@ds 389ds]# docker exec -it 389ds dsconf localhost backend suffix list
dc=cluster,dc=internal (userroot) <-- バックエンドが作れた
[root@ds 389ds]# docker exec -it 389ds dsctl --list
slapd-localhost <-- 389DSのインスタンス名は localhost
[root@ds 389ds]#バックエンドの作成で「docker exec 389ds dsconf localhost backend create --be-name userRoot --suffix "dc=cluster,dc=internal" --create-suffix --create-entries」
と「--create-entries」を付けるとデモデータ(ou=groups, ou=peopleとか)を作ってくれます.
[root@ds 389ds]# ldapsearch -H ldap://ds:389 -D "cn=Directory Manager" -b "cn=plugins,cn=config" -s one "cn=*MemberOf*" cn nsslapd-pluginEnabled -W
:
# MemberOf Plugin, plugins, config
dn: cn=MemberOf Plugin,cn=plugins,cn=config
cn: MemberOf Plugin
nsslapd-pluginEnabled: off
:
[root@ds 389ds]# ldapmodify -H ldap://ds:389 -D "cn=Directory Manager" -W << _EOF_
dn: cn=MemberOf Plugin,cn=plugins,cn=config
changetype: modify
replace: nsslapd-pluginEnabled
nsslapd-pluginEnabled: on
_EOF_
(確認)
[root@ds 389ds]# ldapsearch -H ldap://ds:389 -D "cn=Directory Manager" -b "cn=plugins,cn=config" -s one "cn=*MemberOf*" cn nsslapd-pluginEnabled -W
:
nsslapd-pluginEnabled: on
:
[root@ds 389ds]#389DSのメリット dsidm コマンドで作ってみる
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost organizationalunit create --ou groups <-- パスワードなしで行ける
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost organizationalunit create --ou people
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost organizationalunit create --ou automount
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost organizationalunit create --ou sudoers
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost posixgroup create --cn fgo --gidNumber 2000
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost user create --uid illya --cn "Illyasviel von Einzbern" --displayName illya --uidNumber 2001 --gidNumber 2000 --homeDirectory /home/illya
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost account modify-by-dn uid=illya,ou=people,dc=cluster,dc=internal add:loginShell:/bin/bash
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost account reset_password uid=illya,ou=people,dc=cluster,dc=internal '初期パスワード'
(コンテナの中に入って)
[root@ds 389ds]# docker exec -it 389ds bash
ds:/ #
ds:/ # ldapadd -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: nisMapName=auto.master,ou=automount,dc=cluster,dc=internal
objectClass: top
objectClass: nisMap
nisMapName: auto.master
_EOF_
ds:/ #
ds:/ # ldapadd -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: nisMapName=auto.home,ou=automount,dc=cluster,dc=internal
objectClass: top
objectClass: nisMap
nisMapName: auto.home
_EOF_
ds:/ #
ds:/ # ldapadd -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: cn=supervisor,ou=sudoers,dc=cluster,dc=internal
objectClass: top
objectClass: sudorole
cn: supervisor
sudoUser: %supervisor
sudoCommand: ALL
sudoHost: ALL
sudoOption: nopasswd
_EOF_
ds:/ #
ds:/ # exit
exit
[root@ds 389ds]#[root@ds 389ds]# docker exec -it 389ds dsconf localhost pwpolicy set \
--pwdchecksyntax=off \
--pwdhistory=off \
--pwdminlen=3 \
--pwdminage=0 \
--pwdlockout=on \
--pwdmaxfailures=5 \
--pwdlockoutduration=3600 \
--pwdresetfailcount=600
[root@ds 389ds]#「passwordmustchange」を有効にすると、初期パスワードでログイン後に自分でパスワードを再設定する必要が生じます.
[root@ds 389ds]# docker exec -it 389ds dsconf localhost pwpolicy get | grep passwordmustchange
passwordmustchange: off
[root@ds 389ds]# docker exec -it 389ds dsconf localhost pwpolicy set --pwdmustchange=on
Successfully updated global password policy
[root@ds 389ds]#一般ユーザとは違うouに入れて権限も制限させるようにします
[root@ds 389ds]# docker exec -it 389ds dsidm -b "dc=cluster,dc=internal" localhost organizationalunit create --ou ServiceAccounts
[root@ds 389ds]# docker exec -it 389ds bash
ds:/ # ldapadd -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal
objectClass: top
objectClass: account
objectClass: simpleSecurityObject
uid: sssd-auth
description: LDAP client search account
userPassword: yyyyyyyyyyyy
_EOF_
ds:/ #
ds:/ # exit
[root@ds 389ds]#ただ、現状pwpolicy で「pwdmustchange=on」となっているのでこのアカウント「uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal」にもパスワードポリシーが適用され
初期設定のパスワードがそのままでは使えないです。
なので「Local Password Policy」を使えるようにします
[root@ds 389ds]# docker exec -it 389ds \
dsconf localhost pwpolicy set --pwdlocal on
[root@ds 389ds]#
(確認)
[root@ds 389ds]# docker exec -it 389ds dsconf localhost pwpolicy get
:
nsslapd-pwpolicy-local: on
:
[root@ds 389ds]#これでユーザ/サブツリごとの個別ポリシーを使えるようになります。
なので
[root@ds 389ds]# docker exec -it 389ds \
dsconf localhost localpwp adduser \
--pwdmustchange off \
"uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal"
[root@ds 389ds]#と「uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal」のみ「pwdmustchange off」とさせます。
っで確認
[root@ds 389ds]# docker exec -it 389ds \
dsconf localhost localpwp get \
"uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal"
Local User Policy Policy for "uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal": cn=cn\3DnsPwPolicyEntry_user\(略
------------------------------------
passwordmustchange: off
[root@ds 389ds]#あと、「uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal」のパスワードの再設定
(コンテナの中に入って)
[root@ds 389ds]# docker exec -it 389ds bash
ds:/ # ldapmodify -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal
changetype: modify
replace: userPassword
userPassword: yyyyyyyyyyyy
_EOF_
[root@ds 389ds]#それで、「uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal」による接続テスト
[root@ds 389ds]# ldapwhoami -H ldap://ds:389 -D "uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal" -W
[root@ds 389ds]# LDAPTLS_CACERT=/srv/389ds/certs/ca/ca.crt ldapwhoami -H ldaps://ds:636 -D "uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal" -W次に「uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal」に参照権限を渡す
[root@ds 389ds]# docker exec -it 389ds bash
ds:/ #
ds:/ # ldapmodify -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: ou=people,dc=cluster,dc=internal
changetype: modify
add: aci
aci: (targetattr != "userPassword || aci")
(version 3.0;
acl "SSSD read";
allow (read,search,compare)
userdn="ldap:///uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal";)
_EOF_
ds:/ #
ds:/ # ldapmodify -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: ou=groups,dc=cluster,dc=internal
changetype: modify
add: aci
aci: (targetattr != "userPassword || aci")
(version 3.0;
acl "SSSD read";
allow (read,search,compare)
userdn="ldap:///uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal";)
_EOF_
ds:/ #
ds:/ # ldapmodify -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: ou=sudoers,dc=cluster,dc=internal
changetype: modify
add: aci
aci: (targetattr != "userPassword || aci")
(version 3.0;
acl "SSSD read";
allow (read,search,compare)
userdn="ldap:///uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal";)
_EOF_
ds:/ #
ds:/ # ldapmodify -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: ou=automount,dc=cluster,dc=internal
changetype: modify
add: aci
aci: (targetattr != "userPassword || aci")
(version 3.0;
acl "SSSD read";
allow (read,search,compare)
userdn="ldap:///uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal";)
_EOF_
ds:/ #
ds:/ # ldapmodify -H ldap://localhost:3389 -D "cn=Directory Manager" -W <<_EOF_
dn: dc=cluster,dc=internal
changetype: modify
add: aci
aci: (targetattr="dc || ou || objectClass || description")(version 3.0; acl "SSSD base read"; allow (read,search,compare) userdn="ldap:///uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal";)
_EOF_
ds:/ # exit
[root@ds 389ds]#確認方法
[root@ds 389ds]# ldapsearch -H ldap://ds:389 -D "cn=Directory Manager" -b "dc=cluster,dc=internal" "(objectClass=*)" aci -o ldif-wrap=no -Wクライアントマシンでまずはパッケージを入れて、389DSノードからCA証明書を頂く
[root@rockylinux9 ~]# dnf -y install sssd-ldap oddjob-mkhomedir sssd-tools openldap-clients
[root@rockylinux9 ~]# mkdir /opt/389ds
[root@rockylinux9 ~]# scp root@ds:/srv/389ds/certs/ca/ca.crt /opt/389ds/
(SELinuxが有効なら)
[root@rockylinux9 ~]# restorecon -Rv /opt/389ds接続用アカウントで通信してみる
[root@rockylinux9 ~]# LDAPTLS_CACERT=/opt/389ds/ca.crt ldapsearch -x -H ldaps://ds:636 -D "uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal" -b "dc=cluster,dc=internal" "(uid=illya)" dn -W
:
dn: uid=illya,ou=people,dc=cluster,dc=internal
:
[root@rockylinux9 ~]#とユーザが引ければok
っでsssdの設定
[root@rockylinux9 ~]# vi /etc/sssd/sssd.conf
[sssd]
services = nss, pam
domains = default
[nss]
[domain/default]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://ds:636
ldap_search_base = dc=cluster,dc=internal
ldap_default_bind_dn = uid=sssd-auth,ou=ServiceAccounts,dc=cluster,dc=internal
ldap_default_authtok_type = password
ldap_default_authtok = yyyyyyyyyyyy
ldap_tls_cacert = /opt/389ds/ca.crt
ldap_tls_reqcert = demand
[root@rockylinux9 ~]#
[root@rockylinux9 ~]# chown root:root /etc/sssd/sssd.conf
[root@rockylinux9 ~]# chmod 600 /etc/sssd/sssd.conf
[root@rockylinux9 ~]# systemctl restart sssd
(確認)
[root@rockylinux9 ~]# id illya
uid=2001(illya) gid=2000(fgo) groups=2000(fgo)
[root@rockylinux9 ~]# getent passwd illya
illya:*:2001:2000:Illyasviel von Einzbern:/home/illya:/bin/bash
[root@rockylinux9 ~]#あと、389DSに載せたautomountの情報をクライアントが参照できるようにするとかの設定がある
[root@ds ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ddd64a88ffa 389ds/dirsrv:3.1 "/usr/lib/dirsrv/dsc…" 2 days ago Up 2 days (healthy) 0.0.0.0:389->3389/tcp, [::]:389->3389/tcp, 0.0.0.0:636->3636/tcp, [::]:636->3636/tcp 389ds
[root@ds ~]#
[root@ds ~]# docker update --restart=unless-stopped 389ds
(確認)
[root@ds ~]# docker inspect -f '{{.HostConfig.RestartPolicy.Name} }' 389ds <--- }と}にはスペースを入れてます。ここの表記上の問題です
unless-stopped
[root@ds ~]#これでコンテナ 389ds は unless-stopped となったので、ホストが再起動して、dockerが動けば自動的に 389ds も動きます