Docker 基礎介紹及配置安裝 [一]php
Docker
時間:2016年11月2日
前端
Docker是Docker.lnc
公司開源的一個基於LXC技術
之上構建的Container容器引擎
,源代碼託管在Github
上,基於Go語言並聽從Apache2.0
協議開源
Docker是經過內核
虛擬化技術(namespaces及cgroups等)來提供容器的資源隔離與安全保障等。因爲Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似虛擬機(VM)額外的操做系統開銷,提升資源利用率java
構建 運輸 運行node
Docker的組成部分docker相似於cs結構
Docker Client
Docker Server
咱們能夠將docker啓動
比喻成Docker server
,咱們執行命令的時候至關於Docker client
提示:目前的版本是若是docker的服務端
掛了,運行在docker上的全部容器
都會掛掉linux
鏡像(Image)
容器(Container)
倉庫(Repository)
鏡像介紹:相似於虛擬機,做用和虛擬機是同樣的,惟獨是組成部分會有些區別。簡單的說若是咱們想啓動一個容器就必需要有鏡像nginx
容器介紹: docker是經過容器來運行業務的,就像運行一個kvm虛擬機是同樣的。容器其實就是從鏡像建立的一個實例。
咱們能夠對容器進行增刪改查,容器之間也是相互隔離的。和虛擬機最大的區別就是一個是虛擬的一個是隔離的。 缺點:
不會像虛擬機那樣隔離的那麼完全,咱們能夠將容器理解爲簡化版的linux,有進程運行在裏面。git
倉庫介紹: 根據docker的三大理念構建 運輸 運行,咱們就須要一個倉庫來存放鏡像
簡單的說:咱們將鏡像建立完成就須要存放到倉庫裏面,進行集中式的管理。倉庫這點相似於github,docker也有一個dockerhub,他也是一個公共對外的倉庫。github
簡單解釋,VMware運行在操做系統上,而docker是直接運行在應用上。因此docker沒法提供一個像VMware那樣徹底的隔離,甚至到不少地方都沒有進行隔離,好比說用戶空間。
這裏能夠解釋一下 若是你用的是centos5版本那你就別想安裝docker了,若是是centos6的你能夠看一眼。由於內核版本比較低,可是若是使用烏班圖就能夠,由於烏班圖的內核更新的比較快。
若是公司服務器是centos5和centos6 用docker就須要升級內核,相對比較麻煩.web
類別 | Docker | openstack/KVM |
---|---|---|
部署男刀 | 很是簡單 | 組件多,部署複雜 |
啓動速度 | 秒級 | 分鐘級 |
執行性能 | 和物理系統幾乎一致 | VM會佔用一些資源 |
鏡像體積 | 鏡像是MB級別 | 虛擬機鏡像GB級別 |
管理效率 | 管理簡單 | 組件相互依賴,管理複雜 |
隔離性 | 隔離性高 | 完全隔離 |
可管理性 | 單進程、不建議啓動SSH | 完整的系統管理 |
網絡鏈接 | 比較弱 | 藉助Neutron能夠靈活組件各種網絡架構 |
提示:在這裏能夠簡單的說一下,有些場景是不適合用到docker。例如我前端web使用docker,此時docker掛掉了,裏面不會像數據庫那樣有數據寫入。這時候我重新起一個docker就能夠了。因此有的場景是不適合使用docker的docker
1、簡化配置
這是Docker公司宣傳的Docker的主要使用場景。虛擬機的最大好處是能在你的硬件設施上運行各類配置不同的平 臺(軟件、系統),Docker在下降額外開銷的狀況下提供了一樣的功能。它能讓你將運行環境和配置放在代碼中而後部署,同一個Docker的配置能夠在 不一樣的環境中使用,這樣就下降了硬件要求和應用環境之間耦合度。
2、代碼流水線(Code Pipeline
)管理
前一個場景對於管理代碼的流水線起到了很大的幫助。代碼從開發者的機器到最終在生產環境上的部署,須要通過不少的中間環境。而每個中間環境都有本身微小的差異,Docker給應用提供了一個從開發到上線均一致的環境,讓代碼的流水線變得簡單很多。
3、提升開發效率
這就帶來了一些額外的好處:Docker能提高開發者的開發效率。若是你想看一個詳細一點的例子,能夠參考Aater在DevOpsDays Austin 2014 大會
或者是DockerCon
上的演講。
不一樣的開發環境中,咱們都想把兩件事作好。一是咱們想讓開發環境儘可能貼近生產環境,二是咱們想快速搭建開發環境。
理想狀態中,要達到第一個目標,咱們須要將每個服務都跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,咱們卻不想每次都須要網絡連 接,每次從新編譯的時候遠程鏈接上去特別麻煩。這就是Docker作的特別好的地方,開發環境的機器一般內存比較小,以前使用虛擬的時候,咱們常常須要爲 開發環境的機器加內存,而如今Docker能夠輕易的讓幾十個服務在Docker中跑起來。
4、隔離應用
有不少種緣由會讓你選擇在一個機器上運行不一樣的應用,好比以前提到的提升開發效率的場景等
5、整合服務器
正如經過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker能夠整合多個服務器以下降成本。因爲沒有多個操做系統的內存佔用,以及能在多個實例之間共享沒有使用的內存,Docker能夠比虛擬機提供更好的服務器整合解決方案
6、調試能力
Docker提供了不少的工具,這些工具不必定只是針對容器,可是卻適用於容器。它們提供了不少的功能,包括能夠爲容器設置檢查點、設置版本和查看兩個容器之間的差異,這些特性能夠幫助調試Bug。你能夠在《Docker拯救世界》
的文章中找到這一點的例證。
7、多租戶環境
另一個Docker有意思的使用場景是在多租戶的應用中,它能夠避免關鍵應用的重寫。咱們一個特別的關於這個場景的 例子是爲IoT(譯者注:物聯網)的應用開發一個快速、易用的多租戶環境。這種多租戶的基本代碼很是複雜,很難處理,從新規劃這樣一個應用不但消耗時間, 也浪費金錢。
使用Docker,能夠爲每個租戶的應用層的多個實例建立隔離的環境,這不只簡單並且成本低廉,固然這一切得益於Docker環境的啓動速度和其高效的diff命令。
8、快速部署
在虛擬機以前,引入新的硬件資源須要消耗幾天的時間。Docker的虛擬化技術將這個時間降到了幾分鐘,Docker只是建立一個容器進程而無需啓動操做系統,這個過程只須要秒級的時間。這正是Google和Facebook都看重的特性。
你能夠在數據中心建立銷燬資源而無需擔憂從新啓動帶來的開銷。一般數據中心的資源利用率只有30%,經過使用Docker並進行有效的資源分配能夠提升資源的利用率。
小結: 一句話說明docker
的本質就是 低開銷(系統文件、內存 共用)的虛擬機
面向產品:產品交付
面向開發:簡化環境配置
面向測試:多版本測試
面向運維:環境一致
面向架構:自動化擴容(微服務)
[root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@linux-node1 ~]# uname -r3.10.0-327.36.2.el7.x86_64
[root@linux-node1 ~]# yum install dockerLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.aliyun.com * updates: mirrors.aliyun.comPackage docker-1.10.3-46.el7.centos.14.x86_64 already installed and latest versionNothing to do
Centos7默認安裝docker1.10
,咱們能夠經過官方的yum源安裝docker1.12
Docker官網:http://www.docker.com/
最新版本咱們能夠去官方網站進行下載。
舒適提示:使用docker最好使用最新版,由於功能比較完善。
[root@linux-node1 ~]# systemctl start docker啓動以後咱們能夠查看一下docker的狀態[root@linux-node1 ~]# 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 Wed 2016-10-19 02:32:37 CST; 3h 54min ago Docs: http://docs.docker.com Main PID: 31807 (docker-current) CGroup: /system.slice/docker.service └─31807 /usr/bin/docker-current daemon --exec-opt native.cgroupdriver=systemd --selinux-enabled --log-driver=journaldOct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.832703497+08:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.840719984+08:00" level=warning msg="Running modprobe bridge br_netfilter failed with message: m...Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.854022259+08:00" level=info msg="Firewalld running: false"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.908314481+08:00" level=info msg="Default bridge (docker0) is assigned with an IP addr...P address"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967870654+08:00" level=info msg="Loading containers: start."Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967930460+08:00" level=info msg="Loading containers: done."Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967937814+08:00" level=info msg="Daemon has completed initialization"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967961305+08:00" level=info msg="Docker daemon" commit=cb079f6-unsupported execdriver...ion=1.10.3Oct 19 02:32:37 linux-node1.abcdocker.com systemd[1]: Started Docker Application Container Engine.Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.972026130+08:00" level=info msg="API listen on /var/run/docker.sock"Hint: Some lines were ellipsized, use -l to show in full.
咱們可使用ifconfig查看網卡
[root@linux-node1 ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 ether 02:42:c5:44:7d:3b txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.56.11 netmask 255.255.255.0 broadcast 192.168.56.255 inet6 fe80::20c:29ff:fef4:affe prefixlen 64 scopeid 0x20<link> ether 00:0c:29:f4:af:fe txqueuelen 1000 (Ethernet) RX packets 167717 bytes 175534600 (167.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 69646 bytes 12187530 (11.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 2322 bytes 247665 (241.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2322 bytes 247665 (241.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
提示: 咱們啓動docker的時候,docker會幫咱們建立一個docker 0的網橋
查看當前鏡像 docker p_w_picpaths
[root@linux-node1 ~]# docker p_w_picpathsREPOSITORY TAG IMAGE ID CREATED SIZE
搜索鏡像 docker search [鏡像名字]
執行docker search centos 會從dockerhub上搜索鏡像
[root@linux-node1 ~]# docker search centosINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDdocker.io docker.io/centos The official build of CentOS. 2757 [OK] docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 90 [OK]docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8... 42 [OK]docker.io docker.io/jdeathe/centos-ssh-apache-php CentOS-6 6.8 x86_64 / Apache / PHP / PHP M... 21 [OK]docker.io docker.io/nimmis/java-centos This is docker p_w_picpaths of CentOS 7 with dif... 17 [OK]docker.io docker.io/gluster/gluster-centos Official GlusterFS Image [ CentOS7 + Glus... 12 [OK]docker.io docker.io/million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 12 [OK]docker.io docker.io/torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK]docker.io docker.io/nickistre/centos-lamp LAMP on centos setup 7 [OK]docker.io docker.io/kinogmt/centos-ssh CentOS with SSH 6 [OK]docker.io docker.io/nathonfowlie/centos-jre Latest CentOS p_w_picpath with the JRE pre-insta... 4 [OK]docker.io docker.io/centos/mariadb55-centos7 3 [OK]docker.io docker.io/consol/sakuli-centos-xfce Sakuli JavaScript based end-2-end testing ... 2 [OK]docker.io docker.io/blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK]docker.io docker.io/darksheer/centos Base Centos Image -- Updated hourly 1 [OK]docker.io docker.io/harisekhon/centos-java Java on CentOS (OpenJDK, tags jre/jdk7-8) 1 [OK]docker.io docker.io/harisekhon/centos-scala Scala + CentOS (OpenJDK tags 2.10-jre7 - 2... 1 [OK]docker.io docker.io/timhughes/centos Centos with systemd installed and running 1 [OK]docker.io docker.io/grayzone/centos auto build for centos. 0 [OK]docker.io docker.io/januswel/centos yum update-ed CentOS p_w_picpath 0 [OK]docker.io docker.io/labengine/centos Centos p_w_picpath base 0 [OK]docker.io docker.io/repositoryjp/centos Docker Image for CentOS. 0 [OK]docker.io docker.io/smartentry/centos centos with smartentry 0 [OK]docker.io docker.io/ustclug/centos USTC centos 0 [OK]docker.io docker.io/vcatechnology/centos A CentOS Image which is updated daily 0 [OK]
下載鏡像
咱們可使用docker pull centos
docker pull nginx
來安裝centos和nginx的鏡像
導出鏡像 docker save -o [鏡像名稱] [鏡像]
[root@linux-node1 ~]# docker save -o centos.tar centos[root@linux-node1 ~]# lsanaconda-ks.cfg centos.tar須要將docker導出爲tar,後面爲鏡像名稱
導入鏡像
[root@linux-node1 ~]#docker load --input centos.tar #使用input導入[root@linux-node1 ~]# docker load < nginx.tar #使用重定向導入
刪除鏡像 docker刪除可使用docker rmi 後面加上docker的ID
例如:
提示:若是鏡像已經建立了一個容器,那麼將沒法進行刪除
刪除容器:
[root@linux-node1 ~]# docker rm abcdocker或者使用[root@linux-node1 ~]# docker rm -f abcdocker
第二種會提示容器在將它關閉
docker另外一種刪除方式
啓動一個容器 echo
完就刪除
[root@linux-node1 ~]# docker run --rm centos /bin/echo "www.abcdocker.com"www.abcdocker.com[root@linux-node1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf974696a121a centos "/bin/bash" 2 minutes ago Up About a minute abcdockerbcededa4b82c centos "/bin/echo hello" 6 hours ago Exited (0) 4 hours ago awesome_dijkstra
啓動容器 docker run [鏡像]
[root@linux-node1 ~]# docker run centoscentos是鏡像的名稱,鏡像的名稱必須在選項的後面
啓動鏡像,輸入Hello,並關閉
[root@linux-node1 ~]# docker run centos /bin/echo 'Hello Wordl
本命令的意思是啓動一個docker進程,並echo 執行後面的命令能夠有能夠沒有(hello),若是咱們的鏡像啓動就會執行一個進程就不須要咱們輸入
查看啓動鏡像 docker ps -a
ps
是顯示正在運行的容器 -a
是顯示不運行的
[root@linux-node1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbcededa4b82c centos "/bin/echo hello" 32 seconds ago Exited (0) 32 seconds ago awesome_dijkstra
咱們能夠看到,如今容器並無啓動。由於docker啓動須要在前臺啓動一個進程。容器的名稱能夠咱們指定或自動生成
提示: 管理docker容器能夠經過名稱也能夠經過ID
例如:我要新建一個abcdocker
的容器,它的鏡像是centos.
他有三個參數,第一個是給容器起一個名稱,-t 分配一個僞終端(tty)-i標準輸入打開,我要在裏面輸入命令
[root@linux-node1 ~]# docker run --name abcdocker -t -i centos /bin/bash--name 容器的名稱-t 讓docker分配一個僞終端-i 讓docker的標準輸入打開{input}
提示:最後的/bin/bash
能夠省略,可是最後一個若是不是命令,那就是鏡像的名稱
輸入上方的命令以後會直接進入到容器裏面
[root@f8c8c8156e26 /]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 11752 1920 ? Ss 19:38 0:00 /bin/bashroot 18 0.0 0.0 47424 1660 ? R+ 21:32 0:00 ps aux[root@f8c8c8156e26 /]#
舒適提示:容器不是一個虛擬機,由於他就是一個進程,若是咱們退出,這個進程就退出了。
若是咱們執行建立容器的時候,裏面沒有咱們指定的鏡像,那麼他會從dockerhub
上進行下載而後在啓動
容器啓動
咱們經過docker ps -a
能夠查看到沒有啓動的容器
使用docker start [名稱或PORTS]
[root@linux-node1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf8c8c8156e26 centos "/bin/bash" 2 hours ago Exited (0) 34 minutes ago abcdockerbcededa4b82c centos "/bin/echo hello" 2 hours ago Exited (0) 2 hours ago awesome_dijkstra[root@linux-node1 ~]# docker start abcdockerabcdocker[root@linux-node1 ~]# docker start bcededa4b82cbcededa4b82c
進入容器
[root@linux-node1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf8c8c8156e26 centos "/bin/bash" 2 hours ago Up 24 minutes abcdockerbcededa4b82c centos "/bin/echo hello" 3 hours ago Exited (0) 23 minutes ago awesome_dijkstra[root@linux-node1 ~]# docker attach abcdocker[root@f8c8c8156e26 /]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 11776 1872 ? Ss 22:09 0:00 /bin/bashroot 14 0.0 0.0 47424 1660 ? R+ 22:33 0:00 ps aux
這樣進入容器的缺點就是若是在開一個窗口就會同步操做,相似於單用戶模式(windows遠程桌面)
提示:生產場景是不使用docker attach
的,須要咱們使用nsenter
這個工具,這個工具包含在util-linux
軟件包裏面
[root@linux-node1 ~]# yum install util-linux -y Centos7默認最小化已經安裝
咱們經過nsenter
就能夠進入容器
,可是nsenter是經過pid
進入容器裏,因此咱們須要知道容器的pid。咱們能夠經過docker inspect
來獲取到pid
[root@linux-node1 ~]# docker start abcdockerabcdocker[root@linux-node1 ~]# docker inspect -f "{{ .State.Pid }}" abcdocker37434[root@linux-node1 ~]# nsenter -t 37434 -m -u -i -n -p
docker inspect -f ``.`State`.`Pid`
容器名或者容器id
#每個容器都有.State.Pid,因此這個命令除了容器的id須要咱們根據docker ps
-a
去查找,其餘的所有爲固定的格式 nsenter --target
上面查到的進程id --mount --uts --ipc --net --pid
#輸入該命令便進入到容器中
解釋nsenter指令中進程id以後的參數的含義:
* –mount參數是進去到mount namespace中 * –uts參數是進入到uts namespace中 * –ipc參數是進入到System V IPC namaspace中 * –net參數是進入到network namespace中 * –pid參數是進入到pid namespace中 * –user參數是進入到user namespace中
更多參數咱們能夠經過nsenter --help
進行獲取
咱們進入容器中查看進程
如下是以nsenter啓動的進程
[root@f8c8c8156e26 /]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 11776 1664 ? Ss+ Oct18 0:00 /bin/bashroot 27 0.0 0.1 13376 1984 ? S Oct18 0:00 -bashroot 40 0.0 0.0 49024 1808 ? R+ 00:11 0:00 ps aux
/bin/bash
是咱們運行容器產生的進程 -bash
是咱們使用nsenter產生的,這樣若是咱們退出容器,容器就不會退出,由於-bash
還在運行
[root@f8c8c8156e26 /]# exitlogout[root@linux-node1 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf8c8c8156e26 centos "/bin/bash" 4 hours ago Up 48 minutes abcdocker
由於每次進入容器都須要輸入那兩條命令,因此咱們能夠寫一個腳原本獲取。
腳本內容以下:
[root@linux-node1 ~]# cat docker_in.sh #!/bin/bash# Use nsenter to access dockerdocker_in(){ NAME_ID=$1 PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID) nsenter -t $PID -m -u -i -n -p}docker_in $1
執行結果以下:
[root@linux-node1 ~]# chmod +x docker_in.sh [root@linux-node1 ~]# ./docker_in.sh abcdocker[root@f8c8c8156e26 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 Oct18 ? 00:00:00 /bin/bashroot 54 0 0 00:23 ? 00:00:00 -bashroot 67 54 0 00:23 ? 00:00:00 ps -ef[root@f8c8c8156e26 /]#
咱們也能夠不進入容器進行查看
[root@linux-node1 ~]# docker exec abcdocker ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 Oct18 ? 00:00:00 /bin/bashroot 85 0 0 00:28 ? 00:00:00 ps -ef[root@linux-node1 ~]# docker exec abcdocker ls /anaconda-post.logbindev
提示:可使用exec
參數,不進入容器查看內容
咱們還可使用exec進入docker容器中
[root@linux-node1 ~]# docker exec -it abcdocker /bin/bash
可是最好仍是少使用exec
,有可能會對容器形成一些意外的影響
請點擊下一章