Docker新手指南
什麽是容器?
在本文中,我將介紹主要的Docker命令和概念。
閱讀完畢後。您將能夠採用一些Docker功能來加速和簡化您的日常工作流程。
安裝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
掛載
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將覆蓋容器內的曾經的目錄。
假設存在。它將被替換為提供的目錄
該命令從字面上是掛載目錄,因此容器一旦被殺死。容器對該目錄所做的每一個更改都將被保留。假設您希望將數據庫數據保存在容器生命周期之外,這是一個好方式
容器將有權訪問您的系統資源(共享目錄)。所以要小心。
網絡
為了說明網絡怎樣與容器配合工作。首先讓我們開始編寫一個簡單的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應用,而且您能夠使用此功能來安裝其它類型的軟件,如數據庫,其它微服務等。
高速提示
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安全
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"
相關鏈接:
https://getfedora.org/es/workstation/
https://hub.docker.com/r/library/busybox/tags/
https://en.wikipedia.org/wiki/Security-Enhanced_Linux
Kubernetes零基礎進階培訓
__biz=MzA5OTAyNzQ2OA==&mid=2649697299&idx=1&sn=b3fe8c0f393aa300daf2233f1d268e24&chksm=88931370bfe49a66886d5c5dbe589352ca820aba51c2e092b05139f829b4aa80c48dd0a646fd&scene=21#wechat_redirect" rel="nofollow">點擊了解詳細培訓內容。
4月20日正式上課,點擊閱讀原文鏈接就可以報名。
Docker新手指南