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

Docker故障一例:CPU使用率高

 今天同事告知Docker Server的CPU使用率很高,因為系統是Ubuntu,所以用top檢查一下,結果發現是docker佔用CPU很高。

由於之前並沒有這樣的情況,也沒有增加或更動Docker Container的設定,而且Container上提供使用者的服務都還是正常。

先試著連上Container看看,結果出現下列的錯誤,一連試了這台Docker Server底下的四個Container,都是一樣的情形
[root@FS-TEST ~]# docker exec -it 94ee8a1881a1 /bin/bash

connection error: desc = "transport: dial unix /var/run/docker/containerd/docker-containerd.sock: connect: connection refused": unknown


連關掉Container也沒有辦法
[root@FS-TEST ~]# docker stop 94ee8a1881a1

Error response from daemon: cannot stop container: 94ee8a1881a1: Cannot kill container 94ee8a1881a1b59286282cc14790abb8806a4b3483b9fc7442e411aad99babc0: connection error: desc = "transport: dial unix /var/run/docker/containerd/docker-containerd.sock: connect: connection refused": unknown

因為docker container已經無法連上,也無法關掉,所以只好強制重開Dokcer的核心服務
[docker_server]# service docker restart

重開完docker後,container依舊是無法連上,但是container上的服務已經停掉,而container也可以成功關掉了。
[docker_server]# docker stop 94ee8a1881a1 

接著重新啟動container與服務,終於都恢復正常了。

不過,我是沒有找到為什麼Docker會佔用CPU的真正原因,因為趕著讓服務正常,所以也就沒有辦法慢慢檢查了。



Docker for MS SQL Server的建置

 微軟有為SQL Server發行Docker的版本,對於測試與學習資料庫是非常方便的。

稍微記錄一下操作,以便之後可以快速重建。

Docker Hub:https://hub.docker.com/_/microsoft-mssql-server

下面是我用來產生Docker Container的語法
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=password" -e "MSSQL_PID=Express" -p 4433:1433 -d mcr.microsoft.com/mssql/server:2019-latest


說明:

1、因為我想要測試SQL Server 2019,所以我有指定版本2019-latest

2、MSSQL_PID是指定使用的版本,如不指定預設是developer,我使用的是Express是資源受限的免費版本,可用在生產環境,但是有資源限制

3、SQL Server版本的差異:https://learn.microsoft.com/zh-tw/sql/sql-server/editions-and-components-of-sql-server-2019?view=sql-server-ver16

4、因為我的Docker還有其他的Container,所以必需指定Port:4433

5、在SQL Server Managerment Studio連線特定的port時,可用「,」來指定,例如:192.192.192.10,4433

6、查SQL Server版本的語法:select @@version

用docker來執行firebase CLI login注意事項

 我想在docker container上執行firebase cli,在login時遇到了一些問題,故將步驟記錄下來。

1、我用node最新的docker image來建立container。

2、安裝firebase cli:npm install -g firebase-tools

3、為了避免時區的問題,所以在建立container時一併指定了時區;firebase login會用到port:9005,所以我的指令如下:

   # docker run -it -p 9005:9005 --name firebase_cli -e TZ=Asia/Taipei firebse_cli /bin/bash

4、在cli下執行firebase login時,因為認證會轉到localhost,所以會無法成功,可改用firebase login --no-localhost,用取得authorization code的方式登入

 


docker container測試flask,無法於外部Host瀏覽

 我用Docker來測試及學習Flask,container有將Port mapping:5000:5000

test.py的內容如下,是一段簡單的程式:

from flask import Flask

app = Flask(__name__)

@app.route("/")

def hello_world():

    return "<p>Hello, World!</p>"

if __name__ == "__main__":

    app.run(debug=True, host='0.0.0.0', port=5000)

因為在討論區上有人提到flask預設會只能使用localhost,所以我有加上host='0.0.0.0'

接著我執行下列的指令來啟動Web Server:

# export FLASK_APP=test

# flask run


在docker container用crul http://127.0.0.1:5000來測試,有正確出現Hello,World的訊息。

但是在Host端用瀏覽器開啟http://192.168.1.1:5000(192.168.1.1是Host的IP)卻無法顯示網頁。


接著在討論區上又看到有人提到新版本要以python加參數來啟動flask,所以我依樣輸入下列指令:

# export FLASK_APP=test

# python3 -m flask run --host='0.0.0.0'


再次以瀏覽器開啟http://192.168.1.1:5000,這次就正確出現Hello,World

docker container出現Operation not permitted的錯誤

 我在Windows 10有安裝docker並自訂一個image,後來將這個image移轉至Linux上後產生新的container

在這個container上執行 ls -lh的指令時,卻出現了下列的錯誤,Windows上的container並此錯誤,而且還是以root的身分。

root@3c68aa381e26# ls -lh
ls: cannot access 'prtg_uwsgi.sock': Operation not permitted
total 0
s????????? ? ? ? ?            ? prtg_uwsgi.sock

在google查找一下原因,發現是linux核心中有支援seccomp的緣故。所以不只是ls,還有許多的指令都會出現Operation not permitted

seccomp(secure computing mode,安全計算模式)可以用來限制容器內可用的操作。
預設的seccomp配置為容器提供了一個合理的設定,並且禁用許多的系統呼叫。它具有適度的保護性,同時提供廣泛的應用相容性。
更詳給的內容可以參考:https://docs.docker.com/engine/security/seccomp/

所以Linux為了讓Docker更加安全,所以限制了container部份的權限,就算是以root身份來執行,該限制依舊是有效的。

檢查系統是否有支援secomp:
# cat /boot/config-$(uname -r) |grep CONFIG_SECCOMP
CONFIG_SECCOMP=y


那如果我們有需要這些被限制的功能,則有幾種方式可以放寬限制:

1、使用privileged來啟用特權容器(privileged container),即可取得最大的權限
# docker run --privileged <image>


2、關閉seccomp
docker run --security-opt seccomp=unconfined <image>


3、放寬部份的限制,這是建議的方式,只開放有需要的權限,可參考https://docs.docker.com/engine/security/seccomp/

例如文件中關於修改系統時間的說明如下:
settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME.
stime Time/date is not namespaced. Also gated by CAP_SYS_TIME.

我們就可以將CAP_SYS_TIME加入白名單中,以解除此限制(會自動加上cap_,所以只需要指定sys_timem關鍵字),如下所示:
# docker run --cap-add SYS_TIME <image>

離線移轉docker images到其他的docker server上

 通常都是直接由網路上下載images,但是現在有一台docker伺服器是無法連網。


所以先在可以上網的Docker伺服器上先下載好images,再執行下列指令將images匯出來

# docker save -o helloworld.tar helloworld

參數 -o 後面接的是匯出來的檔案名稱


將匯出來的helloworld.tar上傳到另一台伺服器,再執行下列指令匯入

# docker load -i helloworld.tar

參數-i是要import的檔案名稱


這樣就完成兩台之間images的移轉了。

Centos 7.9離線安裝Docker

 今天將Docker裝好了,記錄一下,以免之後又忘了

1、下載container-selinux-2.9-4.el7.noarch.rpm、docker-ce-17.12.0.ce-1.el7.centos.x86_64.rpm並上傳到伺服器

2、執行安裝,因為有依賴性問題,所以要注意這個package要先安裝

# yum localinstall -y container-selinux-2.9-4.el7.noarch.rpm

3、再安裝下一個package

# yum localinstall -y docker-ce-17.12.0.ce-1.el7.centos.x86_64.rpm

5、啟動Docker服務

# systemctl  start  docker

6、下載一個示範image來驗證是否正常

# docker run hello-world

Docker Error: Cannot enable hyper-v service

 今天更新Windows 10之後,其更新後資訊如下圖







而重開機後,在Start Docker時出現錯誤:Cannot enable hyper-v service

但是在Windows 10更新前Docker並無問題,BIOS的hyper-v也已確定啟用。

以系統管理員開啟cmd後,鍵入下列指令,docker就成功啟動了。

c:\> bcdedit /set hypervisorlaunchtype auto

Jenkins版本更新(Docker container)

今天將Jenkins的Docker容器啟動後,發現有新版本的Jenkins可以更新



Jenkins的更新只有一個jenkins.war的檔案,將它下載至Docker容器內。

以root進入Jenkins Container
C:\ docker container exec -u 0 -it jenkins /bin/bash

將新版的 jenkins.war 移動並取代舊版本,路徑為 /usr/share/jenkins
# mv jenkins.war /usr/share/jenkins

修改權限
# chown jenkins:jenkins /usr/share/jenkins/jenkins.war

退出Jenkins Container
# exit

重新啟動 Jenkins Container
C: \docker container restart ebd587cc3763

等待一段時間,讓服務重啟後即完成版本更新。

Docker for Windows執行Container錯誤:No hypervisor is present on this system

在Windows 10 安裝完 Docker後,下載一個測試用的映象檔,在產生Container時出現下列的錯誤:

C:\> docker run hello-world bash
docker: Error response from daemon:
container 7d97d673d8f080a7a97da1272710f17f065594c330a7e95828aa7459d664252d
encountered an error during CreateContainer: failure in a Windows system call:
No hypervisor is present on this system. (0xc0351000)
...

其原因是未啟用Hyper-V的綠故,以系統管理員開啟powershell,並輸入下列指令
PS c:\> bcdedit /set hypervisorlaunchtype auto

成功執行上述指令後將電腦重開機再測試一次,這次就沒有問題了,但是啟用Hyper-V後,Oracle VirtualBox就不能用了。

如果同時有Docker與VirtualBox的需求,每次都要切換一次還挺麻煩的。

CentOS 7 docker的簡單安裝測試

最近看到docker的簡單介紹,感覺好像蠻有趣的,所以自己也來簡單測試一下。
我是以VirtualBox來安裝測試CentOS 7與docker。

因為只有要測試docker,所以我在安裝時選擇了最小安裝,只安裝最基本的套件。


完成CentOS 7的安裝後,接著開始安裝docker,安裝中途會提示相依套件的安裝,按y就是了
[root@localhost ~]# yum install docker

啟動docker
[root@localhost ~]# systemctl start docker

查詢docker目前的狀態
[root@localhost ~]# systemctl status docker
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
   Active: active (running) since Tue 2015-10-20 13:30:35 CST; 1 day 22h ago
     Docs: http://docs.docker.com
 Main PID: 1170 (docker)
   CGroup: /system.slice/docker.service
           ???€1170 /usr/bin/docker -d --selinux-enabled
(略…)


開機時自動啟動
[root@localhost ~]# systemctl enable docker
ln -s '/usr/lib/systemd/system/docker.service'
'/etc/systemd/system/multi-user.target.wants/docker.service'

檢查docker是否在開機時自動啟動
[root@localhost ~]# systemctl is-enabled docker
enabled

新增base image,需連上網路,我選擇下載ubuntu,也可以用指令來尋找images,
例如:docker search ubuntu。
[root@localhost ~]# docker pull ubuntu
latest: Pulling from docker.io/centos
47d44cb6f252: Pull complete
168a69b62202: Pull complete
812e9d9d677f: Pull complete
(略…)

下載完成之後,可以查詢image
[root@localhost ~]# docker images
REPOSITORY         TAG     IMAGE ID     CREATED     VIRTUAL SIZE
docker.io/ubuntu   latest  a005e6b7dd01 9 days ago  188.3 MB

啟動一個容器(container),參數 -d會在背景執行; -t -i可以讓我們跟容器進行互動,例如:
[root@localhost lib]# docker run -d -t -i  ubuntu:latest /bin/bash
4111209563dbbf7131f6b1258f410593b43507a1016c78bf88b61e0bc72bd6db
Usage of loopback devices is strongly discouraged for production use.
Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.
no_warn_on_loop_devices=true` to suppress this warning.
root@7ff7e5ed5ff6:/#  --> 可以發現已經進到ubuntu(7ff7e5ed5ff6)內

查詢目前容器的狀態
[root@localhost lib]# docker ps
CONTAINER ID  IMAGE         COMMAND     CREATED        STATUS      
7ff7e5ed5ff6  ubuntu:latest "/bin/bash" 2 seconds ago  Up 2 seconds

其實這是一個很簡單的測試,有機會再來以實際的應用來試試。