Docker基礎

1、簡介

  Docker是一個開源的應用容器引擎,使用Go語言開發,基於Linux內核的CGroup、Namespace、Union FS等技術實現的一種系統級虛擬化技術。linux

特性

  • 更高效的利用系統資源:因爲容器不須要進行硬件虛擬以及運行完整操做系統等額外開銷,Docker 對系統資源的利用率更高。不管是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。所以,相比虛擬機技術,一個相同配置的主機,每每能夠運行更多數量的應用。
  • 更快速的啓動時間:傳統的虛擬機技術啓動應用服務每每須要數分鐘,而Docker 容器應用,因爲直接運行於宿主內核,無需啓動完整的操做系統,所以能夠作到秒級、甚至毫秒級的啓動時間。大大的節約了開發、測試、部署的時間。
  • 一致的運行環境:開發過程當中一個常見的問題是環境一致性問題。因爲開發環境、測試環境、生產環境不一致,致使有些bug 並未在開發過程當中被發現。而Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現「這段代碼在我機器上沒問題啊」這類問題。
  • 持續交付和部署:Docker是build once,run everywhere. 使用Docker 能夠經過定製應用鏡像來實現持續集成、持續交付、部署。開發人員能夠經過Dockerfile 來進行鏡像構建,並結合持續集成(CI) 系統進行集成測試,而運維人員則能夠直接在生產環境中快速部署該鏡像,甚至結合持續部署(CD) 系統進行自動部署。
  • 更輕鬆的遷移:Docker 使用的分層存儲以及鏡像的技術,使得應用重複部分的複用更爲容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得很是簡單。此外,Docker 團隊同各個開源項目團隊一塊兒維護了一大批高質量的官方鏡像,既能夠直接在生產環境使用,又能夠做爲基礎進一步定製,大大的下降了應用服務的鏡像製做成本。使用Dockerfile 使鏡像構建透明化,不只僅開發團隊能夠理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。

組件 

鏡像(Image)
  鏡像,能夠理解爲一個模板,這個模版提供了器運行時所需的程序、庫、資源、配置等必要文件。只要有了這個模版,咱們能夠在任何裝有docker的系統上運行容器,也就是所謂的Docker是build once,run everywhere。
 
容器(Container)
  容器,就是依據鏡像這個模板建立出來的實體。容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的命名空間。所以容器能夠擁有本身的root 文件系統、本身的網絡配置、本身的進程空間,甚至本身的用戶ID 空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操做同樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。
 
倉庫(Repository)
  倉庫,故名思義就是存放東西的,這裏的「東西」就是Image。用戶能夠經過倉庫拉取鏡像運行容器,也能夠構建鏡像存放在倉庫中。倉庫可分爲爲公共倉庫和私有倉庫,全部用戶都能使用的倉庫稱爲公共倉庫,而私有倉庫則是我的或者團隊本身搭建,只供我的或者團隊使用。
 
一個直觀圖說明其各個組件運行關係:

 

版本

  Docker 從v17.03開始劃分爲CE 和EE。CE 即社區版,EE 即企業版,強調安全,付費使用。Docker在1.13 版本以後,從2017年的3月1日開始,版本命名規則變爲以下:
  
  Docker CE 每個月發佈一個Edge 版本(17.03, 17.04, 17.05…),每三個月發佈一個Stable 版本(17.03, 17.06, 17.09…),Docker EE 和Stable 版本號保持一致,但每一個版本提供一年維護。

2、安裝部署

安裝說明

  安裝需求:nginx

  •  Linux kernel(內核) 3.10+
  •  Linux kernel cgroups and namespaces 

因爲Docker是創建在linux中兩種核心技術之上:namespace與Cgroup,而User namespace出現的版本是3.8,因此安裝docker須要內核版本大於3.10,centos6內核版本是2.6因此沒法在其上使用docker。docker

 namespace 系統調用參數  隔離內容  內核版本 
UTS  CLONE_NEWUTS  主機名和域名  2.6.19
IPC   CLONE_NEWIPC 信號量、消息隊列和共享內存   2.6.19
PID   CLONE_NEWPID 進程編號   2.6.24
Network   CLONE_NEWNET 網絡設備、網絡棧、端口等   2.6.29
Mount   CLONE_NEWNS 掛載點(文件系統)   2.4.19
User   CLONE_NEWUSER 用戶和用戶組   3.8

centos7安裝

1. 安裝依賴json

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

2.添加倉庫centos

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

3. 查看docker版本列表安全

yum list docker-ce --showduplicates | sort -r

4.  安裝指定版本的docker(可忽略,直接安裝最新版)bash

yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

5.安裝最新版docker網絡

yum install docker-ce docker-ce-cli containerd.io

Debian&Ubuntu

1. 更新包管理session

sudo apt-get update

2.  添加https包信任app

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common

3. 添加docker官方GPG 證書

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

4. 寫入軟件信息

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable」

4.  更新並安裝docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

5.若安裝指定版本採用以下方式

#列出版本
$ apt-cache madison docker-ce

  docker-ce | 5:18.09.1~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages
  docker-ce | 5:18.09.0~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages
  docker-ce | 18.06.1~ce~3-0~debian        | https://download.docker.com/linux/debian stretch/stable amd64 Packages
  docker-ce | 18.06.0~ce~3-0~debian        | https://download.docker.com/linux/debian stretch/stable amd64 Packages
#安裝  
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

運行docker

中止防火牆、關閉selinux

systemctl stop firewalld && systemctl disable firewalld && setenforce 0

配置鏡像加速

默認docker從DockerHUB上拉取鏡像,因爲國內網絡緣由下載鏡像速度會變慢,因此能夠配置國內鏡像加速地址https://registry.docker-cn.com,當有多個鏡像加速地址時候可在列表中以逗號分割。
mkdir  /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

EOF

運行docker

#從新裝載systemd服務
systemctl daemon-reload
#啓動docker
systemctl start docker
#開機自動docker
#systemctl enable docker
#查看docker版本
[root@app51 ~]# docker version
Client:
Version:           18.09.2
API version:       1.39
Go version:        go1.10.6
Git commit:        6247962
Built:             Sun Feb 10 04:13:27 2019
OS/Arch:           linux/amd64
Experimental:      false

Server: Docker Engine - Community
Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 03:47:25 2019
  OS/Arch:          linux/amd64

 

3、docker基本操做

容器操做

docker 命令採用了分組管理的思想,已經歸入管理的docker命令以下(版本18.09.2): 

其中docker container 則是管理容器命令,老的版本中是使用docker進行容器管理,新版本兼容老版本docker命令,因此對容器管理既可用docker也能夠用docker container。

1.啓動容器 

方式1:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
經常使用OPTIONS:
  • -i:--interactive,交互式啓動
  • -t:--tty,分配終端
  • -v:--volume,掛在數據卷
  • -d:--detach,後臺運行
  •  --name:容器名字
  •  --network:指定網絡
  •  --rm:容器中止自動刪除容器
  • -P:自動暴露全部容器內端口,宿主隨機分配端口
  • -p:指定端口映射,將容器內服務的端口映射到宿主機的指定端口,可使用多個-p
    可使用以下三種方式:
    <container port>:隨機分配宿主機的一個端口做爲映射端口
    <hostport>:<container port>指明主機的端口映射爲容器端口
    <hostip>:<hostport>:<container port>指定主機ip和端口
 
示例:運行一個名字爲nginx-container的容器,使用鏡像nginx,並將宿主機的8080映射到容器內部80端口,而後進入交互模式。 
[root@app51 ~]# docker run -it --name nginx-container -p 8080:80  nginx /bin/bash
root@fd92290433da:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

2.查看容器

docker ps [OPTIONS]

經常使用選項:
  • -a:--all ,查看全部容器,包括退出和其餘狀態的
  • -n::--last int,顯示最後n個建立的容器
  • -l, :--latest ,顯示最近的容器
示例 :
root@app51 ~]# docker ps -n 2
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4d51a1cdf4b4        busybox             "/bin/sh"                11 seconds ago      Up 9 seconds                               busybox
383f31ff8f01        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:8080->80/tcp   nginx-container
[root@app51 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4d51a1cdf4b4        busybox             "/bin/sh"           41 seconds ago      Up 39 seconds                           busybox
[root@app51 ~]#

3.查看容器具體信息

docker inspect [OPTIONS] NAME|ID [NAME|ID…]

示例:

[root@app51 ~]# docker inspect busybox
[
    {
        "Id": "4d51a1cdf4b4e06831faa6e54a32f1f8eb544e349028083b12f5b3f87af075c9",
        "Created": "2019-02-23T09:10:20.907074902Z",
        "Path": "/bin/sh",
        "Args": [],

4.中止容器

方式一:docker stop [OPTIONS] CONTAINER [CONTAINER…]
方式二: docker kill [OPTIONS] CONTAINER [CONTAINER…] 
區別:docker stop 至關於發送15中止信號,而kill是強制終止對應信號9
示例:
[root@app51 ~]# docker stop nginx-container 
nginx-container

5.啓動已中止的容器

docker start [OPTIONS] CONTAINER [CONTAINER…]

經常使用選項:
  • -a:--attach 附加終端
  • -I:--interactive 交互式 
[root@app51 ~]# docker start -ia busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # ps 
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
    7 root      0:00 ps

6.刪除容器

docker rm [OPTIONS] CONTAINER [CONTAINER…] 或者docker container rm
若是刪除的容器正在運行則須要指定-f進行強制刪除
經常使用選項:
  • -f: --force 強制刪除
示例: 
docker rm nginx-container

Ps:刪除全部容器

docker rm -f `docker ps -a -q`
docker ps -a |awk -F ' ' '{print $1}' |xargs docker rm -f

7. 暫停某個容器

docker pause CONTAINER [CONTAINER…]

示例:

[root@app51 ~]# docker pause nginx-container
nginx-container

8.恢復暫停的容器

docker unpause CONTAINER [CONTAINER…]

[root@app51 ~]# docker pause nginx-container
nginx-container

9.查看容器日誌

docker logs [OPTIONS] CONTAINER

經常使用選項:

  • -t, --timestamps :顯示日誌時間
root@app51 ~]# docker logs nginx-container 
 10.1.201.30 - - [23/Feb/2019:10:55:33 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36" "-"

10.在已運行的容器中運行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
經常使用選項:
  •   -d:--detach ,後臺運行命令
  •   -e, --env list             設置env
  •   -i, --interactive         啓用交互式
  •   -t, --tty                     啓用終端
  •   -u, --user string        指定用戶 (格式: <name|uid>[:<group|gid>])
  •   -w, --workdir string       指定工做目錄 

示例:

[root@app51 ~]# docker exec -it -u nginx nginx-container /bin/sh
$ id
uid=101(nginx) gid=101(nginx) groups=101(nginx)
$

11.容器導出

docker export [OPTIONS] CONTAINER
容器導出相似於容器快照,導出的是容器的在宿主機上的文件系統壓縮包,導出的文件系統可以使用docker import進行導入,在其餘機器導入時候會以鏡像的方式存在。
經常使用參數
  • -o, --output  導出的文件名稱
示例 :
[root@app51 ~]# docker export nginx-container -o nginx.tar
[root@app51 ~]# ls -lh ningx.tar
-rw------- 1 root root 107M 2月  23 19:18 ningx.tar

12.將導出的容器導入爲鏡像
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
容器導入能夠是文件、文件url、鏡像倉庫
示例: 
[root@app51 ~]# docker import nginx.tar nginx:v154 
sha256:fd4931710d35765edb9bbd0ea84a886e0901aa7a2de03ab2eefd9aedea0e8646
[root@app51 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v154                fd4931710d35        10 seconds ago      108MB
<none>              <none>              940cdf68f69d        7 minutes ago       108MB
busybox             latest              d8233ab899d4        8 days ago          1.2MB
nginx               latest              f09fe80eb0e7        2 weeks ago         109MB

其餘導入示例

docker import http://example.com/image.tar.gz  repository:tag  

12.將容器提交爲鏡像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
經常使用選項:
  • -a,--author     指定做者
  • -m, --message 本次提交的信息
  •  -p, --pause      提交爲鏡像時候暫停容器
  • -c, --change list 修改鏡像某些屬性,列如啓動命令
示例: 
[root@app51 ~]# docker commit -p -m 'build nginx image' nginx-container nginx:test
sha256:6c68885804ca69970d747cc6cc8050ed7a1b6c24838695ec11b18348318809a6
[root@app51 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               test                6c68885804ca        6 seconds ago       109MB
nginx               v154                fd4931710d35        2 hours ago         108MB

鏡像操做

在老版本中鏡像操做也是使用的docker命令,新版本進行了分組,可以使用docker image 來進行鏡像操做。

1.搜索鏡像

docker search [OPTIONS] TERM

經常使用選項:
  • --limit 限制搜索的結果條目數量,默認顯示25條 
[root@app51 ~]# docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5179                [OK]                
ansible/centos7-ansible            Ansible on Centos7                              120                                     [OK]
jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86…   106                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   80                                      [OK]

結果字段含義:
NAME:鏡像名稱
DESCRIPTION :鏡像描述
STARS :獲贊數量
OFFICIAL :是否爲官方鏡像
AUTOMATED:是否爲自動構建 

2.下載鏡像 

docker image pull  <IMAGE_NAME>:<TAG>  或者docker pull

TAG不寫默認爲最新版本latest

[root@app51 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a02a4930cb5d: Pull complete
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest

3.查看鏡像

docker image ls 或者docker images
經常使用選項:
  • -a: 查看全部已下載的鏡像
  • -f: --filter,過濾某些鏡像 
[root@app51 ~]# docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        2 months ago        202MB

4.刪除鏡像

 docker image rm [OPTIONS] IMAGE [IMAGE...]  或者docker rmi IMAGE

[root@app51 ~]# docker image rm centos
Untagged: centos:latest
Untagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb
Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956

5. 鏡像導出

docker save [OPTIONS] IMAGE [IMAGE...]

將鏡像打包爲壓縮包,可在其餘docker主機進行導入,一次可打包多個
經常使用選項:
  • -o,--output   輸出到文件
示例:
[root@app51 ~]# docker save -o nginx-bus.tar.gz busybox:latest nginx:latest

6.鏡像導入

docker load [OPTIONS]
將已經導出的鏡像壓縮文件導入爲鏡像

經常使用選項:

  • -i, --input 指定文件來源 
[root@app51 ~]# docker load -i nginx-bus.tar.gz
Loaded image: nginx:latest
Loaded image: busybox:latest

7.查看鏡像信息

docker image inspect [OPTIONS] IMAGE [IMAGE...]

[root@app51 ~]# docker image inspect nginx
[
    {
        "Id": "sha256:f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:dd2d0ac3fff2f007d99e033b64854be0941e19a2ad51f174d9240dda20d9f534"
        ],

其餘

運行信息查看docker info

[root@app51 ~]# docker info 
Containers: 1
 Running: 1
 Paused: 0
 Stopped: 0
Images: 4
Server Version: 18.09.2
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true

版本信息查看 docker version

root@app51 ~]# docker  version
Client:
Version:           18.09.2
API version:       1.39
Go version:        go1.10.6
Git commit:        6247962
Built:             Sun Feb 10 04:13:27 2019
OS/Arch:           linux/amd64
Experimental:      false
相關文章
相關標籤/搜索