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