docker -v 文件夹下没有数据_详细!快速入门指南!Docker
什 么 是 容 器?
容器只是實(shí)現(xiàn)隔離的一種方法。與虛擬機(jī)不同,它們不是通過模擬硬件來實(shí)現(xiàn)隔離,而是通過使用現(xiàn)有的Linux內(nèi)核功能來實(shí)現(xiàn)隔離。在典型的Unix/Linux操作系統(tǒng)中,所有進(jìn)程都共享相同的用戶空間,但是隨著Linux 2.6+中新功能的引入,您可以創(chuàng)建一個(gè)進(jìn)程,該進(jìn)程具有自己特定的一組隔離上下文的進(jìn)程,如文件樹、線程等。這些功能與其他內(nèi)核技術(shù)結(jié)合在一起是容器的神奇之處!
◆ ◆ ◆ ◆ ◆
在本文中,我將介紹基本的Docker命令和概念。讀完后,您將能夠采用一些Docker功能來加速和簡(jiǎn)化您的日常工作流程。
安裝Docker
在OS X/Windows中,使用安裝向?qū)О惭bDocker是一項(xiàng)簡(jiǎn)單的任務(wù)。您可以在Docker社區(qū)頁面上找到操作系統(tǒng)的安裝程序。在Linux上,Docker通常在分發(fā)包管理器中可用。
在Fedora中安裝Docker :
sudo dnf install docker要開始這個(gè)過程:
sudo systemctl start docker要使Docker進(jìn)程啟動(dòng)和啟動(dòng)時(shí)間:
sudo systemctl enable docker在使用Systemd的其他Linux發(fā)行版中,這些步驟應(yīng)該類似。
入門
Hello World
完成安裝后,我們應(yīng)該嘗試一個(gè)Hello World!
#sudo is only for Linuxsudo docker run --name hello -it busybox echo "Hello World!" # Hello World!只有在運(yùn)行某些Linux發(fā)行版時(shí)才需要使用sudo,但請(qǐng)記住,Docker需要管理員權(quán)限創(chuàng)建容器。在OSX和Windows編寫本文時(shí),本文使用了一些基于Linux的虛擬機(jī),因此Docker命令可以在這些系統(tǒng)中沒有特權(quán)用戶的情況下運(yùn)行。
如何運(yùn)行
sudo docker runrun選項(xiàng)創(chuàng)建并運(yùn)行一個(gè)容器,其中一個(gè)屬性是docker將容器的生命綁定到正在運(yùn)行的進(jìn)程(在本例中是linux命令echo),這意味著當(dāng)進(jìn)程完成時(shí),容器將終止。
- name:我們?cè)O(shè)置容器的名稱,如果您不選擇任何內(nèi)容,Docker將隨機(jī)選擇一個(gè)。
- it:這意味著交互,它將我們的終端連接到容器虛擬tty的輸出,允許與正在運(yùn)行的進(jìn)程交互。
- busybox:這是創(chuàng)建容器的基本映像,將其視為zip文件,其中包含運(yùn)行所需應(yīng)用程序所需的文件和文件夾。在Docker Hub中有一個(gè)完整的社區(qū)基礎(chǔ)圖像,我使用BusyBox,因?yàn)樗浅]p,只有715 kb的壓縮空間。
- echo:正如我們前面提到的,echo是我們?cè)噲D執(zhí)行的命令,它包含在busybox映像中。
如果要檢查busybox中可用的命令,請(qǐng)執(zhí)行以下操作:
sudo docker run -it busybox ls /bin/列出鏡像
當(dāng)您第一次執(zhí)行docker命令時(shí),您可以使用以下命令檢查本地鏡像:
sudo docker images在守護(hù)進(jìn)程模式下運(yùn)行
在某些情況下,我們不希望直接與某些應(yīng)用程序(如服務(wù)器)交互,在這種情況下,我們希望生成進(jìn)程并返回我們的終端繼續(xù)執(zhí)行一些工作,Docker為我們提供了一種在守護(hù)進(jìn)程模式下執(zhí)行進(jìn)程的方法像這樣的-d參數(shù):
sudo docker run - d - name snooze busybox sleep 15此過程將在后臺(tái)運(yùn)行15秒,然后退出。
列出后臺(tái)運(yùn)行容器
容器在后臺(tái)運(yùn)行后,您可以使用ps檢查其狀態(tài):
sudo docker ps殺死運(yùn)行容器
停止容器很簡(jiǎn)單:
sudo docker stop [name of your container]#examplesudo docker stop snooze此命令將停止正在運(yùn)行的容器,但Docker服務(wù)將保留您創(chuàng)建的容器,包括其關(guān)聯(lián)的命令緩存在磁盤中。如果需要重新啟動(dòng),只需執(zhí)行:
sudo docker start snooze如果想要更改配置并重新使用容器名稱,則需要停止并刪除容器,假設(shè)我們要更改休眠容器,使其休眠10秒而不是15秒:
# stop & cleansudo docker stop snoozesudo docker rm snooze# re-createsudo docker run -d --name snooze busybox sleep 10安裝
-v參數(shù)將使我們能夠掛載/從一個(gè)文件夾映射主機(jī)(我們的電腦)到容器內(nèi)的文件夾中。
我們來創(chuàng)建一個(gè)文件:
echo 'Hello World' > hello現(xiàn)在我們要使用busybox中提供的隔離文本編輯器打開文件:
# Opening the file with our contained VIMsudo docker run -it busybox vi hello沒有任何反應(yīng),這是因?yàn)槲覀冋{(diào)用的vi進(jìn)程是隔離的,無法訪問包含區(qū)域之外的文件。要解決這個(gè)問題,我們需要掛載文件夾,以便我們的編輯器能夠找到該文件。
#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這會(huì)將實(shí)際文件夾$(pwd)裝入容器中的文件夾/應(yīng)用程序。如果文件夾中不存在,那么將創(chuàng)建它,然后使用vi并傳遞掛載文件夾vi app/hello的文件位置。
一些觀察結(jié)果:
- 該v將覆蓋容器中以前的任何文件夾。如果存在,它將替換為提供的文件夾。
- 這個(gè)命令實(shí)際上是掛載文件夾,所以一旦容器被殺死,容器對(duì)這個(gè)文件夾所做的每一個(gè)更改都將被持久化,如果您希望數(shù)據(jù)庫在容器生命周期之外持久化其數(shù)據(jù),這是一個(gè)好主意。
- 容器將可以訪問您的系統(tǒng)資源(共享文件夾),因此請(qǐng)小心。
聯(lián)網(wǎng)
-p允許我們公開一個(gè)隔離端口并將其傳遞給特定的主機(jī)端口。
為了說明網(wǎng)絡(luò)如何與容器一起工作,首先讓我們開始編寫一個(gè)簡(jiǎn)單的Javascript腳本來啟動(dòng)服務(wù)器。我們將在本地機(jī)器上執(zhí)行此操作,所以讓我們編寫一些代碼。
require('http') .createServer((req, res) => { res.end('Hello World!') }).listen(8080)我們將調(diào)用這個(gè)文件index.js,它基本上創(chuàng)建了一個(gè)在端口8080中等待連接的服務(wù)器。當(dāng)有人連接時(shí),它會(huì)發(fā)送一個(gè)Hello World!
下一步是在容器中運(yùn)行腳本。我們可以通過編寫以下命令來完成此操作:
sudo docker run - it - v “$(pwd)”:/ app:z - name myserver mhart / alpine - node node app / index。JS這里的新東西是mhart / alpine-node的基本鏡像,它將拉出一個(gè)Node.JS容器,然后將像我們之前那樣使用-v掛載文件夾,然后執(zhí)行隔離節(jié)點(diǎn)app / index.js進(jìn)程。
讓我們看看我們的服務(wù)器是否正常工作:
sudo docker exec -it myserver wget -qO- localhost:8080# Hello World%這個(gè)命令測(cè)試我們的服務(wù)器在容器中工作,我們應(yīng)該返回hello world%。現(xiàn)在,讓我們嘗試從主機(jī)連接,打開一個(gè)新終端,然后寫:Hello World%
curl http://localhost:8080#curl: (7) Failed to connect to localhost port 8080: Connection refused我們無法連接,因?yàn)槿萜骶W(wǎng)絡(luò)是孤立的; 我們需要拉取之前的端口:
# stopping our containersudo docker stop myserver sudo docker rm myserversudo docker run -it -v "$(pwd)":/app:z -p 8080:8080 --name myserver mhart/alpine-node node app/index.js現(xiàn)在嘗試在瀏覽器中打開http:// locahost:8080,你應(yīng)該看到一個(gè) hello world!
恭喜!你已經(jīng)編寫了一個(gè)很好的NodeJS應(yīng)用程序。最大的優(yōu)勢(shì)之一是您可以在不安裝NodeJS的情況下執(zhí)行此操作,并且可以使用此功能來安裝其他類型的軟件,如數(shù)據(jù)庫,其他微服務(wù)等。
一些快速提示
在我的日常工作中,我總是需要與MongoDB和Redis集成,但是安裝它們通常是一個(gè)痛苦的過程,我通過在.zshrc中創(chuàng)建一些bash腳本來解決這個(gè)問題。
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 versionfunction 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}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_mongostop_redis現(xiàn)在,您將能夠按需配置部署本地MongoDB或Redis實(shí)例,并且一個(gè)優(yōu)點(diǎn)(至少在我看來)是這些實(shí)例中的數(shù)據(jù)是短暫的,這意味著當(dāng)您終止容器時(shí)它將重置數(shù)據(jù)庫也是如此,釋放占用的空間。
linux安全性
如果您在Fedora中使用-v參數(shù)執(zhí)行掛載文件夾,可能會(huì)收到此錯(cuò)誤:
sudo docker run -it -v "$(pwd)":/app busybox ls app/text#ls: can't open '.': Permission denied這是因?yàn)镾ELinux默認(rèn)策略將保護(hù)主機(jī)中的任何讀/寫,以防攻擊者離開容器,SELinux將通過在內(nèi)核級(jí)強(qiáng)制執(zhí)行安全規(guī)則來阻止您。
要在SELinux感知機(jī)器中安裝文件夾,您需要傳遞z參數(shù),這將更改SELinux上下文并允許容器執(zhí)行安裝。
# "$(pwd)" will get the actual directory, is equivalent to do pwddocker run -it -v "$(pwd)":/app:z busybox /bin/sh另一種方法(但不建議這樣做)是暫時(shí)禁用此保護(hù):
su -c "setenforce 0"完成后,您可以通過以下操作啟用它:
su - c “setenforce 1”總結(jié)
以上是生活随笔為你收集整理的docker -v 文件夹下没有数据_详细!快速入门指南!Docker的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 镗孔指令g76格式_钻孔、镗孔、攻丝,1
- 下一篇: 不是变量 win10_在win10下安装