Docker命令

docker

http://www.runoob.com/docker/docker-install-python.html

http://dockone.io/article/102

http://www.runoob.com/docker/docker-resources.html

Clients Hosts Registries

Docker鏡像 Images 用于創(chuàng)建容器的只讀模板,包含容器啟動(dòng)所需的一切信息,包括運(yùn)行程序和配置數(shù)據(jù)

Docker容器 Container Hosts 獨(dú)立的應(yīng)用

Docker客戶(hù)端 Client

Docker主機(jī) Host 一個(gè)物理或者虛擬的機(jī)器用于執(zhí)行Docker守護(hù)進(jìn)程和容器

Docker倉(cāng)庫(kù) Registry 用于保存鏡像

Docker Machine Docker Machine是一個(gè)簡(jiǎn)化Docker安裝的命令行工具,通過(guò)一個(gè)簡(jiǎn)單的命令行即可在相應(yīng)的平臺(tái)上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

  • 三個(gè)組件:

    • Docker Client 是用戶(hù)界面,它支持用戶(hù)與Docker Daemon之間通信。

    • Docker Daemon運(yùn)行于主機(jī)上,處理服務(wù)請(qǐng)求。

    • Docker Index是中央registry,支持擁有公有與私有訪問(wèn)權(quán)限的Docker容器鏡像的備份。

  • 三要素:

    • Docker Containers 容器負(fù)責(zé)應(yīng)用程序的運(yùn)行,包括操作系統(tǒng)、用戶(hù)添加的文件以及元數(shù)據(jù)

    • Docker Images是一個(gè)只讀模板,用來(lái)運(yùn)行Docker容器。

    • DockerFile是文件指令集,用來(lái)說(shuō)明如何自動(dòng)創(chuàng)建Docker鏡像。

Docker Client的是交互層

Docker Daemon負(fù)責(zé)實(shí)際操作:

1, 基于Dockerfile的指令構(gòu)建鏡像Docker Images, 然后推送到中央registry:Docker Index, 以供他人使用, 公有或者私有訪問(wèn)權(quán)限

2,運(yùn)行容器 運(yùn)行容器源于我們?cè)诘谝徊街袆?chuàng)建的鏡像。當(dāng)容器被啟動(dòng)后,一個(gè)讀寫(xiě)層會(huì)被添加到鏡像的頂層。當(dāng)分配到合適的網(wǎng)絡(luò)和IP地址后,需要的應(yīng)用程序就可以在容器中運(yùn)行了。

命令

    docker info

    sudo docker pull busybox   預(yù)構(gòu)建Image
    (busybox是最小的Linux系統(tǒng))

    docker run busybox /bin/echo Hello Docker  運(yùn)行應(yīng)用

    sample_job=$(docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done")   啟動(dòng)sample_job的容器(后臺(tái)模式)

    2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

    這個(gè)長(zhǎng)字符叫做容器ID

    docker logs 2b1b7a428627 查看容器內(nèi)的輸出

    docker logs $sample_job  查看日志

    docker help

    docker ps 查看容器

    docker stop $sample_job 停止容器

    docker restart $sample_job

    docker stop $sample_job;
    docker rm $sample_job

    docker images 查看鏡像列表

    docker search (image-name)

    docker history (image_name)

    docker push (image_name) 將鏡像推送到registry

    docker stats --help 查看docker stats 的用法

容器的使用

docker create # 創(chuàng)建一個(gè)容器但是不啟動(dòng)它
docker run # 創(chuàng)建并啟動(dòng)一個(gè)容器
docker stop # 停止容器運(yùn)行,發(fā)送信號(hào)SIGTERM
docker start # 啟動(dòng)一個(gè)停止?fàn)顟B(tài)的容器
docker restart # 重啟一個(gè)容器
docker rm # 刪除一個(gè)容器
docker kill # 發(fā)送信號(hào)給容器,默認(rèn)SIGKILL
docker attach # 連接(進(jìn)入)到一個(gè)正在運(yùn)行的容器
docker wait # 阻塞到一個(gè)容器,直到容器停止運(yùn)行

獲取容器相關(guān)信息

docker ps # 顯示狀態(tài)為運(yùn)行(Up)的容器
docker ps -a # 顯示所有容器,包括運(yùn)行中(Up)的和退出的(Exited)
docker inspect # 深入容器內(nèi)部獲取容器所有信息
docker logs # 查看容器的日志(stdout/stderr)
docker events # 得到docker服務(wù)器的實(shí)時(shí)的事件
docker port # 顯示容器的端口映射
docker top # 顯示容器的進(jìn)程信息
docker diff # 顯示容器文件系統(tǒng)的前后變化

導(dǎo)出容器

docker cp # 從容器里向外拷貝文件或目錄
docker export # 將容器整個(gè)文件系統(tǒng)導(dǎo)出為一個(gè)tar包,不帶layers、tag等信息

執(zhí)行

docker exec # 在容器里執(zhí)行一個(gè)命令,可以執(zhí)行bash進(jìn)入交互式
運(yùn)行web應(yīng)用

docker run -d -P training/webapp python app.py 運(yùn)行一個(gè)python Flask應(yīng)用

-d  后臺(tái)模式
-P 將容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上。

docker ps 這里多了端口信息。

Docker 開(kāi)放了 5000 端口(默認(rèn) Python Flask 端口)映射到主機(jī)端口 32769 上。
這時(shí)我們可以通過(guò)瀏覽器訪問(wèn)WEB應(yīng)用

runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py -p來(lái)綁定指定端口

docker port 可以查看指定 (ID或者名字)容器的某個(gè)確定端口映射到宿主機(jī)的端口號(hào)。

docker port 7a38a1ad55c6

docker port determined_swanson

docker logs [ID或者名字] 可以查看容器內(nèi)部的標(biāo)準(zhǔn)輸出。

-f:讓 dokcer logs 像使用 tail -f 一樣來(lái)輸出容器內(nèi)部的標(biāo)準(zhǔn)輸出。

docker top determined_swanson 查看容器內(nèi)部運(yùn)行的進(jìn)程

docker inspect determined_swanson 來(lái)查看Docker的底層信息。它會(huì)返回一個(gè) JSON 文件記錄著 Docker 容器的配置和狀態(tài)信息。

docker stop determined_swanson

docker start determined_swanson

docker rm determined_swanson 要先停止再移除

Dickerfile

Docker為我們提供了Dockerfile來(lái)自動(dòng)化構(gòu)建鏡像

所有Dockerfile都必須以FROM命令開(kāi)始。 FROM命令會(huì)指定鏡像基于哪個(gè)基礎(chǔ)鏡像創(chuàng)建,接下來(lái)的命令也會(huì)基于這個(gè)基礎(chǔ)鏡像(譯者注:CentOS和Ubuntu有些命令可是不一樣的)。FROM命令可以多次使用,表示會(huì)創(chuàng)建多個(gè)鏡像。具體語(yǔ)法如下:

FROM <image name>

MAINTAINER <author name> 設(shè)置鏡像作者

RUN 《command》 在shell或者exec的環(huán)境下執(zhí)行的命令。RUN指令會(huì)在新創(chuàng)建的鏡像上添加新的層面,接下來(lái)提交的結(jié)果用在Dockerfile的下一條指令中

ADD 《src》 《destination》 復(fù)制文件指令。它有兩個(gè)參數(shù)<source>和<destination>。destination是容器內(nèi)的路徑。source可以是URL或者是啟動(dòng)配置上下文中的一個(gè)文件。

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

EXPOSE <port>; 指定容器運(yùn)行時(shí)的監(jiān)聽(tīng)端口

鏡像的使用

docker images # 顯示本地所有的鏡像列表
docker import # 從一個(gè)tar包創(chuàng)建一個(gè)鏡像,往往和export結(jié)合使用
docker build # 使用Dockerfile創(chuàng)建鏡像(推薦)
docker commit # 從容器創(chuàng)建鏡像
docker rmi # 刪除一個(gè)鏡像
docker load # 從一個(gè)tar包創(chuàng)建一個(gè)鏡像,和save配合使用
docker save # 將一個(gè)鏡像保存為一個(gè)tar包,帶layers和tag信息
docker history # 顯示生成一個(gè)鏡像的歷史命令
docker tag # 為鏡像起一個(gè)別名

docker images

REPOSTITORY:表示鏡像的倉(cāng)庫(kù)源

TAG:鏡像的標(biāo)簽

IMAGE ID:鏡像ID

CREATED:鏡像創(chuàng)建時(shí)間

SIZE:鏡像大小

同一倉(cāng)庫(kù)源可以有多個(gè) TAG,代表這個(gè)倉(cāng)庫(kù)源的不同個(gè)版本,如ubuntu倉(cāng)庫(kù)源里,有15.10、14.04等多個(gè)不同的版本,我們使用 REPOSTITORY:TAG 來(lái)定義不同的鏡像。

指定使用ubuntu:15.10倉(cāng)庫(kù)源

docker run -t -i ubuntu:15.10 /bin/bash

-t:在新容器內(nèi)指定一個(gè)偽終端或終端。

-i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互。

exist 退出
  • 構(gòu)建新的鏡像

當(dāng)我們?cè)诒镜刂鳈C(jī)上使用一個(gè)不存在的鏡像時(shí) Docker 就會(huì)自動(dòng)下載這個(gè)鏡像。如果我們想預(yù)先下載這個(gè)鏡像,我們可以使用 docker pull 命令來(lái)下載它。

docker pull ubuntu:13.10

  • 查找鏡像

我們可以從 Docker Hub 網(wǎng)站來(lái)搜索鏡像,Docker Hub 網(wǎng)址為: https://hub.docker.com/

docker search httpd

NAME:鏡像倉(cāng)庫(kù)源的名稱(chēng)

DESCRIPTION:鏡像的描述

OFFICIAL:是否docker官方發(fā)布
  • 創(chuàng)建鏡像

當(dāng)我們從docker鏡像倉(cāng)庫(kù)中下載的鏡像不能滿(mǎn)足我們的需求時(shí),我們可以通過(guò)以下兩種方式對(duì)鏡像進(jìn)行更改。

1.從已經(jīng)創(chuàng)建的容器中更新鏡像,并且提交這個(gè)鏡像
2.使用 Dockerfile 指令來(lái)創(chuàng)建一個(gè)新的鏡像
  • 更新鏡像

docker run -t -i ubuntu:15.10 /bin/bash

在運(yùn)行的容器內(nèi)使用 apt-get update 命令進(jìn)行更新。 exist退出

docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 提交容器副本

-m:提交的描述信息

-a:指定鏡像作者

e218edb10161:容器ID

runoob/ubuntu:v2:指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名:標(biāo)簽

docker images

docker run -t -i runoob/ubuntu:v2 /bin/bash

  • 構(gòu)建鏡像

們使用命令 docker build , 從零開(kāi)始來(lái)創(chuàng)建一個(gè)新的鏡像。為此,我們需要?jiǎng)?chuàng)建一個(gè) Dockerfile 文件,其中包含一組指令來(lái)告訴 Docker 如何構(gòu)建我們的鏡像。

每一個(gè)指令都會(huì)在鏡像上創(chuàng)建一個(gè)新的層,每一個(gè)指令的前綴都必須是大寫(xiě)的。

第一條FROM,指定使用哪個(gè)鏡像源

RUN 指令告訴docker 在鏡像內(nèi)執(zhí)行命令,安裝了什么。。。

然后,我們使用 Dockerfile 文件,通過(guò) docker build 命令來(lái)構(gòu)建一個(gè)鏡像。

ROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

docker build -t runoob/centos:6.7 .

參數(shù)說(shuō)明:

-t :指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名

. :Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對(duì)路徑

docker images

我們可以使用新的鏡像來(lái)創(chuàng)建容器

run -t -i runoob/centos:6.7 /bin/bash

  • 鏡像標(biāo)簽

docker tag 860c279d2fec runoob/centos:dev

容器連接

docker run -d -P training/webapp python app.py

-P 參數(shù)創(chuàng)建一個(gè)容器,使用 docker ps 來(lái)看到端口5000綁定主機(jī)端口32768。

我們也可以使用 -p 標(biāo)識(shí)來(lái)指定容器端口綁定到主機(jī)端口。

兩種方式的區(qū)別是:

-P :是容器內(nèi)部端口隨機(jī)映射到主機(jī)的高端口。
-p : 是容器內(nèi)部端口綁定到指定的主機(jī)端口


docker run -d -p 5000:5000 training/webapp python app.py

另外,我們可以指定容器綁定的網(wǎng)絡(luò)地址,比如綁定127.0.0.1。

docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py

上面的例子中,默認(rèn)都是綁定 tcp 端口,如果要綁定 UDP 端口,可以在端口后面加上 /udp。

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

docker port 命令可以讓我們快捷地查看端口的綁定情況。

docker port adoring_stonebraker 5002
  • Docker容器連接

端口映射并不是唯一把 docker 連接到另一個(gè)容器的方法。

docker有一個(gè)連接系統(tǒng)允許將多個(gè)容器連接在一起,共享連接信息。

docker連接會(huì)創(chuàng)建一個(gè)父子關(guān)系,其中父容器可以看到子容器的信息。

當(dāng)我們創(chuàng)建一個(gè)容器的時(shí)候,docker會(huì)自動(dòng)對(duì)它進(jìn)行命名。另外,我們也可以使用--name標(biāo)識(shí)來(lái)命名容器

docker run -d -P --name runoob training/webapp python app.py

Docker Registry

docker login # 登錄到一個(gè)registry
docker search # 從registry倉(cāng)庫(kù)搜索鏡像
docker pull # 從倉(cāng)庫(kù)下載鏡像到本地
docker push # 將一個(gè)鏡像push到registry倉(cāng)庫(kù)中

Docker Registry。它是所有倉(cāng)庫(kù)(包括共有和私有)以及工作流的中央Registry。在深入Docker Registry之前,讓我們先去看看一些常見(jiàn)的術(shù)語(yǔ)和與倉(cāng)庫(kù)相關(guān)的概念。

Repositories(倉(cāng)庫(kù))可以被標(biāo)記為喜歡或者像書(shū)簽一樣標(biāo)記起來(lái)
用戶(hù)可以在倉(cāng)庫(kù)下評(píng)論。
私有倉(cāng)庫(kù)和共有倉(cāng)庫(kù)類(lèi)似,不同之處在于前者不會(huì)在搜索結(jié)果中顯示,也沒(méi)有訪問(wèn)它的權(quán)限。只有用戶(hù)設(shè)置為合作者才能訪問(wèn)私有倉(cāng)庫(kù)。
成功推送之后配置webhooks。

Docker Registry有三個(gè)角色,分別是index、registry和registry client。

Docker 安裝 Python

  • 官方鏡像

docker search python

docker pull python:2.7

在~/python/myapp目錄下創(chuàng)建一個(gè) helloworld.py 文件,代碼如下:

#!/usr/bin/python
print("Hello, World!");

運(yùn)行容器

runoob@runoob:~/python$ docker run  -v $PWD/myapp:/usr/src/myapp  -w /usr/src/myapp python:3.5 python helloworld.py

命令說(shuō)明:

-v $PWD/myapp:/usr/src/myapp :將主機(jī)中當(dāng)前目錄下的myapp掛載到容器的/usr/src/myapp

-w /usr/src/myapp :指定容器的/usr/src/myapp目錄為工作目錄

python helloworld.py :使用容器的python命令來(lái)執(zhí)行工作目錄中的helloworld.py文件

輸出結(jié)果:

Hello, World!
  • Dockerfile

創(chuàng)建Dockerfile

首先,創(chuàng)建目錄python,用于存放后面的相關(guān)東西。

 mkdir -p ~/python ~/python/myapp
 
 myapp目錄將映射為python容器配置的應(yīng)用目錄

 cd ~/python
 
 vim Dockerfile
 
 docker build -t python:3.5 

DockerFile

Dockerfile

Dockerfile是docker構(gòu)建鏡像的基礎(chǔ),也是docker區(qū)別于其他容器的重要特征,正是有了Dockerfile,docker的自動(dòng)化和可移植性才成為可能。

不論是開(kāi)發(fā)還是運(yùn)維,學(xué)會(huì)編寫(xiě)Dockerfile幾乎是必備的,這有助于你理解整個(gè)容器的運(yùn)行。
FROM , 從一個(gè)基礎(chǔ)鏡像構(gòu)建新的鏡像

FROM ubuntu

MAINTAINER , 維護(hù)者信息

MAINTAINER William wlj@nicescale.com

ENV , 設(shè)置環(huán)境變量

ENV TEST 1

RUN , 非交互式運(yùn)行shell命令

RUN apt-get -y update
RUN apt-get -y install nginx

ADD , 將外部文件拷貝到鏡像里,src可以為url

ADD http://nicescale.com/ /data/nicescale.tgz

WORKDIR /path/to/workdir, 設(shè)置工作目錄

WORKDIR /var/www

USER , 設(shè)置用戶(hù)ID

USER nginx

VULUME <#dir>, 設(shè)置volume

VOLUME [‘/data’]

EXPOSE , 暴露哪些端口

EXPOSE 80 443

ENTRYPOINT [‘executable’, ‘param1’,’param2’]執(zhí)行命令

ENTRYPOINT ["/usr/sbin/nginx"]

CMD [“param1”,”param2”]

CMD ["start"]

docker創(chuàng)建、啟動(dòng)container時(shí)執(zhí)行的命令,如果設(shè)置了ENTRYPOINT,則CMD將作為參數(shù)
Dockerfile最佳實(shí)踐

盡量將一些常用不變的指令放到前面
CMD和ENTRYPOINT盡量使用json數(shù)組方式

通過(guò)Dockerfile構(gòu)建image

docker build csphere/nginx:1.7 .

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 知道有些人費(fèi)勁九牛二虎之力也裝不了Kitematic但你可以使用命令來(lái)使用docker。(假設(shè)你的終端可以執(zhí)行do...
    _我和你一樣閱讀 10,683評(píng)論 0 0
  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,876評(píng)論 15 147
  • 五、Docker 端口映射 無(wú)論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問(wèn)不到的。此外,除了...
    R_X閱讀 1,972評(píng)論 0 7
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,772評(píng)論 0 120
  • 看似溫和的老媽有時(shí)候也是蠻毒舌的。 Part 1:那是因?yàn)槟阈叵麓拱?我:(叉腰看肚子)媽?zhuān)次业男《亲樱以趺从X(jué)...
    leelooyes閱讀 356評(píng)論 0 1

友情鏈接更多精彩內(nèi)容