怎樣安裝和配置docker?
本文補充了關于在云中部署和管理容器化工作負載的網絡研討會系列?。?本系列介紹了容器的基本知識,包括容器生命周期管理,部署多容器應用程序,擴展工作負載以及理解kubernetes,以及突出顯示運行有狀態應用程序的最佳實踐。
本教程包括本系列第一部分“容器入門”中介紹的概念和命令。
介紹
docker是一個部署和管理容器化應用程序的平臺。?容器在開發人員,管理員和devops工程師中很受歡迎,因為他們提供了靈活性。Docker有三個基本組件:Docker引擎Docker工具Docker注冊表Docker Engine提供了管理容器的核心功能。?它與底層的linux操作系統進行接口,以公開簡單的API來處理容器的生命周期。Docker Tools是一組與Docker Engine公開的API交互的命令行工具。?它們用于運行容器,創建新映像,配置存儲和網絡,以及執行更多影響容器生命周期的操作。Docker Registry是存儲容器圖像的地方。?每個圖像可以有多個版本通過獨特的標簽標識。?用戶從注冊表中拉出現有的圖像,并推送新的圖像。?Docker Hub是由Docker,Inc.管理的托管注冊表。還可以在自己的環境中運行注冊表,以使圖像更靠近引擎。
在本教程結束時,您將在DigitalOcean Droplet上安裝Docker,管理容器,處理圖像,添加持久性,并設置私有注冊表。
先決條件
要學習本教程,您將需要:
按照ubuntu 16.04初始服務器設置教程設置一個Ubuntu 16.04 Droplet,其中包括一個sudo非root用戶和一個防火墻。
Docker Hub帳戶?。?Docker Hub的這個概述將幫助你開始。
默認情況下,?docker命令需要root權限。?但是,可以通過在docker組中以docker用戶身份運行docker來執行不帶sudo前綴的命令。
要以這種方式配置您的Droplet,請運行命令sudo usermod -aG docker ${USER}?。?這會將當前用戶添加到docker組。?然后,運行命令su – ${USER}以應用新的組成員身份。
本教程希望您的服務器配置為不使用sudo前綴來運行docker命令。
第1步 – 安裝Docker
在ssh進入Droplet后,運行以下命令刪除所有可能已經安裝的docker相關的包,然后從官方倉庫安裝Docker:
sudo?apt-get?remove?docker?docker-engine?docker.io sudo?apt-get?install?-y?apt-transport-https?ca-certificates?cURL?software-properties-common curl?-fsSL?https://download.docker.com/linux/ubuntu/gpg?|?sudo?apt-key?add?-sudo?apt-key?fingerprint?0EBFCD88sudo?add-apt-repository?"deb?[arch=amd64]?https://download.docker.com/linux/ubuntu?$(lsb_release?-cs)?stable"sudo?apt-get?update sudo?apt-get?install?-y?docker-ce
安裝Docker后,使用以下命令驗證安裝:
docker?info
以上命令顯示了環境中部署的Docker Engine的詳細信息。?下一個命令將驗證Docker Tools是否正確安裝和配置。?它應該打印Docker引擎和工具的版本。
docker?version
第2步 – 啟動容器
Docker容器是從存儲在注冊表中的現有圖像啟動的。?Docker中的圖像可以存儲在私有或公共存儲庫中。?私有存儲庫要求用戶在提取圖像之前進行身份驗證。?任何人都可以訪問公共圖像。
要搜索名為hello-world的映像,請運行以下命令:
docker?search?hello-world
可能會有多個圖片與名稱hello-world相匹配。?選擇最大的星星,這表明圖像的流行。
使用以下命令檢查本地環境中的可用映像:
docker?images
由于我們還沒有推出任何容器,所以不會有任何圖像。?我們現在可以下載圖像并在本地運行:
docker?pull?hello-world docker?run?hello-world
如果我們執行docker run命令而不拖動圖像,Docker Engine將首先拉取圖像然后運行它。?再次運行docker images命令顯示我們有本地可用的hello-world映像。
讓我們啟動一個更有意義的容器:一個apache Web服務器。
docker?run?-p?80:80?--name?web?-d?httpd
您可能會注意到傳遞給docker run命令的其他選項。?以下是對這些開關的解釋:
-p?– 這告訴Docker引擎在主機的端口80上公開容器的端口80?。?由于Apache在端口80上監聽,我們需要在主機端口上公開它。–name?– 這個開關給我們正在運行的容器分配一個名字。?如果我們省略這個,Docker Engine將會分配一個隨機的名字。
-d?– 此選項指示Docker引擎以分離模式運行容器。?沒有這個,容器將在前臺啟動,阻止對外殼的訪問。?通過將容器推入后臺,我們可以在容器仍在運行時繼續使用外殼。
要驗證我們的容器是否確實在后臺運行,請嘗試以下命令:
docker?ps
輸出顯示名為web的容器正在運行,端口80映射到主機端口80?。
現在訪問Web服務器:
curl?localhost
讓我們停止并用下面的命令刪除正在運行的容器:
docker?stop?web docker?rm?web
運行docker ps再次確認容器已被終止。
第3步 – 添加存儲到容器
容器是短暫的,這意味著當容器終止時,存儲在容器內的任何東西都將丟失。?要將數據保存在容器的壽命之外,我們需要將容器附加到容器中。?卷是主機文件系統的目錄。
首先在主機上創建一個新目錄:
mkdir?htdocs
現在,讓我們用一個新開關啟動容器來掛載htdocs目錄,并將其指向Apache Web服務器的文檔根目錄:
docker?run?-p?80:80?--name?web?-d?-v?$PWD/htdocs:/usr/local/apache2/htdocs?httpd
-v開關將容器中的htdocs目錄指向主機的文件系統。?對這個目錄所做的任何更改都將在兩個位置都可見。
通過運行以下命令從容器中訪問目錄:
docker?exec?-it?web?/bin/bash
該命令以交互模式將我們的終端連接到容器的外殼。?你應該看到你現在被丟在容器內。
導航到htdocs文件夾并創建一個簡單的html文件。?最后退出shell返回主機:
cd?/usr/local/apache2/htdocs echo?'<h1>Hello?World?from?Container</h1>'?>?index.htmlexit
再次執行curl localhost命令顯示Web服務器正在返回我們創建的頁面。
我們不僅可以從主機訪問這個文件,但我們也可以修改它:
cd?htdocs cat?index.html echo?'<h1>Hello?World?from?Host</h1>'?|?sudo?tee?index.html?>/dev/null
再次運行curl localhost?,確認Web服務器正在提供從主機創建的最新頁面。
使用以下命令終止容器。?(?-f迫使Docker先停止而不停止。)
docker?rm?-f?web
第4步 – 建立圖像
除了從注冊表中運行現有的圖像,我們可以創建自己的圖像,并將其存儲在注冊表中。
您可以從現有的容器中創建新的圖像。?首先提交對容器所做的更改,然后將圖像標記并推送到注冊表。
讓我們再次啟動httpd容器并修改默認文檔:
docker?run?-p?80:80?--name?web?-d?httpd docker?exec?-it?web?/bin/bash cd?htdocs echo?'<h1>Welcome?to?my?Web?Application</h1>'?>?index.htmlexit
該容器現在運行一個自定義的index.html?。?你可以使用curl localhost來驗證它。
在我們提交更改后的容器之前,最好停止它。?停止后,我們將運行commit命令:
docker?stop?web docker?commit?web?doweb
使用docker images命令確認圖像的創建。?它顯示了我們剛剛創建的doweb圖像。
要在Docker Hub中標記和存儲此映像,請運行以下命令將映像推送到公共注冊表:
docker?login docker?tag?your_docker_hub_username/doweb docker?push
您可以通過從瀏覽器或命令行在Docker Hub中搜索來驗證新映像。
第5步 – 啟動私人注冊表
可以在私人環境中運行注冊表以保持圖像更加安全。?它也減少了Docker引擎和映像庫之間的延遲。
Docker Registry是一個可以像任何其他容器一樣啟動的容器。?由于注冊表擁有多個圖像,因此最好將存儲卷附加到該圖像上。
docker?run?-d?-p?5000:5000?--restart=always?--name?registry?-v?$PWD/registry:/var/lib/registry?registry
請注意,容器是在后臺啟動的,端口5000暴露,?registry目錄映射到主機文件系統。?您可以通過執行docker ps命令來驗證容器正在運行。
我們現在可以標記一個本地圖像,并將其推送到私人注冊表。?我們首先從Docker Hub中取出busybox容器并對其進行標記。
docker?pull?busybox docker?tag?busybox?localhost:5000/busybox docker?images
以前的命令確認busybox容器現在用localhost:5000標記,所以將圖像推送到私有注冊表。
docker?push?localhost:5000/busybox
將圖像推送到本地注冊表,讓我們嘗試從環境中刪除它,并從注冊表中拉回。
docker?rmi?-f?localhost:5000/busybox docker?images docker?pull?localhost:5000/busybox docker?images
我們經歷了拉動圖像,標記,推送到本地注冊表,最后拉回來的整個圈子。
可能有些情況下您想要在專用主機中運行私有注冊表。?在不同的機器上運行的Docker引擎會與遠程注冊表進行通信,以獲取和推送圖像。
由于注冊表不安全,我們需要修改Docker引擎的配置以啟用對不安全注冊表的訪問。?為此,編輯位于/etc/docker/daemon.json的daemon.json文件。?創建文件,如果它不存在。
添加以下條目:
編輯/etc/docker/daemon.json
{
?“insecure-registries” : [“REMOTE_REGISTRY_HOST:5000”]}
將REMOTE_REGISTRY_HOST替換為遠程注冊表的主機名或IP地址。?重新啟動Docker引擎以確保應用配置更改。
結論
本教程幫助您開始使用Docker。?它涵蓋了安裝,容器管理,映像管理,存儲和私有注冊表等基本概念。?本系列即將發布的會議和文章將幫助您超越Docker的基礎知識。
相關參考:docker教程