在學一門新知識的時候,超哥喜歡提問,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以上
[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=“[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”]
[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 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程式
[root@master 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)
[root@master 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跑一個selenium腳本
不用docker的情況
docker入門
運作完整流程
[root@chaogelinux tmp]# pip3 list |grep selenium
selenium 3.141.0
[root@chaogelinux tmp]# cat baidu.py
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless') #不需要可視化界面,linux無圖形化
chrome_options.add_argument('--no-sandbox') #以最高權限運作
driver = webdriver.Chrome(executable_path='/tmp/chromedriver', options=chrome_options) #找到webdriver浏覽器驅動
driver.get("http://www.baidu.com")
print(driver.title)
driver.close()
#擷取浏覽器驅動
wget http://npm.taobao.org/mirrors/chromedriver/71.0.3578.33/chromedriver_linux64.zip
[root@chaogelinux tmp]# python3 baidu.py
百度一下,你就知道
使用容器
1.準備好一個裝好selenium的鏡像,并且是執行baidu.py功能的,準備好Dockerfile
[root@chaogelinux selenium_docker]# cat Dockerfile
FROM python:3.7
RUN echo 'nameserver 119.29.29.29' >> /etc/resolv.conf
RUN pip3 install -i https://pypi.douban.com/simple selenium
ADD baidu.py /opt/
WORKDIR /opt/
CMD ['python3','/opt/baidu.py']
2.建構鏡像
[root@chaogelinux selenium_docker]# docker build -t se_python .
3.如果建構失敗,網速問題,則
vim /etc/sysctl.conf #添加,修改代碼
net.ipv4.ip_forward=1
systemctl restart network
檢查
sysctl net.ipv4.ip_forward
4.檢查鏡像
[root@chaogelinux selenium_docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
se_python latest 2b9508d00eb9 6 minutes ago 926 MB
5.
努力成為一個開發者
個人站點:www.pythonav.cn