1. 程式人生 > >Docker新手指南

Docker新手指南

letter The window 打開文件 詳細 dsm ble data- 網址

版權聲明:本文為博主原創文章,未經博主同意不得轉載。 https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/79786106

技術分享圖片

什麽是容器?

技術分享圖片


容器僅僅是實現流程隔離的一種方式。與虛擬機不同。它們不通過模擬硬件實現隔離,而是通過使用現有的Linux內核功能實現隔離。
在一個典型的Unix / Linux操作系統中,全部進程共享相同的用戶空間,可是通過在Linux 2.6+中引入的新功能,您能夠創建一個自己單獨擁有的獨立環境(如文件樹、線程等)的進程。這些與其它內核技術相結合的特性是容器背後的魔力。


在本文中,我將介紹主要的Docker命令和概念。

閱讀完畢後。您將能夠採用一些Docker功能來加速和簡化您的日常工作流程。

安裝Docker

技術分享圖片


在OS X / Windows中使用安裝向導安裝Docker是一項簡單的任務。

能夠在Docker社區頁面上找到適用於操作系統的安裝程序。

在Linux上。Docker通常在分發包管理器中能夠找到。
在Fedora[1]中安裝Docker:

sudo dnf install docker

啟動進程:
sudo systemctl start docker

使Docker進程開機自啟動:
sudo systemctl enable docker

在其它使用Systemd的Linux發行版中,這些步驟相似。

入門

技術分享圖片

Hello World
一旦你完畢安裝。我們能夠嘗試一個容器的Hello World應用:
#sudo is only for Linux
sudo docker run --name hello -it busybox echo "Hello World!"
# Hello World!

僅僅有在運行某些Linux發行版時才須要使用sudo。但請記住。Docker須要管理員權限才幹創建遏制。在編寫本文時,在OSX和Windows中使用一些基於Linux的虛擬機。所以Docker命令能夠在這些系統中沒有特權用戶的情況下運行。
怎樣工作
sudo docker run <options> <image> <command to run inside the container>

run參數項創建並運行一個容器,當中一個特點是Docker將容器的生命周期和運行進程進行了綁定(在這個樣例中是Linux的echo命令),這意味著當進程結束後容器也尾隨終止了。
  • Name:我們設置容器的名稱,假設你不選擇不論什麽Docker將隨機選擇一個。

  • It:交互式的。它將我們的終端連接到容器虛擬TTY的輸出,同意與正在運行的進程交互。

  • Busybox:這是創建容器的基礎映像,能夠覺得帶有應用程序運行所需的文件和目錄組成的zip文件。 Docker Hub中有一個完整的社區基礎鏡像,使用busybox[2]是由於它非常輕便,壓縮後僅僅有715 KB

  • Echo:正如前所述。echo是運行的命令。包括在busybox鏡像中。


假設想檢查命令是否在busybox中可用,可輸入例如以下命令:
sudo docker run -it busybox ls /bin/
列出緩存的鏡像
當你第一次運行Docker命令時,鏡像被下載並被緩存以加高速度。能夠使用下面命令檢查本地鏡像:
sudo docker images
守護進程模式下運行
在某些情況下,我們不想直接與某些應用程序(如server)進行交互,此時我們希望生成該進程並返回終端以繼續工作。Docker為我們提供了一種使用守護進程模式運行進程的方法,像例如以下命令使用-d參數這樣:
sudo docker run -d --name snooze busybox sleep 15

這個進程將在後臺運行15s後退出。
列出後臺運行的容器
一旦容器在後臺運行,能夠使用例如以下ps命令檢查容器狀態:
sudo docker ps
殺死運行的容器
停止一個容器非常easy:
sudo docker stop [name of your container]
#比如
sudo docker stop snooze

該命令會停止運行的容器。可是Docker服務會將創建的容器和其關聯的命令緩存在磁盤中。

假設你想再次反復運行相同的命令。僅僅須要運行:

sudo docker start snooze

假設想改變配置並重用容器名。須要停止並刪除容器。假設我們想改變snooze容器為休眠10秒而不是15秒:
#stop & clean
sudo docker stop snooze
sudo docker rm snooze
#re-create
sudo docker run -d --name snooze busybox sleep 10

掛載

技術分享圖片


參數v同意我們將主機的文件掛載、映射到容器的目錄。創建一個文件如:
echo ‘Hello World‘ > hello

如今我們使用busybox中提供的獨立文本編輯器來打開文件:
#使用容器的VIM打開文件
sudo docker run -it busybox vi hello

沒有不論什麽反應。這是由於vi進程是孤立的,無法訪問容器外的文件。為了解決問題。我們須要掛載該目錄,以便我們的編輯器能夠找到該文件。
#the :z in /app:z -> is for SELinux, non-Linux can ignore this.
sudo docker run -it -v "$(pwd)":/app:z busybox vi app/text

這將掛載當前目錄$pwd為容器內的/app目錄。假設目錄在容器內不存在。將自己主動創建,然後。使用vi打開文件位置vi app/hello。
一些實驗:
  • 參數v將覆蓋容器內的曾經的目錄。

    假設存在。它將被替換為提供的目錄

  • 該命令從字面上是掛載目錄,因此容器一旦被殺死。容器對該目錄所做的每一個更改都將被保留。假設您希望將數據庫數據保存在容器生命周期之外,這是一個好方式

  • 容器將有權訪問您的系統資源(共享目錄)。所以要小心。

網絡

技術分享圖片


選項p同意我們公開一個隔離的端口並通過特定的主機端口重定向。
為了說明網絡怎樣與容器配合工作。首先讓我們開始編寫一個簡單的JavaScript腳本來啟動server。我們將在本地機器上運行此操作,因此我們來編寫一些代碼。
require(‘http‘)
?.createServer((req, res) => { res.end(‘Hello World!‘) }).listen(8080)

我們將調用這個文件index.js。它簡單的創建了一個等待8080端口連接的server。

當有人連接它時。它會發送“Hello World!


下一步是在容器內運行腳本,能夠運行例如以下命令:

sudo docker run -it -v "$(pwd)":/app:z --name myserver mhart/alpine-node node app/index.js

這裏的新事物是基礎鏡像mhart/alpine-node,它將拉取一個Node.JS容器,然後像曾經一樣使用-v掛載目錄,然後運行隔離節點的app/index.js進程。
讓我們看看我們的server是否工作:
sudo docker exec -it myserver wget -qO- localhost:8080
# Hello World

這個命令是測試server在容器內工作,獲得hello world反饋。如今我們試下從主機連接server,打開終端。運行:
curl http://localhost:8080
#curl: (7) Failed to connect to localhost port 8080: Connection refused

我們無法連接,由於容器的網絡是隔離的,我們須要實現端口轉:
# stopping our container
sudo docker stop myserver ?
sudo docker rm myserver
sudo docker run -it -v "$(pwd)":/app:z -p 8080:8080 --name myserver \
mhart/alpine-node node app/index.js

如今試下在瀏覽器中打開網址http://locahost:8080。你會看到hello world。
恭喜!你已經寫了一個完美的容器化NodeJS應用。當中一個最大的優點是你能夠在不安裝NodeJS的情況下實現NodeJS應用,而且您能夠使用此功能來安裝其它類型的軟件,如數據庫,其它微服務等。

高速提示

技術分享圖片


在我的日常工作中,我總是須要集成MongoDB和Redis,但安裝這些一般是一個痛苦的過程,我通過在.zshrc中創建一些bash腳本來攻克了這個問題。


function new_mongo {
?docker run -d --name mongodb -p ?27017:27017 mongo
}
# the : here means image tag, usually if the image is done correctly
# like in this case tag version match the Redis version
function new_redis {
?docker run -d ?--name redis ?-p 6379:6379 redis:3.2
}
function stop_mongo {
?docker stop mongodb
?docker rm mongodb
}
function stop_redis {
?docker stop redis
?docker rm redis
}

在你的.bashrc或者.zshrc底部加入這一行,然後運行source ~/.bashrc || source ~/.zshrc,這樣你就能夠實現上面的功能了。
new_mongo # it will spin up a new mongodb instance. 
new_redis # it will spin up a new redis instance.
# to stop this containers
stop_mongo
stop_redis

如今。您將能夠以零配置按需部署本地MongoDB或Redis實例,而且一個優勢(至少在我看來)是這些實例中的數據是短暫的,這意味著當您終止容器時,它將重置數據庫以及釋放占用的空間。

Linux安全

技術分享圖片


假設你在Fedora使用參數v運行掛載目錄的命令,會遇到例如以下錯誤:
sudo docker run -it -v "$(pwd)":/app busybox ls app/text
#ls: can‘t open ‘.‘: Permission denied

這是由於SELinux[3]默認策略將禁止不論什麽主機上的讀寫操作,以防止黑客在容器外運行操作。SELinux通過在內核級上的安全規則來保護您。
要將目錄安裝在支持SELinux的機器中,您須要指定z參數。這將更改SELinux上下文,並同意容器運行掛載動作。
# "$(pwd)" will get the actual directory, is equivalent to do pwd
docker run -it -v "$(pwd)":/app:z busybox /bin/sh

還有一種方式(但不推薦)是臨時禁用這樣的保護:
su -c "setenforce 0"

完畢後打開保護:
su -c "setenforce 1"

相關鏈接:
  1. https://getfedora.org/es/workstation/

  2. https://hub.docker.com/r/library/busybox/tags/

  3. https://en.wikipedia.org/wiki/Security-Enhanced_Linux


原文鏈接:https://dzone.com/articles/docker-for-beginners


Kubernetes零基礎進階培訓

技術分享圖片


本次培訓內容包括:容器原理、Docker架構及工作原理、Docker網絡與存儲方案、Harbor、Kubernetes架構、組件、核心機制、插件、核心模塊、Kubernetes網絡與存儲、監控、日誌、二次開發以及實踐經驗等。

__biz=MzA5OTAyNzQ2OA==&mid=2649697299&idx=1&sn=b3fe8c0f393aa300daf2233f1d268e24&chksm=88931370bfe49a66886d5c5dbe589352ca820aba51c2e092b05139f829b4aa80c48dd0a646fd&scene=21#wechat_redirect" rel="nofollow">點擊了解詳細培訓內容


技術分享圖片


4月20日正式上課,點擊閱讀原文鏈接就可以報名。

Docker新手指南