1. 程式人生 > >Docker基本介紹和操作

Docker基本介紹和操作

後臺 掛載點 遷移 layer 其中 for 時間 自啟動 exe

Docker基本介紹和操作

Docker基本介紹

什麽是Docker

Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,它是基於 dotCloud 公司多年雲服務技術的一次革新,並於 2013 年 3 月以 Apache 2.0 授權協議開源,主要項目代碼在 GitHub 上進行維護。
Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基於 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離,屬於 操作系統層面的虛擬化技術。由於隔離的進程獨立於宿主和其它的隔離的進程,因此也稱其為容器。最初實現是基於 LXC,從 0.7 版本以後開始去除 LXC,轉而使用自行開發的 libcontainer,從 1.11 開始,則進一步演進為使用 runC 和 containerd。

Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的創建和維護。使得 Docker 技術比虛擬機技術更為輕便、快捷。

Docker與傳統虛擬化的不同

傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。

為什麽使用Docker

  • 更高效的利用系統資源
  • 更快速的啟動時間
  • 一致的運行環境
  • 持續交付和部署
  • 更輕松的遷移
  • 更輕松的維護和擴展

對比傳統虛擬機總結,如下表:

特性 容器 虛擬機
啟動 秒級 分鐘級
硬盤使用 一般為 MB 一般為 GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 一般幾十個

Docker基本概念

Docker 包括三個基本概念

  • 鏡像(Image)
  • 容器(Container)
  • 倉庫(Repository)

Docker基本操作

Docker版本介紹

docker-ce-17.09.0.ce
系統環境是linux7.x

Docker服務相關命令

啟動docker服務
systemctl start docker
查看docker服務狀態
systemctl status docker
關閉docker服務
systemctl stop docker
docker開機自啟動
systemctl enable docker

查看Docker信息

查看docker版本
docker version
查看docker系統信息
docker info
查看docker日誌信息
docker logs

Docker鏡像

鏡像拉取

例如以 centos 為關鍵詞進行搜索:
docker search centos
使用公司內部鏡像庫
docker login dockerhub.datagrand.com
輸入賬號+密碼
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]
實戰:如從公司內部鏡像庫下載CentOS鏡像
docker pull dockerhub.datagrand.com/global/centos:7.2.1511
使用第三方鏡像倉庫,如Docker
實戰:如從Docker鏡像庫下載busybox
docker pull busybox

列出鏡像

要想列出已經下載下來的鏡像,可以使用 docker image 命令。

REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
busybox                                latest              e1ddd7948a1c        5 days ago          1.16MB
說明:
列表包含了 倉庫名、標簽、鏡像 ID、創建時間 以及 所占用的空間。

鏡像推送

推送至公司內部鏡像庫
登錄公司鏡像庫
docker login dockerhub.datagrand.com
輸入賬號+密碼
如我們需要將 busybox:latest 推送至global項目下,具體操作步驟如下:
docker tag e1ddd7948a1c dockerhub.datagrand.com/global/busybox:v100
其中,e1ddd7948a1c 是鏡像ID,可以通過docker images來查看。

操作Docker容器

運行鏡像

實戰:運行busybox,容器名字是datagrand,啟動sh並且將其放到後臺運行。

語法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -itd --name=datagrand busybox /bin/sh
其中:
-itd這三個參數分別表示:
-i:交互式操作
-t:終端
-d:後臺運行

查看容器運行狀態

正在運行的容器
docker ps
查找某個正在運行的容器,如上例中的datagrand
docker ps grep datagrand
查看所有容器狀態(包括運行和停止的)
docker ps -a

進入容器內部

語法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it b7df818849aa /bin/sh
其中b7df818849aa為容器ID,可通過docker ps來查看。

停止、重啟和刪除容器

docker stop b7df818849aa 
docker restart b7df818849aa
docker rm b7df818849aa
其中b7df818849aa為容器ID,可通過docker ps來查看。

刪除本地鏡像

語法:docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi e1ddd7948a1c feac5e0dfdb2
其中e1ddd7948a1c和feac5e0dfdb2是鏡像ID,可以通過docker images來查看。

請註意:在刪除鏡像之前,請將使用該鏡像的容器停止和刪除,否則會有如下報錯:

Error response from daemon: conflict: unable to delete e1ddd7948a1c (cannot be forced) - image is being used by running container b7df818849aa
Error response from daemon: conflict: unable to delete e1ddd7948a1c (must be forced) - image is being used by stopped container b7df818849aa

鏡像導出和導入

鏡像導出
docker save e1ddd7948a1c |gzip > docker_file.tgz
其中,e1ddd7948a1c是鏡像ID,可以通過docker images來查看。
鏡像導入
docker load < docker_file.tgz 
說明:
也可以使用Export和Import對容器進行導出和導入。
兩者區別,這裏簡單說一下:
使用導出後再導入(exported-imported)的鏡像會丟失所有的歷史,而保存後再加載(saveed-loaded)的鏡像沒有丟失歷史和層(layer)。這意味著使用導出後再導入的方式,你將無法回滾到之前的層(layer),同時,使用保存後再加載的方式持久化整個鏡像,就可以做到層回滾(可以執行docker tag <LAYER ID> <IMAGE NAME>來回滾之前的層)。

Docker 數據管理

為什麽需要數據卷

  • 當該容器不再運行時,數據將不會持久存在,並且如果另一個進程需要,則可能很難從容器中獲取數據。
  • 容器的可寫層緊密耦合到運行容器的主機。無法輕松地將數據移動到其他位置。
  • 寫入容器的可寫層需要 存儲驅動程序來管理文件系統。存儲驅動程序使用Linux內核提供聯合文件系統。與使用直接寫入主機文件系統的數據卷相比,這種額外的抽象降低了性能 。

Docker將數據從Docker主機安裝到容器中三種方式:

  • 數據卷(Volumes)
  • 掛載主機目錄 (Bind mounts)
  • tmpfs卷

容器中管理數據三種方式區別:

  • Volumes 存儲在由Docker(/var/lib/docker/volumes/在Linux上)管理的主機文件系統的一部分中。非Docker進程不應修改文件系統的這一部分。卷是在Docker中保留數據的最佳方式。
  • Bind mounts 可以存儲在主機系統的任何位置。它們甚至可能是重要的系統文件或目錄。Docker主機或Docker容器上的非Docker進程可以隨時修改它們。
  • tmpfs 掛載僅存儲在主機系統的內存中,永遠不會寫入主機系統的文件系統。

什麽是數據卷

數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:

  • 可以在容器之間共享和重用
  • 對數據卷的修改會立馬生效
  • 對數據卷的更新,不會影響鏡像
  • 數據卷默認會一直存在,即使容器被刪除

註意:
數據卷的使用,類似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的 數據卷。

創建和管理卷

創建一個卷
docker volume create my-vol
查看創建的卷
docker volume ls
查看卷詳細信息
docker volume inspect my-vol
刪除卷
docker volume rm my-vol

啟動具有卷的容器

如果啟動具有尚不存在的卷的容器,Docker會自動創建卷。
docker run -d   -it   --name datatest   --mount source=myvol2,target=/app   busybox
使用docker inspect devtest驗證創建卷並安裝正確。尋找Mounts部分:
"Mounts": [
            {
                "Type": "volume",
                "Name": "myvol2",
                "Source": "/data/sys/var/docker/volumes/myvol2/_data",
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
說明:mount是一個卷,它顯示正確的源和目標,並且mount是可讀寫的。
停止容器並移除卷:
docker stop datatest
docker rm datatest
docker volume rm myvol2

使用只讀卷

docker run -d   -it   --name=nginxtest   --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly   nginx:latest

使用綁定掛載(Bind mounts)

與卷相比,綁定裝載具有有限的功能。使用綁定裝入時,主機上的文件或目錄將裝入容器中。文件或目錄由其在主機上的完整路徑或相對路徑引用。相反,當你使用卷時,會在主機上的Docker存儲目錄中創建一個新目錄,Docker會管理該目錄的內容。
該文件或目錄不需要已存在於Docker主機上。如果它尚不存在,則按需創建。綁定掛載非常高效,但它們依賴於具有特定目錄結構的主機文件系統。

創建source路徑文件target
mkdir /tmp/target
docker run -d   -it   --name devtest   --mount type=bind,source=/tmp/target,target=/app   busybox

使用docker inspect devtest驗證綁定安裝正確創建。尋找Mounts部分:

"Mounts": [
            {
                "Type": "bind",
                "Source": "/tmp/target",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
說明:
這表明mount是一個bindmount,它顯示了正確的源和目標,它表明mount是讀寫的,並且傳播設置為rprivate。

停止容器:

docker stop devtest
docker rm devtest

註意:
如果將bind-mount綁定到容器上的非空目錄中,則綁定裝置將隱藏目錄的現有內容。

使用只讀綁定掛載
docker run -d   -it   --name devtest   --mount type=bind,source="$(pwd)"/target,target=/app,readonly   nginx:latest

Docker容器網絡

默認網絡

安裝Docker時,它會自動創建三個網絡。可以使用以下docker network ls命令列出這些網絡:

docker network ls

NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                null
cf03ee007fb4        host                host

說明:

  • 這三個網絡內置於Docker中。運行容器時,可以使用該--network標誌指定容器應連接到的網絡。
  • bridge所有Docker主機上都存在默認網絡。如果未指定其他網絡,則新容器將自動連接到默認bridge網絡。

創建網絡

創建了橋接網絡
docker network create --driver bridge datagrand
docker network create datatest
查看創建的網絡
docker network ls
NETWORK ID          NAME                   DRIVER              SCOPE
3bf08b12e820        datagrand              bridge              local
0e155373e305        datatest               bridge              local
說明:
默認創建的是bridge網絡
刪除網絡
docker network rm datatest datagrand

網絡端口映射

-P(大寫)

創建容器時,使用 -P 標誌用於自動將其中的任何網絡端口映射到Docker主機上臨時端口範圍內的隨機高端口。
實戰:運行一個ngin容器,將容器中的端口80 和 443 綁定到主機上的隨機高端口。

docker run -itd --name nginxtest -P nginx:1.7.9 /bin/bash
查看nginx容器運行情況:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                                           NAMES
09cc5e292f7d        nginx:1.7.9                                "/bin/bash"              4 seconds ago       Up 2 seconds        0.0.0.0:32770->80/tcp, 0.0.0.0:32769->443/tcp   nginxtest
-p(小寫)

說明:-p 可以多次使用該標誌來配置多個端口。

  • 創建容器時,使用該-p標誌將容器的端口綁定到特定端口。

實戰:運行一個ngin容器,將主機的端口8080映射到容器的端口80.

docker run -itd --name nginxtest -p 8080:80  nginx:1.7.9 /bin/bash
查看nginx容器運行情況:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
89469d564c89        nginx:1.7.9                                "/bin/bash"              3 seconds ago       Up 3 seconds        443/tcp, 0.0.0.0:8080->80/tcp   nginxtest
  • 創建容器時,使用該-p標誌將容器的端口綁定到一定範圍內隨機端口。

實戰:運行一個ngin容器,將容器中的端口80綁定到主機上8000到9000之間的隨機可用端口。

docker run -itd --name nginxtest -p 8000-9000:80  nginx:1.7.9 /bin/bash
查看nginx容器運行情況:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
dbaeeba59908        nginx:1.7.9                                "/bin/bash"              3 seconds ago       Up 3 seconds        443/tcp, 0.0.0.0:8000->80/tcp   nginxtest
  • 默認情況下,該-p標誌將指定的端口綁定到主機上的所有接口。但您也可以指定綁定到特定接口,例如僅指定localhost。

實戰:運行一個ngin容器,將容器中的端口80綁定到主機127.0.0.1:8080上

docker run -itd --name nginxtest -p 127.0.0.1:8080:80  nginx:1.7.9 /bin/bash
查看nginx容器運行情況:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                             NAMES
205dd2ed1640        nginx:1.7.9                                "/bin/bash"              3 seconds ago       Up 3 seconds        443/tcp, 127.0.0.1:8080->80/tcp   nginxtest

或者,要將容器的端口80綁定到動態端口,但只能在其上 localhost。

docker run -itd --name nginxtest -p 127.0.0.1::80  nginx:1.7.9 /bin/bash
查看nginx容器運行情況:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                              NAMES
ba506a445ccc        nginx:1.7.9                                "/bin/bash"              2 seconds ago       Up 2 seconds        443/tcp, 127.0.0.1:32769->80/tcp   nginxtest
  • 可以通過添加尾部來綁定UDP端口/udp
docker run -d -p 127.0.0.1:80:5000/udp training/webapp python app.py

Docker基本介紹和操作