在學一門新知識的時候,超哥喜歡提問,why?what?how?html
wiki資料python
什麼是docker
Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,於 2013 年 3 月以 Apache 2.0 受權協議開源,主要項目代碼在 GitHub 上進行維護。
Docker 使用 Google 公司推出的 Go 語言 進行開發實現。
docker是linux容器的一種封裝,提供簡單易用的容器使用接口。它是最流行的Linux容器解決方案。
docker的接口至關簡單,用戶能夠方便的建立、銷燬容器。
docker將應用程序與程序的依賴,打包在一個文件裏面。運行這個文件就會生成一個虛擬容器。
程序運行在虛擬容器裏,如同在真實物理機上運行同樣,有了docker,就不用擔憂環境問題了。
docker應用場景
web應用的自動化打包和發佈
自動化測試和持續集成、發佈
在服務型環境中部署和調整數據庫或其餘應用
爲何要用docker?
咱們先看看好久好久之前,服務器是怎麼部署應用的!mysql
因爲物理機的諸多問題,後來出現了虛擬機linux
可是虛擬化也是有侷限性的,每個虛擬機都是一個完整的操做系統,要分配系統資源,虛擬機多道必定程度時,操做系統自己資源也就消耗殆盡,或者說必須擴容
docker與虛擬機的區別
docker VS 傳統虛擬機
特性nginx |
容器git |
虛擬機程序員 |
啓動github |
秒級web |
分鐘級sql |
硬盤使用 |
通常爲 MB |
通常爲 GB |
性能 |
接近原生 |
弱 |
系統支持量 |
單機支持上千個容器 |
通常幾十個 |
環境配置的難題
讓開發人員最頭疼的麻煩事之一就是環境配置了,每臺計算機的環境都不相同,應該如何確保本身的程序換一臺機器能運行起來呢?
用戶必須確保的是:
- 操做系統的相同
- 各類平臺庫和組件的安裝
- 例如python依賴包,環境變量等
如何一些低版本的依賴模塊和當前環境不兼容,那就頭疼了。。。。。
若是環境配置這麼痛苦的話,換一臺機器,就得從新配置一下,那麼在安裝軟件的時候,帶着原始環境如出一轍的複製過來。
然而,開發和運維之間聊天通常是這樣的
解決方案一 虛擬機
虛擬機也能夠製做模板,基於模板建立虛擬機,保證環境問題一致
虛擬機(virtual machine)就是帶環境安裝的一種解決方案。它能夠在一種操做系統裏面運行另外一種操做系統,好比在 Windows 系統裏面運行 Linux 系統。應用程序對此毫無感知,由於虛擬機看上去跟真實系統如出一轍,而對於底層系統來講,虛擬機就是一個普通文件,不須要了就刪掉,對其餘部分毫無影響。
雖然用戶能夠經過虛擬機還原軟件的原始環境。可是,這個方案有幾個缺點。
(1)資源佔用多
虛擬機會獨佔一部份內存和硬盤空間。它運行的時候,其餘程序就不能使用這些資源了。哪怕虛擬機裏面的應用程序,真正使用的內存只有 1MB,虛擬機依然須要幾百 MB 的內存才能運行。
(2)冗餘步驟多
虛擬機是完整的操做系統,一些系統級別的操做步驟,每每沒法跳過,好比用戶登陸。
(3)啓動慢
啓動操做系統須要多久,啓動虛擬機就須要多久。可能要等幾分鐘,應用程序才能真正運行。
解決方案二 Linux容器
如今:自從用上docker容器後,能夠實現開發、測試和生產環境的統一化和標準化。
鏡像做爲標準的交付件,可在開發、測試和生產環境上以容器來運行,最終實現三套環境上的應用以及運行所依賴內容的徹底一致。
因爲虛擬機的諸多問題,Linux發展出了另外一種虛擬化技術:Linux容器(Linux Containers,縮寫LXC)
Linux容器不是模擬一個完整的操做系統,而是對進程進行隔離。在正常進程的外面套了一個保護層,對於容器裏面進程來講,它接觸的資源都是虛擬的,從而實現和底層系統的隔離。
(1)啓動快
容器裏面的應用,直接就是底層系統的一個進程,而不是虛擬機內部的進程。因此,啓動容器至關於啓動本機的一個進程,而不是啓動一個操做系統,速度就快不少。
(2)資源佔用少
容器只佔用須要的資源,不佔用那些沒有用到的資源;虛擬機因爲是完整的操做系統,不可避免要佔用全部資源。另外,多個容器能夠共享資源,虛擬機都是獨享資源。
(3)體積小
容器只要包含用到的組件便可,而虛擬機是整個操做系統的打包,因此容器文件比虛擬機文件要小不少。
總之,容器有點像輕量級的虛擬機,可以提供虛擬化的環境,可是成本開銷小得多。
docker容器的優點
更高效的利用系統資源
因爲容器不須要進行硬件虛擬以及運行完整操做系統等額外開銷,Docker 對系統 資源的利用率更高。
不管是應用執行速度、內存損耗或者文件存儲速度,都要比傳 統虛擬機技術更高效。所以,相比虛擬機技術,一個相同配置的主機,每每能夠運 行更多數量的應用。
更快速的啓動時間
傳統的虛擬機技術啓動應用服務每每須要數分鐘,而 Docker 容器應用,因爲直接 運行於宿主內核,無需啓動完整的操做系統,所以能夠作到秒級、甚至毫秒級的啓 動時間。大大的節約了開發、測試、部署的時間。
一致的運行環境
開發過程當中一個常見的問題是環境一致性問題。因爲開發環境、測試環境、生產環 境不一致,致使有些 bug 並未在開發過程當中被發現。
而 Docker 的鏡像提供了除內 核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 「這段代碼 在我機器上沒問題啊」 這類問題。
持續交付和部署
對開發和運維(DevOps)人員來講,最但願的就是一次建立或配置,能夠在任意 地方正常運行。
使用 Docker 能夠經過定製應用鏡像來實現持續集成、持續交付、部署。開發人員 能夠經過 Dockerfile 來進行鏡像構建,並結合 持續集成(Continuous Integration) 系 統進行集成測試,
而運維人員則能夠直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
並且使用 Dockerfile 使鏡像構建透明化,不只僅開發團隊能夠理解應用運行環 境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。
更輕鬆的遷移
因爲 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 能夠在 不少平臺上運行,不管是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運 行結果是一致的。
所以用戶能夠很輕易的將在一個平臺上運行的應用,遷移到另外一 個平臺上,而不用擔憂運行環境的變化致使應用沒法正常運行的狀況。
工做中的虛擬化和容器
docker三大概念
容器三大基本概念
鏡像 image
容器 container
倉庫 repository
docker整個生命週期就是這三個概念。
docker鏡像
Docker鏡像就是一個只讀的模板。
例如:一個鏡像能夠包含一個完整的CentOS操做系統環境,裏面僅安裝了Apache或用戶須要的其餘應用程序。
鏡像能夠用來建立Docker容器。
Docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。
image的分層存儲
由於鏡像包含完整的root文件系統,體積是很是龐大的,所以docker在設計時按照Union FS的技術,將其設計爲分層存儲的架構。
鏡像不是ISO那種完整的打包文件,鏡像只是一個虛擬的概念,他不是一個完整的文件,而是由一組文件組成,或者多組文件系統聯合組成。
docker容器(container)
image和container的關係,就像面向對象程序設計中的 類和實例同樣,鏡像是靜態的定義(class),容器是鏡像運行時的實體(object)。 容器能夠被建立、啓動、中止、刪除、暫停 Docker利用容器來運行應用。 容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的,保證安全的平臺。 能夠把容器看作是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。 注意:鏡像是隻讀的,容器在啓動的時候建立一層可寫層做爲最上層。
docker倉庫(repository)
倉庫是集中存放鏡像文件的場所。有時候把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。
倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool等,能夠提供大陸用戶更穩定快讀的訪問。
當用戶建立了本身的鏡像以後就可使用push命令將它上傳到公有或者私有倉庫,這樣下載在另一臺機器上使用這個鏡像時候,只需須要從倉庫上pull下來就能夠了。
注意:Docker倉庫的概念跟Git相似,註冊服務器能夠理解爲GitHub這樣的託管服務。
docker Registry
Docker Registry 公開服務是開放給用戶使用、容許用戶管理鏡像的 Registry 服 務。通常這類公開服務容許用戶免費上傳、下載公開的鏡像,並可能提供收費服務 供用戶管理私有鏡像。
最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,並 擁有大量的高質量的官方鏡像。
除此之外,還有 CoreOS 的 Quay.io,CoreOS 相 關的鏡像存儲在這裏;Google 的 Google Container Registry,Kubernetes 的鏡像 使用的就是這個服務。 因爲某些緣由,在國內訪問這些服務可能會比較慢。
國內的一些雲服務商提供了針 對 Docker Hub 的鏡像服務(Registry Mirror),這些鏡像服務被稱爲加速器。常見 的有 阿里雲加速器、DaoCloud 加速器、靈雀雲加速器等。
使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從官方網站下載速度會提升不少。在後 面的章節中會有進一步如何配置加速器的講解。 國內也有一些雲服務商提供相似於 Docker Hub 的公開服務。好比 時速雲鏡像倉 庫、網易雲鏡像服務、DaoCloud 鏡像市場、阿里雲鏡像庫等。
CentOS安裝docker
官方教程以下,最正確安裝docker姿式
1.卸載舊版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 2.設置存儲庫 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 3.安裝docker社區版 sudo yum install docker-ce 4.啓動關閉docker systemctl start docker
docker版本
Docker 是一個開源的商業產品,有兩個版本:社區版(Community Edition,縮寫爲 CE)和企業版(Enterprise Edition,縮寫爲 EE)。
企業版包含了一些收費服務,我的開發者通常用不到。本文的介紹都針對社區版。
系統環境準備
docker最低支持centos7且在64位平臺上,內核版本在3.10以上
[root@oldboy_python ~ 10:48:11]#uname -r
3.10.0-693.el7.x86_64
Docker鏡像加速器
https://www.daocloud.io/mirror#accelerator-doc
https://www.cnblogs.com/pyyu/p/6925606.html
#一條命令加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
docker基礎命令註釋
[root@docker ~]# docker --help Usage: docker [OPTIONS] COMMAND [arg...] docker daemon [ --help | ... ] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files #客戶端配置文件的位置 -D, --debug=false Enable debug mode #啓用Debug調試模式 -H, --host=[] Daemon socket(s) to connect to #守護進程的套接字(Socket)鏈接 -h, --help=false Print usage #打印使用 -l, --log-level=info Set the logging level #設置日誌級別 --tls=false Use TLS; implied by--tlsverify # --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA #信任證書籤名CA --tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS證書文件路徑 --tlskey=~/.docker/key.pem Path to TLS key file #TLS密鑰文件路徑 --tlsverify=false Use TLS and verify the remote #使用TLS驗證遠程 -v, --version=false Print version information and quit #打印版本信息並退出 Commands: attach Attach to a running container #當前shell下attach鏈接指定運行鏡像 build Build an image from a Dockerfile #經過Dockerfile定製鏡像 commit Create a new image from a container's changes #提交當前容器爲新的鏡像 cp Copy files/folders from a container to a HOSTDIR or to STDOUT #從容器中拷貝指定文件或者目錄到宿主機中 create Create a new container #建立一個新的容器,同run 但不啓動容器 diff Inspect changes on a container's filesystem #查看docker容器變化 events Get real time events from the server#從docker服務獲取容器實時事件 exec Run a command in a running container#在已存在的容器上運行命令 export Export a container's filesystem as a tar archive #導出容器的內容流做爲一個tar歸檔文件(對應import) history Show the history of an image #展現一個鏡像造成歷史 images List images #列出系統當前鏡像 import Import the contents from a tarball to create a filesystem image #從tar包中的內容建立一個新的文件系統映像(對應export) info Display system-wide information #顯示系統相關信息 inspect Return low-level information on a container or image #查看容器詳細信息 kill Kill a running container #kill指定docker容器 load Load an image from a tar archive or STDIN #從一個tar包中加載一個鏡像(對應save) login Register or log in to a Docker registry#註冊或者登錄一個docker源服務器 logout Log out from a Docker registry #從當前Docker registry退出 logs Fetch the logs of a container #輸出當前容器日誌信息 pause Pause all processes within a container#暫停容器 port List port mappings or a specific mapping for the CONTAINER #查看映射端口對應的容器內部源端口 ps List containers #列出容器列表 pull Pull an image or a repository from a registry #從docker鏡像源服務器拉取指定鏡像或者庫鏡像 push Push an image or a repository to a registry #推送指定鏡像或者庫鏡像至docker源服務器 rename Rename a container #重命名容器 restart Restart a running container #重啓運行的容器 rm Remove one or more containers #移除一個或者多個容器 rmi Remove one or more images #移除一個或多個鏡像(無容器使用該鏡像才能夠刪除,不然須要刪除相關容器才能夠繼續或者-f強制刪除) run Run a command in a new container #建立一個新的容器並運行一個命令 save Save an image(s) to a tar archive#保存一個鏡像爲一個tar包(對應load) search Search the Docker Hub for images #在docker hub中搜索鏡像 start Start one or more stopped containers#啓動容器 stats Display a live stream of container(s) resource usage statistics #統計容器使用資源 stop Stop a running container #中止容器 tag Tag an image into a repository #給源中鏡像打標籤 top Display the running processes of a container #查看容器中運行的進程信息 unpause Unpause all processes within a container #取消暫停容器 version Show the Docker version information#查看容器版本號 wait Block until a container stops, then print its exit code #截取容器中止時的退出狀態值 Run 'docker COMMAND --help' for more information on a command. #運行docker命令在幫助能夠獲取更多信息
使用docker鏡像
從倉庫獲取鏡像
管理本地主機的鏡像
獲取鏡像
從docker registry獲取鏡像的命令是docker pull。命令格式是:
docker pull [選項][docker registry地址] 倉庫名:標籤
docker register地址:地址的格式通常是 域名:端口,默認地址是docker hub
倉庫名:倉庫名是兩段格式,用戶名/軟件名,若是不寫用戶,默認docker hub用戶名是library,也就是官方鏡像
鏡像文件
docker是把應用程序和其依賴打包在image文件裏面,只有經過這個鏡像文件才能生成docker容器。
一個image文件能夠生成多個容器實例。
image文件是通用,能夠共享的,爲了節省時間,咱們儘可能
列出服務器全部鏡像文件
#列出全部的image文件
docker image ls
#刪除image文件
docker image rm [imagename]
搜索docker鏡像
[root@docker ~]# docker search centos #搜索全部centos的docker鏡像 INDEX NAME(名稱) DESCRIPTION(描述) STARS(下載次數)OFFICIAL(官方) AUTOMATED(自動化) docker.io docker.io/centos The official build of CentOS. 1781 [OK] docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.7 x86_64 / 14 [OK] ……
獲取docker鏡像
可使用docker pull命令來從倉庫獲取所須要的鏡像。下面的例子將從Docker Hub倉庫下載一個Centos操做系統的鏡像。 [root@docker ~]# docker pull centos #獲取centos鏡像 [root@docker ~]# docker run -it centos /bin/bash #完成後可使用該鏡像建立一個容器
查看docker鏡像
鏡像的ID惟一標識了鏡像,若是ID相同,說明是同一鏡像。 TAG信息來區分不一樣發行版本,若是不指定具體標記,默認使用latest標記信息。 [root@docker ~]# docker images #查看docker鏡像 REPOSITORY(來自那個倉庫) TAG(標籤) IMAGE ID(惟一ID) CREATED(建立時間) VIRTUAL SIZE(大小) docker.io/centos latest 60e65a8e4030 5 days ago 196.6 MB docker.io/nginx latest 813e3731b203 13 days ago 133.8 MB
刪除Docker鏡像
若是要移除本地的鏡像,可使用docker rmi命令(在刪除鏡像以前先用docker rm刪除依賴於這個鏡像的全部容器)。注意docker rm 命令是移除容器。
[root@docker ~]# docker rmi imageID #刪除docker鏡像
導出docker鏡像
若是要導出鏡像到本地文件,可使用docker save命令。 [root@docker ~]# docker save centos > /opt/centos.tar.gz #導出docker鏡像至本地 [root@docker ~]# ll /opt/ -rw-r--r--.1 root root 204205056 12月 30 09:53 centos.tar.gz
導入docker鏡像
可使用docker load從本地文件中導入到本地docker鏡像庫 [root@docker ~]# docker load < /opt/centos.tar.gz #導入本地鏡像到docker鏡像庫 [root@docker~]# docker images #查看鏡像導入狀況 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.io/centos latest 60e65a8e4030 5 days ago 196.6 MB
啓動docker容器的方式
啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另一個是將在終止狀態(stopped)的容器從新啓動。
由於Docker的容器實在過輕量級了,不少時候用戶都是隨時刪除和新建立容器。
新建容器而且啓動
所須要的命令主要爲docker run 例如,下面的命令輸出一個hehe,以後終止容器。 [root@docker ~]# docker run centos /bin/echo "hehe" #這跟在本地直接執行 /bin/echo'hehe' hehe [root@docker ~]# docker run --name mydocker -it centos /bin/bash#啓動一個bash終端,容許用戶進行交互。 [root@1c6c3f38ea07 /]# pwd / [root@1c6c3f38ea07 /]# ls anaconda-post.log bindev etc homelib lib64 lost+foundmedia mnt optproc root runsbin srv systmp usr var --name:給容器定義一個名稱 -i:則讓容器的標準輸入保持打開。 -t:讓Docker分配一個僞終端,並綁定到容器的標準輸入上 /bin/bash:執行一個命令
當利用docker run來建立容器時,Docker在後臺運行的標準操做包括
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
利用鏡像建立並啓動一個容器
分配一個文件系統,並在只讀的鏡像層外面掛在一層可讀寫層
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
從地址池配置一個ip地址給容器
執行用戶指定的應用程序
執行完畢後容器被終止
docker與"hello docker"
hello world是程序員啓蒙語言,咱們經過最簡單的image文件「hello-world」,來感覺一下docker。
#獲取鏡像 hello-world docker pull hello-world #檢查鏡像 docker images #運行image文件,能夠用容器id docker run hello-world
#檢查docker容器進程
docker ps
#檢查全部運行過的容器
docker ps -a
運行成功後,能夠看到結果
表示你已經成功運行了容器,hello world運行的容器會在完成後,自動終止
運行一個ubuntu容器
我們要在cenots7操做系統下,以docker下載一個ubuntu image文件,而後以image啓動容器
[root@oldboy_python ~ 11:52:22]#docker pull ubuntu:14.04
#如圖,烏班圖的鏡像下載,是下載每一層的文件
Trying to pull repository docker.io/library/ubuntu ... 14.04: Pulling from docker.io/library/ubuntu 8284e13a281d: Pull complete 26e1916a9297: Pull complete 4102fc66d4ab: Pull complete 1cf2b01777b2: Pull complete 7f7a2d5e04ed: Pull complete Digest: sha256:4851d1986c90c60f3b19009824c417c4a0426e9cf38ecfeb28598457cefe3f56 Status: Downloaded newer image for docker.io/ubuntu:14.04
下載過程能夠看出鏡像是由多層存儲構成的。下載也是一層一層,並不是單一的文件。
下載過程當中給出每一層的前12位ID。下載結束後會給出sha246的文件一致性校驗值。
運行這個烏班圖容器!
[root@oldboy_python ~ 12:18:53]#docker run -it --rm ubuntu:14.04 bash
#此時會進入交互式的shell界面,便可以使用烏班圖操做系統 root@3efbb2749d7c:/# cat /etc/os-release NAME="Ubuntu" VERSION="14.04.5 LTS, Trusty Tahr" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 14.04.5 LTS" VERSION_ID="14.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
#使用exit退出容器
exit
docker run就是運行容器的命令。 參數 -it : -i 是交互式操做,-t是終端 -rm : 容器退出後將其刪除。也能夠不指定參數,手動docker rm,使用-rm能夠避免浪費空間。
ubuntu:14.04 這指的是鏡像文件
bash : 指定用交互式的shell,所以須要bash命令
Docker與CentOS
docker容許在容器內運行應用程序,使用docker run命令來在容器內運行應用程序。
#加速docker鏡像下載 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
[root@oldboy_python ~ 15:14:31]#docker pull docker.io/centos Using default tag: latest Trying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos 256b176beaff: Pull complete Digest: sha256:fc2476ccae2a5186313f2d1dadb4a969d6d2d4c6b23fa98b6c7b0a1faad67685 Status: Downloaded newer image for docker.io/centos:latest
運行一個交互式的容器
[root@oldboy_python ~ 15:15:07]#docker run -it centos /bin/bash
#此時進入docker容器 [root@c72e9c40cfe2 /]# cat /etc/redhat-release
參數解析:
-
-t:在新容器內指定一個僞終端或終端。
-
-i:容許你對容器內的標準輸入 (STDIN) 進行交互。
此時就進入了centos系統 能夠查看系統相關信息,內核版本信息 cat /proc/version
ls /
此時想要退出容器,使用exit命令
後臺模式啓動docker
-d參數:後臺運行容器,返回容器ID
[root@oldboy_python ~ 15:58:14]#docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done" c0283f1077d16a2bf2597e269d51a02815334f7390f18a62ed7a4ba07f351b65
#檢查容器進程 [root@oldboy_python ~ 15:58:22]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0283f1077d1 centos "/bin/sh -c 'while..." 6 seconds ago Up 5 seconds fervent_turing [root@oldboy_python ~ 15:58:28]#
查看容器內的標準輸出
docker logs c02
中止容器
docker stop c02
#此時容器進程不存在
docker ps
啓動容器
docker start c02
#檢查容器進程
docker ps
刪除容器
docker rm c02
Docker鏡像經常使用命令
docker images #列出全部本級鏡像
docker pull centos #獲取新的centos鏡像
docker search nginx #搜索nginx鏡像
構建鏡像
1.經過commit修改鏡像 2.編寫dockerfile
進入容器
使用-d參數時,容器啓動後會進入後臺。某些時候須要進入容器進行操做,有不少種方法,包括使用docker attach命令或nsenter工具等。
docker exec -it 容器id
docker attach 容器id
提交建立自定義的鏡像(docker container commit)
1.咱們進入交互式的centos容器中,發現沒有vim命令 docker run -it centos 2.在當前容器中,安裝一個vim yum install -y vim 3.安裝好vim以後,exit退出容器 exit 4.查看剛纔安裝好vim的容器記錄 docker container ls -a 5.提交這個容器,建立新的image docker commit 059fdea031ba chaoyu/centos-vim 6.查看鏡像文件 [root@master /home]docker images REPOSITORY TAG IMAGE ID CREATED SIZE chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago 348MB
外部訪問容器
容器中能夠運行網絡應用,可是要讓外部也能夠訪問這些應用,能夠經過-p或-P參數指定端口映射。
-P 參數會隨機映射端口到容器開放的網絡端口
[root@oldboy_python ~ 16:31:37]#docker run -d -P training/webapp python app.py
檢查映射的端口
#宿主機ip:32768 映射容器的5000端口
[root@oldboy_python ~ 16:34:02]#docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfd632821d7a training/webapp "python app.py" 21 seconds ago Up 20 seconds 0.0.0.0:32768->5000/tcp brave_fermi
查看容器日誌信息
#不間斷顯示log
docker logs -f cfd
也能夠經過-p參數指定映射端口
#指定服務器的9000端口,映射到容器內的5000端口
[root@oldboy_python ~ 16:46:13]#docker run -d -p 9000:5000 training/webapp python app.py c0b5a6278d0f4f2e9b9eba8680451111d8b911b61de0c37ea64cb337aefb854e
訪問服務器的9000端口
(若是訪問失敗的話,檢查本身的防火牆,以及雲服務器的安全組)
查看指定容器的端口映射
[root@oldboy_python ~ 16:49:01]#docker port c0b 5000/tcp -> 0.0.0.0:9000
查看容器內的進程
[root@oldboy_python ~ 16:49:05]#docker top c0b UID PID PPID C STIME TTY TIME CMD root 3926 3912 0 16:46 ? 00:00:00 python app.py
利用dockerfile定製鏡像
鏡像是容器的基礎,每次執行docker run的時候都會指定哪一個鏡像做爲容器運行的基礎。咱們以前的例子都是使用來自docker hub的鏡像,直接使用這些鏡像只能知足必定的需求,當鏡像沒法知足咱們的需求時,就得自定製這些鏡像。
鏡像的定製就是定製每一層所添加的配置、文件。若是能夠吧每一層修改、安裝、構建、操做的命令都寫入到一個腳本,用腳原本構建、定製鏡像,這個腳本就是dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,所以每一條指令的內容,就是描述該層應當如何構建。
FROM scratch #製做base image 基礎鏡像,儘可能使用官方的image做爲base image FROM centos #使用base image FROM ubuntu:14.04 #帶有tag的base image LABEL version=「1.0」 #容器元信息,幫助信息,Metadata,相似於代碼註釋 LABEL maintainer=「yc_uuu@163.com" #對於複雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令! RUN yum update && yum install -y vim \ Python-dev #反斜線換行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME」 WORKDIR /root #至關於linux的cd命令,改變目錄,儘可能使用絕對路徑!!!不要用RUN cd WORKDIR /test #若是沒有就自動建立 WORKDIR demo #再進入demo文件夾 RUN pwd #打印結果應該是/test/demo ADD and COPY ADD hello / #把本地文件添加到鏡像中,吧本地的hello可執行文件拷貝到鏡像的/目錄 ADD test.tar.gz / #添加到根目錄並解壓 WORKDIR /root ADD hello test/ #進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑 COPY hello test/ #等同於上述ADD效果 ADD與COPY - 優先使用COPY命令 -ADD除了COPY功能還有解壓功能 添加遠程文件/目錄使用curl或wget ENV #環境變量,儘量使用ENV增長可維護性 ENV MYSQL_VERSION 5.6 #設置一個mysql常量 RUN yum install -y mysql-server=「${MYSQL_VERSION}」
------這裏須要稍微理解一下了-------中級知識---先不講
VOLUME and EXPOSE 存儲和網絡 RUN and CMD and ENTRYPOINT RUN:執行命令並建立新的Image Layer CMD:設置容器啓動後默認執行的命令和參數 ENTRYPOINT:設置容器啓動時運行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo 」hello docker」 ENTRYPOINT echo 「hello docker」 Exec格式 RUN [「apt-get」,」install」,」-y」,」vim」] CMD [「/bin/echo」,」hello docker」] ENTRYPOINT [「/bin/echo」,」hello docker」] 經過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [「/bin/echo」,」hello $name」]#這個僅僅是執行echo命令,讀取不了shell變量 ENTRYPOINT [「/bin/bash」,」-c」,」echo hello $name"] CMD 容器啓動時默認執行的命令 若是docker run指定了其餘命令(docker run -it [image] /bin/bash ),CMD命令被忽略 若是定義多個CMD,只有最後一個執行 ENTRYPOINT 讓容器以應用程序或服務形式運行 不會被忽略,必定會執行 最佳實踐:寫一個shell腳本做爲entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [「docker-entrypoint.sh] EXPOSE 27017 CMD [「mongod」] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name」]
發佈docker image到倉庫
第一種,docker hub公有鏡像發佈
1.docker提供了一個相似於github的倉庫dockerhub, 網址https://hub.docker.com/須要註冊使用 2.註冊docker id後,在linux中登陸dockerhub docker login
注意要保證image的tag是帳戶名,若是鏡像名字不對,須要改一下tag
docker tag chaoyu/centos-vim yuchao163/centos-vim
語法是: docker tag 倉庫名 yuchao163/倉庫名
3.推送docker image到dockerhub docker push yuchao163/centps-cmd-exec:latest 4.在dockerhub中檢查鏡像 https://hub.docker.com/ 5.刪除本地鏡像,測試下載pull 鏡像文件 docker pull yuchao163/centos-entrypoint-exec
私有倉庫
可是這種鏡像倉庫是公開的,其餘人也是能夠下載,並不安全,所以還可使用docker registry官方提供的私有倉庫
1.官方提供的私有倉庫docker registry用法 https://yeasy.gitbooks.io/docker_practice/repository/registry.html 2.一條命令下載registry鏡像而且啓動私有倉庫容器 私有倉庫會被建立在容器的/var/lib/registry下,所以經過-v參數將鏡像文件存儲到本地的/opt/data/registry下 端口映射容器中的5000端口到宿主機的5000端口 docker run -d \ -p 5000:5000 \ -v /opt/data/registry:/var/lib/registry \ registry 3.檢查啓動的registry容器 docker ps 4.測試鏈接容器 telnet 192.168.119.10 5000 5.修改鏡像tag,以docker registry的地址端口開頭 docker tag hello-world:latest 192.168.119.10:5000/hello-world:latest 6.查看docker鏡像,找到registry的鏡像 docker images 7.Docker 默認不容許非 HTTPS 方式推送鏡像。咱們能夠經過 Docker 的配置選項來取消這個限制,這裏必須寫正確json數據 [root@master /]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.119.10:5000"] }
寫入到docker服務中,寫入到[Service]配置塊中,加載此配置文件 [root@master home]# grep 'EnvironmentFile=/etc/docker/daemon.json' /lib/systemd/system/docker.service EnvironmentFile=/etc/docker/daemon.json 8.修改了docker配置文件,從新加載docker systemctl daemon-reload 9.重啓docker systemctl restart docker 10.重啓了docker,剛纔的registry容器進程掛掉了,所以從新啓動它 docker ps -a docker start 容器id 11.推送本地鏡像 docker push 192.168.119.10:5000/hello-world
12.因爲docker registry沒有web節目,可是提供了API數據 官網教程:https://docs.docker.com/registry/spec/api/#listing-repositories curl http://192.168.119.10:5000/v2/_catalog
或者瀏覽器訪問http://192.168.119.10:5000/v2/_catalog
13.刪除本地鏡像,從私有倉庫中下載
docker pull 192.168.119.10:5000/hello-world
打包flask程序與dockerfile
超哥構建好的鏡像,只要丟給武沛奇,說「小沛奇,拿去用吧,這個鏡像你直接docker run就能用了,不須要你管環境問題了,有沒有很崇拜我」,沛奇說,「超哥真牛逼」
確保app.py和dockerfile在同一個目錄! 1.準備好app.py的flask程序 [root@master home]# cat app.py from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker" if __name__=="__main__": app.run(host='0.0.0.0',port=8080) [root@master home]# ls app.py Dockerfile 2.編寫dockerfile [root@master home]# cat Dockerfile FROM python:2.7 LABEL maintainer="Chao Yu<yc_uuu@163.com>" RUN pip install flask COPY app.py /app/ WORKDIR /app EXPOSE 8080 CMD ["python","app.py"] 3.構建鏡像image docker build -t yuchao163/flask-hello-docker . 4.查看建立好的images docker image ls 5.啓動此flask-hello-docker容器,映射一個端口供外部訪問 docker run -d -p 8080:8080 yuchao163/flask-hello-docker 6.檢查運行的容器 docker container ls