程式設計師都在學的docker--docker基本命令(docke概述、安裝docker、docker基本使用)

2020-09-22 13:00:17

一、 docker概述

Docker 是一個開源的應用容器引擎:讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。是一個輕量級的「虛擬機器器」,容器是完全使用沙箱機制,相互之間不會有任何介面。

1.1 Docker中基本概念(三大核心)

映象(Image)

映象,從認識上簡單的來說,就是物件導向中的類,相當於一個模板。從本質上來說,映象相當於一個檔案系統。Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、設定等檔案外,還包含了一些為執行時準備的一些設定引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。

容器(Container)

容器,從認識上來說,就是類建立的範例,就是依據映象這個模板建立出來的實體。容器的實質是程序,但與直接在宿主執行的程序不同,容器程序執行於屬於自己的獨立的名稱空間。因此容器可以擁有自己的root 檔案系統、自己的網路設定、自己的程序空間,甚至自己的使用者ID 空間。容器內的程序是執行在一個隔離的環境裡,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主執行更加安全。

倉庫(Repository)

倉庫,從認識上來說,就好像軟體包上傳下載站,有各種軟體的不同版本被上傳供使用者下載。映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務,Docker Registry 就是這樣的服務。

1.2 Docker 與虛擬機器器

相同點

  • 可在不同的主機之間遷移;
  • 都具備 root 許可權;
  • 都可以遠端控制;
  • 都有備份、回滾操作。

docker的優點

  • 更高效的利用系統資源:由於容器不需要進行硬體虛擬以及執行完整作業系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、記憶體損耗或者檔案儲存速度,都要比傳統虛擬機器器技術更高效。因此,相比虛擬機器器技術,一個相同設定的主機,往往可以執行更多數量的應用。
  • 更快速的啟動時間:傳統的虛擬機器器技術啟動應用服務往往需要數分鐘,而Docker 容器應用,由於直接執行於宿主核心,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。
  • 一致的執行環境:開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些bug 並未在開發過程中被發現。而Docker 的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性,從而不會再出現「這段程式碼在我機器上沒問題啊」這類問題。
  • 持續交付和部署:Docker是build once,run everywhere. 使用Docker 可以通過客製化應用映象來實現持續整合、持續交付、部署。開發人員可以通過Dockerfile 來進行映象構建,並結合持續整合(Continuous Integration) 系統進行整合測試,而運維人員則可以直接在生產環境中快速部署該映象,甚至結合持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
  • 更輕鬆的遷移:Docker 使用的分層儲存以及映象的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基於基礎映象進一步擴充套件映象也變得非常簡單。此外,Docker 團隊同各個開源專案團隊一起維護了一大批高品質的官方映象,既可以直接在生產環境使用,又可以作為基礎進一步客製化,大大的降低了應用服務的映象製作成本。使用Dockerfile 使映象構建透明化,不僅僅開發團隊可以理解應用執行環境,也方便運維團隊理解應用執行所需條件,幫助更好的生產環境中部署該映象。

docker和虛擬機器器的不足

  • docker:對核心沒有控制許可權,只有容器的提供者具備升級許可權。只有一個核心執行在物理節點上,幾乎不能實現不同的作業系統混合。容器提供者一般僅提供少數的幾個作業系統。
  • 虛擬機器器:每一臺虛擬機器器都具有更大的負載,耗費更多的資源,使用者需要全權維護和管理。一臺物理機上能夠執行的虛擬機器器非常有限。

1.3 Docker引擎(Docker Engine)

docker之所以可以跨系統,就是因為有 Docker引擎(Docker Engine)的存在,只要你能在你的服務上裝上 Docker引擎(Docker Engine),你就可以使用Docker映象進行部署。

Docker Engine是具有以下主要元件的使用者端-伺服器應用程式:

  • 伺服器是一種長期執行的程式,稱為守護程式程序( dockerd命令)。
  • REST API,它指定程式可以用來與守護程式進行通訊並指示其操作的介面。
  • 命令列介面(CLI)使用者端(docker命令)。

1.4 docker的分層儲存

因為映象包含作業系統完整的root 檔案系統,其體積往往是龐大的,因此在Docker設計時,就充分利用Union FS 的技術,將其設計為分層儲存的架構。所以嚴格來說,映象並非是像一個ISO 那樣的打包檔案,映象只是一個虛擬的概念,其實際體現並非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成。

映象構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層檔案的操作,實際不是真的刪除前一層的檔案,而是僅在當前層標記為該檔案已刪除。在最終容器執行的時候,雖然不會看到這個檔案,但是實際上該檔案會一直跟隨映象。因此,在構建映象的時候,需要額外小心,每一層儘量只包含該層需要新增的東西,任何額外的東西應該在該層構建結束前清理掉。

分層儲存的特徵還使得映象的複用、客製化變的更為容易。甚至可以用之前構建好的映象作為基礎層,然後進一步新增新的層,以客製化自己所需的內容,構建新的映象。

二、 安裝docker及docker的基本命令

2.1 安裝docker

1.   安裝依賴包
yum install yum-utils device-mapper-persistent-data lvm2 -y
#yum-utils提供了yum-config-manager
#device mapper儲存驅動程式需要device-mapper-persistent-data和Ivm2
#Device Mapper是 Linux2.6核心中支援邏輯卷管理的通用裝置對映機制,
它為實現用於儲存資源管理的塊裝置驅動提供了一個高度模組化的核心架構。

2. 設定阿里雲映象源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 安裝Docker-CE
yum install docker-ce -y

4. 開啟docker服務,設為開機自啟動
systemctl start docker.service
systemctl enable docker.service

5. 設定映象加速
登入阿里雲官網(一定要登入),在官網首頁搜尋」映象加速「
搜尋的第一個,點進去
網頁的下面有一個容器映象服務,點進去
進去以後點選管理控制檯
找到映象加速器,選擇centos
複製以下的內容到自己的終端直接執行,就可以了

ee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xda9renm.mirror.aliyuncs.com"]
}
EOF

注意:每個人都有自己的專屬加速,用別人的就是會很慢,所以不要嫌麻煩

2.2 docker 常用命令

2.2.1 關於映象的操作

docker version            檢視版本資訊

**在這裡插入圖片描述**

docker search nginx       搜尋nginx映象(共有倉庫)

在這裡插入圖片描述
下載nginx映象

[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
d121f8d1c412: Pull complete 
ebd81fc8c071: Pull complete 
655316c160af: Pull complete 
d15953c0e0f8: Pull complete 
2ee525c5c3cc: Pull complete 
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

檢視下載的映象列表
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB

下載的映象存放位置

[root@localhost ~]# cd /var/lib/docker/image/overlay2/
[root@localhost overlay2]# ls
distribution  imagedb  layerdb  repositories.json
[root@localhost overlay2]# vim repositories.json      ##存放著映象檔案
{"Repositories":{"nginx":{"nginx:latest":"sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d","nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0":"sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d"}}}

檢視下載映象的詳細資訊,兩種方式

docker inspect  nginx:latest       後面跟映象名稱
docker inspect  7e4d58f0e5f3       後面跟映象ID

新增映象的標籤,相當於建立了一個別名

[root@localhost overlay2]# docker tag nginx:latest nginx:web
[root@localhost overlay2]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
nginx               web                 7e4d58f0e5f3        9 days ago          133MB

刪除映象,如果映象新增了新的標籤,則無法刪除,只有映象只存在一個標籤時才可以刪除映象,不管這個標籤是新新增的,還是原來的

[root@localhost overlay2]# docker rmi nginx:web
Untagged: nginx:web
[root@localhost overlay2]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
[root@localhost overlay2]# docker tag nginx:latest nginx:web
[root@localhost overlay2]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
nginx               web                 7e4d58f0e5f3        9 days ago          133MB
[root@localhost overlay2]# docker rmi 7e4d58f0e5f3
Error response from daemon: conflict: unable to delete 7e4d58f0e5f3 (must be forced) - image is referenced in multiple repositories

重新為nginx新增標籤
[root@localhost overlay2]# docker tag nginx:latest nginx:web
[root@localhost overlay2]# docker rmi nginx:web 
Untagged: nginx:web
[root@localhost overlay2]# docker rmi 7e4d58f0e5f3 
Untagged: nginx:latest
Untagged: nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Deleted: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
Deleted: sha256:eedfd37abc0b05520a719addf6675b372687fe9a2ed1746fa988335720d4376c
Deleted: sha256:4f052ddd517f6dc5b74d2f7d881838b8ec6a5e67ec7a1da8bbbe91e1e068ad3a
Deleted: sha256:5f78154d356577280e4ac0d9bf0d021d488828e57f953b011dcbadaecd539ce4
Deleted: sha256:db5783668220e16186080f3e9d69ad748aab8c72abb8e457f6fc45369461634b
Deleted: sha256:07cab433985205f29909739f511777a810f4a9aff486355b71308bb654cdc868
[root@localhost overlay2]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

重新下載nginx映象進行匯出到指定目錄

[root@localhost overlay2]# docker pull nginx    ##下載nginx映象
[root@localhost overlay2]# docker save -o /opt/nginx nginx:latest    ##將nginx:latest匯出到/opt目錄下,命名為nginx
[root@localhost overlay2]# ll -h /opt
總用量 131M
drwx--x--x. 4 root root   28 9  18 15:40 containerd
-rw-------. 1 root root 131M 9  19 21:37 nginx
drwxr-xr-x. 2 root root    6 10 31 2018 rh

映象的重新載入,如果不小心做了誤刪映象的操作,可以通過到處的檔案進行重新載入

[root@localhost opt]# docker rmi nginx:latest 
Untagged: nginx:latest
Untagged: nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Deleted: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
Deleted: sha256:eedfd37abc0b05520a719addf6675b372687fe9a2ed1746fa988335720d4376c
Deleted: sha256:4f052ddd517f6dc5b74d2f7d881838b8ec6a5e67ec7a1da8bbbe91e1e068ad3a
Deleted: sha256:5f78154d356577280e4ac0d9bf0d021d488828e57f953b011dcbadaecd539ce4
Deleted: sha256:db5783668220e16186080f3e9d69ad748aab8c72abb8e457f6fc45369461634b
Deleted: sha256:07cab433985205f29909739f511777a810f4a9aff486355b71308bb654cdc868
[root@localhost opt]# docker load < /opt/nginx      ##重新載入映象
07cab4339852: Loading layer  72.49MB/72.49MB
f431d0917d41: Loading layer  64.31MB/64.31MB
60c688e8765e: Loading layer  3.072kB/3.072kB
eabfa4cd2d12: Loading layer  4.096kB/4.096kB
908cf8238301: Loading layer  3.584kB/3.584kB
Loaded image: nginx:latest
[root@localhost opt]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB

2.2.2 關於容器的操作

檢視容器

docker ps -a
-a 列出所有的容器,包括未執行的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
容器的ID             來源於哪一個映象        執行的指令                 建立時間             容器狀態                             名字

容器的建立

[root@localhost opt]# docker create -it nginx:latest /bin/bash    ##建立容器,並同時建立一個子bash環境
-i 讓容器的便準輸入保持開啟
-t 讓Docker分配一個偽終端
6e198a8c25d9d38f130a1e569857986d7a84ae0d177540e4017a6b1e9451fe0c
[root@localhost opt]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   About a minute ago   Created                                 quirky_greider

在這裡插入圖片描述
開啟容器

[root@localhost opt]# docker start 6e198a8c25d9     ##開啟容器
6e198a8c25d9

[root@localhost opt]# docker ps -a    ##這時候容器的狀態變成了up,埠為80/tcp,這裡的埠是對容器內部的埠,同樣的容器對外也會有一個埠,連個埠做對映才可以實現對外的通訊
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   4 minutes ago       Up 14 seconds       80/tcp              quirky_greider

這時候我們檢視網路卡設定資訊,多了一個B類的私有地址作為docker的閘道器,一旦docker這個閘道器掛了,服務的狀態會仍然保持原有狀態,排錯時候需要注意。
在這裡插入圖片描述

[root@localhost ~]# docker pull centos:7     ##下載centos7的映象
7: Pulling from library/centos
75f829a71a1c: Pull complete 
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@localhost ~]# docker create -it centos:7 /bin/bash      ##為centos7映象建立容器
9dd5e445e513a6c64372b9e33a81f40f0494fdf87478739e25ca308fc8dec330

[root@localhost ~]# docker ps -a      ##檢視容器列表
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9dd5e445e513        centos:7            "/bin/bash"              50 seconds ago      Created                                 funny_grothendieck
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   10 hours ago        Up 10 hours         80/tcp              quirky_greider
[root@localhost ~]# docker start 9dd5e445e513       ##開啟容器
9dd5e445e513
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
9dd5e445e513        centos:7            "/bin/bash"              About a minute ago   Up 7 seconds                            funny_grothendieck
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   10 hours ago         Up 10 hours         80/tcp              quirky_greider

停止容器
[root@localhost ~]# docker stop 9dd5e445e513     ##停止容器服務
9dd5e445e513
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
9dd5e445e513        centos:7            "/bin/bash"              4 minutes ago       Exited (137) 12 seconds ago                       funny_grothendieck
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   10 hours ago        Up 10 hours                   80/tcp              quirky_greider

刪除容器
[root@localhost ~]# docker rm 9dd5e445e513     ##刪除容器,刪除映象為rmi
9dd5e445e513
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   10 hours ago        Up 10 hours         80/tcp              quirky_greider

啟動執行命令檢視系統/opt目錄,這種方式使用容器,會在使用完成後自動停止,並釋放資源

[root@localhost ~]# docker run centos:7 /bin/bash -c ls /      ##啟動centos:7容器,並載入一個子bash環境,使用命令ls檢視根目錄,執行完就關閉,狀態是 Exited
Unable to find image 'centos:7' locally
7: Pulling from library/centos
75f829a71a1c: Pull complete 
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7e4d58f0e5f3        9 days ago          133MB
centos              7                   7e6257c9f8d8        5 weeks ago         203MB
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
43957539a471        centos:7            "/bin/bash -c ls /"      25 minutes ago      Exited (0) 25 minutes ago                       trusting_sanderson
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   11 hours ago        Up 11 hours                 80/tcp              quirky_greider

持續在後臺執行

[root@localhost ~]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"      ##狀態為up
587a0678365e6e687c3a3f47d4bec64d3e2c829e3a6996b508464830b6862892
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
587a0678365e        centos:7            "/bin/bash -c 'while…"   13 seconds ago      Up 13 seconds                                   wizardly_sutherland
43957539a471        centos:7            "/bin/bash -c ls /"      35 minutes ago      Exited (0) 35 minutes ago                       trusting_sanderson
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   11 hours ago        Up 11 hours                 80/tcp              quirky_greider

進入容器,進入容器之前必須保持容器是up狀態

[root@localhost ~]# docker create -it centos:7 /bin/bash
eec9262be812c3e70d99cc12e1245cd3298ff2c30a14ccb3fea5ebfcefb81126
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
eec9262be812        centos:7            "/bin/bash"              13 seconds ago      Created                                            nostalgic_goldberg
587a0678365e        centos:7            "/bin/bash -c 'while…"   30 minutes ago      Up 30 minutes                                      wizardly_sutherland
43957539a471        centos:7            "/bin/bash -c ls /"      About an hour ago   Exited (0) About an hour ago                       trusting_sanderson
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   12 hours ago        Up 11 hours                    80/tcp              quirky_greider
[root@localhost ~]# docker start ee
ee
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
eec9262be812        centos:7            "/bin/bash"              35 seconds ago      Up 7 seconds                                       nostalgic_goldberg
587a0678365e        centos:7            "/bin/bash -c 'while…"   31 minutes ago      Up 31 minutes                                      wizardly_sutherland
43957539a471        centos:7            "/bin/bash -c ls /"      About an hour ago   Exited (0) About an hour ago                       trusting_sanderson
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   12 hours ago        Up 11 hours                    80/tcp              quirky_greider
[root@localhost ~]# docker exec -it eec9262be812 /bin/bash    ##進容器
[root@eec9262be812 /]# 
[root@eec9262be812 ~]# exit     ##退出容器
exit

進入容器後我們可以使用部分命令,也有一部分命令不能使用,因為容器畢竟不是虛擬機器器,而且現在沒有建立內外埠對映。以後再進行演示。

容器的匯出

[root@localhost ~]# docker export 6e198a8c25d9 > /opt/nginx_container
[root@localhost ~]# cd /opt
[root@localhost opt]# ls
containerd  nginx  nginx_container  rh

容器只要存在就不能刪除容器的映象,只有先將容器刪除,才可以刪除映象。

容器的批次清理,不加bash就刪除不了,執行中的容器不能刪除

[root@localhost opt]# docker ps -a | awk '{print "docker rm "$1}'
docker rm CONTAINER
docker rm 4bedfe57a907
docker rm 691f58d21035
docker rm 6e198a8c25d9
[root@localhost opt]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
4bedfe57a907        centos:7            "/bin/bash -c ls /opt"   22 seconds ago      Exited (0) 22 seconds ago                       bold_euler
691f58d21035        centos:7            "/bin/bash -c ls /"      27 seconds ago      Exited (0) 27 seconds ago                       sweet_goldstine
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   12 hours ago        Up 12 hours                 80/tcp              quirky_greider
[root@localhost opt]# docker ps -a | awk '{print "docker rm "$1}' | bash
Error: No such container: CONTAINER
4bedfe57a907
691f58d21035
Error response from daemon: You cannot remove a running container 6e198a8c25d9d38f130a1e569857986d7a84ae0d177540e4017a6b1e9451fe0c. Stop the container before attempting removal or force remove
[root@localhost opt]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6e198a8c25d9        nginx:latest        "/docker-entrypoint.…"   12 hours ago        Up 12 hours         80/tcp              quirky_greider