国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

30 分鐘快速入門(mén) Docker 教程

Binguner / 1106人閱讀

摘要:分鐘快速入門(mén)教程一歡迎來(lái)到世界與虛擬化在沒(méi)有的時(shí)代,我們會(huì)使用硬件虛擬化虛擬機(jī)以提供隔離。倉(cāng)庫(kù)分為公開(kāi)倉(cāng)庫(kù)和私有倉(cāng)庫(kù),最大的公開(kāi)倉(cāng)庫(kù)是官方倉(cāng)庫(kù),國(guó)內(nèi)的公開(kāi)倉(cāng)庫(kù)也有很多選擇,例如阿里云等。

原文地址:梁桂釗的博客

博客地址:http://blog.720ui.com

歡迎關(guān)注公眾號(hào):「服務(wù)端思維」。一群同頻者,一起成長(zhǎng),一起精進(jìn),打破認(rèn)知的局限性。

30 分鐘快速入門(mén) Docker 教程 一、歡迎來(lái)到 Docker 世界 1. Docker 與虛擬化

在沒(méi)有 Docker 的時(shí)代,我們會(huì)使用硬件虛擬化(虛擬機(jī))以提供隔離。這里,虛擬機(jī)通過(guò)在操作系統(tǒng)上建立了一個(gè)中間虛擬軟件層 Hypervisor ,并利用物理機(jī)器的資源虛擬出多個(gè)虛擬硬件環(huán)境來(lái)共享宿主機(jī)的資源,其中的應(yīng)用運(yùn)行在虛擬機(jī)內(nèi)核上。但是,虛擬機(jī)對(duì)硬件的利用率存在瓶頸,因?yàn)樘摂M機(jī)很難根據(jù)當(dāng)前業(yè)務(wù)量動(dòng)態(tài)調(diào)整其占用的硬件資源,因此容器化技術(shù)得以流行。其中,Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上。

Docker 容器不使用硬件虛擬化,它的守護(hù)進(jìn)程是宿主機(jī)上的一個(gè)進(jìn)程,換句話說(shuō),應(yīng)用直接運(yùn)行在宿主機(jī)內(nèi)核上。因?yàn)槿萜髦羞\(yùn)行的程序和計(jì)算機(jī)的操作系統(tǒng)之間沒(méi)有額外的中間層,沒(méi)有資源被冗余軟件的運(yùn)行或虛擬硬件的模擬而浪費(fèi)掉。

Docker 的優(yōu)勢(shì)不僅如此,我們來(lái)比較一番。

特性 Docker 虛擬機(jī)
啟動(dòng)速度 秒級(jí) 分鐘級(jí)
交付/部署 開(kāi)發(fā)、測(cè)試、生產(chǎn)環(huán)境一致 無(wú)成熟體系
性能 近似物理機(jī) 性能損耗大
體量 極?。∕B) 較大(GB)
遷移/擴(kuò)展 跨平臺(tái),可復(fù)制 較為復(fù)雜
2. 鏡像、容器和倉(cāng)庫(kù)

Docker 由鏡像(Image)、容器(Container)、倉(cāng)庫(kù)(Repository) 三部分組成。

Docker 的鏡像可以簡(jiǎn)單的類(lèi)比為電腦裝系統(tǒng)用的系統(tǒng)盤(pán),包括操作系統(tǒng),以及必要的軟件。例如,一個(gè)鏡像可以包含一個(gè)完整的 centos 操作系統(tǒng)環(huán)境,并安裝了 Nginx 和 Tomcat 服務(wù)器。注意的是,鏡像是只讀的。這一點(diǎn)也很好理解,就像我們刻錄的系統(tǒng)盤(pán)其實(shí)也是可讀的。我們可以使用 docker images?來(lái)查看本地鏡像列表。

Docker 的容器可以簡(jiǎn)單理解為提供了系統(tǒng)硬件環(huán)境,它是真正跑項(xiàng)目程序、消耗機(jī)器資源、提供服務(wù)的東西。例如,我們可以暫時(shí)把容器看作一個(gè) Linux 的電腦,它可以直接運(yùn)行。那么,容器是基于鏡像啟動(dòng)的,并且每個(gè)容器都是相互隔離的。注意的是,容器在啟動(dòng)的時(shí)候基于鏡像創(chuàng)建一層可寫(xiě)層作為最上層。我們可以使用 docker ps -a?查看本地運(yùn)行過(guò)的容器。

Docker 的倉(cāng)庫(kù)用于存放鏡像。這一點(diǎn),和 Git 非常類(lèi)似。我們可以從中心倉(cāng)庫(kù)下載鏡像,也可以從自建倉(cāng)庫(kù)下載。同時(shí),我們可以把制作好的鏡像 commit 到本地,然后 push 到遠(yuǎn)程倉(cāng)庫(kù)。倉(cāng)庫(kù)分為公開(kāi)倉(cāng)庫(kù)和私有倉(cāng)庫(kù),最大的公開(kāi)倉(cāng)庫(kù)是官方倉(cāng)庫(kù) Dock Hub,國(guó)內(nèi)的公開(kāi)倉(cāng)庫(kù)也有很多選擇,例如阿里云等。

3. Docker 促使開(kāi)發(fā)流程變更

筆者認(rèn)為,Docker 對(duì)開(kāi)發(fā)流程的影響在于使環(huán)境標(biāo)準(zhǔn)化。例如,原來(lái)我們存在三個(gè)環(huán)境:開(kāi)發(fā)(日常)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境。這里,我們對(duì)于每個(gè)環(huán)境都需要部署相同的軟件、腳本和運(yùn)行程序,如圖所示。事實(shí)上,對(duì)于啟動(dòng)腳本內(nèi)容都是一致的,但是沒(méi)有統(tǒng)一維護(hù),經(jīng)常會(huì)出問(wèn)題。此外,對(duì)于運(yùn)行程序而言,如果所依賴(lài)的底層運(yùn)行環(huán)境不一致,也會(huì)造成困擾和異常。

現(xiàn)在,我們通過(guò)引入 Docker 之后,我們只需要維護(hù)一個(gè) Docker?鏡像。換句話說(shuō),多套環(huán)境,一個(gè)鏡像,實(shí)現(xiàn)系統(tǒng)級(jí)別的一次構(gòu)建到處運(yùn)行。此時(shí),我們把運(yùn)行腳本標(biāo)準(zhǔn)化了,把底層軟件鏡像化了,然后對(duì)于相同的將要部署的程序?qū)嵭袠?biāo)準(zhǔn)化部署。因此,Docker 為我們提供了一個(gè)標(biāo)準(zhǔn)化的運(yùn)維模式,并固化運(yùn)維步驟和流程。

通過(guò)這個(gè)流程的改進(jìn),我們更容易實(shí)現(xiàn) DevOps 的目標(biāo),因?yàn)槲覀兊溺R像生成后可以跑在任何系統(tǒng),并快速部署。此外,使用 Docker 的很大動(dòng)力是基于 Docker 實(shí)現(xiàn)彈性調(diào)度,以更充分地利用機(jī)器資源,節(jié)省成本。

哈哈,筆者在使用 Docker 過(guò)程中,還發(fā)現(xiàn)了一些很棒的收益點(diǎn),例如我們發(fā)布回滾的時(shí)候只需要切換 TAG 并重啟即可。還比如,我們對(duì)環(huán)境升級(jí),也只需要升級(jí)基礎(chǔ)鏡像,那么新構(gòu)建的應(yīng)用鏡像,自動(dòng)會(huì)引用新的版本。(歡迎補(bǔ)充~~~)

二、從搭建 Web 服務(wù)器開(kāi)始說(shuō)起 1. 環(huán)境先行,安裝 Docker

現(xiàn)在,我們需要安裝以下步驟安裝 Docker。

注冊(cè)帳號(hào):在 https://hub.docker.com/ 注冊(cè)賬號(hào)。

下載安裝

官方下載地址:(Mac):https://download.docker.com/mac/stable/Docker.dmg
阿里云下載地址(Mac):http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/
阿里云下載地址(Windows): http://mirrors.aliyun.com/docker-toolbox/windows/docker-for-windows/

安裝指南

這里,雙擊剛剛下載的 Doker.dmg 安裝包進(jìn)行安裝。

安裝完成后啟動(dòng), Mac 頂部導(dǎo)航欄出現(xiàn)了一個(gè)圖標(biāo),通過(guò)菜單可以進(jìn)行 docker 配置和退出等操作。

官方指南:https://docs.docker.com/install/
阿里云指南(Linux):https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.468b1991jdT95t

設(shè)置加速服務(wù)

市面上有很多加速服務(wù)的提供商,如:DaoCloud,阿里云等。這里,筆者使用的是阿里云。(注意的是,筆者操作系統(tǒng)是?Mac,其他操作系列參見(jiàn)阿里云操作文檔)?

右鍵點(diǎn)擊桌面頂欄的 docker 圖標(biāo),選擇 Preferences ,在 Daemon 標(biāo)簽(Docker 17.03 之前版本為 Advanced 標(biāo)簽)下的 Registry mirrors 列表中將
https://xxx.mirror.aliyuncs.com?加到"registry-mirrors"的數(shù)組里,點(diǎn)擊 Apply & Restart 按鈕,等待 Docker 重啟并應(yīng)用配置的鏡像加速器。

阿里云操作文檔:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

查看版本

至此,我們已經(jīng)安裝完成了。這里,我們來(lái)查看版本。

docker version

查看結(jié)果,如下所示。

2. 實(shí)干派,從搭建 Web 服務(wù)器開(kāi)始

我們作為實(shí)干派,那么先來(lái)搭建一個(gè) Web 服務(wù)器吧。然后,筆者帶你慢慢理解這個(gè)過(guò)程中,做了什么事情。首先,我們需要拉取 centos 鏡像。

docker run -p 80 --name web -i -t centos /bin/bash

緊接著,我們安裝 nginx 服務(wù)器,執(zhí)行以下命令:

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安裝完 Nginx 源后,就可以正式安裝 Nginx 了。

yum install -y nginx

至此,我們?cè)佥斎?whereis nginx?命令就可以看到安裝的路徑了。最后,我們還需要將 Nginx 跑起來(lái)。

nginx

現(xiàn)在,我們執(zhí)行?ctrl + P + ?Q?切換到后臺(tái)。然后,通過(guò)?docker ps -a?來(lái)查看隨機(jī)分配的端口。

這里,筆者分配的端口是 32769?,那么通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:32769?即可。

大功告成,哈哈哈~

3. 復(fù)盤(pán)理解全過(guò)程

現(xiàn)在,我們來(lái)理解下這個(gè)流程。首先,我們輸入 docker run -p 80 --name web -i -t centos /bin/bash?命令會(huì)運(yùn)行交互式容器,其中 -i?選項(xiàng)告訴 Docker 容器保持標(biāo)準(zhǔn)輸入流對(duì)容器開(kāi)放,即使容器沒(méi)有終端連接,另一個(gè) -t?選項(xiàng)告訴 Docker 為容器分配一個(gè)虛擬終端,以便于我們接下來(lái)安裝 Nginx 服務(wù)器。(筆者備注:Docker 還支持輸入 -d?選項(xiàng)告訴 Docker 在后臺(tái)運(yùn)行容器的守護(hù)進(jìn)程)

Docker 會(huì)為我們創(chuàng)建的每一個(gè)容器自動(dòng)生成一個(gè)隨機(jī)的名稱(chēng)。事實(shí)上,這種方式雖然便捷,但是可讀性很差,并且對(duì)我們后期維護(hù)的理解成本會(huì)比較大。因此,我們通過(guò) --name web?選項(xiàng)告訴 Docker 創(chuàng)建一個(gè)名稱(chēng)是 web?的容器。此外,我們通過(guò) -p 80?告訴 Docker 開(kāi)放 80 端口,那么, Nginx 才可以對(duì)外通過(guò)訪問(wèn)和服務(wù)。但是,我們的宿主機(jī)器會(huì)自動(dòng)做端口映射,比如上面分配的端口是?32769?,注意的是,如果關(guān)閉或者重啟,這個(gè)端口就變了,那么怎么解決固定端口的問(wèn)題,筆者會(huì)在后面詳細(xì)剖析和帶你實(shí)戰(zhàn)。

這里,還有一個(gè)非常重要的知識(shí)點(diǎn) docker run?。Docker 通過(guò) run 命令來(lái)啟動(dòng)一個(gè)新容器。Docker 首先在本機(jī)中尋找該鏡像,如果沒(méi)有安裝,Docker 在 Docker Hub 上查找該鏡像并下載安裝到本機(jī),最后 Docker 創(chuàng)建一個(gè)新的容器并啟動(dòng)該程序。

但是,當(dāng)?shù)诙螆?zhí)行??docker run?時(shí),因?yàn)?Docker 在本機(jī)中已經(jīng)安裝該鏡像,所以 Docker 會(huì)直接創(chuàng)建一個(gè)新的容器并啟動(dòng)該程序。

注意的是,docker run?每次使用都會(huì)創(chuàng)建一個(gè)新的容器,因此,我們以后再次啟動(dòng)這個(gè)容器時(shí),只需要使用命令 docker start? 即可。這里, docker start?的作用在用重新啟動(dòng)已存在的鏡像,而docker run?包含將鏡像放入容器中 docker create?,然后將容器啟動(dòng)?docker start?,如圖所示。

現(xiàn)在,我們可以在上面的案例的基礎(chǔ)上,通過(guò) exit?命令關(guān)閉 Docker 容器。當(dāng)然,如果我們運(yùn)行的是后臺(tái)的守護(hù)進(jìn)程,我們也可以通過(guò) docker stop web?來(lái)停止。注意的是,docker stop?和?docker kill?略有不同,docker stop?發(fā)送 SIGTERM 信號(hào),而?docker kill?發(fā)送SIGKILL 信號(hào)。然后,我們使用?docker start?重啟它。

docker start web

Docker 容器重啟后會(huì)沿用?docker run?命令指定的參數(shù)來(lái)運(yùn)行,但是,此時(shí)它還是后臺(tái)運(yùn)行的。我們必須通過(guò) docker attach?命令切換到運(yùn)行交互式容器。

docker attach web
4. 不止如此,還有更多命令

Docker 提供了非常豐富的命令。所謂一圖勝千言,我們可以從下面的圖片了解到很多信息和它們之前的用途。(可以直接跳過(guò)閱讀,建議收藏,便于擴(kuò)展閱讀)

如果希望獲取更多信息,可以閱讀官方使用文檔。

Command Description
docker attach Attach local standard input, output, and error streams to a running container
docker build Build an image from a Dockerfile
docker builder Manage builds
docker checkpoint Manage checkpoints
docker commit Create a new image from a container’s changes
docker config Manage Docker configs
docker container Manage containers
docker cp Copy files/folders between a container and the local filesystem
docker create Create a new container
docker deploy Deploy a new stack or update an existing stack
docker diff Inspect changes to files or directories on a container’s filesystem
docker engine Manage the docker engine
docker events Get real time events from the server
docker exec Run a command in a running container
docker export Export a container’s filesystem as a tar archive
docker history Show the history of an image
docker image Manage images
docker images List images
docker import Import the contents from a tarball to create a filesystem image
docker info Display system-wide information
docker inspect Return low-level information on Docker objects
docker kill Kill one or more running containers
docker load Load an image from a tar archive or STDIN
docker login Log in to a Docker registry
docker logout Log out from a Docker registry
docker logs Fetch the logs of a container
docker manifest Manage Docker image manifests and manifest lists
docker network Manage networks
docker node Manage Swarm nodes
docker pause Pause all processes within one or more containers
docker plugin Manage plugins
docker port List port mappings or a specific mapping for the container
docker ps List containers
docker pull Pull an image or a repository from a registry
docker push Push an image or a repository to a registry
docker rename Rename a container
docker restart Restart one or more containers
docker rm Remove one or more containers
docker rmi Remove one or more images
docker run Run a command in a new container
docker save Save one or more images to a tar archive (streamed to STDOUT by default)
docker search Search the Docker Hub for images
docker secret Manage Docker secrets
docker service Manage services
docker stack Manage Docker stacks
docker start Start one or more stopped containers
docker stats Display a live stream of container(s) resource usage statistics
docker stop Stop one or more running containers
docker swarm Manage Swarm
docker system Manage Docker
docker tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
docker top Display the running processes of a container
docker trust Manage trust on Docker images
docker unpause Unpause all processes within one or more containers
docker update Update configuration of one or more containers
docker version Show the Docker version information
docker volume Manage volumes
docker wait Block until one or more containers stop, then print their exit codes
官方閱讀鏈接:https://docs.docker.com/engine/reference/commandline/docker/
5. 進(jìn)階:倉(cāng)庫(kù)與軟件安裝的簡(jiǎn)化

還記得筆者在文章開(kāi)頭介紹的「鏡像、容器和倉(cāng)庫(kù)」嗎?Docker 的倉(cāng)庫(kù)用于存放鏡像。我們可以從中心倉(cāng)庫(kù)下載鏡像,也可以從自建倉(cāng)庫(kù)下載。同時(shí),我們可以把制作好的鏡像從本地推送到遠(yuǎn)程倉(cāng)庫(kù)。

首先,筆者先引入一個(gè)知識(shí)點(diǎn):Docker 的鏡像就是它的文件系統(tǒng),一個(gè)鏡像可以放在另外一個(gè)鏡像的上層,那么位于下層的就是它的父鏡像。所以,Docker 會(huì)存在很多鏡像層,每個(gè)鏡像層都是只讀的,并且不會(huì)改變。當(dāng)我們創(chuàng)建一個(gè)新的容器時(shí),Docker 會(huì)構(gòu)建出一個(gè)鏡像棧,并在棧的最頂層添加一個(gè)讀寫(xiě)層,如圖所示。

現(xiàn)在,我們可以通過(guò) docker images?命令查看本地的鏡像。

docker images

查詢(xún)結(jié)果,如圖所示。

這里,對(duì)幾個(gè)名詞解釋一下含義。

REPOSITORY:倉(cāng)庫(kù)名稱(chēng)。

TAG: 鏡像標(biāo)簽,其中 lastest 表示最新版本。注意的是,一個(gè)鏡像可以有多個(gè)標(biāo)簽,那么我們就可以通過(guò)標(biāo)簽來(lái)管理有用的版本和功能標(biāo)簽。

IMAGE ID :鏡像唯一ID。

CREATED :創(chuàng)建時(shí)間。

SIZE :鏡像大小。

那么,如果第一次我們通過(guò) docker pull centos:latest?拉取鏡像,那么當(dāng)我們執(zhí)行?docker run -p 80 --name web -i -t centos /bin/bash?時(shí),它就不會(huì)再去遠(yuǎn)程獲取了,因?yàn)楸緳C(jī)中已經(jīng)安裝該鏡像,所以 Docker 會(huì)直接創(chuàng)建一個(gè)新的容器并啟動(dòng)該程序。

事實(shí)上,官方已經(jīng)提供了安裝好 Nginx 的鏡像,我們可以直接使用?,F(xiàn)在,我們通過(guò)拉取鏡像的方式重新構(gòu)建一個(gè) Web 服務(wù)器。首先,我們通過(guò) docker search?來(lái)查找鏡像。我們獲取到 Nginx 的鏡像清單。

docker search nginx

補(bǔ)充一下,我們也可以通過(guò)訪問(wèn) Docker Hub (https://hub.docker.com/)搜索倉(cāng)庫(kù),那么 star 數(shù)越多,說(shuō)明它越靠譜,可以放心使用。

現(xiàn)在,我們通過(guò) docker pull nginx?拉取最新的?Nginx 的鏡像。當(dāng)然,我們也可以通過(guò)?docker pull nginx:latest? 來(lái)操作。

docker pull nginx

然后,我們創(chuàng)建并運(yùn)行一個(gè)容器。與前面不同的是,我們通過(guò) -d?選項(xiàng)告訴 Docker 在后臺(tái)運(yùn)行容器的守護(hù)進(jìn)程。并且,通過(guò) 8080:80?告訴 Docker 8080 端口是對(duì)外開(kāi)放的端口,80 端口對(duì)外開(kāi)放的端口映射到容器里的端口號(hào)。

docker run -p 8080:80 -d --name nginx nginx

我們?cè)偻ㄟ^(guò)?docker ps -a?來(lái)查看,發(fā)現(xiàn)容器已經(jīng)后臺(tái)運(yùn)行了,并且后臺(tái)執(zhí)行了 nginx 命令,并對(duì)外開(kāi)放 8080 端口。

因此,通過(guò)瀏覽器訪問(wèn)?http://127.0.0.1:8080?即可。

6. 其他選擇,使用替代注冊(cè)服務(wù)器

Docker Hub 不是軟件的唯一來(lái)源,我們也可以切換到國(guó)內(nèi)的其他替代注冊(cè)服務(wù)器,例如阿里云。我們可以登錄?https://cr.console.aliyun.com?搜索,并拉取公開(kāi)的鏡像。

現(xiàn)在,我們輸入 docker pull?命令進(jìn)行拉取。

docker pull registry.cn-hangzhou.aliyuncs.com/qp_oraclejava/orackejava:8u172_DCEVM_HOTSWAPAGEN_JCE

這里,筆者繼續(xù)補(bǔ)充一個(gè)知識(shí)點(diǎn):注冊(cè)服務(wù)器的地址。事實(shí)上,注冊(cè)服務(wù)器的地址是有一套規(guī)范的。完整格式是:倉(cāng)庫(kù)主機(jī)/容器短名[:標(biāo)簽]。這里,倉(cāng)庫(kù)主機(jī)是?registry.cn-hangzhou.aliyuncs.com,用戶名是?qp_oraclejava,容器短名是?orackejava,標(biāo)簽名是 8u172_DCEVM_HOTSWAPAGEN_JCE。事實(shí)上,我們上面通過(guò)?docker pull centos:latest?拉取鏡像,相當(dāng)于?docker pull registry.hub.docker.com/centos:latest?。

三、構(gòu)建我的鏡像

通過(guò)上面的學(xué)習(xí),筆者相信你已經(jīng)對(duì) Docker 使用有了一個(gè)大致的了解,就好比我們通過(guò) VMware 安裝了一個(gè)系統(tǒng),并讓它跑了起來(lái),那么我們就可以在這個(gè) Linux 系統(tǒng)(CentOS 或者 Ubuntu ) 上面工作我們想要的任何事情。事實(shí)上,我們還會(huì)經(jīng)常把我們安裝好的 VMware 系統(tǒng)進(jìn)行快照備份并實(shí)現(xiàn)克隆來(lái)滿足我們下次快速的復(fù)制。這里,Docker 也可以構(gòu)建定制內(nèi)容的 Docker 鏡像,例如上面我們使用官方提供的安裝好 Nginx 的 Docker 鏡像。注意的是,我們通過(guò)基于已有的基礎(chǔ)鏡像,在上面添加鏡像層的方式構(gòu)建新鏡像而已。

總結(jié)一下,Docker 提供自定義鏡像的能力,它可以讓我們保存對(duì)基礎(chǔ)鏡像的修改,并再次使用。那么,我們就可以把操作系統(tǒng)、運(yùn)行環(huán)境、腳本和程序打包在一起,并在宿主機(jī)上對(duì)外提供服務(wù)。

Docker 構(gòu)建鏡像有兩種方式,一種方式是使用?docker commit?命令,另外一種方式使用 docker build?命令和 Dockerfile?文件。其中,不推薦使用?docker commit?命令進(jìn)行構(gòu)建,因?yàn)樗鼪](méi)有使得整個(gè)流程標(biāo)準(zhǔn)化,因此,在企業(yè)的中更加推薦使用?docker build?命令和?Dockerfile?文件來(lái)構(gòu)建我們的鏡像。我們使用Dockerfile?文件可以讓構(gòu)建鏡像更具備可重復(fù)性,同時(shí)保證啟動(dòng)腳本和運(yùn)行程序的標(biāo)準(zhǔn)化。

1. 構(gòu)建第一個(gè) Dockerfile 文件

現(xiàn)在,我們繼續(xù)實(shí)戰(zhàn)。這里,我們把一開(kāi)始搭建的 Web 服務(wù)器構(gòu)建一個(gè)鏡像。首先,我們需要?jiǎng)?chuàng)建一個(gè)空的 Dokcerfile 文件。

mkdir dockerfile_test
cd dockerfile_test/
touch Dockerfile
nano Dockerfile

緊接著,我們需要編寫(xiě)一個(gè) Dockerfile 文件,代碼清單如下

FROM centos:7
MAINTAINER LiangGzone "lianggzone@163.com"
RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum install -y nginx
EXPOSE 80

最后,我們通過(guò) docker build?命令進(jìn)行構(gòu)建。

docker build -t="lianggzone/nginx_demo:v1" .

現(xiàn)在, 我們來(lái)通過(guò)?docker images?看下我們的新鏡像吧。

2. 理解 Dockerfile 全過(guò)程

哇,我們通過(guò)編寫(xiě)一個(gè) Dockerfile 文件順利構(gòu)建了一個(gè)新的鏡像。這個(gè)過(guò)程簡(jiǎn)單得讓人無(wú)法相信?,F(xiàn)在,讓我們來(lái)理解一下這個(gè)全過(guò)程吧。首先,?FROM centos:7?是 Dockerfile 必須要的第一步,它會(huì)從一個(gè)已經(jīng)存在的鏡像運(yùn)行一個(gè)容器,換句話說(shuō),Docker 需要依賴(lài)于一個(gè)基礎(chǔ)鏡像進(jìn)行構(gòu)建。這里,我們指定 centos 作為基礎(chǔ)鏡像,它的版本是 7 (CentOS 7)。然后,我們通過(guò)?MAINTAINER LiangGzone "lianggzone@163.com"?指定該鏡像的作者是?LiangGzone,郵箱是?lianggzone@163.com。這有助于告訴使用者它的作者和聯(lián)系方式。接著,我們執(zhí)行兩個(gè) RUN 指令進(jìn)行 Nginx 的下載安裝,最后通過(guò)??EXPOSE 80?暴露 Dokcer 容器的 80 端口。注意的是,Docker 的執(zhí)行順序是從上而下執(zhí)行的,所以我們要明確整個(gè)流程的執(zhí)行順序。除此之外,Docker 在執(zhí)行每個(gè)指令之后都會(huì)創(chuàng)建一個(gè)新的鏡像層并且進(jìn)行提交。

我們使用??docker build?命令進(jìn)行構(gòu)建,指定 - t?告訴 Docker 鏡像的名稱(chēng)和版本。注意的是,如果沒(méi)有指定任何標(biāo)簽,Docker 將會(huì)自動(dòng)為鏡像設(shè)置一個(gè) lastest 標(biāo)簽。還有一點(diǎn),我們最后還有一個(gè) .?是為了讓 Docker 到當(dāng)前本地目錄去尋找 Dockerfile 文件。注意的是,Docker 會(huì)在每一步構(gòu)建都會(huì)將結(jié)果提交為鏡像,然后將之前的鏡像層看作緩存,因此我們重新構(gòu)建類(lèi)似的鏡像層時(shí)會(huì)直接復(fù)用之前的鏡像。如果我們需要跳過(guò),可以使用?--no-cache?選項(xiàng)告訴 Docker 不進(jìn)行緩存。

3. Dockerfile 指令詳解

Dockerfile 提供了非常多的指令。筆者這里特別整理了一份清單,建議收藏查看。

官方地址:https://docs.docker.com/engine/reference/builder/#usage
指令辨別一:RUN、CMD、ENTRYPOINT

RUN?、 CMD?、 ENTRYPOINT? 三個(gè)指令的用途非常相識(shí),不同在于,RUN?指令是在容器被構(gòu)建時(shí)運(yùn)行的命令,而CMD?、?ENTRYPOINT?是啟動(dòng)容器時(shí)執(zhí)行 shell 命令,而?RUN?會(huì)被 docker run?命令覆蓋,但是??ENTRYPOINT?不會(huì)被覆蓋。事實(shí)上,docker run?命令指定的任何參數(shù)都會(huì)被當(dāng)作參數(shù)再次傳遞給?ENTRYPOINT? 指令。CMD?、?ENTRYPOINT?兩個(gè)指令之間也可以一起使用。例如,我們 可以使用?ENTRYPOINT?的 exec 形式設(shè)置固定的默認(rèn)命令和參數(shù),然后使用任一形式的 CMD?來(lái)設(shè)置可能更改的其他默認(rèn)值。

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
指令辨別二:ADD、COPY

ADD?、 COPY?指令用法一樣,唯一不同的是?ADD? 支持將歸檔文件(tar, gzip, bzip2, etc)做提取和解壓操作。注意的是,COPY?指令需要復(fù)制的目錄一定要放在 Dockerfile 文件的同級(jí)目錄下。

4. 將鏡像推送到遠(yuǎn)程倉(cāng)庫(kù) 遠(yuǎn)程倉(cāng)庫(kù):Docker Hub?

鏡像構(gòu)建完畢之后,我們可以將它上傳到 Docker Hub 上面。首先,我們需要通過(guò) docker login?保證我們已經(jīng)登錄了。緊接著,我們使用 docker push?命令進(jìn)行推送。

docker push lianggzone/nginx_demo:v1

這里,我們了解下它的使用,格式是 docker push [OPTIONS] NAME[:TAG]?,其中,筆者設(shè)置 NAME 是?lianggzone/nginx_demo,TAG 是 v1。 (筆者注:推送 Docker Hub 速度很慢,耐心等待) 最后,上傳完成后訪問(wèn):https://hub.docker.com/u/lianggzone/,如圖所示。

遠(yuǎn)程倉(cāng)庫(kù):阿里云

同時(shí),我們也可以使用國(guó)內(nèi)的倉(cāng)庫(kù),比如阿里云。首先,在終端中輸入訪問(wèn)憑證,登錄 Registry 實(shí)例。如果你不知道是哪個(gè),可以訪問(wèn)?https://cr.console.aliyun.com/cn-hangzhou/instances/credentials。

docker login --username=帳號(hào) registry.cn-hangzhou.aliyuncs.com

現(xiàn)在,將鏡像推送到阿里云鏡像倉(cāng)庫(kù)。其中, docker tag [IMAGE_ID] registry.cn-hangzhou.aliyuncs.com/[命名空間]/[鏡像名稱(chēng)]:[版本]?和 docker push registry.cn-hangzhou.aliyuncs.com/[命名空間]/[鏡像名稱(chēng)]:[版本]?命令的使用如下所示。

docker tag 794c07361565 registry.cn-hangzhou.aliyuncs.com/lianggzone/nginx_demo:v1
docker push registry.cn-hangzhou.aliyuncs.com/lianggzone/nginx_demo:v1

最后,上傳完成后訪問(wèn):https://cr.console.aliyun.com/cn-hangzhou/instances/repositories,如圖所示。

5.?Dockerfile 的 Github 源碼地址

這里,附上我整理的 Dockerfile 的倉(cāng)庫(kù)。后面,筆者會(huì)陸續(xù)更新用到的一些常用文件,歡迎 star 關(guān)注。

https://github.com/lianggzone/dockerfile-images
附:參考資料

《Docker實(shí)戰(zhàn)》

《第一本Docker書(shū)》

Docker 命令參考文檔

Dockerfile 鏡像構(gòu)建參考文檔

(完,轉(zhuǎn)載請(qǐng)注明作者及出處。)

寫(xiě)在末尾

【服務(wù)端思維】:我們一起聊聊服務(wù)端核心技術(shù),探討一線互聯(lián)網(wǎng)的項(xiàng)目架構(gòu)與實(shí)戰(zhàn)經(jīng)驗(yàn)。同時(shí),擁有眾多技術(shù)大牛的「后端圈」大家庭,期待你的加入,一群同頻者,一起成長(zhǎng),一起精進(jìn),打破認(rèn)知的局限性。

更多精彩文章,盡在「服務(wù)端思維」!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/77513.html

相關(guān)文章

  • 30 分鐘快速入門(mén) Docker 教程

    摘要:分鐘快速入門(mén)教程一歡迎來(lái)到世界與虛擬化在沒(méi)有的時(shí)代,我們會(huì)使用硬件虛擬化虛擬機(jī)以提供隔離。倉(cāng)庫(kù)分為公開(kāi)倉(cāng)庫(kù)和私有倉(cāng)庫(kù),最大的公開(kāi)倉(cāng)庫(kù)是官方倉(cāng)庫(kù),國(guó)內(nèi)的公開(kāi)倉(cāng)庫(kù)也有很多選擇,例如阿里云等。 30 分鐘快速入門(mén) Docker 教程 一、歡迎來(lái)到 Docker 世界 1. Docker 與虛擬化 在沒(méi)有 Docker 的時(shí)代,我們會(huì)使用硬件虛擬化(虛擬機(jī))以提供隔離。這里,虛擬機(jī)通過(guò)在操作系...

    LucasTwilight 評(píng)論0 收藏0
  • 30 分鐘快速入門(mén) Docker 教程

    摘要:分鐘快速入門(mén)教程一歡迎來(lái)到世界與虛擬化在沒(méi)有的時(shí)代,我們會(huì)使用硬件虛擬化虛擬機(jī)以提供隔離。倉(cāng)庫(kù)分為公開(kāi)倉(cāng)庫(kù)和私有倉(cāng)庫(kù),最大的公開(kāi)倉(cāng)庫(kù)是官方倉(cāng)庫(kù),國(guó)內(nèi)的公開(kāi)倉(cāng)庫(kù)也有很多選擇,例如阿里云等。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 歡迎關(guān)注公眾號(hào):「服務(wù)端思維」。一群同頻者,一起成長(zhǎng),一起精進(jìn),打破認(rèn)知的局限性。 30 分鐘快速入門(mén) Docker 教程...

    yexiaobai 評(píng)論0 收藏0
  • AI開(kāi)發(fā)書(shū)籍分享

    摘要:編程書(shū)籍的整理和收集最近一直在學(xué)習(xí)深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后也找了很多的書(shū)和文章,隨著不斷的學(xué)習(xí),也整理了下自己的學(xué)習(xí)筆記準(zhǔn)備分享出來(lái)給大家后續(xù)的文章和總結(jié)會(huì)繼續(xù)分享,先分享一部分的 編程書(shū)籍的整理和收集 最近一直在學(xué)習(xí)deep learning深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后...

    huayeluoliuhen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<