一、Docker 概述
Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。Docker 自開源後受到廣泛的關注和討論, 以至於 dotCloud 公司後來都改名爲 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中廣泛應用。Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更爲簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
左邊傳統的虛擬化技術,底層是服務器硬件,硬件上運行宿主機的操作系統,在宿主機
的操作系統之上,虛擬化出虛擬硬件設備,在虛擬硬件之上運行虛擬化操作系統,再在虛擬
的操作系統之上運行應用服務。而中間這段,虛擬化出來的操作系統大大佔用了服務器的硬
件資源。而容器虛擬化技術就不同了,我們看一下右邊這張圖。在底層硬件上運行宿主機操作系
統,在宿主機上運行docker 引擎,無需虛擬化硬件,也不用操作系統,而是直接運行容器,
提供所需的應用服務,大大減降低了服務器資源的佔用。
二、Docker 的優點
1、快速的交付和部署
2、更高效的虛擬化
3、更輕鬆的遷移和擴展
4、簡單的管理
三、Docker 的基本概念
1、鏡像(Image) Docker 鏡像就是一個只讀的模板。例如:一個鏡像可以包含一個完整的 ubuntu 操作系統環境,裏面僅安裝了 Apache 或用戶需要的其它應用程序。 鏡像可以用來創建 Docker 容器。Docker 提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那裏下載一個已經做好的鏡像來直接使用。
2、容器(Container) Docker 利用容器來運行應用。容器是從鏡像創建的運行實例。它可以被啓動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的 Linux 環境(包括root 用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。 *注:鏡像是隻讀的,容器在啓動的時候創建一層可寫層作爲最上層。
3、倉庫(Repository)
倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。倉庫分爲公開倉庫(Public)和私有倉庫(Private) 兩種形式。最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。 國內的公開倉庫包括 Docker Pool 等,可以提供大陸用戶更穩定快速的訪問。當然,用戶也可以在本地網絡內創建一個私有倉庫。當用戶創建了自己的鏡像之後就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。 *注:Docker 倉庫的概念跟 Git 類似,註冊服務器可以理解爲 GitHub 這樣的託管服務。
四、Docker 基礎命令
1、docker search //從Docker Hub 搜索鏡像
用法: docker search TERM
參數:
--automated=false 僅顯示自動創建的鏡像
--no-trunc=false 輸出信息不截斷顯示
-s, --stars=0 指定僅顯示評價爲指定星級以上的鏡像
[root@docker ~]# docker search -s 500 nginx //搜索星級爲500 以上的鏡像
2、docker info //查看當前信息
[root@docker ~]# docker info
3、docker pull //下載鏡像
[root@docker ~]# docker pull amber/nginx
4、docker push //上傳鏡像
[root@docker ~]# docker push amber/nginx
5、cat 本地容器快照名 |docker import - 自定義容器名:自定義標記名 //導入本地容器快照
6、docker run //運行一個容器,-i 交互式,-t 獲得一個終端,-d 守護進程形式運行
[root@docker ~]# docker run -it centos:1 /bin/bash
[root@fcbe47db440d /]#
[root@docker ~]# docker run -d centos:1 /bin/bash -c "while :; do echo hello; sleep 2; done"
b21e687d0719cb36c89a4325808bc03d42918ef51176235e9dfc50c57094236b
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b21e687d0719 centos:1 "/bin/bash -c 'while " About a minute ago Up About a minute high_brahmagupta
7、退出容器
exit 或 ctrl + d //退出並停止容器
(2)先按ctrl + p 再按 ctrl + q //退出僞終端,容器後臺運行
[root@docker ~]# docker run -it centos:1 /bin/bash
[root@353fc6f27cb7 /]#ctrl +p ; ctrl+q [root@docker ~]#
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
353fc6f27cb7 centos:1 "/bin/bash" 49 seconds ago Up 48 seconds berserk_einstein
b21e687d0719 centos:1 "/bin/bash -c 'while " 5 minutes ago Up 5 minutes high_brahmagupta
[root@docker ~]# docker attach 353 //輸入容器ID,若沒有重名的,輸入第一個字母即可
[root@353fc6f27cb7 /]#
8、docker ps //查看容器,-a 查看所有容器,-q 只查看容器ID
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b21e687d0719 centos:1 "/bin/bash -c 'while " 11 minutes ago Up 11 minutes high_brahmagupta
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
353fc6f27cb7 centos:1 "/bin/bash" 18 minutes ago Exited (127) 11 minutes ago berserk_einstein
b21e687d0719 centos:1 "/bin/bash -c 'while " 23 minutes ago Up 23 minutes high_brahmagupta
fcbe47db440d centos:1 "/bin/bash" 26 minutes ago Exited (127) 23 minutes ago nauseous_franklin
9、docker rm //刪除一個容器
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
353fc6f27cb7 centos:1 "/bin/bash" 20 minutes ago Exited (127) 12 minutes ago berserk_einstein
b21e687d0719 centos:1 "/bin/bash -c 'while " 24 minutes ago Up 24 minutes high_brahmagupta
fcbe47db440d centos:1 "/bin/bash" 27 minutes ago Exited (127) 24 minutes ago nauseous_franklin
[root@docker ~]# docker rm -f b21
b21
[root@docker ~]# docker rm -f f
f
[root@docker ~]# docker rm -f 353
353
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10、docker rmi //刪除一個或多個鏡像,-f 強制刪除
[root@docker ~]# docker p_w_picpaths
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 51f7df51ca40 30 minutes ago 196.7 MB
docker.io/nginx latest db079554b4d2 32 hours ago 181.8 MB
[root@docker ~]# docker rmi docker.io/nginx
Untagged: docker.io/nginx:latest
Untagged: docker.io/nginx@sha256:4296639ebdf92f035abf95fee1330449e65990223c899838283c9844b1aaac4c
[root@docker ~]# docker p_w_picpaths
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 51f7df51ca40 32 minutes ago 196.7 MB
11、docker create //創建一個容器,但不運行
[root@docker ~]# docker p_w_picpaths
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 385c6554f48e 19 seconds ago 196.7 MB
[root@docker ~]# docker create -it centos:1 /bin/bash
9bace61c06b5c4539e4d8668a04ff2762cf5aaad13731d3c2ac6b99d1e3cb517
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bace61c06b5 centos:1 "/bin/bash" 12 seconds ago Created drunk_payne
12、docker start|stop|restart|kill //運行已停止的容器|停止一個正在運行的容器|重啓
一個容器|殺死一個正在運行的容器
[root@docker ~]# docker start 9ba
9ba
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bace61c06b5 centos:1 "/bin/bash" About a minute ago Up 9 seconds drunk_payne
[root@docker ~]# docker stop 9ba
9ba
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker ~]# docker start 9ba
9ba
[root@docker ~]# docker kill 9ba
9ba
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bace61c06b5 centos:1 "/bin/bash" 4 minutes ago Exited (137) 8 seconds ago drunk_payne
13、docker save |load //存儲鏡像|載入鏡像
[root@docker ~]# docker p_w_picpaths
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 385c6554f48e 6 minutes ago 196.7 MB
[root@docker ~]# docker save -o centos.tar centos:1
[root@docker ~]# ls
anaconda-ks.cfg centos.tar mysql5.tar nginx.tar tomcat.tar
[root@docker ~]# docker rmi -f centos:1
Untagged: centos:1
Deleted: sha256:385c6554f48e0aaa488fd905e2f70b579ba47c98a9d4d44bf0235e0a8e3141ff
[root@docker ~]# docker p_w_picpaths
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker ~]# docker load < centos.tar
Loaded p_w_picpath: centos:1
[root@docker ~]# docker p_w_picpaths
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 385c6554f48e 15 minutes ago 196.7 MB
[root@docker ~]#
14、docker export //導出容器快照
[root@docker ~]# docker run -it centos:1 /bin/bash
[root@42a1ab757ffd /]# touch aaa
[root@42a1ab757ffd /]# ls
aaa bin etc lib lost+found mnt proc run srv tmp var
anaconda-post.log dev home lib64 media opt root sbin sys usr
[root@42a1ab757ffd /]# exit
exit
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42a1ab757ffd centos:1 "/bin/bash" 45 seconds ago Exited (0) 29 seconds ago nauseous_varahamihira
9bace61c06b5 centos:1 "/bin/bash" 17 minutes ago Exited (137) 13 minutes ago drunk_payne
[root@docker ~]# docker export -o centos-aaa.tar 42a
[root@docker ~]# ls
anaconda-ks.cfg centos-aaa.tar centos.tar mysql5.tar nginx.tar tomcat.tar
[root@docker ~]# cat centos-aaa.tar |docker import - centos-aaa
sha256:99e1653378ed127eaeb8dd531fc7b4b5fc17b8bf095d9deeec5246f368dc4dcf
[root@docker ~]# docker p_w_picpaths
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-aaa latest 99e1653378ed 13 seconds ago 196.7 MB
centos 1 385c6554f48e 21 minutes ago 196.7 MB
[root@docker ~]# docker run -it centos-aaa /bin/bash
[root@0dcb3999062c /]# ls
aaa bin etc lib lost+found mnt proc run srv tmp var
anaconda-post.log dev home lib64 media opt root sbin sys usr
五、創建私有倉庫
倉庫(Repository)是集中存放鏡像的地方。
註冊服務器纔是存放倉庫具體的服務器(Registry),每個服務器上都可以放置多個倉庫,
而每個倉庫下可以放置多個鏡像,每個鏡像上可以運行多個容器,每個容器上可以跑一個應
用或應用組。
倉庫自身可以分爲:公共倉庫和私有倉庫
比如共有倉庫: http://hub.docker.com 或國內的: dl.dockerpool.com
安裝docker 後,可以通過官方提供的registry 鏡像來簡單搭建一套本地倉庫環境
[root@docker ~]# vi /etc/sysconfig/docker
# INSECURE_REGISTRY='--insecure-registry'
INSECURE_REGISTRY='--insecure-registry 192.168.10.130:5000'
[root@docker ~]# systemctl restart docker.service
方法一:
方法二:
[root@docker ~]# mkdir -pv /opt/data/registry
mkdir: 已創建目錄 "/opt/data" mkdir:
已創建目錄 "/opt/data/registry"
[root@docker ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry 通過這種方式可以將上傳的鏡像放到本地的: /opt/data/registry
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb09700272a6 registry "/entrypoint.sh /etc/" 5 minutes ago Exited (2) 25 seconds ago jovial_poitras
[root@docker ~]# docker start bb0
bb0
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb09700272a6 registry "/entrypoint.sh /etc/" 3 minutes ago Up 3 minutes 0.0.0.0:5000->5000/tcp jovial_poitras
root@19bd142b0566:/# 192.168.10.160 - - [17/Feb/2017:10:22:06 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)" "-"
按ctrl+p 再按ctrl+q,使服務保持後臺運行
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19bd142b0566 nginx "/bin/bash" 12 minutes ago Up 12 minutes 443/tcp, 0.0.0.0:5500->80/tcp adoring_ardinghelli
bb09700272a6 registry "/entrypoint.sh /etc/" 23 minutes ago Up 18 minutes 0.0.0.0:5000->5000/tcp jovial_poitras
[root@docker ~]# docker tag nginx 192.168.10.130:5000/nginx-test //將修改過的nginx 鏡
像做標記封裝,準備上傳到私有倉庫
[root@docker ~]# docker p_w_picpaths
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-aaa latest 99e1653378ed 31 minutes ago 196.7 MB
centos 1 385c6554f48e 53 minutes ago 196.7 MB
docker.io/nginx latest db079554b4d2 33 hours ago 181.8 MB
192.168.10.130:5000/nginx-test latest db079554b4d2 33 hours ago 181.8 MB
docker.io/registry latest d1e32b95d8e8 4 weeks ago 33.17 MB
[root@docker ~]# docker push 192.168.10.130:5000/nginx-test //上傳到私有倉庫
The push refers to a repository [192.168.10.130:5000/nginx-test]
a82b6c66a6d4: Pushed
1941ca4a7a84: Pushed
a2ae92ffcd29: Pushed
latest: digest: sha256:9e81e4ce4899448e5e7aea69a72dfd1df989a7a0fe7365ad63be1133f05acf10 size: 948
另外打開一臺機器裝好docker
[root@docker-2 ~]# docker pull 192.168.10.131:5000/nginx-test //從私有倉庫下載鏡像
略。。。