顯示具有 Docker 標籤的文章。 顯示所有文章
顯示具有 Docker 標籤的文章。 顯示所有文章

星期六, 1月 07, 2023

Docker CAS 6.6.x with LDAP

之前我們已確認了 Docker CAS 可以運作,預設帳密是 casuser / Mellon 這組,姑且稱之為「靜態帳密表」。接著利用這篇所述(注意版本,行文時已升到 2.6.3),來試試 CAS 如何與後端 LDAP 合作。首先開好 LDAP 與之前的 CAS,並進去確認連往 LDAP 的網路通暢:

  • docker run -d --name cas -p 8080:8080 -v ./cas.properties:/etc/cas/config/cas.properties apereo/cas:6.6.4
  • docker exec -it cas /bin/bash
    • echo < /dev/tcp/172.18.8.166/1389 && echo on || echo off
      • on

接著在 cas.properties 加入以下幾行:

  • cas.authn.ldap[0].ldap-url=ldap://172.18.8.166:1389
  • cas.authn.ldap[0].base-dn=ou=users,dc=example,dc=org
  • cas.authn.ldap[0].type=ANONYMOUS
  • cas.authn.ldap[0].search-filter=(&(objectClass=posixAccount)(cn={user}))

重啟帶有新設定的 CAS 雖然順利,但仍僅能驗證 casuser / Mellon 而不能驗證 LDAP user01 / bitnami1 這組帳密。注意看,log 裡面有這段:

  • user01 not found in backing map.

意思是 CAS 把輸入的 user01 / bitnami1 這組帳密交給「靜態帳密表」了。為防止混淆,可以關掉它。在 cas.properties 加入一行:

  • cas.authn.accept.users=

重啟之後情況不變?這時得把 log4j2.xml 抓出來改設定,看看發生了什麼問題?

  • docker cp cas:/etc/cas/config/log4j2.xml .
  • vi log4j2.xml
    • <Property name="cas.log.level">debug</Property>
  • vi cas.properties
    • logging.config=file:/etc/cas/config/log4j2.xml
  • docker stop cas
  • docker rm cas
  • lsof -i :8080
    • <PID>
  • kill <PID>
  • docker run -d --name cas -p 8080:8080 -v ./cas.properties:/etc/cas/config/cas.properties -v ./log4j2.xml:/etc/cas/config/log4j2.xml apereo/cas:6.6.4

在海一般的訊息之中,唯一有幫助的是這條:

  • <Authentication handler [HttpBasedServiceCredentialsAuthenticationHandler] does not support the credential type [UsernamePasswordCredential(username=user01, source=null, customFields={})].>

這意思很難懂?沒錯,它其實要表達的是「現在這個 Docker CAS 並不支援 LDAP」。我們得學習這篇的做法,在這裡挑 6.6 或你想要的分支下載,在 build.gradle 檔案中找到 dependencies 段落,在其中新增一行:

  • implementation "org.apereo.cas:cas-server-support-ldap"

這裡千萬要注意拼字是否正確?原文把 implementation 拼錯,複製貼上並不管用,也不會有錯誤訊息,我就這樣又去多走彎路了。然後在同目錄執行指令:

  • gradlew clean build

幾分鐘後,可以看到一個新的 cas.war 在 build/libs 目錄下,大小應該會比 Docker Image 裡面那個要大一些,我們要用這個新的:

  • docker run -d --name cas -p 8080:8080 -v ./cas.properties:/etc/cas/config/cas.properties -v ./log4j2.xml:/etc/cas/config/log4j2.xml -v ./cas.war:/docker/cas/war/cas.war apereo/cas:6.6.4

這次要有耐心一點,原本一分鐘就能開好的 CAS 可能要拉長到三分多鐘,不是壞了。能驗證 LDAP 的帳密,算是值得吧?

星期三, 1月 04, 2023

Docker CAS 6.6.x without SSL

  • vi cas.properties
    • server.port=8080
    • server.ssl.enabled=false
  • docker run -d --name cas -p 8080:8080 -v ./cas.properties:/etc/cas/config/cas.properties apereo/cas:6.6.4

星期二, 1月 03, 2023

Docker CAS 6.6.x needs /etc/cas/thekeystore

We can create the /etc/cas/thekeystore immediately like this:

docker run -d --name cas -p 8443:8443 apereo/cas:6.6.4; docker exec -it cas keytool -genkeypair -alias cas -keyalg RSA -keypass changeit -storepass changeit -keystore /etc/cas/thekeystore -dname "CN=localhost"

星期五, 4月 22, 2022

OpenLDAP on Docker

  • docker run -d --name openldap -p 1389:1389 [-e LDAP_USERS=user01,user02 -e LDAP_PASSWORDS=bitnami1,bitnami2] bitnami/openldap:2.6.1
  • ldapsearch -H ldap://localhost:1389 -x -b dc=example,dc=org 

星期六, 12月 25, 2021

修改 Docker Container 預設使用 STDOUT / STDERR 以致不易查看的問題​

每一個 Dockerfile 都可能或多或少地「定義」了一些應用程式本身與外在環境的關係,這次我們以 Nginx 為例,各位可以把它看做是一個輕量級的網頁伺服器。當我們把 Nginx 塞到 Docker 裡面,可能有許多細節我們不會想花時間去了解太深入,畢竟以 Scrum 的精神先讓事情發生,所以用以下的指令把它跑起來:

  • docker run -d --name nginx -p 8080:80 nginx
依這個官網 Image 預設行為,它會把 log 寫到 /var/log/nginx 目錄下,分別是外部訪問的紀錄在 access.log 以及錯誤在 error.log,但這兩個檔案又被連結到 STDOUT / STDERR 去了,好處是不太會因為檔案太大而爆掉,但壞處就是一下就捲過去了,很難在裡面慢慢查問題。這裡我們先看第一招:在這個 Image 有指令可以在「Container 內部」重啟的情況下,可以直接進到 Container 裡面,把這兩個連結刪掉,再重啟 Nginx 就好了,過程細節請參考下圖。
​但依作者的經驗,不是每一個 Image 都留有內部重啟的餘地,有時候我們得遷就一下。接下來第二招,利用映射保留 Container 所用到的磁碟空間,再把它跑起來:

​當我們在當前目錄下,開了 log/nginx 子目錄,並對應到 Container 裡面的 /var/log/nginx 目錄,在此狀況下的 Nginx 就不會再產生連結,而是直接利用這磁碟空間輸出 log。以上這樣看來很不錯了?不過細究起來,「映射就不產生連結」應該也是由 Nginx Dockerfile 所決定的特性,換言之,其他的 Image 不見得能這麼容易修改,這時我們還有最後一招:找找 Docker Host(也就是「外面」)是不是有這樣的檔案?
  • /var/lib/docker/containers/<containerId>/<containerId>-json.log
雖然內容形式有些修改,但 Container 的 STDOUT / STDERR 都集中在此,資訊是不漏接的。

星期五, 3月 27, 2020

HashiCorp Vault in Docker

Including this basically, but some extra arguments required:
  • docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"backend": {"file": {"path": "/vault/file"}}, "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": "true", "listener": {"tcp": {"address": "0.0.0.0:8200", "tls_disable": "true"}}}' -d --name vault -p 8200:8200 vault server
Then, you can visit http://localhost:8200/ui for initializing.

星期五, 2月 14, 2020

Get free Domain Name and SSL Certificate

If you have a Public IP Address and Linux OS running:
  • get a free Domain Name from noip or duckdns
  • install Docker
  • follow this guideline

星期一, 2月 10, 2020

Docker CAS steps

  • docker run -d --name cas -p 8443:8443 apereo/cas:v6.1.3
  • [optional] docker logs cas, "<The following profiles are active: standalone>" shown.
  • append "127.0.0.1 cas.example.org" to /etc/hosts
  • visit https://cas.example.org:8443/cas
  • login username: casuser, password Mellon

星期二, 5月 14, 2019

New Selenium Node (Chrome / Firefox) on CentOS without GUI

  • Assume Selenium Hub listen on docker host 172.17.0.1:4444
  • docker (refer this)
  • docker-compose (refer this)
  • docker-compose.yml (updated from here)
    • version: "3"
    • services:
      • chrome:
        • image: selenium/node-chrome:3.141.59-neon
        • volumes:
          • - /dev/shm:/dev/shm
        • environment:
          • - HUB_HOST=172.17.0.1
          • - HUB_PORT=4444
          • - REMOTE_HOST=http://<Host_or_IP>:6666
          • - NODE_MAX_INSTANCES=5
        • ports:
          • - "6666:5555"
      • firefox:
        • image: selenium/node-firefox:3.141.59-neon
        • volumes:
          • - /dev/shm:/dev/shm
        • environment:
          • - HUB_HOST=172.17.0.1
          • - HUB_PORT=4444
          • - REMOTE_HOST=http://<Host_or_IP>:7777
          • - NODE_MAX_INSTANCES=5
        • ports:
          • - "7777:5555"

星期三, 4月 24, 2019

Quick Start: Selenium Grid

How can we create a Selenium Grid Environment quickly? If you have docker-compose already, just refer this, save as docker-compose.yml, and run "docker-compose up -d" to start it. That's all.

How to prove it worked? we need:
  • selenese-runner.jar download from here
  • check your docker host ip address like "ip addr | grep docker0"
  • any workable side file
If selenese-runner.jar and my.side in the current directory, start another docker container:
  • docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp openjdk java -jar selenese-runner.jar --driver remote --remote-url http://<DOCKER_HOST_IP>:4444/wd/hub --remote-browser <BROWSER> <WORKABLE.side>
<BROWSER> can be chrome or firefox.

星期二, 4月 16, 2019

CentOS7, Firewalld and Docker

In the past, I always stop firewalld for Docker. But it's not secured. According to this, if we update firewalld version to 0.4.3.2-9 can fix this, or running these command:
  • nmcli connection modify docker0 connection.zone trusted
  • systemctl stop NetworkManager.service
  • firewall-cmd --permanent --zone=trusted --change-interface=docker0
  • systemctl start NetworkManager.service
  • nmcli connection modify docker0 connection.zone trusted
  • systemctl restart docker.service

星期二, 1月 29, 2019

Build WebGoat in a temporary Docker Container

  • git clone https://github.com/WebGoat/WebGoat
  • cd WebGoat
  • docker run -it --rm --name mymaven -v "$(pwd)":/usr/src/mymaven -w /usr/src/mymaven maven:3-jdk-11 mvn clean install

星期五, 1月 11, 2019

Docker & Docker Compose on CentOS

  • Docker
    • sudo yum install yum-utils
    • sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    • sudo yum install docker-ce
    • sudo systemctl start docker
    • (optional) sudo systemctl enable docker
    • sudo usermod -aG docker `whoami`
    • (logout, then login again)
    • (optional) docker ps
  • Docker Compose
    • (docker installed)
    • (check latest version of Docker Compose from here, ex: 1.23.2)
    • sudo curl -L “https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
    • sudo chmod +x /usr/local/bin/docker-compose
    • (optional) docker-compose --version

星期二, 1月 01, 2019

Java Restful WebServices

為了想在最少的準備之下開發 Java Restful WebServices,研究了以下的做法:
  1. 參考這篇這篇所述,在 Docker 已安裝的前提下,藉由 Maven webapp plugin,不依賴任何 IDE,建立專案的目錄結構。需要在一個空的目錄下這命令(請自行替換適合的 groupId):
    docker run -it --rm -v "$(pwd)":/usr/src/mymaven -w /usr/src/mymaven maven mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.acme -DartifactId=my-webapp
  2. 將這群目錄、檔案的擁有權取回:
    sudo chown -R `whoami`. my-webapp
  3. 進入 my-webapp 子目錄,補上 src/main/java/com/acme/TestService.java,內容可參考這篇(如果用複製的話,要注意雙引號可能需要替換)。
  4. 續上,增加 servlet 與 servlet-mapping 補足 src/main/webapp/WEB-INF/web.xml 的內容,尤其要注意 param-value 與程式中所述的套件、所在路徑一致。
  5. 續上,增加三個 dependency 補足 pom.xml 的內容。若在意未來的路徑名稱,也可以增設 build/finalName。
  6. 再用 Maven 於 target 目錄產出 war 檔:
    docker run -it --rm -v "$(pwd)":/usr/src/mymaven -w /usr/src/mymaven maven mvn package
接下來的課題是,需要 Servlet Container 讓 war 跑起來,一樣是借重 Docker 與大家最熟悉的 Tomcat:
  1. 將 Tomcat 預設埠 8080 8443 都對應好:
    docker run -d --name tomcat -p 8080:8080 -p 8443:8443 tomcat
  2. 先確認瀏覽器訪問 8080 沒問題,再設法讓 Manager App 開起來,首先是修改 /usr/local/tomcat/conf/tomcat-users.xml 增加 manager-gui 角色的帳密;若要遠端訪問還有 /usr/local/tomcat/webapps/manager/META-INF/context.xml 要放寬 RemoteAddrValve。
  3. 登入 Manager App 之後,部署 war 上去,不論 http://localhost:8080/my-webapp 或 http://localhost:8080/my-webapp/rest/testservice 都應能得到正確內容。
  4. 準備 https 憑證與金鑰檔,放到 Docker Container 內,並參考這篇的說明修改 /usr/local/tomcat/conf/server.xml,對應的必要屬性至少有 certificateFile、certificateKeyFile 兩個,就可改由 https 8443 訪問取得結果。

星期一, 8月 20, 2018

Change port expose after run

已 run 起來的 docker container 若要增加曝露對外的網路埠,除了 stop / commit / start 之外,也有更漂亮的方式:
  • docker stop ...
  • systemctl stop docker
  • vi /var/lib/docker/containers/.../hostconfig.json
  • systemctl start docker
  • docker start ...

星期一, 6月 25, 2018

Enable Https by Nginx in docker

對於那些提供 Web Service 的 docker image(如圖左側),要如何賦予 https 的連線能力?當然依各種服務都有不同的做法可行,例如 GitLab 要改 gitlab.rb,Jenkins 是個 war 等等,不過有沒有更簡單一致的做法?那就是隔壁也開一個 Nginx docker container,配置如圖:
假設申請簽署的網站名為 nginx.acme.com,pem 格式的金鑰對紀錄在 nginx.acme.com.key 檔案內,nginx.acme.com.crt 是 pem 格式的憑證檔, Nginx 設定當有以下段落:
  • server {
    • listen 443 ssl;
    • server_name nginx.acme.com;
    • ssl_certificate /etc/ssl/certs/nginx.acme.com.crt;
    • ssl_certificate_key /etc/ssl/certs/nginx.acme.com.key;
    • ...
    • location / {
      • proxy_pass http://172.17.0.2:80;
      • proxy_set_header Host $host;
      • proxy_set_header X-Real-IP $remote_addr;
      • proxy_set_header X-Forwarded-Proto https;
    • }
    • ...
  • }
東拼西湊來的有些不踏實,這裡有比較完整的說明。

[2018/06/27]
這件事似乎有個常見的名詞 SSL Termination,用 HAProxy 也可以,請參考這篇

[2018/08/17]
由於 Nginx 官方 docker image 只聽著 port 80,在不想改官方產出的前提下,可以:

  • 由外面的 443 對應到裡面的 80,-p 443:80
  • Nginx 設定檔 listen 80 ssl;
  • 在某些虛擬機環境,因為防火牆的規則比較亂,可能讓這個 image 開不起來,在這篇有人提到解法:
    • iptables -t filter -F
    • iptables -t filter -X
    • systemctl restart docker

星期五, 6月 15, 2018

GitLab Jenkins Integrated Authentication

這兩個服務除了各自有許多驗證方式之外,若要輕量化地使用者單一帳號管理,只要在 GitLab 自建帳號,再搭配 Jenkins 上有個 GitLab Authentication Plugin,即可達到通用的目的。首先來開兩部機器:
  • docker run -d --name gitlab -p 80:80 gitlab/gitlab-ce
  • docker run -d --name jenkins -p 8080:8080 jenkins/jenkins:lts
在 GitLab 除了要建帳號給使用者之外,還有設定的工作,註冊一個應用程式,如圖:
完成後,有些東西要抄起來:
在 Jenkins 外掛 GitLab Authentication Plugin 後的設定用得上:
以上其實還算單純的整合,在 Mac 硬是搞了好久,重點是那些位址究竟是要讓 Client 能找到 Server,還是 Server 要找到另一部 Server?因為 Mac 上的 Host (Client) 網路上無法看到 Container (Servers),但 Linux 沒這問題,Windows 則依這篇小加一條繞送規則即可。

星期二, 11月 28, 2017

Docker shared folder between host and containers

因為很多 Docker Image 都陽春到沒有方便的交換檔案做法,像是要從 Host 複製檔案進 Docker Container,或反方向,或是 Docker Container 之間互相分享檔案,也許連平常視為基本的 SCP SSH 都沒有。幸好 Docker 有專門設計 Volume 給我們用,方法也不只一種,這邊講個最簡單又通用的:
  • docker volume create <your_volume_name> 建立新的共享目錄
  • docker volume ls 查詢目前有哪些共享目錄
  • docker volume inspect <your_volume_name> | grep Mountpoint 查詢共享目錄在主機上的實體路徑
  • docker volume rm <your_volume_name> 刪除共享目錄
當我們要開一個新的 Container,可以掛上這個共享目錄,如:
  • docker run
    • -d
    • --name <your_container_name>
    • -v <your_volume_name>:/tmp
    • <your_image_name>
就能在 Container 的 /tmp 找到我們放在 Mountpoint 的檔案。

星期二, 8月 01, 2017

Simplest Node.js Web Server (in Docker or not)

這篇實在是一年多前就不該偷懶好好寫的(與這篇有關),在參考了這篇這篇之後,覺得以下的內容還算能用:

var http = require('http');
var port = 8080;
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('<html><head></head><body><h1>Hello World!</h1></body></html>');
}).listen(port);
console.log('Server running at http://localhost:' + port);

要能執行的前提僅需安裝 Node.js,因為 http 是內建的,也不需要再補 npm install http。假設存檔名為 helloServer.js,執行時只要切到該目錄,在命令列下 node helloServer.js,之後就可用瀏覽器訪問 http://localhost:8080 看到這個超陽春網頁。

想更乾淨一點,不要直接在本機安裝 Node.js?用 Docker 再適合不過了,而且官方支援就提到如何直接執行單一程式,我稍做修改的命令與簡略說明:
  • docker run -it --rm --name myNode -v "$PWD":/usr/src/app -w /usr/src/app node:latest node helloServer.js
  • 命名為 myNode,可以修改。
  • /usr/src/app 是 container 裡面的目錄,對應外面的現行目錄,也是裡面的工作目錄。
  • image 名稱 node:latest,因為這個簡單範例不挑版本。
  • 最後的 node helloServer.js 就是下到 container 裡面去執行的命令。
但這次瀏覽器看不到網頁了?別急,先另開一個 Terminal 下指令查 container 用哪個 IP:
  • docker inspect myNode | grep IPAddress
瀏覽器在 docker 外面,所以 localhost 要換成這樣查來的 IP 才會通。


星期五, 4月 21, 2017

Initial Docker on CentOS

安裝
  • sudo yum install docker
啟動 docker service
  • sudo systemctl start docker 或是舊指令 sudo service docker start
開機後自動啟動 docker service
  • sudo systemctl enable docker
省略當前使用者未來每個 docker 指令都要 sudo
  • sudo groupadd docker
  • sudo gpasswd -a ${USER} docker 或是另一種寫法 sudo usermod -aG docker ${USER}
  • sudo systemctl restart docker
  • logout / login