Docker容器技術之基礎用法(2)
阿新 • • 發佈:2020-08-27
目錄
1. docker架構
概念 | 說明 |
---|---|
Docker 映象(Images) | Docker 映象是用於建立 Docker 容器的模板,比如 Ubuntu 系統。 |
Docker 容器(Container) | 容器是獨立執行的一個或一組應用,是映象執行時的實體。 |
Docker 客戶端(Client) | Docker 客戶端通過命令列或者其他工具使用 Docker SDK(https://docs.docker.com/develop/sdk/) 與 Docker 的守護程序通訊。 |
Docker 主機(Host) | 一個物理或者虛擬的機器用於執行 Docker 守護程序和容器。 |
Docker Registry | Docker 倉庫用來儲存映象,可以理解為程式碼控制中的程式碼倉庫。 Docker Hub(https://hub.docker.com) 提供了龐大的映象集合供使用。 一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個映象。 通常,一個倉庫會包含同一個軟體不同版本的映象,而標籤就常用於對應該軟體的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟體哪個版本的映象。如果不給出標籤,將以 latest 作為預設標籤。 |
Docker Machine | Docker Machine是一個簡化Docker安裝的命令列工具,通過一個簡單的命令列即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
2. docker映象與映象倉庫
- Docker映象是由檔案系統疊加而成。最低端是一個引導檔案系統,即bootfs。當一個容器啟動後,它將會被移到記憶體中,而引導檔案系統則會被解除安裝,以留出更多的記憶體供initrd磁碟映象使用。
- Docker映象的第二層是root檔案系統rootfs,它位於引導檔案系統之上。rootfs可以是一種或多種作業系統。
- 在Docker裡,root檔案系統永遠只能是隻讀狀態,並且Docker利用聯合載入技術又會在root檔案系統層上載入更多的只讀檔案系統。聯合載入指的是一次同時載入多個檔案系統,但是在外面看起來只能看到一個檔案系統。聯合載入會將各層檔案系統疊加到一起,這樣最終的檔案系統會包含所有底層的檔案和目錄。
- 當從一個映象啟動容器時,Docker會在該映象的最頂層載入一個讀寫檔案系統。
- 當Docker第一次啟動一個容器時,初始的讀寫層是空的。當檔案系統發生變化時,這些變化都會應用到這一層上。如果修改一個檔案,這個檔案首先會從該讀寫層下面的只讀層複製到該讀寫層。該檔案的只讀版本依然存在,但是已經被讀寫層中的該檔案副本所隱藏。
- 通常這種機制被稱為寫時複製,這也是使Docker如此強大的技術之一。每個只讀映象層都是隻讀的,並且以後永遠不會變化。當建立一個新容器時,Docker會構建出一個映象棧,並在棧的最頂端新增一個讀寫層。這個讀寫層再加上其下面的映象層以及一些配置資料,就構成了一個容器。
映象是靜態的,而容器是動態的,容器有其生命週期,映象與容器的關係類似於程式與程序的關係。映象類似於檔案系統中的程式檔案,而容器則類似於將一個程式執行起來的狀態,也即程序。所以容器是可以刪除的,容器被刪除後其映象是不會被刪除的。
3. 安裝及使用docker
[root@node02 ~]# cd /etc/yum.repos.d/
[root@node02 ~]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@node02 ~]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@node02 ~]# yum -y install docker-ce
..........
[root@node02 ~]# systemctl start docker
[root@node02 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 二 2020-08-25 21:10:21 CST; 1 day 14h ago
Docs: https://docs.docker.com
Main PID: 13346 (dockerd)
Tasks: 10
Memory: 160.6M
CGroup: /system.slice/docker.service
└─13346 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock...
8月 25 21:10:21 node02.localdomain dockerd[13346]: time="2020-08-25T21:10:21.084087316+..."
8月 25 21:10:21 node02.localdomain dockerd[13346]: time="2020-08-25T21:10:21.120471911+...2
8月 25 21:10:21 node02.localdomain dockerd[13346]: time="2020-08-25T21:10:21.120568243+..."
8月 25 21:10:21 node02.localdomain dockerd[13346]: time="2020-08-25T21:10:21.145448828+..."
8月 25 21:10:21 node02.localdomain systemd[1]: Started Docker Application Container Engine.
8月 26 14:35:11 node02.localdomain dockerd[13346]: time="2020-08-26T14:35:11.689001390+..."
8月 26 14:35:11 node02.localdomain dockerd[13346]: time="2020-08-26T14:35:11.689040187+..."
8月 26 14:35:11 node02.localdomain dockerd[13346]: time="2020-08-26T14:35:11.689113428+..."
8月 26 14:35:38 node02.localdomain dockerd[13346]: time="2020-08-26T14:35:38.325746170+..."
8月 26 14:37:22 node02.localdomain dockerd[13346]: time="2020-08-26T14:37:22.170782380+..."
Hint: Some lines were ellipsized, use -l to show in full.
3.1 docker加速
docker-ce的配置檔案是/etc/docker/daemon.json,此檔案預設不存在,需要我們手動建立並進行配置,而docker的加速就是通過配置此檔案來實現的。
docker的加速有多種方式:
- docker cn
- 中國科技大學加速器
- 阿里雲加速器(需要通過阿里雲開發者平臺註冊帳號,免費使用個人私有的加速器)
[root@node02 ~]# cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
[root@node02 ~]# systemctl restart docker
[root@node02 ~]# docker version
..........
[root@node02 ~]# docker info
..........
配置阿里雲加速器
[root@node02 ~]# vim /etc/docker/daemon.json
[root@node02 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://v3ose6n1.mirror.aliyuncs.com"]
}
[root@node02 ~]# 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
[root@node02 ~]# docker info
Client:
Debug Mode: false
Server:
Containers: 2
Running: 2
Paused: 0
Stopped: 0
Images: 3
Server Version: 19.03.12
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1062.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 972.4MiB
Name: node02.localdomain
ID: U62S:SR3R:CBJP:25BX:XBJF:7YU5:F5RQ:A3RP:556R:DU54:DLTL:EANF
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://v3ose6n1.mirror.aliyuncs.com/
Live Restore Enabled: false
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
4. docker常用操作
命令 | 功能 |
---|---|
docker search | 在Docker Hub中搜索影象 |
docker pull | 從登錄檔中提取影象或儲存庫 |
docker images | 列出圖片 |
docker create | 建立一個新的容器 |
docker start | 啟動一個或多個已停止的容器 |
docker run | 在新容器中執行命令 |
docker attach | 附加到執行容器 |
docker ps | 列出容器 |
docker logs | 提取容器的日誌 |
docker restart | 重新啟動容器 |
docker stop | 停止一個或多個執行中的容器 |
docker kill | 殺死一個或多個正在執行的容器 |
docker rm | 刪除一個或更多的容器 |
docker exec | 在正在執行的容器中執行命令 |
docker info | 顯示系統範圍的資訊 |
docker inspect | 返回有關Docker物件的低階資訊 |
4.1 程序相關命令
4.1.1 啟動docker服務
[root@node02 ~]# systemctl start docker
4.1.2 停止docker服務
[root@node02 ~]# systemctl stop docker
4.1.3 重啟docker服務
[root@node02 ~]# systemctl restart docker
4.1.4 檢視docker服務狀態
[root@node02 ~]# systemctl status docker
4.1.5 設定開機啟動docker服務
[root@node02 ~]# systemctl enable --now docker
4.2 映象相關命令
4.2.1 檢視映象
[root@node02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dragonyear22/b1 v0.1 65d1b2004e78 19 hours ago 1.22MB
nginx latest 4bb46517cac3 13 days ago 133MB
busybox latest 018c9d7b792b 4 weeks ago 1.22MB
4.2.2 搜尋映象
[root@node02 ~]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3155 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 36
centos/httpd 30 [OK]
arm32v7/httpd The Apache HTTP Server Project 9
polinux/httpd-php Apache with PHP in Docker (Supervisor, CentO… 4
..........
4.2.3 拉取映象
//想下載什麼映象就換成什麼映象
[root@node02 ~]# docker pull httpd
4.2.4 刪除映象
4.3 容器相關命令
4.3.1 檢視容器
[root@node02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08e6ab7d2085 busybox "sh" 19 hours ago Up 19 hours b1
09c991e385d4 nginx "/docker-entrypoint.…" 21 hours ago Up 2 seconds 80/tcp quizzical_rosalind
^[[A[root@node02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08e6ab7d2085 busybox "sh" 19 hours ago Up 19 hours b1
09c991e385d4 nginx "/docker-entrypoint.…" 21 hours ago Up 3 seconds 80/tcp quizzical_rosalind
4.3.2 建立容器
//httpd可以改成任意映象名
[root@node02 ~]# docker create httpd
4.3.3 建立並啟動容器
[root@node02 ~]# docker run -d httpd
引數:
-i 保持容器執行。通常與 -t 同時使用。加入it這兩個引數後,容器建立後自動進入容器中,退出容器後,容器自動關閉。
-t 為容器重新分配一個偽輸入終端,通常與 -i 同時使用。
-d 以守護(後臺)模式執行容器。建立一個容器在後臺執行,需要使用docker exec 進入容器。退出後,容器不會關閉。
-it 建立的容器一般稱為互動式容器,-id 建立的容器一般稱為守護式容器
--name 為建立的容器命名。
4.3.4 進入容器
[root@node02 ~]# docker exec -it 735775363df1 /bin/bash
root@735775363df1:/usr/local/apache2#
//退出容器,容器不會關閉
4.3.5 停止容器
[root@node02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
735775363df1 httpd "httpd-foreground" About a minute ago Up About a minute 80/tcp zen_northcutt
08e6ab7d2085 busybox "sh" 20 hours ago Up 20 hours b1
09c991e385d4 nginx "/docker-entrypoint.…" 21 hours ago Up 6 minutes 80/tcp quizzical_rosalind
[root@node02 ~]# docker stop 735775363df1
735775363df1
4.3.6 啟動容器
[root@node02 ~]# docker start 735775363df1
735775363df1
4.3.7 殺死正在執行的容器(可殺死多個)
[root@node02 ~]# docker kill 735775363df1
735775363df1
4.3.8 刪除容器
[root@node02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
735775363df1 httpd "httpd-foreground" 4 minutes ago Up 2 seconds 80/tcp zen_northcutt
08e6ab7d2085 busybox "sh" 20 hours ago Up 20 hours b1
09c991e385d4 nginx "/docker-entrypoint.…" 21 hours ago Up 9 minutes 80/tcp quizzical_rosalind
[root@node02 ~]# docker rm -f 735775363df1
735775363df1
[root@node02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08e6ab7d2085 busybox "sh" 20 hours ago Up 20 hours b1
09c991e385d4 nginx "/docker-entrypoint.…" 21 hours ago Up 9 minutes 80/tcp quizzical_rosalind
4.3.9 獲取容器日誌
[root@node02 ~]# docker logs 09c991e385d4
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
..........
4.3.10 檢視容器資訊
[root@node02 ~]# docker inspect 09c991e385d4
[
{
"Id": "09c991e385d4bfe2bb0d283abc2c47a477acf084822d20833f4fe85d95bab64c",
"Created": "2020-08-26T06:35:02.155714914Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 16682,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-08-27T03:46:26.241450795Z",
"FinishedAt": "2020-08-27T03:45:07.484724366Z"
},
..........