Docker是一個開源的容器引擎,它基於 LXC 容器技術,使用 Go 語言開發。源代碼託管在 Github 上,並聽從 Apache2.0 協議。 Docker採用 C/S 架構,其能夠輕鬆的爲任何應用建立一個輕量級的、可移植的、自給自足的容器。 簡單來講: Docker 就是一種快速解決生產問題的一種技術手段。nginx
docker 官網: www.docker.com/docker
優勢 :json
缺點:ubuntu
根據不用的操做系統能夠輕鬆在網上查找到不少安裝教程,以前寫過一個: blog.csdn.net/Enjolras_fu… 這裏再也不贅述。vim
docker version
複製代碼
在安裝前,只有 ens33 和 lo 網卡 在安裝後,docker 啓動後,多出了 docker0 網卡,網卡地址是 172.17.0.1瀏覽器
這部分網上也有較多文章去具體講解,這裏就再也不贅述。 blog.csdn.net/Enjolras_fu…bash
docker 鏡像至關於一個只讀的文件,就相似於咱們安裝操做系統的時候所須要的各類iso 光盤鏡像,咱們經過運行這個鏡像來完成各類應用的部署。網絡
能夠理解鏡像就是一個能被 docker 運行起來的一個程序。架構
docker search ubuntu
複製代碼
docker pull ubuntu
複製代碼
獲取的鏡像存放在哪裏? /var/lib/docker 目錄下。curl
docker images [image_name]
複製代碼
這裏是 docker images ubuntu:latest
鏡像的 ID 惟一標識了鏡像,若是 ID 相同,就說明是同一鏡像。TAG 信息來區分不一樣的發行版本,若是不指定具體的標記,就默認使用 latest 來標記信息。
docker image ls (當前存在的鏡像)
複製代碼
或者 docker images -a (包含已經刪除的鏡像記錄)
這兩個命令列出的結果略有不一樣。
docker history [image_name]
複製代碼
咱們獲取到一個鏡像,想知道他默認啓動了哪些命令或者封裝了哪些系統層,就可使用 docker history 來獲取。
docker tag [old_image]:[old_version] [new_image]:[new_version]
複製代碼
演示: docker tag nginx:latest sswang-nginx:v1.0
docker rmi [image_id/image_name:image_version]
複製代碼
注意 若是一個 image_id 對應多個名稱,要使用 name:tag 的格式刪除鏡像。
docker image prune
複製代碼
docker image prune -a
複製代碼
docker image prune -a --filter "until=24h"
複製代碼
咱們能夠將已經下載好的鏡像導出到本地,以備後用。
docker save -o [包文件][鏡像]
docker save [鏡像1] ... [鏡像n] > [包文件]
複製代碼
docker save 會保存鏡像的所有歷史記錄和元數據信息。
舉例: docker save -o nginx.tar sswang-nginx
docker load < [image.tar_name]
docker load --input [image.tar_name]
複製代碼
舉例: docker load < nginx.tar
容器是什麼? 容器相似於咱們運行起來的一個操做系統,並且這個操做系統啓動了某些服務。 這裏的容器指的是一個運行起來的 docker 鏡像。
docker ps
複製代碼
docker ps -a
複製代碼
docker start [container_id]
複製代碼
在生產過程當中,經常會出現運行和不運行的容器,咱們使用 start 命令開起一個已經關閉的容器。
docker stop [container_id]
複製代碼
在生產過程當中,咱們會由於臨時狀況, 要關閉某些容器,咱們使用 stop 命令來關閉容器。
docker rm [container_id]
docker container prune
複製代碼
docker container prune --filter "until=24h"
複製代碼
docker rm -f [container_id]
複製代碼
docker rm -f $(docker ps -a -q)
複製代碼
docker run --name [container_name] -it [docker_image] /bin/bash
複製代碼
method1: exit
method2: Ctrl+D
複製代碼
docker exec -it [container_id] /bin/bash
複製代碼
docker commit -m '改動信息' -a '做者信息' [container_id] [new_image:tag]
複製代碼
舉例: 進入一個容器,建立文件以後退出。
$ docker exec -it 7f551fd3c017 /bin/bash
root@7f551fd3c017:/# mkdir /furuiyang
root@7f551fd3c017:/# exit
exit
複製代碼
基於該容器建立一個鏡像:
$ docker commit -m 'mkdir /furuiyang' -a 'furuiyang' 7f551fd3c017 ry-nginx:v0.0.1
sha256:e0aa3ce6ace3bc8e38de40ab31a88b3901ba09c366511a280ba75b0719963c98
複製代碼
查看鏡像:
$ docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ry-nginx v0.0.1 e0aa3ce6ace3 14 seconds ago 126MB
複製代碼
基於新鏡像啓動一個容器:
$ docker run --name d3 -itd ry-nginx:v0.0.1 /bin/bash
6d2e0f2cf48569b44eed1af2ca9871bb56a58b561695266112f7650e84546ead
複製代碼
進入容器進行查看:
$ docker exec -it 6d2e0f2cf48 /bin/bash
root@6d2e0f2cf485:/# ls
bin boot dev etc furuiyang home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
複製代碼
docker logs [container_id]
複製代碼
docker inspect [container_id]
複製代碼
在詳細信息中過濾出容器的網絡信息:
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
複製代碼
倉庫就相似於咱們在網上搜索操做系統光盤的一個鏡像站。 這裏的倉庫指的是 Docker 鏡像存儲的地方。
部署流程:
實施方案: 下載 regisstry 鏡像:
docker pull registry:latest
複製代碼
啓動倉庫容器:
docker run -d -p 5000:5000 registry:latest
複製代碼
檢查容器效果:
curl 127.0.0.1:5000/v2/_catalog
複製代碼
配置容器權限:
vim /etc/docker/daemin.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["172.18.222.137:5000"]}
複製代碼
注意私有倉庫的 ip 地址是宿主機的 ip 地址,而且 ip 地址的兩側有引號。
重啓 docker 服務:
systemctl restart docker
systemctl status docker
複製代碼
效果查看: 啓動倉庫服務的容器: (在重啓 docker 服務的過程當中關閉了運行中的所有容器)
docker start 6492f6a098c6
複製代碼
標記要提交的鏡像:
docker tag ry-nginx:v0.0.1 172.18.222.137:5000/ry-nginx:v0.0.1
複製代碼
推送鏡像:
docker push 172.18.222.137:5000/ry-nginx:v0.0.1
複製代碼
拉取鏡像:
docker pull 172.18.222.137:5000/ry-nginx:v0.0.1
複製代碼
docker 的鏡像是隻讀的,雖然能夠根據鏡像建立的容器能夠進行操做,可是咱們不能將數據保存在容器裏面,由於容器會隨時關閉和開啓,那麼應該如何將 數據保存下來呢?
答案就是數據卷和數據卷容器。
就是講宿主機的某個目錄,映射到容器中,做爲數據存儲的目錄,咱們就能夠在宿主機對數據進行存儲。
缺點: 太單一了。
咱們可以使用 docker run 來建立容器,在 docker run 命令時添加 -v 參數,就能夠建立而且掛載一個到多個數據捲到當前運行的容器中。
-v 參數的做用是將宿主機的一個目錄做爲容器的數據卷掛載到docker容器中,使宿主機和容器之間能夠共享一個 目錄,若是本地路徑不存在,Docker也會自動建立。 -v 宿主機文件:容器文件
關於數據卷的管理咱們從兩個方面來講: 一、目錄 二、普通文件
命令格式:
docker run -itd --name [container_name] -v [宿主機目錄]:[容器目錄] [鏡像名稱] [命令[可選]]
複製代碼
命令演示: 建立測試文件:
echo 'hello ruiyang' > /tmp/file1.txt
複製代碼
啓動一個容器,掛載數據卷
docker run -itd --name test1 -v /tmp:/test1 nginx
複製代碼
進入容器查看:
docker exec -it 3733303ee /bin/bash
cat /test1/file1.txt
複製代碼
命令格式:
docker run -itd --name [container_name] -v [宿主機文件]:[容器文件] [鏡像名稱][命令[可選]]
複製代碼
命令演示: 建立測試文件:
echo 'file1' > /tmp/file1.txt
複製代碼
啓動一個容器,掛載數據卷
docker run -itd --name test2 -v /temp/file1.txt:/nihao/nihao.sh nginx
複製代碼
這時候直接建立文件夾 nihao.sh ...
將宿主機的某個目錄,使用容器的方式來表示,而後其餘的應用容器將數據保存在這個容器裏面,達到大批量應用數據同時存儲的目的。
若是咱們使用數據卷容器,在多個容器之間共享數據,並永久保留這些數據,須要有一個規範的流程才能作獲得。 一、 建立數據卷容器 二、 其餘容器掛載數據卷容器 注意: 數據卷容器不啓動
建立一個數據卷容器:
docker create -v [容器數據卷目錄] --name [容器名字] [鏡像名稱]:[命令[可選]]
docker create -v /data --name v-test nginx
複製代碼
建立兩個容器同時掛載數據卷容器:
docker run --volumes-from e7dd7d04c9 -itd --name t1 nginx /bin/bash
docker run --volumes-from e7dd7d04c9 -itd --name t2 nginx /bin/bash
複製代碼
進入 t1 操做數據卷容器:
docker exec -it 7dc224 /bin/bash
cd /data
touch reach.py
複製代碼
進入 t2 確認數據卷是否有改動:
docker exec -it dc17055491 /bin/bash
cd /data
ls
複製代碼
回到宿主機查看 /data 目錄,不存在上述目錄。
容器之間能夠共享數據卷迷你容器,不過數據是保存在數據卷裏面的,並無保存到宿主機的文件目錄中。
docker 以上的內容都依賴於網絡才能工做,咱們從兩個方面來學習網絡:
默認狀況下,容器和宿主機之間網絡是隔離的,咱們能夠經過端口映射的方式,將容器中的端口,映射到宿主機的某個端口上。這樣咱們就能夠經過 宿主機的ip+port的方式來訪問容器裏的內容。
注意: 在生產場景通常不使用隨機映射,可是隨機映射的好處就是由docker分配,端口不會衝突, 無論哪一種映射都會影響性能,由於涉及到映射。
隨機映射咱們從兩個方面來學習:
docker run -d -P [鏡像名稱]
複製代碼
啓動一個 nginx 鏡像:
查看效果:
咱們能夠看到宿主機的 32768 端口被映射到容器裏面的 80 端口。 -P 能夠作到自動綁定全部對外提供服務的容器端口,映射的端口將會從沒有使用過的端口池中自動隨機選擇,可是若是連續綁定多個容器的話,則下一個容器的端口默認是當前容器佔用端口號+1.
這時候咱們在瀏覽器裏面訪問本地的 32768 端口,效果以下:
命令格式:
docker run -d -p [宿主機ip]::[容器端口] --name [容器名稱] [鏡像名稱]
複製代碼
好比:
查看效果:
命令格式:
docker run -d -p [宿主機ip]:[宿主機端口]:[容器端口] --name [容器名字] [鏡像名字]
複製代碼
注意:
命令實踐: 如今咱們在啓動容器的時候,給容器指定一個訪問的端口是 1199:
docker run -d -p 172.18.222.137:1199:80 --name n3 nginx
複製代碼
查看新容器的 ip:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' c64c7cdc052cc57961
複製代碼
查看容器的端口映射: (接着上次寫的嗎,因此截圖時間是 42 小時以前)
查看宿主機開啓的端口:
netstat -tnulp | grep docker-proxy
複製代碼
咱們能夠在瀏覽器訪問指定的端口 http://172.18.222.137:32768 查看效果. 在這裏,我直接使用 httpie 的命令去訪問:
命令格式:
docker run -d -p [宿主機端口1]:[容器端口1] -p [宿主機端口2]:[容器端口2] --name [容器名稱] [鏡像名稱]
複製代碼
開啓多端口映射實踐:
docker run -d -p 520:443 -p 6666:80 --name n3 nginx
複製代碼
查看容器進程:
docker network --help
docker 的默認模式,會在 docker 啓動的時候,自動配置好本身的網絡信息。同一個宿主機的全部容器都在一個網絡下,彼此之間能夠通訊,相似於 vmware 虛擬機的 nat 模式。 在這種模式下,利用宿主機的網卡進行通訊,由於涉及到網絡轉換,因此會形成資源浪費,網絡效率會低。 示意圖:
截取一段提問方便以後覆盤:
簡單來講,就是鳩佔鵲巢,用着宿主機的東西,幹着本身的事情。容器使用宿主機的 ip 地址進行通訊。 特色: 容器和宿主機共享網絡。 示意圖:
開啓小灰與大黃模式:
新建立的容器之間適應已經建立的容器網絡,相似於一個局域網。 特色: 容器和容器之間共享網絡。 示意圖:
這種模式最爲純粹,不會幫你作任何的配置,能夠最大限度的定製化。
容器之間不是在同一網絡,可是能互相通行。
嗯,交學費了 ... 找了一篇參考: blog.csdn.net/sqzhao/arti… 有待繼續深刻
其實在端口映射部分作的實踐就是 bridge 的簡單演示了,由於他們使用的是默認 bridge 模式,如今咱們來自定義橋接網絡。 這一部分從三個方面來演示:
命令格式:
docker network create --driver [網絡類型][網絡名稱]
複製代碼
命令演示:
docker network create --driver bridge bridge-test
複製代碼
查看主機網絡類型:
docker network ls
複製代碼
查看新建的網絡的網絡信息:
docker network inspect bridge-test
複製代碼
查看宿主機的網卡: 能夠看到宿主機多出一個網卡設備:
命令格式:
docker run --net=[網絡名稱] -itd --name=[容器名稱] [鏡像名稱]
複製代碼
使用效果:
docker run --net=bridge-test -itd --name=n_bri nginx
複製代碼
查看該容器的 ip 信息:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' n_bri
複製代碼
注意:使用戶默認的橋接模型的容器是能夠直接聯網的,可是使用自定義的橋接模型不能夠直接聯網,可是能夠經過端口映射來實現聯網。
命令格式:
docker network disconnect [網絡名] [容器名]
複製代碼
命令演示:
docker network disconnect bridge-test n_bri
複製代碼
效果展現:
命令格式:
docker network connect [網絡名] [容器名]
複製代碼
命令演示:
docker network connect bridge-test n_bri
複製代碼
效果展現:
咱們從命令講解 以及 host 特色兩個方面來學習。
在host模型下,容器使用宿主機的 ip 地址進行對外提供服務,自己沒有 ip 地址。
命令格式:
docker run --net=host -itd --name [容器名稱] [鏡像名稱]
複製代碼
命令示例: 建立容器使用 host 模式:
docker run --net=host -itd --name nginx-1 nginx
複製代碼
通常這時咱們 netstat -at 查看宿主機端口,就能夠看到 80 被使用。
若是不能啓動 ,說明本機的 80 已經被佔用
host 的特色: host 模型比較適合於,一臺宿主機跑一個固定的容器,比較穩定。或者是一個宿主機跑幾個佔用不一樣端口容器的應用場景,他的網絡性能是很高的。 host 模型啓動的容器不會有任何地址,他實際上是使用了宿主機的全部信息。