docker入門 基礎命令 docker安裝
在學一門新知識的時候,超哥喜歡提問,why?what?how?
wiki資料
什麽是docker
Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,於 2013 年 3 月以 Apache 2.0 授權協議開源,主要項目代碼在 GitHub 上進行維護。 Docker 使用 Google 公司推出的 Go 語言 進行開發實現。 docker是linux容器的一種封裝,提供簡單易用的容器使用接口。它是最流行的Linux容器解決方案。 docker的接口相當簡單,用戶可以方便的創建、銷毀容器。 docker將應用程序與程序的依賴,打包在一個文件裏面。運行這個文件就會生成一個虛擬容器。 程序運行在虛擬容器裏,如同在真實物理機上運行一樣,有了docker,就不用擔心環境問題了。
ocke用場景
web應用的自動化打包和發布 自動化測試和持續集成、發布 在服務型環境中部署和調整數據庫或其他應用
為什麽要用docker?
我們先看看很久很久以前,服務器是怎麽部署應用的!
由於物理機的諸多問題,後來出現了虛擬機
但是虛擬化也是有局限性的,每一個虛擬機都是一個完整的操作系統,要分配系統資源,虛擬機多道一定程度時,操作系統本身資源也就消耗殆盡,或者說必須擴容
docker與虛擬機的區別
docker VS 傳統虛擬機
特性 |
容器 |
虛擬機 |
啟動 |
秒級 |
分鐘級 |
硬盤使用 |
一般為 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
請遵循官方安裝方式!!!
https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-after-using-the-convenience-script
官方教程如下,最正確安裝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以上
[[email protected]_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基礎命令註釋
[[email protected] ~]# 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鏡像
[[email protected] ~]# 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操作系統的鏡像。 [[email protected] ~]# docker pull centos #獲取centos鏡像 [[email protected] ~]# docker run -it centos /bin/bash #完成後可以使用該鏡像創建一個容器
查看docker鏡像
鏡像的ID唯一標識了鏡像,如果ID相同,說明是同一鏡像。 TAG信息來區分不同發行版本,如果不指定具體標記,默認使用latest標記信息。 [[email protected] ~]# 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 命令是移除容器。 [[email protected] ~]# docker rmi imageID #刪除docker鏡像
導出docker鏡像
如果要導出鏡像到本地文件,可以使用docker save命令。 [[email protected] ~]# docker save centos > /opt/centos.tar.gz #導出docker鏡像至本地 [[email protected] ~]# ll /opt/ -rw-r--r--.1 root root 204205056 12月 30 09:53 centos.tar.gz
導入docker鏡像
可以使用docker load從本地文件中導入到本地docker鏡像庫 [[email protected] ~]# docker load < /opt/centos.tar.gz #導入本地鏡像到docker鏡像庫 [[email protected]~]# 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,之後終止容器。 [[email protected] ~]# docker run centos /bin/echo "hehe" #這跟在本地直接執行 /bin/echo‘hehe‘ hehe [[email protected] ~]# docker run --name mydocker -it centos /bin/bash#啟動一個bash終端,允許用戶進行交互。 [[email protected] /]# pwd / [[email protected] /]# 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啟動容器
[[email protected]_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的文件一致性校驗值。
運行這個烏班圖容器!
[[email protected]_python ~ 12:18:53]#docker run -it --rm ubuntu:14.04 bash
#此時會進入交互式的shell界面,即可以使用烏班圖操作系統 [email protected]:/# 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
[[email protected]_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
運行一個交互式的容器
[[email protected]_python ~ 15:15:07]#docker run -it centos /bin/bash
#此時進入docker容器 [[email protected] /]# cat /etc/redhat-release
參數解析:
-
-t:在新容器內指定一個偽終端或終端。
-
-i:允許你對容器內的標準輸入 (STDIN) 進行交互。
此時就進入了centos系統 可以查看系統相關信息,內核版本信息 cat /proc/version
ls /
此時想要退出容器,使用exit命令
後臺模式啟動docker
-d參數:後臺運行容器,返回容器ID
[[email protected]_python ~ 15:58:14]#docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done" c0283f1077d16a2bf2597e269d51a02815334f7390f18a62ed7a4ba07f351b65
#檢查容器進程 [[email protected]_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 [[email protected]_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.查看鏡像文件 [[email protected] /home]docker images REPOSITORY TAG IMAGE ID CREATED SIZE chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago 348MB
外部訪問容器
容器中可以運行網絡應用,但是要讓外部也可以訪問這些應用,可以通過-p或-P參數指定端口映射。
-P 參數會隨機映射端口到容器開放的網絡端口
[[email protected]_python ~ 16:31:37]#docker run -d -P training/webapp python app.py
檢查映射的端口
#宿主機ip:32768 映射容器的5000端口
[[email protected]_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端口
[[email protected]_python ~ 16:46:13]#docker run -d -p 9000:5000 training/webapp python app.py c0b5a6278d0f4f2e9b9eba8680451111d8b911b61de0c37ea64cb337aefb854e
訪問服務器的9000端口
(如果訪問失敗的話,檢查自己的防火墻,以及雲服務器的安全組)
查看指定容器的端口映射
[[email protected]_python ~ 16:49:01]#docker port c0b 5000/tcp -> 0.0.0.0:9000
查看容器內的進程
[[email protected]_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=“[email protected]" #對於復雜的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”] [[email protected] 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數據 [[email protected] /]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.119.10:5000"] }
寫入到docker服務中,寫入到[Service]配置塊中,加載此配置文件 [[email protected] 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 run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
--privileged=true docker容器的安全機制:設置特權級運行的容器 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程序 [[email protected] home]# cat app.py
#coding:utf8 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) [[email protected] home]# ls app.py Dockerfile 2.編寫dockerfile
FROM centos
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY epel.repo /etc/yum.repos.d/
RUN yum clean all
RUN yum install python-setuptools -y
RUN easy_install flask
COPY s16-flask.py /opt/
WORKDIR /opt
EXPOSE 8080
CMD ["python","s16-flask.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
一致的開發環境
docker入門 基礎命令 docker安裝