docker基礎

2020-09-23 13:00:41

Docker概述

是一種輕量級別的「虛擬機器器」,與虛擬機器器相比是不依賴於系統

是Linux容器裡執行應用的開源工具

不需要裝系統

沙箱機制

Docker從一開始就以提供標準化的執行時環境為目標,真正做到「build once, run anywhere」,可以將同一個構建版本用於開發、測試、預釋出、生產等任何環境,並且做到了與底層作業系統的解耦。在此基礎上還進一步發展出了CaaS(容器即服務)技術。

Docker是一個用於開發,交付和執行應用程式的開放平臺。Docker使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體。

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

沙箱(Sandbox):沙箱是一個虛擬系統程式,沙箱提供的環境相對於每一個執行的程式都是獨立的,而且不會對現有的系統產生影響

Docker的使用場景

打包應用程式簡單部署
可脫離底層硬體任意遷移(實現了應用的隔離,將應用拆分並進行解耦),例如:伺服器從騰訊雲遷移到阿里雲
持續整合和持續交付(CI/CD):開發到測試釋出
部署微服務
提供PAAS產品(平臺即服務){OpenStack的雲主機類似於阿里雲的ECS,屬於IAAS、Docker(K8S) 屬於PAAS}

Docker的架構

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上查詢,可以搞個人倉庫。

Docker的核心概念

映象(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和虛擬機器器的區別

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...

918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.1477...c
918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.1477...c
918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.1477...c
918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.1788..."
918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.2789..."
918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.3441..."
918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.3676...2
918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.3681..."
918 01:25:32 localhost.localdomain dockerd[66860]: time="2020-09-18T01:25:32.4011..."
918 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 920 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