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