docker 基礎總結

docker 是什麼

Docker是一個開源的容器引擎,它基於 LXC 容器技術,使用 Go 語言開發。源代碼託管在 Github 上,並聽從 Apache2.0 協議。 Docker採用 C/S 架構,其能夠輕鬆的爲任何應用建立一個輕量級的、可移植的、自給自足的容器。 簡單來講: Docker 就是一種快速解決生產問題的一種技術手段。nginx

docker 官網: www.docker.com/docker

理解 docker 的理念

  • 構建: 龍珠裏的膠囊,將你須要的場景構建好,裝在一個小膠囊裏
  • 運輸: 隨身攜帶着房子、車子等,很是方便
  • 運行: 只須要你輕輕按一下膠囊,找個合適的地方一放,就ok了

優缺點

優勢 :json

  • 多: 使用場景多
  • 快: 環境部署快、更新快
  • 好: 好多人在用,東西好
  • 省: 省錢省力省人工。

缺點:ubuntu

  • 依賴操做系統;
  • 依賴網絡;
  • 銀行 U 盾等場景不能用。

docker 的安裝

根據不用的操做系統能夠輕鬆在網上查找到不少安裝教程,以前寫過一個: blog.csdn.net/Enjolras_fu… 這裏再也不贅述。vim

測試已安裝:

docker version 
複製代碼

網卡區別:

在安裝前,只有 ens33 和 lo 網卡 在安裝後,docker 啓動後,多出了 docker0 網卡,網卡地址是 172.17.0.1瀏覽器

docker 的基本目錄

  • /etc/docker/ 是 docker 的認證目錄

  • /var/lib/docker/ 是 docker 的應用目錄

配置 docker 加速器

這部分網上也有較多文章去具體講解,這裏就再也不贅述。 blog.csdn.net/Enjolras_fu…bash

docker 鏡像簡介

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 的格式刪除鏡像。

清除狀態爲 dangling 的鏡像:

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 
複製代碼

  • --name 給容器定義一個名稱
  • -i 讓容器的標準輸入保持打開
  • -t 讓 docker 分配一個僞終端,而且綁定到容器的標準輸入上
  • /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 鏡像存儲的地方。

Docker 倉庫分類

  • 共有倉庫: Docker hub、 Docker cloud 等
  • 私有倉庫: register、 harbor 等
  • 本地倉庫: 在當前的主機存儲鏡像的地方

倉庫相關命令

  • 登陸倉庫: docker login [倉庫名稱]
  • 在倉庫中 pull 鏡像: docker pull [鏡像名稱]
  • 推送鏡像: docker push [鏡像名稱]
  • 查找鏡像: docker search [鏡像名稱]

部署一個私有倉庫

部署流程:

  1. 根據 registry 鏡像建立容器
  2. 配置倉庫權限
  3. 提交鏡像到私有倉庫
  4. 測試

實施方案: 下載 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 的鏡像是隻讀的,雖然能夠根據鏡像建立的容器能夠進行操做,可是咱們不能將數據保存在容器裏面,由於容器會隨時關閉和開啓,那麼應該如何將 數據保存下來呢?

答案就是數據卷和數據卷容器。

什麼是數據卷

就是講宿主機的某個目錄,映射到容器中,做爲數據存儲的目錄,咱們就能夠在宿主機對數據進行存儲。

缺點: 太單一了。

咱們可以使用 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 volume ls
  • 刪除某個數據卷: docker volume rm [VOLUME NAME]
  • 清除無用的數據卷: docker volume prune

數據卷容器

將宿主機的某個目錄,使用容器的方式來表示,而後其餘的應用容器將數據保存在這個容器裏面,達到大批量應用數據同時存儲的目的。

若是咱們使用數據卷容器,在多個容器之間共享數據,並永久保留這些數據,須要有一個規範的流程才能作獲得。 一、 建立數據卷容器 二、 其餘容器掛載數據卷容器 注意: 數據卷容器不啓動

數據卷容器實踐:

建立一個數據卷容器:

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的方式來訪問容器裏的內容。

端口映射種類
  • 隨機映射 -P(大寫)
  • 指定映射 -p 宿主機端口:容器端口

注意: 在生產場景通常不使用隨機映射,可是隨機映射的好處就是由docker分配,端口不會衝突, 無論哪一種映射都會影響性能,由於涉及到映射。

隨機映射實踐

隨機映射咱們從兩個方面來學習:

  • 默認隨機映射
  • 指定主機隨機映射

默認隨機映射

docker run -d -P [鏡像名稱]
複製代碼

啓動一個 nginx 鏡像:

查看效果:

咱們能夠看到宿主機的 32768 端口被映射到容器裏面的 80 端口。 -P 能夠作到自動綁定全部對外提供服務的容器端口,映射的端口將會從沒有使用過的端口池中自動隨機選擇,可是若是連續綁定多個容器的話,則下一個容器的端口默認是當前容器佔用端口號+1.

這時候咱們在瀏覽器裏面訪問本地的 32768 端口,效果以下:

指定主機隨機映射

命令格式:

docker run -d -p [宿主機ip]::[容器端口] --name [容器名稱] [鏡像名稱]
複製代碼

好比:

查看效果:

指定映射實踐

命令格式:

docker run -d -p [宿主機ip]:[宿主機端口]:[容器端口] --name [容器名字] [鏡像名字]
複製代碼

注意:

  • 若是不指定宿主機的ip,默認是使用 0.0.0.0
  • 容器端口必須清楚,並且必須寫出來

命令實踐: 如今咱們在啓動容器的時候,給容器指定一個訪問的端口是 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 網絡命令

docker network --help

docker 的網絡模式

bridge 模式

docker 的默認模式,會在 docker 啓動的時候,自動配置好本身的網絡信息。同一個宿主機的全部容器都在一個網絡下,彼此之間能夠通訊,相似於 vmware 虛擬機的 nat 模式。 在這種模式下,利用宿主機的網卡進行通訊,由於涉及到網絡轉換,因此會形成資源浪費,網絡效率會低。 示意圖:

截取一段提問方便以後覆盤:

host 模式

簡單來講,就是鳩佔鵲巢,用着宿主機的東西,幹着本身的事情。容器使用宿主機的 ip 地址進行通訊。 特色: 容器和宿主機共享網絡。 示意圖:

開啓小灰與大黃模式:

container 模式

新建立的容器之間適應已經建立的容器網絡,相似於一個局域網。 特色: 容器和容器之間共享網絡。 示意圖:

提問時間:

none 模式

這種模式最爲純粹,不會幫你作任何的配置,能夠最大限度的定製化。

overlay 模式

容器之間不是在同一網絡,可是能互相通行。

提問時間:

嗯,交學費了 ... 找了一篇參考: blog.csdn.net/sqzhao/arti… 有待繼續深刻

bridge 實踐

其實在端口映射部分作的實踐就是 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 特色兩個方面來學習。

命令講解

在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 模型啓動的容器不會有任何地址,他實際上是使用了宿主機的全部信息。

相關文章
相關標籤/搜索