是一種輕量級別的「虛擬機器器」,與虛擬機器器相比是不依賴於系統
是Linux容器裡執行應用的開源工具
不需要裝系統
沙箱機制
Docker從一開始就以提供標準化的執行時環境為目標,真正做到「build once, run anywhere」,可以將同一個構建版本用於開發、測試、預釋出、生產等任何環境,並且做到了與底層作業系統的解耦。在此基礎上還進一步發展出了CaaS(容器即服務)技術。
Docker是一個用於開發,交付和執行應用程式的開放平臺。Docker使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體。
是一個開源的應用容器引擎,讓開發者可以打包大門的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的Linux或者Windows機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面
沙箱(Sandbox):沙箱是一個虛擬系統程式,沙箱提供的環境相對於每一個執行的程式都是獨立的,而且不會對現有的系統產生影響
打包應用程式簡單部署
可脫離底層硬體任意遷移(實現了應用的隔離,將應用拆分並進行解耦),例如:伺服器從騰訊雲遷移到阿里雲
持續整合和持續交付(CI/CD):開發到測試釋出
部署微服務
提供PAAS產品(平臺即服務){OpenStack的雲主機類似於阿里雲的ECS,屬於IAAS、Docker(K8S) 屬於PAAS}
Docker使用使用者端-伺服器架構。Docker 使用者端與Docker 守護行程進行對話,該守護行程完成了構建,執行和分發Docker容器的繁重工作。
Docker區別於傳統的虛擬化,不需要虛擬硬體資源,直接使用容器引擎,所以速度快
Docker Client:使用者端
Docker使用者端(docker)是許多Docker使用者與Docker互動的主要方式。當您使用諸如之類的命令時docker run,使用者端會將這些命令傳送到dockerd,以執行這些命令。該docker命令使用Docker API。Docker使用者端可以與多個守護程式通訊。
Docker daemon:守護行程
Docker守護程式(dockerd)偵聽Docker API請求並管理Docker物件,例如影象,容器,網路和卷。守護程式還可以與其他守護程式通訊以管理Docker服務。
Docker images:映象
容器可以被打包成映象
Docker container:容器
Docker registry:映象倉庫
儲存映象的地方,預設在公共的Docker Hub上查詢,可以搞個人倉庫。
映象(image)
Docker的映象是建立容器的基礎,類似虛擬機器器的快照,可以理解為是一個面向Docker容器引擎的唯讀模式,比如:一個映象可以是一個完整的CentOS作業系統環境,稱為一個CentOS映象;可以是一個安裝了MySQL的應用程式,稱之為一個MySQL映象等等
Docker提供了簡單的機制來建立和更新現有的映象,使用者也可以從網上下載已經做好的應用映象來直接使用
容器(container)
Docker的容器是從映象建立的執行範例,他可以被啟動、停止和刪除。所建立的每一個容器都是相互隔離、互不看見的,可以保證平臺的安全性。
還可以把容器看作是一個簡易版的Linux環境,Docker利用容器來執行和隔離應用
倉庫(repository)
Docker倉庫是用來集中儲存映象的地方,當建立了自己的映象之後,可以使用push命令將它上傳到公共倉庫(public)或者私有倉庫(private),這樣一來當下次要在另一臺機器上使用這個映象的時候,只需要從倉庫上pull下來就可以了。
倉庫註冊伺服器(registry)是存放倉庫的地方,其中包含了多個倉庫,每個倉庫集中存檔某一類映象,並且使用不同的標籤(tag)來區分他們。目前最大的公公倉庫是Docker Hub,其中存放了數量龐大的映象供使用者下載使用。
dockerfile 工具 製作映象
docker-engine 引擎(實現了docker的跨平臺)
容器不依賴於系統,依賴的是引擎
docker和虛擬機器器的區別
docker | 虛擬機器器 | |
---|---|---|
資源 | 少 | 多 |
安全 | 共用核心,不安全 | 系統邏輯隔離,安全 |
服務 | 一個容器只跑一個服務 | 可以執行多個服務 |
cgroup docker安全 資源分配,資源邏輯隔離
映象
容器
倉庫(公有 私有)私有harbor
docker.com 官網
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# yum install -y docker-ce
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 五 2020-09-18 01:25:32 CST; 4s ago
Docs: https://docs.docker.com
Main PID: 66860 (dockerd)
CGroup: /system.slice/docker.service
└─66860 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.s...
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.1477...c
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.1477...c
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.1477...c
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.1788..."
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.2789..."
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.3441..."
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.3676...2
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.3681..."
9月 18 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.4011..."
9月 18 01:25:32 localhost.localdomain systemd[1]: Started Docker Application Contain....
Hint: Some lines were ellipsized, use -l to show in full.
vim /etc/selinux/config
SELINUX=disabled
映象加速
登入阿里雲
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [""]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
tee 標準性的輸入
systemctl daemon-reload
systemctl restart docker
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
網路優化
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@localhost ~]# service network restart
Restarting network (via systemctl): [ 確定 ]
[root@localhost ~]# systemctl restart docker
檢視版本
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 19.03.12
API version: 1.40
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:46:54 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:45:28 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
docker images : 列出本地映象。
選項:
-a :列出本地所有的映象(含中間映像層,預設情況下,過濾掉中間映像層);
--digests :顯示映象的摘要資訊;
-f :顯示滿足條件的映象;
--format :指定返回值的模板檔案;
--no-trunc :顯示完整的映象資訊;
-q :只顯示映象ID。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos c1b1b6ac3906 21 hours ago 419MB
192.168.20.50:5000/nginx latest 7e4d58f0e5f3 10 days ago 133MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
registry latest 2d4f4b5309b1 3 months ago 26.2MB
檢視映象列表
名稱 標籤 ID號 建立時間 大小
搜尋NGINX映象(公有倉庫)
[root@localhost ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13745 [OK]
下載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 inspect 7e4d58f0e5f3
新增新的標籤
不是修改,重新增加了一個映象標籤 相當於別名
[root@localhost ~]# docker tag nginx:latest nginx:web
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 7 days ago 133MB
nginx web 7e4d58f0e5f3 7 days ago 133MB
[root@localhost ~]# docker images | grep nginx
nginx latest 7e4d58f0e5f3 7 days ago 133MB
nginx web 7e4d58f0e5f3 7 days ago 133MB
docker rmi nginx:web //i刪除映象
[root@localhost ~]# docker rmi nginx:web
Untagged: nginx:web
[root@localhost ~]# docker images | grep nginx
nginx latest 7e4d58f0e5f3 7 days ago 133MB
有別名的映象,只留下一個才能用rmi+ID號進行刪除,否則不能刪除
儲存映象
[root@localhost ~]# cd /opt/
[root@localhost opt]# docker save -o nginx nginx:latest
[root@localhost opt]# ls -lh nginx
-rw-------. 1 root root 131M 9月 20 08:35 nginx
導回映象
[root@localhost opt]# docker load < /opt/nginx
Loaded image: nginx:latest
容器建立
it建立一個執行的終端
[root@localhost opt]# docker create -it nginx:latest /bin/bash
69e0afc39c5bb94131d4034d0fd9e4f5b745625464ba0fd496770b9148fcb4e5
檢視容器列表
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69e0afc39c5b nginx:latest "/docker-entrypoint.…" 46 seconds ago Created happy_lamport
啟動容器
[root@localhost opt]# docker start 69e0afc39c5b
69e0afc39c5b
docker start ID號 //檢視狀態為up 提供的埠是TCP80埠,是內部暴露的埠,不是對外埠號,不能通過這個埠對外存取
Linux伺服器上會多一個網路卡docker0(B類127段的私有網路地址)
容器彼此之間可以相互通訊
docker0相當於閘道器,有路由表
啟動執行命令檢視系統根目錄
[root@localhost opt]# docker pull paigeeworld/centos7
[root@localhost opt]# docker create -it paigeeworld/centos7 /bin/bash
445a62ffa5d5f2b3ab289b24d60577eb2a00df98df12f92b37f288810c1ec643
[root@localhost opt]# docker start 445a62ffa5d5
445a62ffa5d5
[root@localhost opt]# docker run paigeeworld/centos7 /usr/bin/bash -c ls /
bin
boot
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost opt]# docker run -d paigeeworld/centos7 /usr/bin/bash -c "while true;do echo hello;done"
e47d095ac7647234855d73a1f0b18136434d77f36d629df091500c6819fa18fc
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e47d095ac764 paigeeworld/centos7 "/usr/bin/bash -c 'w…" 52 seconds ago Up 51 seconds compassionate_wright
Created fervent_mcnulty
445a62ffa5d5 paigeeworld/centos7 "/bin/bash" 40 minutes ago Up 38 minutes xenodochial_franklin
69e0afc39c5b nginx:latest "/docker-entrypoint.…" 46 minutes ago Up 44 minutes 80/tcp happy_lamport
docker run paigeeworld/centos7 /usr/bin/bash -c ls /
直接載入生成容器,有載入,沒有下載
執行完自動停止,把資源釋放掉,一次性的
//執行完成直接關閉 狀態是Exited
//執行在後臺程式完成
docker run -d paigeeworld/centos7 /bin/bash -c 「with true;do echo hello;done」
-d 守護行程 支撐 死迴圈
容器進入
exit //退出容器
[root@localhost opt]# docker exec -it e47d095ac764 /bin/bash
bash-4.2# ls /
bin dev home lib64 media opt root sbin sys usr
boot etc lib lost+found mnt proc run srv tmp var
bash-4.2# exit
exit
容器匯出
docker export ID > ngixn_c
容器匯入
cat nginx_c | docker import - nginx
[root@localhost ~]# docker export 69e0afc39c5b > nginx_c
[root@localhost ~]# cat nginx_c | docker import - nginx:web
sha256:99ec3001701292a59b3f4314afd95ca3b46d5229f6b5db27fabb053db4a2b3bd
[root@localhost ~]# docker ps -a | awk '{print "docker rm "$1}' | bash
不可以處於容器執行的時候把映象刪了
有容器在不能刪除映象
只要有這個映象的容器在,不管它有沒有執行,都不能刪除這個映象
批次刪除容器
[root@localhost ~]# docker ps -a | awk ‘{print "docker rm "$1}’ | bash