docker使用筆記node
authorization:胡湘林python
email: a714585725@qq.comgit
一、安裝dockergithub
CentOS6web
對於 CentOS6,可使用 EPEL 庫安裝 Docker,命令以下docker
yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm yum install docker-io
CentOS7數據庫
CentOS7 系統 CentOS-Extras 庫中已帶 Docker,能夠直接安裝:ubuntu
yum install dockercentos
安裝以後啓動 Docker 服務,並讓它隨系統啓動自動加載。bash
service docker start chkconfig docker on
二、獲取鏡像
可使用 docker pull 命令來從倉庫獲取所須要的鏡像。
下面的例子將從 Docker Hub 倉庫下載一個 Ubuntu 12.04 操做系統的鏡像。
$ sudo docker pull ubuntu:12.04 Pulling repository ubuntu ab8e2728644c: Pulling dependent layers 511136ea3c5a: Download complete 5f0ffaa9455e: Download complete a300658979be: Download complete 904483ae0c30: Download complete ffdaafd1ca50: Download complete d047ae21eeaf: Download complete
下載過程當中,會輸出獲取鏡像的每一層信息。
該命令實際上至關於 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即從註冊服務器 registry.hub.docker.com 中的 ubuntu 倉庫來下載標記爲 12.04 的鏡像。
有時候官方倉庫註冊服務器下載較慢,能夠從其餘倉庫下載。 從其它倉庫下載時須要指定完整的倉庫註冊服務器地址。例如
$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04 Pulling dl.dockerpool.com:5000/ubuntu ab8e2728644c: Pulling dependent layers 511136ea3c5a: Download complete 5f0ffaa9455e: Download complete a300658979be: Download complete 904483ae0c30: Download complete ffdaafd1ca50: Download complete d047ae21eeaf: Download complete
完成後,便可隨時使用該鏡像了,例如建立一個容器,讓其中運行 bash 應用。
三、列出鏡像列表
使用 docker p_w_picpaths 顯示本地已有的鏡像。
$ sudo docker p_w_picpaths REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MB ubuntu precise 74fe38d11401 4 weeks ago 209.6 MB ubuntu 14.04 99ec81b80c55 4 weeks ago 266 MB ubuntu latest 99ec81b80c55 4 weeks ago 266 MB ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB ...
在列出信息中,能夠看到幾個字段信息
來自於哪一個倉庫,好比 ubuntu
鏡像的標記,好比 14.04
它的 ID 號(惟一)
建立時間
鏡像大小
其中鏡像的 ID 惟一標識了鏡像,注意到 ubuntu:14.04 和 ubuntu:trusty 具備相同的鏡像 ID,說明它們其實是同一鏡像。
TAG 信息用來標記來自同一個倉庫的不一樣鏡像。例如 ubuntu 倉庫中有多個鏡像,經過 TAG 信息來區分發行版本,例如 10.0四、12.0四、12.十、13.0四、14.04 等。
四、啓動容器
docker run -t -i centos:latest /bin/bash
若是不指定具體的標記,則默認使用 latest 標記信息。
五、容器基本使用
容器生命週期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause] 容器操做運維 — docker [ps|inspect|top|attach|events|logs|wait|export|port] 容器rootfs命令 — docker [commit|cp|diff] 鏡像倉庫 — docker [login|pull|push|search] 本地鏡像管理 — docker [p_w_picpaths|rmi|tag|build|history|save|import] 其餘命令 — docker [info|version]
容器生命週期管理
# 在容器中運行"echo"命令,輸出"hello word" $docker run p_w_picpath_name echo "hello word" # 交互式進入容器中 $docker run -i -t p_w_picpath_name /bin/bash # 在容器中安裝新的程序 $docker run p_w_picpath_name yum install -y app_name #使容器在守護態運行 docker run -d -i -t p_w_picpath_name /bin/bash #使容器在運行時綁定特定端口 容器中能夠運行一些網絡應用,要讓外部也能夠訪問這些應用,能夠經過 -P 或 -p 參數來指定端口映射。 當使用 -P 標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口。 docker run -d -P training/webapp python app.py docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse -p(小寫的)則能夠指定要映射的端口,而且,在一個指定端口上只能夠綁定一個容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。 映射全部接口地址 使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,能夠執行 docker run -d -p 5000:5000 training/webapp python app.py 此時默認會綁定本地全部接口上的全部地址。 映射到指定地址的指定端口 可使用 ip:hostPort:containerPort 格式指定映射使用一個特定地址,好比 localhost 地址 127.0.0.1 docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py 映射到指定地址的任意端口 使用 ip::containerPort 綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。 docker run -d -p 127.0.0.1::5000 training/webapp python app.py 還可使用 udp 標記來指定 udp 端口 docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 查看映射端口配置 使用 docker port 來查看當前映射的端口配置,也能夠查看到綁定的地址 docker port nostalgic_morse 5000 127.0.0.1:49155. 注意: 容器有本身的內部網絡和 ip 地址(使用 docker inspect 能夠獲取全部的變量,Docker 還能夠有一個可變的網絡配置。) -p 標記能夠屢次使用來綁定多個端口 例如 docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py #啓動/重啓容器和關閉容器 啓動一個關閉的容器:docker start CONTAINER_ID 重啓一個容器:docker restart CONTAINER_ID 關閉一個容器:docker stop CONTAINER_ID或者docker kill CONTAINER_ID強制關閉一個容器 刪除一個容器:docker rm -f CONTAINER_ID 刪除全部容器:docker rm `docker ps -a -q` 暫停/恢復一個容器的全部進程:docker pause/unpause
容器操做運維
#查看容器運行狀態 docker ps -a #查看全部容器的狀態 docker ps -a -q #列出全部容器列表 docker inspect CONTAINER_ID #檢查鏡像或者容器的參數,默認返回 JSON 格式。 docker top CONTAINER_ID #查詢某個容器的進程運行狀況 docker attach CONTAINER_ID #接入某個正在運行的docker容器中進行操做(重點:退出的時候不能使用ctrl+d或者exit方式,這將會致使容器中止運行,退出時應使用ctrl+p,而後再使用ctrl+q) docker events --since=20151118 #查看直到指定日期容器的實時系統事件 docker logs CONTAINER_ID #批量打印出容器中進程的運行日誌 docker wait CONTAINER_ID #阻塞一個容器,直到該容器中止(PS:目前不知道咋用) docker export CONTAINER_ID > /directory/container.tar #(保存當前某個容器的狀態信息),導入可以使用cat /directory/container.tar |docker import - CONTAINER_NAME:tag docker save IMAGE_NAME >/directory/p_w_picpath_name.tar #(將某個鏡像導出),導入可以使用docker load < /directory/p_w_picpath_name.tar 這兩個之間的區別以下: 導出後再導入(exported-imported)的鏡像會丟失全部的歷史,而保存後再加載(saveed-loaded)的鏡像沒有丟失歷史的層(layer)。這意味着使用導出後再導入的方式,你將沒法回滾到以前的層(layer),同時,使用保存後再加載的方式持久化整個鏡像,就能夠作到層回滾(能夠執行docker tag <LAYER ID> <IMAGE NAME>來回滾以前的層)。 docker port CONTAINER_ID #列出某個容器和宿主機之間的端口映射關係
容器rootfs命令
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] $ sudo docker ps ID IMAGE COMMAND CREATED STATUS PORTS c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours $ docker commit c3f279d17e0a SvenDowideit/testp_w_picpath:version3 f5283438590d $ docker p_w_picpaths | head REPOSITORY TAG ID CREATED VIRTUAL SIZE SvenDowideit/testp_w_picpath version3 f5283438590d 16 seconds ago 335.7 MB 使用說明: 這個命令的用處在於把有修改的container提交成新的Image,而後導出此Imange分發給其餘場景中調試使用。Docker官方的建議是,當你在調試完Image的問題後,應該寫一個新的Dockerfile文件來維護此Image。commit命令僅是一個臨時建立Image的輔助命令。 docker cp CONTAINER:PATH HOSTPATH 使用說明: 使用cp能夠把容器內的文件複製到Host主機上。這個命令在開發者開發應用的場景下,會須要把運行程序產生的結果複製出來的需求,在這個狀況下就可使用這個cp命令。 docker diff CONTAINER 例子: $ sudo docker diff 7bb0e258aefe C /dev A /dev/kmsg C /etc A /etc/mtab A /go A /go/src A /go/src/github.com A /go/src/github.com/dotcloud .... 使用說明: diff會列出3種容器內文件狀態變化(A - Add, D - Delete, C - Change )的列表清單。構建Image的過程當中須要的調試指令。
鏡像倉庫
docker [login|pull|push|search] 首先須要一個存放共享鏡像的地方,在企業環境可使用私有的鏡像倉庫,但爲了方便起見,咱們直接使用Docker的公共倉庫。首先須要在Docker Hub註冊一個用戶,而後使用 docker login 命令登錄到倉庫服務器。 docker login Username: xxxxxx Password: Email: xxxxxx@******.com Login Succeeded 而後咱們須要將本地修改過的容器使用 docker commit 命令生成一個本地的鏡像。注意,因爲以後須要將鏡像提交至Docker Hub,這裏鏡像的名字必須以本身的Docker Hub用戶名做爲前綴,不然在後面的 push 時候會遇到 403 「Access Denied: Not allowed to create Repo at given location」 錯誤。例如名爲 linfan/employees。 docker commit node-app linfan/employees a4281aa8baf9aee1173509b30b26b17fd1bb2de62d4d90fa31b86779dd15109b docker p_w_picpaths REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE linfan/employees latest a4281aa8baf9 14 seconds ago 696.2 MB 最後,使用 docker push 命令將這個準備好的鏡像提交到Docker Hub倉庫中。 docker push linfan/employees The push refers to a repository [linfan/employees] (len: 1) Sending p_w_picpath list ... Pushing tag for rev [5577d6743652] on {https://cdn-registry-1.docker.io/v1/repositories/linfan/employees/tags/latest} 提交完成後,在其餘節點就可使用 docker pull 命令獲取到這個鏡像了。 注意:嚴格來講,將數據庫服務容器經過Docker Link暴露給應用服務容器的方法並不符合分佈式應用的12條準則,由於經過Docker Link鏈接的兩個容器必須運行在同一個物理主機上,數據與應用不能在集羣中分別獨立的部署或橫向擴展。 search 使用方法: docker search TERM 使用說明: 經過關鍵字搜索分享的Image。
本地鏡像管理
docker p_w_picpaths #列出全部的鏡像 docker rmi p_w_picpath [p_w_picpath...] #刪除鏡像 docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
使用說明: 組合使用用戶名,Image名字,標籤名來組織管理Image。 docker build -t edwardsbean/centos6-jdk1.7 . Dockerfile用來建立一個自定義的p_w_picpath,包含了用戶指定的軟件依賴等。當前目錄下包含Dockerfile,使用命令build來建立新的p_w_picpath,並命名爲edwardsbean/centos6-jdk1.7: (Dockerfile書寫比較重要,須要重點學習) docker history p_w_picpath #列出某個鏡像以前作過的操做 docker save IMAGE_NAME >/directory/p_w_picpath_name.tar #(將某個鏡像導出),導入可以使用docker load < /directory/p_w_picpath_name.tar docker export CONTAINER_ID > /directory/container.tar #(保存當前某個容器的狀態信息),導入可以使用cat /directory/container.tar |docker import - CONTAINER_NAME:tag
其餘命令
docker [info|version] docker info #結合docker vesion一塊兒,能夠隨時使用這個命令把本地的配置信息提供出來,方便Docker的開發者快速定位問題。 docker version #顯示Docker的版本號,API版本號,Git commit, Docker客戶端和後臺進程的Go版本號。