摘要:從命名上就知道這是一篇簡(jiǎn)單粗暴的新手入門教程,為什么要簡(jiǎn)單粗暴我認(rèn)為有自學(xué)能力的人幫他入門就夠了,不能自學(xué)的一時(shí)半會(huì)兒也教不會(huì),不符合入門教程的初衷,建議出門左拐去找找視頻教程本章目標(biāo)大概了解是個(gè)什么玩意知道常用的指令參數(shù)能啟動(dòng)一個(gè)容器不然
從命名上就知道這是一篇簡(jiǎn)單粗暴的docker新手入門教程, 為什么要簡(jiǎn)單粗暴? 我認(rèn)為有自學(xué)能力的人幫他入門就夠了, 不能自學(xué)的一時(shí)半會(huì)兒也教不會(huì), 不符合入門教程的初衷, 建議出門左拐去找找視頻教程...本章目標(biāo)
大概了解 docker 是個(gè)什么玩意
知道常用的 docker 指令參數(shù), 能啟動(dòng)一個(gè)容器(不然還想怎么樣? 上天嗎?)
安裝環(huán)境強(qiáng)烈推薦使用 Docker for Mac 或 Docker for Windows, 這兩個(gè)工具已經(jīng)將 Kitematic 和 docker-compose 集成好了, 至于這兩個(gè)工具是做什么的咱們后面再說(shuō), win10 版本需要專業(yè)版的, 不然開啟不了Hyper-V, win7 就別想了,不支持...
怎么安裝在 阿里云鏡像容器服務(wù) 里面都說(shuō)的很清楚了, 連國(guó)內(nèi)鏡像源都給你安排好了, 咱們就進(jìn)入下一話題
PS: 如果是 CentOS 6 的就需要升級(jí)一下系統(tǒng)內(nèi)核了, centOS6.5 安裝docker, 畢竟都 8102 年了, docker 又是個(gè)比較新的東西, 對(duì)于稍微久一點(diǎn)的系統(tǒng)的支持就不那么友好運(yùn)行第一個(gè)容器
安裝完環(huán)境之后就啟動(dòng)一個(gè)鏡像開開眼兒
docker run -d -p 8080:80 --name local_nginx nginx
然后訪問(wèn) http://localhost:8080/ 就能看到 nginx 的初始界面了
中間發(fā)生了什么呢?
docker run 運(yùn)行鏡像的起手式, 詳情查看 docker run --help
-d 啟動(dòng) docker 守護(hù)進(jìn)程
-p 8080:80 將本地的 8080 端口綁定到容器的 80 端口上
--name local_nginx 分配一個(gè)容器名, 不寫的話會(huì)默認(rèn)分配要給, 不過(guò)這個(gè)還是很有用的
nginx 指定運(yùn)行的鏡像名,如果沒(méi)有指定標(biāo)簽則默認(rèn)是 latest, 這里其實(shí)是啟動(dòng)nginx:latest鏡像
現(xiàn)在可以查看一下本機(jī)都在運(yùn)行著什么鏡像
PS D:docker_study> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6732fa239270 nginx "nginx -g "daemon of…" 18 minutes ago Up 18 minutes 0.0.0.0:8080->80/tcp local_nginx
docker ps 只能看到正在運(yùn)行中的容器, 想看到全部的就是 docker ps -a
進(jìn)入這個(gè)容器的命令:
docker exec -it 6732fa239270 /bin/bash #或 docker exec -it local_nginx /bin/bash
解釋一下:
docker exec 在容器中執(zhí)行命令
-i 保持stdin打開
-t 分配一個(gè)偽終端(tty)
6732fa239270 或 local_nginx 這里你也發(fā)現(xiàn)了, 可以是通過(guò) CONTAINER ID 也可以是 NAMES 這里的 CONTAINER ID分為128位長(zhǎng)ID和32位短ID, 不過(guò)作用都是一樣的
/bin/bash 運(yùn)行容器中的 /bin/bash 腳本
進(jìn)入容器中感覺(jué)其實(shí)和進(jìn)入一個(gè)虛擬機(jī)一樣, 但是容器和虛擬機(jī)有點(diǎn)區(qū)別, 這個(gè)我們下一小節(jié)會(huì)講到
關(guān)閉容器
docker stop 6732fa239270 或 local_nginx什么是容器?什么是鏡像?
之前我們使用 VirtualBox 裝虛擬機(jī)的時(shí)候有裝盤鏡像, 但是啟動(dòng)后就是一個(gè)個(gè)的虛擬機(jī)了, 不過(guò)在 docker 中和虛擬機(jī)還是有點(diǎn)區(qū)別
就拿上圖來(lái)說(shuō), container就是鏡像的實(shí)例化, image 是容器的底層支撐, 其實(shí)他們的關(guān)系用代碼中的類Class來(lái)比喻是最合適的:
Class 就是我們實(shí)際開發(fā)中寫的一個(gè)代碼集合, Object 是 Class 實(shí)例化之后生成的一種資源變量
Image 也是預(yù)先寫好的邏輯, 并存在一個(gè)地方, Container 是 Image 啟動(dòng)之后生成的一個(gè)虛擬系統(tǒng)
實(shí)例化出來(lái)的 Object 不會(huì)影響到 Class 中的內(nèi)容
已經(jīng)啟動(dòng)的 Container 也不會(huì)影響到 Image 中的邏輯
Class 可以繼承別的 Class, 從而繼承它的特性
Image 也是可以繼承別的 Image, 并在它的基礎(chǔ)上構(gòu)建新的鏡像
一個(gè) Object 對(duì)應(yīng)著一個(gè) Class, 但是 一個(gè) Class 可以實(shí)例化無(wú)數(shù)個(gè) Object
同理, 一份 Image 可以生成無(wú)數(shù)個(gè) Container, 這就是方便集群化部署的所在
簡(jiǎn)單的說(shuō) Container 就是 Image 的兒子, 模樣和 Image 預(yù)想的一樣, 但是 Container 運(yùn)行之后會(huì)發(fā)生一些改變, 而且這種改變是可以保存的
常用的運(yùn)行參數(shù)和命令咱們先不說(shuō)構(gòu)建鏡像的事兒(那是下一章的話題), 這里先了解一下 docker run 命令中比較常用的參數(shù):
-it 建立一個(gè)可在終端交互的容器比如:
docker run -it --name local_nginx nginx:latest /bin/bash # 或 docker exec -it local_nginx bin/bash-p 用于宿主機(jī)和容器的端口綁定
綁定多個(gè)端口就設(shè)置多個(gè)映射
docker run -d -p 8088:80 -p 4433:443 nginx:latest # 或 不寫本地端口, docker 將幫你自動(dòng)分配 docker run -d -p :80 -p :443 nginx:latest # 或 加上 ip 就綁本地指定的 ip docker run -d -p 127.0.0.1:8088:80 -p :443 nginx:latest # 或 照樣不寫本地端口就隨機(jī)分配 docker run -d -p 127.0.0.1::80 -p :443 nginx:latest
通過(guò) docker ps 可以看一下上面兩行命令的執(zhí)行狀態(tài)
? test docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 57f65b46bd87 nginx:latest "nginx -g "daemon of…" 1 second ago Up 3 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp happy_zhukovsky 0c035ebabe44 nginx:latest "nginx -g "daemon of…" About a minute ago Up About a minute 0.0.0.0:8088->80/tcp, 0.0.0.0:4433->443/tcp ecstatic_haibt-v 將宿主機(jī)的卷掛載到容器中的指定目錄
docker run -d -p 8088:80 -v /Users/gpf/Documents/docker_study/docker_test/www/:/usr/share/nginx/html/ nginx:latest
這里本地的目錄要寫絕對(duì)路徑, 不然會(huì)報(bào)錯(cuò), 這樣一來(lái), 本地的/Users/gpf/Documents/docker_study/docker_test/www/ 就是容器中的/usr/share/nginx/html/, 就可以本地更改代碼, 然后容器中運(yùn)行
-d 后臺(tái)運(yùn)行想查看日志的話就 docker logs [containerID] 就行
docker exec 執(zhí)行 docker 容器中的命令通常就是用來(lái)進(jìn)入容器中搞七搞八的
docker exec -it 57f65b46bd87 /bin/bash # 或 docker exsec -it local_nginx /bin/bash
這里注意兩點(diǎn):
containerID 在很多情況下都可以用 container Name 來(lái)代替, 很多情況是等價(jià)的
命令最后的 /bin/bash 不是必須這么填, 而是執(zhí)行的容器中的腳本, 如果你的鏡像是 alpine版的就是 sh, 因?yàn)檫@個(gè)版本中就沒(méi)有 bash 這個(gè)命令
docker ps 容器的運(yùn)行狀態(tài) docker stop [containerID 或 name] 停止容器目前版本也增加了 docker container stop [containerID 或 name] 其實(shí)作用是一樣的, 不過(guò) docker container 命令底下還有很多別的命令, docker 給各模塊的命令做了細(xì)分
docker rm [containerID 或 name] 刪除指定未運(yùn)行的容器, 一個(gè)或多個(gè)docker rm 6dee0a9b5232 582f708af9d3docker rmi [imageID 或 tag] 刪除宿主機(jī)指定的鏡像
這里要注意如果這個(gè)鏡像還有容器在使用就不能刪除掉, 這個(gè)時(shí)候要先把對(duì)應(yīng)的容器刪掉才行
刪除指定鏡像的容器
docker stop $(docker ps | grep "這里寫imageName" | awk "{ print $1}") docker rm $(docker ps | grep "這里寫imageName" | awk "{ print $1}")
刪除臨時(shí)構(gòu)建的鏡像
docker rmi $(docker images | grep "prune 大殺器" | awk "{ print $3}")
這一手還是慎用,一些情況下可造成 rm -rf /* 的效果
#移除所有未使用的鏡像 docker image prune #移除所有未運(yùn)行的容器 docker container prune #移除所有未使用的本地卷 docker volume prune ...
PS: 因?yàn)橛羞@一手, 所以可以看出官方的態(tài)度, 他們貌似也許可能沒(méi)準(zhǔn)大概差不多不建議把容器當(dāng)成虛擬機(jī)一樣把所有的東西都堆在一個(gè)鏡像里面, 那樣搞不止構(gòu)建出來(lái)的鏡像臃腫, 而且維護(hù)性移植性很差, 從目前網(wǎng)上的 docker 鏡像資源來(lái)說(shuō), 基礎(chǔ)鏡像 alpine > debian > ubuntu > centos, 優(yōu)先使用最小的基礎(chǔ)構(gòu)建, 然后整個(gè) image 只為一個(gè)服務(wù)而構(gòu)建, 比如 redis 鏡像里只要 redis, 沒(méi)有什么 MySQL, memcache 什么的, 多個(gè)獨(dú)立的 service 才組成一個(gè) APP, 里面各個(gè)組件替換的話不用考慮其他組件的環(huán)境依賴什么的, 當(dāng)然, 這個(gè)也是看業(yè)務(wù)的實(shí)際需要, 不能為了拆分而拆分, 在這之間能找到最合適自己的才是工具給我們帶來(lái)的便利docker network 容器之間的互聯(lián)
如果只是在一個(gè)容器里搞來(lái)搞去就真的是虛擬機(jī)了, docker 的強(qiáng)大之處就是它內(nèi)部維護(hù)一個(gè)網(wǎng)絡(luò), 處在相同網(wǎng)絡(luò)的容器是可以互通的
# 新建一個(gè) docker 網(wǎng)絡(luò), -d bridge 是指定網(wǎng)絡(luò)模式, 當(dāng)前是橋接網(wǎng)絡(luò) docker network create -d bridge nginx_swarm # 啟動(dòng)兩個(gè) nginx 容器, 分別命名 nginx_swarm_a nginx_swarm_b , 兩者都加入了 nginx_swarm 這個(gè)網(wǎng)絡(luò) --rm 是當(dāng)容器停止后自動(dòng)刪除 docker run -it --rm --name nginx_swarm_a --network nginx_swarm nginx /bin/bash docker run -it --rm --name nginx_swarm_b --network nginx_swarm nginx /bin/bash
注意, 我們并沒(méi)把接口暴露出去, 現(xiàn)在隨便在一個(gè)容器中 ping 另一個(gè)容器
# 這是在 nginx_swarm_a 中 # 沒(méi)有 ping 命令的先裝一個(gè) ping # apt-get update && apt-get install -y iputils-ping root@73d04107780f:/# ping -c 3 nginx_swarm_b PING nginx_swarm_b (172.18.0.3) 56(84) bytes of data. 64 bytes from nginx_swarm_b.nginx_swarm (172.18.0.3): icmp_seq=1 ttl=64 time=0.084 ms 64 bytes from nginx_swarm_b.nginx_swarm (172.18.0.3): icmp_seq=2 ttl=64 time=0.161 ms 64 bytes from nginx_swarm_b.nginx_swarm (172.18.0.3): icmp_seq=3 ttl=64 time=0.146 ms --- nginx_swarm_b ping statistics ---
docker 能自動(dòng)的把 server name 轉(zhuǎn)換成 ip, 我們只需要標(biāo)明請(qǐng)求的是哪個(gè)容器, 而不是還要記住它的 ip 地址(當(dāng)然 ip 地址也能設(shè)置)
總結(jié)弄明白以下幾點(diǎn)啟動(dòng)一個(gè)容器應(yīng)該是沒(méi)什么問(wèn)題了:
國(guó)內(nèi)一定要使用國(guó)內(nèi)鏡像源, 不然會(huì)痛不欲生, 國(guó)內(nèi) docker 倉(cāng)庫(kù)鏡像對(duì)比
分清鏡像和容器的概念, 容器就是基于鏡像構(gòu)建出來(lái)的一個(gè)實(shí)例
不要往容器中保存數(shù)據(jù), 容器應(yīng)該是無(wú)狀態(tài)的, 需要持久化保存的就docker run -v xx:xx 或者 docker create volume ... 用獨(dú)立的卷來(lái)保存
docker 不是虛擬機(jī)
分清楚宿主機(jī)端口和容器端口
處在相同network下的容器才能通過(guò)容器明互相訪問(wèn)
參考資料:
Docker — 從入門到實(shí)踐
nginx 官方鏡像
下一章:
不正宗 docker 入門教程 構(gòu)建一個(gè)鏡像(2/3)
不正宗 Docker 入門教程-啟動(dòng)一個(gè)容器(1/3)
不正宗 Docker 入門教程-構(gòu)建一個(gè)鏡像(2/3)
不正宗 Docker 入門教程-使用 Docker-Compose (3/3)
博客原文
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27359.html
摘要:看看它里面的鏡像是怎么寫的還是很有收獲的相關(guān)不正宗入門教程啟動(dòng)一個(gè)容器不正宗入門教程構(gòu)建一個(gè)鏡像不正宗入門教程使用博客原文 本章通過(guò)一個(gè)具體的demo來(lái)了解 docker-compose docker-compose 是做什么的 在構(gòu)建一個(gè)完整的服務(wù)時(shí),我們通常啟動(dòng)一個(gè)容器, 一旦出現(xiàn)多個(gè)容器需要同時(shí)啟動(dòng)的時(shí)候手打是下下之策, 因?yàn)闀r(shí)間一長(zhǎng)難免會(huì)忘記細(xì)節(jié),寫腳本也不是不可以,但是大家沒(méi)...
摘要:初步列了以下方案用實(shí)現(xiàn)擅長(zhǎng),通過(guò)重定向?qū)⒌妮敵鰝鹘o,處理完后執(zhí)行系統(tǒng)命令清除鏡像。對(duì)鏡像列表進(jìn)行去重操作可以以鏡像名稱為進(jìn)行去重獲取歷史鏡像要保留最近個(gè)鏡像清除歷史鏡像,其實(shí)就是保留數(shù)據(jù)前行,有個(gè)內(nèi)置變量保存當(dāng)前處理行編號(hào)。 背景 雖然對(duì)awk早有耳聞,據(jù)說(shuō)是個(gè)很強(qiáng)大的工具,但一直沒(méi)機(jī)會(huì)去了解和使用,最近碰到一個(gè)需求,用awk輕松解決,才真正一窺它的厲害。需求是這樣的,應(yīng)用每次升級(jí)都會(huì)...
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。必填用于執(zhí)行命令,當(dāng)執(zhí)行完畢后,將產(chǎn)生一個(gè)新的文件層。可選指定此鏡像啟動(dòng)時(shí)默認(rèn)執(zhí)行命令。可選用于指定需要暴露的網(wǎng)絡(luò)端口號(hào)。可選向鏡像中掛載一個(gè)卷組。 時(shí)間:2017年09月16日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:無(wú) 學(xué)習(xí)源碼:無(wú) 第一章:課程簡(jiǎn)介 1-1 課程介紹 Docke...
摘要:原文地址零基礎(chǔ)入門指南四啟動(dòng)容器啟動(dòng)容器有兩種方式,一種是基于鏡像新建一個(gè)容器并啟動(dòng),另外一個(gè)是將在終止?fàn)顟B(tài)的容器重新啟動(dòng)。此外,當(dāng)容器中指定的應(yīng)用終結(jié)時(shí),容器也自動(dòng)終止。命令命令用于進(jìn)入一個(gè)正在運(yùn)行的容器。 原文地址:Docker零基礎(chǔ)入門指南(四) 啟動(dòng)容器 啟動(dòng)容器有兩種方式,一種是基于鏡像新建一個(gè)容器并啟動(dòng),另外一個(gè)是將在終止?fàn)顟B(tài)(stopped)的容器重新啟動(dòng)。因?yàn)镈ocke...
閱讀 2887·2021-11-24 09:39
閱讀 3140·2021-11-19 10:00
閱讀 1542·2021-10-27 14:17
閱讀 1816·2021-10-14 09:43
閱讀 966·2021-09-03 10:30
閱讀 3419·2019-08-30 15:54
閱讀 2741·2019-08-30 13:05
閱讀 2018·2019-08-30 11:02