一、簡介
Docker是一個開源的應用容器引擎,使用Go語言開發,基于Linux核心的CGroup、Namespace、Union FS等技術實作的一種系統級虛拟化技術。
特性
- 更高效的利用系統資源:由于容器不需要進行硬體虛拟以及運作完整作業系統等額外開銷,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 版本号保持一緻,但每個版本提供一年維護。
二、安裝部署
安裝說明
安裝需求:
- Linux kernel(核心) 3.10+
- Linux kernel cgroups and namespaces
由于Docker是建立在linux中兩種核心技術之上:namespace與Cgroup,而User namespace出現的版本是3.8,是以安裝docker需要核心版本大于3.10,centos6核心版本是2.6是以無法在其上使用docker。
namespace | 系統調用參數 | 隔離内容 | 核心版本 |
UTS | CLONE_NEWUTS | 主機名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息隊列和共享記憶體 | |
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. 安裝依賴
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
2.添加倉庫
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(可忽略,直接安裝最新版)
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. 更新包管理
sudo apt-get update
2. 添加https包信任
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
#重新裝載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
三、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