1. 程式人生 > 實用技巧 >Docker容器技術之基礎用法(2)

Docker容器技術之基礎用法(2)

目錄

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"
        },
..........