筆記內容:安裝docker
筆記日期:2018-02-02php
Docker是一個開放源代碼軟件項目,自2013年開始,近些年發展迅猛,它讓應用程序佈署在軟件容器下的工做能夠自動化進行,藉此在Linux操做系統上,提供一個額外的軟件抽象層,以及操做系統層虛擬化的自動管理機制。Docker利用Linux核心中的資源分脫機制,例如cgroups,以及Linux核心名字空間(name space),來建立獨立的軟件容器(containers)。這能夠在單一Linux實體下運做,避免引導一個虛擬機形成的額外負擔。Linux核心對名字空間的支持徹底隔離了工做環境中應用程序的視野,包括進程樹、網絡、用戶ID與掛載文件系統,而核心的cgroup提供資源隔離,包括CPU、內存、block I/O與網絡。從0.9版本起,Dockers在使用抽象虛擬是經由libvirt的 LXC與systemd - nspawn提供界面的基礎上,開始包括libcontainer庫作爲以本身的方式開始直接使用由Linux核心提供的虛擬化的設施,依據行業分析公司「451研究」:「Dockers是有能力打包應用程序及其虛擬容器,能夠在任何Linux服務器上運行的依賴性工具,這有助於實現靈活性和便攜性,應用程序在任何地方均可以運行,不管是公有云、私有云、單機等。」 。linux
簡單來講Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化,容器是徹底使用沙箱機制,相互之間不會有任何接口。git
Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,能夠把貨物規整的擺放起來。而且各類各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不須要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裏封裝的好好的,那我就能夠用一艘大船把他們都運走。docker就是相似的理念。如今都流行雲計算了,雲計算就比如大貨輪。docker就是集裝箱。docker
不一樣的應用程序可能會有不一樣的應用環境,好比.net開發的網站和php開發的網站依賴的軟件就不同,若是把他們依賴的軟件都安裝在一個服務器上就要調試好久,並且很麻煩,還會形成一些衝突。好比IIS和Apache訪問端口衝突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來說,咱們能夠在服務器上建立不一樣的虛擬機在不一樣的虛擬機上放置不一樣的應用,可是虛擬機開銷比較高。docker能夠實現虛擬機隔離應用環境的功能,而且開銷比虛擬機小,小就意味着省錢了。數據庫
你開發軟件的時候用的是Ubuntu,可是運維管理的都是centos,運維在把你的軟件從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,好比:有個特殊版本的數據庫,只有Ubuntu支持,centos不支持,在轉移的過程中運維就得想辦法解決這樣的問題。這時候要是有docker你就能夠把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就能夠了。並且部署速度快。apache
docker特色:json
docker的 官網地址:vim
https://www.docker.com/centos
docker從1.13x開始,版本分爲社區版ce和企業版ee,而且基於年月的時間線形式,當前最新穩定版爲17.09 參考:bash
http://blog.csdn.net/chenhaifeng2016/article/details/68062414
Docker和傳統的虛擬化比較:
Docker的優點:
Docker核心概念:
因爲docker的ee企業版是須要收取必定費用的,因此咱們安裝的是ce社區版,如下是官方的安裝文檔:
如下是個人安裝步驟:
1.若是你的系統沒有安裝過docker的話,只須要兩步就能夠把docker安裝上,首先使用如下命令下載docker的repo源:
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
2.而後直接經過yum安裝便可:
yum install -y docker-ce
若是以上這種安裝方式的速度比較慢的話,你們也能夠直接下載rpm包:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下載完以後也須要使用yum安裝,yum能夠自動解決依賴關係:
yum install -y docker-ce-xxxx.rpm
3.安裝完成以後,啓動docker:
[root@server ~]# systemctl start docker # 啓動docker [root@server ~]# ps aux |grep docker # 查看進程 root 5289 2.3 1.6 531968 30256 ? Ssl 23:16 0:00 /usr/bin/dockerd root 5297 1.5 1.2 366740 22500 ? Ssl 23:16 0:00 docker-containerd --config /var/run/docker/containerd/containerd.toml root 5438 0.0 0.0 112652 964 pts/0 S+ 23:17 0:00 grep --color=auto docker
啓動docker後,會自動生成一些iptables規則:
[root@server ~]# iptables -nvL Chain INPUT (policy ACCEPT 1022 packets, 421K bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 828 packets, 382K bytes) pkts bytes target prot opt in out source destination Chain DOCKER (1 references) pkts bytes target prot opt in out source destination Chain DOCKER-ISOLATION (1 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 Chain DOCKER-USER (1 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 [root@server ~]# iptables -t nat -nvL # 查看net表 Chain PREROUTING (policy ACCEPT 4 packets, 1040 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT 4 packets, 1040 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 103 packets, 6545 bytes) pkts bytes target prot opt in out source destination 0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT 103 packets, 6545 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 Chain DOCKER (2 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 [root@server ~]#
可是這生成的規則是臨時的,若是想要保存,可使用如下命令,不過通常沒有這個必要:
service iptables save
1.首先咱們須要從docker上拉取一個鏡像,例如我要拉取一個centos的鏡像,命令以下:
[root@server ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos af4b0a2388c6: Pull complete Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d Status: Downloaded newer image for centos:latest # 拉取完成 [root@server ~]#
若是下載得很慢的話,咱們須要配置一個docker加速器,具體的配置能夠參考如下文檔:
個人配置以下:
[root@server ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["阿里雲加速器地址"] }
說明:這個url爲加速器地址,須要自行去阿里雲申請。
配置完以後重啓docker。而後再進行拉取鏡像速度就會快不少了。
把鏡像拉取下來以後,就能夠進行使用了,如下是一些經常使用的命令:
1.查看本地的鏡像:
[root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
說明:
2.搜索鏡像命令,用於搜索哪些鏡像能夠提供下載,其中xxx是關鍵詞:
[root@server ~]# docker search xxx
例如我要搜索centos的鏡像,則格式以下:
[root@server ~]# docker search centos
3.咱們能夠給某一個鏡像打標籤或者說定義它的標識,打上標籤後會新生成一個不一樣標籤的鏡像:
[root@server ~]# docker tag centos test_centos [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB test_centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
雖說會新生成一個鏡像,但其實並非,從上面的輸出結果能夠看到,這兩個鏡像使用的IMAGE ID是同樣的,那它們其實就是同一個,不一樣的只是標籤。
除了能夠定義鏡像的 REPOSITORY 以外,還能夠定義鏡像的TAG:
[root@server ~]# docker tag centos test_centos2:171104 [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB test_centos2 171104 ff426288ea90 3 weeks ago 207MB test_centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
4.咱們說了docker是容器,因此下載到鏡像後,還須要把鏡像啓動爲容器:
[root@server ~]# docker run -itd centos 79fab4540315f6eb2b5616a2f8c8fabbcba7f3b5dffd46d52f98473c323594e9 [root@server ~]#
-i表示讓容器的標準輸入打開,-t表示分配一個僞終端,-d表示後臺啓動,要把-i -t -d 放到鏡像名字前面。
5.查看運行中的容器:
[root@server ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 79fab4540315 centos "/bin/bash" 46 seconds ago Up 44 seconds friendly_chatterjee [root@server ~]#
加上-a選項後能夠查看全部容器,包括未運行的。
6.刪除指定鏡像:
[root@server ~]# docker rmi test_centos Untagged: test_centos:latest [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB test_centos2 171104 ff426288ea90 3 weeks ago 207MB [root@server ~]#
後面的參數能夠是 REPOSITORY 也能夠是 TAG,若是是TAG時,其實是刪除該TAG。當後面的參數爲鏡像ID時,則會完全刪除整個鏡像,全部標籤也會一同刪除。
或者 REPOSITORY 和 TAG 一塊兒使用:
[root@server ~]# docker rmi test_centos2:171104 Untagged: test_centos2:171104 [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
咱們從倉庫上拉取到一個鏡像後,啓動爲容器就可使用了,可是,可能這個容器裏面的環境不是我須要的,因此咱們須要本身進行定製,例如在裏面配置本身須要的環境什麼的,配置好以後把這個容器生成一個鏡像就能夠拿到其餘機器上使用了。
1.想要定製容器的環境,首先要進入到容器裏,命令以下:
[root@server ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 79fab4540315 centos "/bin/bash" 27 minutes ago Up 27 minutes friendly_chatterjee [root@server ~]# docker exec -it 79fab4540315 bash [root@79fab4540315 /]# ls # 進入成功 anaconda-post.log dev home lib64 mnt proc run srv tmp var bin etc lib media opt root sbin sys usr [root@79fab4540315 /]#
這個拉取下來的centos鏡像,是一個閹割的操做系統,不少東西都沒有的,須要本身經過yum去安裝。
說明:
2.進入到該容器後,咱們能夠作一些變動,好比安裝一些東西,搭建本身須要的環境,而後針對這個容器進行建立新的鏡像:
## 隨便裝點東西 [root@79fab4540315 /]# yum install -y net-tools [root@79fab4540315 /]# yum install vim
3.安裝完成後Ctrl + d退出該容器,而後執行如下命令生成一個鏡像:
[root@server ~]# docker commit -m "install net-tools and vim" -a "author" 79fab4540315 test_centos sha256:0749459e3be3d66c787217bc7842c0856f7452e286f38e7e7979218787c1842a [root@server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test_centos latest 0749459e3be3 11 seconds ago 359MB centos latest ff426288ea90 3 weeks ago 207MB [root@server ~]#
說明:
若是熟悉git或svn的命令行操做的話,會發現這和它們的命令格式很像。
以上咱們就經過容器建立了一個新的、由本身自定義環境的鏡像,以後使用該鏡像時,就不須要再去搭建環境了。並且咱們能夠把這個鏡像放到一個倉庫上,這樣其餘機器也能夠下載。這就和集裝箱同樣,把東西都封裝到一個箱子裏,不只方便移動,還能夠開箱即用。