Docker 是一個開源的應用容器引擎:讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。是一個輕量級的「虛擬機器器」,容器是完全使用沙箱機制,相互之間不會有任何介面。
映象,從認識上簡單的來說,就是物件導向中的類,相當於一個模板。從本質上來說,映象相當於一個檔案系統。Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、設定等檔案外,還包含了一些為執行時準備的一些設定引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。
容器,從認識上來說,就是類建立的範例,就是依據映象這個模板建立出來的實體。容器的實質是程序,但與直接在宿主執行的程序不同,容器程序執行於屬於自己的獨立的名稱空間。因此容器可以擁有自己的root 檔案系統、自己的網路設定、自己的程序空間,甚至自己的使用者ID 空間。容器內的程序是執行在一個隔離的環境裡,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主執行更加安全。
倉庫,從認識上來說,就好像軟體包上傳下載站,有各種軟體的不同版本被上傳供使用者下載。映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務,Docker Registry 就是這樣的服務。
docker之所以可以跨系統,就是因為有 Docker引擎(Docker Engine)的存在,只要你能在你的服務上裝上 Docker引擎(Docker Engine),你就可以使用Docker映象進行部署。
Docker Engine是具有以下主要元件的使用者端-伺服器應用程式:
因為映象包含作業系統完整的root 檔案系統,其體積往往是龐大的,因此在Docker設計時,就充分利用Union FS 的技術,將其設計為分層儲存的架構。所以嚴格來說,映象並非是像一個ISO 那樣的打包檔案,映象只是一個虛擬的概念,其實際體現並非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成。
映象構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層檔案的操作,實際不是真的刪除前一層的檔案,而是僅在當前層標記為該檔案已刪除。在最終容器執行的時候,雖然不會看到這個檔案,但是實際上該檔案會一直跟隨映象。因此,在構建映象的時候,需要額外小心,每一層儘量只包含該層需要新增的東西,任何額外的東西應該在該層構建結束前清理掉。
分層儲存的特徵還使得映象的複用、客製化變的更為容易。甚至可以用之前構建好的映象作為基礎層,然後進一步新增新的層,以客製化自己所需的內容,構建新的映象。
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
注意:每個人都有自己的專屬加速,用別人的就是會很慢,所以不要嫌麻煩
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
檢視容器
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