Ubuntu上安装使用Docker
生活随笔
收集整理的這篇文章主要介紹了
Ubuntu上安装使用Docker
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Docker簡(jiǎn)介
- Docker是一個(gè)開(kāi)源的容器引擎,他有助于更快的交付應(yīng)用。Docker可以將應(yīng)用程序和基礎(chǔ)設(shè)施層做隔離,并且能將基礎(chǔ)設(shè)施當(dāng)做程序一樣進(jìn)行管理。使用Docker,可以更快的打包,測(cè)試以及部署應(yīng)用程序,并且可以縮短從編寫(xiě)到部署運(yùn)行的代碼調(diào)試周期。
Docker官網(wǎng)
Docker 的GitHub
Docker 的架構(gòu)
- 以下是Docker官方文檔的架構(gòu)圖
- Docker daemon(Docker守護(hù)進(jìn)程):Docker daemon是一個(gè)運(yùn)行在宿主機(jī)(DOCKER_HOST)的后臺(tái)進(jìn)程??梢酝ㄟ^(guò)Docker客戶端與Docker daemon進(jìn)行通信
- Client (Docker 客戶端): Docker客戶端是Docker的用戶界面,他可以接受用戶命令和配置標(biāo)識(shí),并與Docker daemon通信。途中,Docker build 等都是Docker的相關(guān)命令
- Images(Docker 的鏡像):Docker鏡像是一個(gè)只讀的模板,他包含創(chuàng)建Docker容器的說(shuō)明。他和系統(tǒng)安裝光盤(pán)有點(diǎn)像----使用系統(tǒng)安裝光盤(pán)可以安裝系統(tǒng),同理,使用Docker鏡像可以運(yùn)行Docker鏡像中的程序。
- Container(容器):容器是鏡像的可運(yùn)行實(shí)例。鏡像和容器的關(guān)系有點(diǎn)類(lèi)似面向?qū)ο笾械?#xff0c;類(lèi)之于對(duì)象的關(guān)系??赏ㄟ^(guò)Docker API或者CLI命令來(lái)啟動(dòng)停止,移動(dòng),刪除容器。
- Registry(類(lèi)似代碼倉(cāng)庫(kù)):Docker Registry是一個(gè)集中存儲(chǔ)于分發(fā)鏡像的服務(wù)。構(gòu)建完Docker鏡像后,就可以在當(dāng)前宿主機(jī)上運(yùn)行。如果想在其他機(jī)器上運(yùn)行這個(gè)鏡像,需要手動(dòng)負(fù)責(zé),或者借助Docker Registry來(lái)避免負(fù)責(zé),經(jīng)Docker鏡像push到Docker Registry上,然后在其他機(jī)器上pull對(duì)應(yīng)鏡像。
Docker安裝
- 準(zhǔn)備Ubuntu系統(tǒng),或者虛擬機(jī),安裝程序可參照網(wǎng)址
安裝Docker
- 官方Ubuntu存儲(chǔ)庫(kù)中提供的Docker安裝包,但是可能不是最新的版本,為了確保獲取最新版,我們將從Docker官網(wǎng)存儲(chǔ)庫(kù)安裝Docker。因此,我們需要添加一個(gè)新的資源包,從Docker添加GPG以確保下載有效,然后安裝該包:
- 首先更新現(xiàn)有包列表,新安裝的ubuntu這個(gè)步驟可能會(huì)久一點(diǎn):
- 接下來(lái)使用按apt 安裝一下運(yùn)行通過(guò)HTTPS才能使用的軟件包
- 將官方Docker存儲(chǔ)的GPG秘鑰添加到系統(tǒng):
- 將Docker存儲(chǔ)庫(kù)添加到APT源:
- 接下來(lái),使用新添加的repo源中的Docker包更新數(shù)據(jù)庫(kù):
- 確保從Docker repo安裝,而不是默認(rèn)的Ubuntu repo:
- 看到如下的輸出,說(shuō)明是成功的,版本不同輸出的日志應(yīng)該有一點(diǎn)點(diǎn)差異:
- 現(xiàn)在Docker-ce還沒(méi)有安裝,用上面這個(gè)命令我們能看到安裝源來(lái)自Docker官方存儲(chǔ)庫(kù),最后安裝Docker:
- 現(xiàn)在Docker已經(jīng)安裝好了,檢查一下是否正常運(yùn)行:
- 有類(lèi)似如下的輸出,標(biāo)準(zhǔn)狀態(tài)正常:
- Docker不僅僅提供Docker服務(wù),還提供了Docker命令行工具或者Docker客戶端。
非Sudo執(zhí)行Docker命令
- 默認(rèn)情況下,Docker命令只能Root用戶或者Docker組中用戶運(yùn)行,改用戶在Docker安裝過(guò)程中自動(dòng)創(chuàng)建,如果想要不使用Sudo運(yùn)行,或不在docker組中的用戶運(yùn)行會(huì)有錯(cuò)誤提示信息:
- 想要在運(yùn)行docer時(shí)候不輸入sudo,需要將用戶添加到docker組中,首先創(chuàng)建docker用戶組
- 將用戶添加到docker用戶組
- 重啟docker服務(wù)
使用Docker命令
- 以下我都用的root用戶來(lái)執(zhí)行,Docker命令使用包括傳遞一系列docker選項(xiàng)和命令,后跟參數(shù)。語(yǔ)法格式如下:
- 查詢所有子命令輸入 docker,有如下:
- 查看有關(guān)Docker的系統(tǒng)信息:
- 搜索鏡像:
- 執(zhí)行后可以看到如下表格信息
-
以上表格中五列含義如下:
- NAME:鏡像倉(cāng)庫(kù)名稱
- DESCRIPTION:鏡像倉(cāng)庫(kù)描述
- STARS:鏡像倉(cāng)庫(kù)收藏?cái)?shù)量,標(biāo)識(shí)該鏡像受歡迎程度,類(lèi)似GitHub的Stars
- OFFICAL:表示是否為官方倉(cāng)庫(kù),改列標(biāo)記為[OK] 的鏡像都是各軟件官方項(xiàng)目組創(chuàng)建和維護(hù)的。由結(jié)果可知,frekele/java 這個(gè)鏡像不是官方倉(cāng)庫(kù)。
- AUTOMATED:表示是否是自動(dòng)構(gòu)建的鏡像倉(cāng)庫(kù)
-
下載鏡像
- 使用 docker pull 命令可以從Docker Registry上下載鏡像,例如:docker pull java
- 命令執(zhí)行后,Docker會(huì)從Docker Hub上的java殘酷中下載最新版本的java鏡像。若鏡像下載緩慢可以配置加速器(以下會(huì)講解加速器配置)
-
列出已有鏡像,使用docker images命令可以列出已經(jīng)下載的鏡像。執(zhí)行后有如下表格:
- 包括五列,分別有如下意義:
- REPOSITORY:鏡像所屬的倉(cāng)庫(kù)名稱
- TAG:鏡像標(biāo)簽,默認(rèn)是lastest,表示最新
- IMAGE ID:鏡像ID,表示鏡像唯一標(biāo)識(shí)
- CREATED:鏡像創(chuàng)建時(shí)間
- SIZE:鏡像大小
- 刪除鏡像:
- 刪除鏡像可能遇到如下問(wèn)題,原因是提示有關(guān)聯(lián)的Docker容器,因?yàn)槲覀兛吹絙f756fb1ae65 對(duì)應(yīng)了兩個(gè)容器,一個(gè)是我們自己提交的tag,通過(guò)hello-world生成的一個(gè)鏡像,系統(tǒng)無(wú)法識(shí)別你要?jiǎng)h除的是哪一個(gè):
- 我們刪除的時(shí)候可以用指定repository和tag的方式來(lái)刪除,比如:
- 如上,線上已經(jīng)被刪除成功
批量刪除鏡像
- 刪除所有:
- 刪除所有鏡像
- 按條件刪除鏡像
Docker 容器常用命令
- 新建并啟動(dòng)容器:使用docker run 命令可以新建并啟動(dòng)一個(gè)容器。該命令是常用命令,他有很多選項(xiàng),下面列舉某一些選項(xiàng):
- -d選項(xiàng):表示后臺(tái)運(yùn)行
- -p選項(xiàng):隨機(jī)端口映射
- -p選項(xiàng):指定端扣映射,有以下四種格式:
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- –network選項(xiàng): 指定網(wǎng)絡(luò)模式,該選項(xiàng)有以下可選參數(shù):
- –network=bridge:默認(rèn)選項(xiàng),表示連接到默認(rèn)的網(wǎng)橋
- –network=host:容器使用宿主機(jī)網(wǎng)絡(luò)
- –network=container:NAME_or_ID:告訴Docker讓新建的容器使用已有容器的網(wǎng)絡(luò)配置。
- –network=none:不配置該容器網(wǎng)絡(luò),用戶可以自定義網(wǎng)絡(luò)配置
- 示例一,這樣終端會(huì)打印Hello world,跟在本地執(zhí)行/bin/echo ‘Hello world’ 得到一樣的結(jié)果:
- 示例二,啟動(dòng)一個(gè)Nginx容器,這里添加了兩個(gè)參數(shù),含義與命令如下所示:
-
訪問(wèn)http://Docker宿主機(jī)IP:91,將會(huì)看到如下界面
-
進(jìn)入容器,某些場(chǎng)景下需要進(jìn)入容器中。
- 使用docker sttach命令進(jìn)入容器,弊端在于,使用此命令并不方便,當(dāng)多個(gè)窗口同事attach到同一個(gè)容器時(shí)候,所有窗口都會(huì)同步顯示。同樣,當(dāng)某個(gè)窗口發(fā)生阻塞,其他窗口也無(wú)法執(zhí)行操作。命令如下
- 使用nsenter進(jìn)入容器:nsenter工具包含在util-linux2.23或者更高版本中。為了連接到容器,需要找到容器第一個(gè)進(jìn)程PID,可以以下命令獲取
- 以上獲取到PID后,就可以使用nsenter進(jìn)入容器,完整命令如下
配置鏡像加速器
- 國(guó)內(nèi)訪問(wèn)Docker Hub的速度很不穩(wěn)定,有時(shí)候會(huì)出現(xiàn)鏈接不上的情況。我們可以通過(guò)配置國(guó)內(nèi)鏡像加速器的形式來(lái)解決問(wèn)題。目前,國(guó)內(nèi)很多公司云服務(wù)商提供了鏡像加速服務(wù)。常用鏡像加速器有:阿里云加速器,DaoCloud加速器。我用的阿里云的加速器,配置如下:
使用Docker鏡像
- Docker容器是從Docker進(jìn)行構(gòu)建的,默認(rèn)情況下,Docker從Docker Hub中pull下來(lái)的這些鏡像,這是一個(gè)由Docker管理的Docker鏡像市場(chǎng),這是Docker項(xiàng)目背后的公司。任何人都可以在Docker Hub上托管他們的Docker鏡像,所以你只要將你的應(yīng)用程序和LInux放再那邊托管就可以。
- 我們用剛才pull的hello-world鏡像測(cè)試,輸入:
- 輸出下面的內(nèi)容說(shuō)明已經(jīng)成功運(yùn)行
運(yùn)行Docker容器
- 上一步中,hello-world容器運(yùn)行并發(fā)出一個(gè)測(cè)試消息后退出容器,容器可以比這更有用,是可以相互交互的,比較,類(lèi)似虛擬機(jī),只是更加有利于資源。
- 我們用ubuntu的鏡像做一個(gè)測(cè)試,通過(guò)-i, -t子命令提供了容器的交互shell訪問(wèn):
- 執(zhí)行以上兩個(gè)命令就可以進(jìn)入到ubuntu鏡像內(nèi)部,shell展示如下
- 如上命令提示符中的容器ID,在此處是b8488a2dcef8,在此shell中不需要sudo,因?yàn)槭怯胷oot用戶身份在容器中操作,我們?cè)诖绥R像中安裝一個(gè)node:
- 得到如下結(jié)果:
- 退出容器,直接輸入exit或者Ctrl+d 退出,兩種方式有如下區(qū)別
- 對(duì)于創(chuàng)建的bash容器,當(dāng)使用exit命令退出后,容器就自動(dòng)處于退出(Exited)狀態(tài),這是因?yàn)閷?duì)Docker容器來(lái)說(shuō),當(dāng)運(yùn)行的應(yīng)用退出后,容器就沒(méi)有繼續(xù)運(yùn)行的必要
- 而用Ctrl退出后,容器還會(huì)在運(yùn)行,他認(rèn)為你只是退出了命令界面的鏈接狀態(tài)而已
Docker容器管理
- 使用Docker后,可能有很多非運(yùn)行狀態(tài)的容器,我們需要查詢?nèi)萜鞯倪\(yùn)行狀態(tài)用如下命令:
-
看到如上輸出,每一列的含義如下:
- CONTAINER_ID:表示容器ID
- IMAGE:表示鏡像名稱
- COMMAND:表示啟動(dòng)容器時(shí)運(yùn)行的命令
- CREATED:表示容器創(chuàng)建時(shí)間
- STATUS:容器運(yùn)行狀態(tài),Up標(biāo)識(shí)運(yùn)行中,Exited表示停止
- PORTS:容器對(duì)外的端口號(hào)
- NAMES:表示容器名稱,默認(rèn)由Docker自動(dòng)生成,也可以docker run 命令后面–name自行指定。
-
查看所有容器情況使用 docker ps -a,得到所有的信息,如下:
- 只查看已經(jīng)啟動(dòng)的容器:
- 啟動(dòng)已經(jīng)停止的容器,使用Docker start ,后面跟上容器ID b8488a2dcef8 ,啟動(dòng)后status會(huì)變?yōu)閡p狀態(tài)
- 同樣,停止容器,使用docker stop CONTAINER_ID,更容器id或者容器名稱
- 批量停止容器 docker stop 51c20c4f5a04 22c37049f352 1ac1218c1a54
- 刪除容器,當(dāng)我們不需要某個(gè)容器時(shí)候,可以docker rm刪除,上面內(nèi)容以及講過(guò)這個(gè)命令。
將容器中的更改提交給Docker鏡像
- 當(dāng)啟動(dòng)Docker鏡像后,可以像虛擬機(jī)一樣創(chuàng)建,修改,刪除文件。例如ubuntu鏡像,我們所有更改都僅僅在鏡像內(nèi)部而已。我們可以通過(guò)docker rm銷(xiāo)毀,但是會(huì)永久丟失。
- 在ubuntu容器中安裝Nodejs后,我們現(xiàn)在想要將這個(gè)容器作為一個(gè)新的容器,可以如下操作:
- 如上commit命令,對(duì)于ljmadmin用戶,使用容器id b8488a2dcef8 作為目標(biāo)鏡像,打包成新鏡像 ljmadmin/ubuntu-nodejs ,得到如下所有images信息:
- 在如上列表中新鏡像ubuntu-nodejs 是動(dòng)Docker Hub的Ubuntu現(xiàn)有鏡像中衍生出來(lái)的,鏡像大小的差異可以看出有變化因此下次我們可以直接使用ubuntu-nodejs 新的鏡像。
Dockerfile構(gòu)建鏡像
- 待續(xù)
將Docker鏡像推送到Docker存儲(chǔ)庫(kù)
- 我們以上提到的從Docker Hub pull下來(lái)的鏡像都是在我們本地,包括我們自己commit生成的也是在本地,如果需要遷移需要先將鏡像推到遠(yuǎn)程倉(cāng)庫(kù),我們需要 一個(gè)Docker Hub的倉(cāng)庫(kù)賬號(hào)信息
- 系統(tǒng)將提升輸入Docker Hub的密碼進(jìn)行身份驗(yàn)證,然后你可以使用以下方法推送自己的鏡像:
- 第一步:獲取需要推送到遠(yuǎn)端鏡像的 容器ID(CONTAINER ID),此處我們用ubuntu來(lái)進(jìn)行測(cè)試提交,ID是b8488a2dcef8,如下命令:
- 第二步將對(duì)應(yīng)Docker容器打包成鏡像:
- 第三步Docker Images 命令查詢打包好的鏡像文件,并且獲取對(duì)應(yīng)鏡像ID:
- 第四部:將需要提交的鏡像文件通過(guò)docker tag命令打包成自己倉(cāng)庫(kù)對(duì)應(yīng)的鏡像文件(之前的鏡像默認(rèn)是Docker hub公共的倉(cāng)庫(kù))
- 此處沒(méi)有指定tag的名稱,如需指定名稱用以下命令:
-
如上images命令后可以看的多了一個(gè)倉(cāng)庫(kù)名稱(REPOSITORY)是645121107/ljmadmin的鏡像文件,并且該鏡像文件的id和我們之前通過(guò)tag打包成鏡像的id是同一個(gè),說(shuō)明他們是同一個(gè)文件,我們可以理解為將他的副本映射到了我們自己的倉(cāng)庫(kù)地址,以下是我創(chuàng)建的倉(cāng)庫(kù)
-
第五步提交對(duì)應(yīng)鏡像文件,通過(guò)docker push命令提交
- 執(zhí)行以上命令后會(huì)得到如下的輸出,因?yàn)槲募惺畮譓甚至100M,所以需要一定時(shí)間,以上命令和git push類(lèi)似,645121107/ljmadmin 其實(shí)就是遠(yuǎn)程倉(cāng)庫(kù)地址,如果ljmadmin 是別在包例如645121107/1234,docker hub也會(huì)自動(dòng)在遠(yuǎn)程倉(cāng)庫(kù)創(chuàng)建新的文件1234.
- 在倉(cāng)庫(kù)中可以看到剛才提交的文件如下:
- 第六部:驗(yàn)證提交的鏡像文件有效
- 如下圖所示,說(shuō)明以及在下載文件:
查看Docker容器啟動(dòng)日志
- 用的最多的一個(gè),實(shí)時(shí)日志跟蹤,類(lèi)似 tail -f -n 300 xxx.log
-
Options操作如下:
- –details 顯示更多信息
- -f, --follow 跟蹤實(shí)時(shí)日志信息
- –since string 顯示自某個(gè)timestamp之后的日志,或相對(duì)時(shí)間,如40m(40分鐘)
- -tail string 從日志末尾開(kāi)始算顯示多少行日志,默認(rèn)是all
- -t, --timestamp 顯示時(shí)間搓
- –until string 顯示自某個(gè)timestamp之前的日志信息,或者相對(duì)時(shí)間,如40m(40分鐘)
-
查看最近30分鐘的日志:
- 查看某時(shí)間之后的日志:
- 查看某時(shí)間段日志:
下一篇 SpringCloud + Docker
總結(jié)
以上是生活随笔為你收集整理的Ubuntu上安装使用Docker的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 紫菀的功效与作用
- 下一篇: 终端编译opengl程序编译运行_ubu