Docker 安裝ELK及Docker常見命令


最近搭建基於Spring Cloud的微服務框架,日誌系統當然最佳選擇就是ELK。看著MAC 那緊巴巴的配置,又不想熱情退去而留下一堆軟件,果斷選擇Docker安裝來節省那可憐的資源。當然這只是鵬哥的一點點小心思。

為什麼使用docker 這裡就不在贅述了,相信就算現在豬肉貴你沒吃過,但是新聞裡至少有豬的圖片你應該看過吧。這篇文章的主旨是搭建一個ELK(主要是elasticsearch + kibana,logstash會在spring cloud 繼承ELK的文章中介紹),Docker充其量是一個工具,但是磨刀不誤砍柴工,我們還是先來看看安裝ELK過程中用到的Docker命令吧。

Docker 常見命令

search 命令

下載鏡像之前我們應該先搜索到鏡像,搜索鏡像的命令:

<code>docker search [OPTIONS] TERM/<code>

OPTIONS說明:

--automated :只列出 automated build類型的鏡像;--no-trunc :顯示完整的鏡像描述;-s :列出收藏數不小於指定值的鏡像。

NAME: 鏡像倉庫源的名稱DESCRIPTION: 鏡像的描述OFFICIAL: 是否 docker 官方發佈stars: 類似 Github 裡面的 star,表示點贊、喜歡的意思。AUTOMATED: 自動構建。

pull 命令

搜索之後找到對應的鏡像,然後我們調用pull命令將鏡像拉到本地:

<code>docker pull [OPTIONS] NAME[:TAG|@DIGEST]/<code>

OPTIONS說明:

-a :拉取所有 tagged 鏡像--disable-content-trust :忽略鏡像的校驗,默認開啟


run命令

鏡像下來之後,我們的最終目的是要運行這個鏡像,運行鏡像需要用到run命令。

<code>docker run [OPTIONS] IMAGE [COMMAND] [ARG...]/<code>

OPTIONS說明:

-a stdin: 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項;-d: 後臺運行容器,並返回容器ID;-i: 以交互模式運行容器,通常與 -t 同時使用;-P: 隨機端口映射,容器內部端口隨機映射到主機的高端口-p: 指定端口映射,格式為:主機(宿主)端口:容器端口-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;--name="nginx-lb": 為容器指定一個名稱;--dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致;--dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致;-h "mars": 指定容器的hostname;-e username="ritchie": 設置環境變量;--env-file=[]: 從指定文件讀入環境變量;--cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運行;-m :設置容器使用內存最大值;--net="bridge": 指定容器的網絡連接類型,支持 bridge/host/none/container: 四種類型;--link=[]: 添加鏈接到另一個容器;--expose=[]: 開放一個端口或一組端口;--volume , -v: 綁定一個卷



logs命令

鏡像啟動之後,會在容器裡運行,那我們如何查看運行的情況呢?logs命令會幫我們輸出運行的日誌。

<code>docker logs [OPTIONS] CONTAINER/<code>

OPTIONS說明:

-f : 跟蹤日誌輸出--since :顯示某個開始時間的所有日誌-t : 顯示時間戳--tail :僅列出最新N條容器日誌

ps 命令

鏡像啟動之後,會在有一個容器,如果我們想查看當前容器的信息,需要執行ps命令。

<code>docker ps [OPTIONS]/<code>

OPTIONS說明:

-a :顯示所有的容器,包括未運行的。-f :根據條件過濾顯示的內容。--format :指定返回值的模板文件。-l :顯示最近創建的容器。-n :列出最近創建的n個容器。--no-trunc :不截斷輸出。-q :靜默模式,只顯示容器編號。-s :顯示總的文件大小。


輸出詳情介紹:

CONTAINER ID: 容器 ID。IMAGE: 使用的鏡像。COMMAND: 啟動容器時運行的命令。CREATED: 容器的創建時間。STATUS: 容器狀態。狀態有7種:created(已創建)restarting(重啟中)running(運行中)removing(遷移中)paused(暫停)exited(停止)dead(死亡)PORTS: 容器的端口信息和使用的連接類型(tcp\\\\udp)。NAMES: 自動分配的容器名稱。

exec 命令

有時候我們需要進入到鏡像的內部,exec 命令會幫助我們在容器內部執行命令。

<code>docker exec [OPTIONS] CONTAINER COMMAND [ARG...]/<code>

OPTIONS說明:

-d :分離模式: 在後臺運行-i :即使沒有附加也保持STDIN 打開-t :分配一個偽終端

start/stop/restart 命令

docker start :啟動一個或多個已經被停止的容器docker stop :停止一個運行中的容器docker restart :重啟容器

<code>docker start [OPTIONS] CONTAINER [CONTAINER...]/<code>

<code>docker stop [OPTIONS] CONTAINER [CONTAINER...]/<code>

<code>docker stop [OPTIONS] CONTAINER [CONTAINER...]/<code>

rm 命令

如果我們認為這個容器已經沒有存在的意義了,我們可以執行rm 命令刪除這個容器。

<code>docker rm [OPTIONS] CONTAINER [CONTAINER...]/<code>

OPTIONS說明:

-f :通過 SIGKILL 信號強制刪除一個運行中的容器。-l :移除容器間的網絡連接,而非容器本身。-v :刪除與容器關聯的卷。

images命令

<code>如果我們長期不使用,就會忘記我們之前拉取過那些,images 命令會列出我們本地所有的鏡像。docker images [OPTIONS] [REPOSITORY[:TAG]]/<code>

OPTIONS說明:

-a :列出本地所有的鏡像(含中間映像層,默認情況下,過濾掉中間映像層);--digests :顯示鏡像的摘要信息;-f :顯示滿足條件的鏡像;--format :指定返回值的模板文件;--no-trunc :顯示完整的鏡像信息;-q :只顯示鏡像ID。


rmi

本地鏡像如果不在需要,放在本地就會佔用寶貴的存儲資源,鵬哥就非常在意這個,所以我會定期使用rmi命令清理本地不用的鏡像。

<code>docker rmi [OPTIONS] IMAGE [IMAGE...]/<code>

OPTIONS說明:

-f :強制刪除;--no-prune :不移除該鏡像的過程鏡像,默認移除;

介紹完我們會用到的docker命令之後,安裝ELK就是水到渠成的事了,下邊我們來安裝ELK。

Docker 安裝 elasticsearch

在elastic 6.0 版本之後 elastic 官方開始維護自己的Docker鏡像包,所以如果我們要搭建elk的花,官方的包當然是首選,我們選用最新的7.5.1 版本來搭建。首先我們執行pull命令 將鏡像拉到本地:

<code>docker pull docker.elastic.co/elasticsearch/elasticsearch:7.5.1/<code>

執行完pull命令之後,我們起一個容器,為了後邊方便kibana 鏈接,這裡最好指定一個名稱:

<code>docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.5.1/<code>

啟動完之後在瀏覽器輸入 http://localhost:9200 ,如果能看到如下的輸出,說明我們已經安裝啟動成功。


Docker 安裝 Kibana

安裝完elasticsearch ,就像安裝了一個命令行的操作系統,如果我們想直觀的查看日誌情況,我們需要一個GUI,kibana就是elastic的GUI,這也是elastic的核心競爭力。

同樣的,我們先執行pull 命令拉下來7.5.1 版本的kibana,版本的選擇有一定的要求:我們不能選高於elasticsearch的版本,同時又必須和elasticsearch 保持同樣的大版本。當然簡單起見我們選擇同樣的版本號是不會有問題的。

<code>docker pull docker.elastic.co/kibana/kibana:7.5.1/<code>

拉完鏡像之後,起一個容器,這裡說明一下ELASTICSEARCH_URL 這個參數,鵬哥試下來似乎是沒有作用的,可能是鵬哥不知道怎麼用,如果有網友知道,也請幫忙告知一下,不勝感激。

<code>docker run -d -p 5601:5601 --link elasticsearch -e ELASTICSEARCH_URL=http://elasticsearch:9200 --name kibana docker.elastic.co/kibana/kibana:7.5.1/<code>

我們在起kibana的時候需要知道elasticsearch容器的名稱,ELASTICSEARCH_URL的規則可以是 http://[elasticsearch 容器名稱]:9200,也可以是elasticsearch的無理IP地址,但是不能是localhost, 因為這樣會解析到kibana容器內部,導致無法連接elasticsearch 服務器。

這裡我們設置的elasticsearch 容器名稱跟kibana 默認的 名稱重合了,所以我們不用修改任何配置,這個時候打開瀏覽器 輸入 http://localhost:5601 就能看到kibana的歡迎頁面。但是如果我們沒有設置 elasticsearch 的容器名稱或者設置的其他的字符串,那麼需要我們修改kibana.yml 來指定這個名稱。

首先使用 exec 進入容器:

<code>docker exec -it [你的容器id] /bin/bash/<code>

然後使用vim 打開 kibana.yml

<code>vi /usr/share/kibana/config/kibana.yml/<code>

修改完之後輸入 exit 推出當前的容器。然後使用restart 命令,重啟容器,就能看到效果了。

kibana 默認是英文界面,如果需要支持中文,可以按照上邊的方式修改 kibana.yml ,在最後一行追加:

<code>i18n.locale: zh-CN/<code>

重啟kibana ,刷新瀏覽器就能看到效果了。


總結

按照這套教程,你可以無腦的安裝ELK而不用修改任何東西,也就是這是最簡單的demo,如果你需要更高級別的配置,可以持續關注鵬哥的文章,因為鵬哥也在開始學習elastic 的東西。這套教程就是鵬哥花了兩天的時間從零摸索出來的。雖然意義不大,但是沒辦法,鵬哥就是這麼愛折騰。