溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker的知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2022-05-26 15:58:12 來(lái)源:億速云 閱讀:190 作者:iii 欄目:大數(shù)據(jù)

今天小編給大家分享一下Docker的知識(shí)點(diǎn)有哪些的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

一、docker 簡(jiǎn)介

docker 兩個(gè)主要部件:

docker: 開源的容器虛擬化平臺(tái)docker hub: 用于分享、管理 docker 容器的 docker saas 平臺(tái) -- docker hub

docker 使用客戶端-服務(wù)器 (c/s) 架構(gòu)模式。docker 客戶端會(huì)與 docker 守護(hù)進(jìn)程進(jìn)行通信。docker 守護(hù)進(jìn)程會(huì)處理復(fù)雜繁重的任務(wù),例如建立、運(yùn)行、發(fā)布你的 docker 容器。docker 客戶端和守護(hù)進(jìn)程可以運(yùn)行在同一個(gè)系統(tǒng)上,當(dāng)然你也可以使用 docker 客戶端去連接一個(gè)遠(yuǎn)程的 docker 守護(hù)進(jìn)程。docker 客戶端和守護(hù)進(jìn)程之間通過(guò) socket 或者 restful api 進(jìn)行通信。

Docker的知識(shí)點(diǎn)有哪些

1.1 docker 守護(hù)進(jìn)程

如上圖所示,docker 守護(hù)進(jìn)程運(yùn)行在一臺(tái)主機(jī)上。用戶并不直接和守護(hù)進(jìn)程進(jìn)行交互,而是通過(guò) docker 客戶端間接和其通信。

1.2 docker 客戶端

docker 客戶端,實(shí)際上是 docker 的二進(jìn)制程序,是主要的用戶與 docker 交互方式。它接收用戶指令并且與背后的 docker 守護(hù)進(jìn)程通信,如此來(lái)回往復(fù)。

1.3 docker 內(nèi)部

要理解 docker 內(nèi)部構(gòu)建,需要理解以下三種部件:

docker 鏡像 - docker imagesdocker 倉(cāng)庫(kù) - docker registeriesdocker 容器 - docker containersdocker 鏡像

docker 鏡像是 docker 容器運(yùn)行時(shí)的只讀模板,每一個(gè)鏡像由一系列的層 (layers) 組成。docker 使用 unionfs 來(lái)將這些層聯(lián)合到單獨(dú)的鏡像中。unionfs 允許獨(dú)立文件系統(tǒng)中的文件和文件夾(稱之為分支)被透明覆蓋,形成一個(gè)單獨(dú)連貫的文件系統(tǒng)。正因?yàn)橛辛诉@些層的存在,docker 是如此的輕量。當(dāng)你改變了一個(gè) docker 鏡像,比如升級(jí)到某個(gè)程序到新的版本,一個(gè)新的層會(huì)被創(chuàng)建。因此,不用替換整個(gè)原先的鏡像或者重新建立(在使用虛擬機(jī)的時(shí)候你可能會(huì)這么做),只是一個(gè)新 的層被添加或升級(jí)了?,F(xiàn)在你不用重新發(fā)布整個(gè)鏡像,只需要升級(jí),層使得分發(fā) docker 鏡像變得簡(jiǎn)單和快速。

docker 倉(cāng)庫(kù)

docker 倉(cāng)庫(kù)用來(lái)保存鏡像,可以理解為代碼控制中的代碼倉(cāng)庫(kù)。同樣的,docker 倉(cāng)庫(kù)也有公有和私有的概念。公有的 docker 倉(cāng)庫(kù)名字是 docker hub。docker hub 提供了龐大的鏡像集合供使用。這些鏡像可以是自己創(chuàng)建,或者在別人的鏡像基礎(chǔ)上創(chuàng)建。docker 倉(cāng)庫(kù)是 docker 的分發(fā)部分。

docker 容器

docker 容器和文件夾很類似,一個(gè)docker容器包含了所有的某個(gè)應(yīng)用運(yùn)行所需要的環(huán)境。每一個(gè) docker 容器都是從 docker 鏡像創(chuàng)建的。docker 容器可以運(yùn)行、開始、停止、移動(dòng)和刪除。每一個(gè) docker 容器都是獨(dú)立和安全的應(yīng)用平臺(tái),docker 容器是 docker 的運(yùn)行部分。

1.4 libcontainer

docker 從 0.9 版本開始使用 libcontainer 替代 lxc,libcontainer 和 linux 系統(tǒng)的交互圖如下:

Docker的知識(shí)點(diǎn)有哪些

圖片來(lái)源: docker 0.9: introducing execution drivers and libcontainer

1.5 命名空間「namespaces」

pid namespace

不同用戶的進(jìn)程就是通過(guò) pid namespace 隔離開的,且不同 namespace 中可以有相同 pid。具有以下特征:

每個(gè) namespace 中的 pid 是有自己的 pid=1 的進(jìn)程(類似 /sbin/init 進(jìn)程)

每個(gè) namespace 中的進(jìn)程只能影響自己的同一個(gè) namespace 或子 namespace 中的進(jìn)程

因?yàn)?/proc 包含正在運(yùn)行的進(jìn)程,因此在 container 中的 pseudo-filesystem 的 /proc 目錄只能看到自己 namespace 中的進(jìn)程

因?yàn)?namespace 允許嵌套,父 namespace 可以影響子 namespace 的進(jìn)程,所以子 namespace 的進(jìn)程可以在父 namespace 中看到,但是具有不同的 pid

參考文檔:introduction to linux namespaces – part 3: pid

mnt namespace

類似 chroot,將一個(gè)進(jìn)程放到一個(gè)特定的目錄執(zhí)行。mnt namespace 允許不同 namespace 的進(jìn)程看到的文件結(jié)構(gòu)不同,這樣每個(gè) namespace 中的進(jìn)程所看到的文件目錄就被隔離開了。同 chroot 不同,每個(gè) namespace 中的 container 在 /proc/mounts 的信息只包含所在 namespace 的 mount point。

net namespace

網(wǎng)絡(luò)隔離是通過(guò) net namespace 實(shí)現(xiàn)的, 每個(gè) net namespace 有獨(dú)立的 network devices, ip addresses, ip routing tables, /proc/net 目錄。這樣每個(gè) container 的網(wǎng)絡(luò)就能隔離開來(lái)。 docker 默認(rèn)采用 veth 的方式將 container 中的虛擬網(wǎng)卡同 host 上的一個(gè) docker bridge 連接在一起。

參考文檔:introduction to linux namespaces – part 5: net

uts namespace

uts ("unix time-sharing system") namespace 允許每個(gè) container 擁有獨(dú)立的 hostname 和 domain name, 使其在網(wǎng)絡(luò)上可以被視作一個(gè)獨(dú)立的節(jié)點(diǎn)而非 host 上的一個(gè)進(jìn)程。

參考文檔:introduction to linux namespaces – part 1: uts

ipc namespace

container 中進(jìn)程交互還是采用 linux 常見(jiàn)的進(jìn)程間交互方法 (interprocess communication - ipc), 包括常見(jiàn)的信號(hào)量、消息隊(duì)列和共享內(nèi)存。然而同 vm 不同,container 的進(jìn)程間交互實(shí)際上還是 host 上具有相同 pid namespace 中的進(jìn)程間交互,因此需要在ipc資源申請(qǐng)時(shí)加入 namespace 信息 - 每個(gè) ipc 資源有一個(gè)唯一的 32bit id。

參考文檔:introduction to linux namespaces – part 2: ipc

user namespace

每個(gè) container 可以有不同的 user 和 group id, 也就是說(shuō)可以以 container 內(nèi)部的用戶在 container 內(nèi)部執(zhí)行程序而非 host 上的用戶。

有了以上 6 種 namespace 從進(jìn)程、網(wǎng)絡(luò)、ipc、文件系統(tǒng)、uts 和用戶角度的隔離,一個(gè) container 就可以對(duì)外展現(xiàn)出一個(gè)獨(dú)立計(jì)算機(jī)的能力,并且不同 container 從 os 層面實(shí)現(xiàn)了隔離。 然而不同 namespace 之間資源還是相互競(jìng)爭(zhēng)的,仍然需要類似 ulimit 來(lái)管理每個(gè) container 所能使用的資源 - cgroup。

referencedocker getting start: related knowledgedocker 介紹以及其相關(guān)術(shù)語(yǔ)、底層原理和技術(shù)

1.6 資源配額「cgroups」

cgroups 實(shí)現(xiàn)了對(duì)資源的配額和度量。 cgroups 的使用非常簡(jiǎn)單,提供類似文件的接口,在 /cgroup 目錄下新建一個(gè)文件夾即可新建一個(gè) group,在此文件夾中新建 task 文件,并將 pid 寫入該文件,即可實(shí)現(xiàn)對(duì)該進(jìn)程的資源控制。具體的資源配置選項(xiàng)可以在該文件夾中新建子 subsystem ,{子系統(tǒng)前綴}.{資源項(xiàng)} 是典型的配置方法, 如 memory.usageinbytes 就定義了該 group 在 subsystem memory 中的一個(gè)內(nèi)存限制選項(xiàng)。 另外,cgroups 中的 subsystem 可以隨意組合,一個(gè) subsystem 可以在不同的 group 中,也可以一個(gè) group 包含多個(gè) subsystem - 也就是說(shuō)一個(gè) subsystem。

memory內(nèi)存相關(guān)的限制

cpu在 cgroup 中,并不能像硬件虛擬化方案一樣能夠定義 cpu 能力,但是能夠定義 cpu 輪轉(zhuǎn)的優(yōu)先級(jí),因此具有較高 cpu 優(yōu)先級(jí)的進(jìn)程會(huì)更可能得到 cpu 運(yùn)算。 通過(guò)將參數(shù)寫入 cpu.shares ,即可定義改 cgroup 的 cpu 優(yōu)先級(jí) - 這里是一個(gè)相對(duì)權(quán)重,而非絕對(duì)值blkioblock io 相關(guān)的統(tǒng)計(jì)和限制,byte/operation 統(tǒng)計(jì)和限制 (iops 等),讀寫速度限制等,但是這里主要統(tǒng)計(jì)的都是同步 io

devices設(shè)備權(quán)限限制

參考文檔:how to use cgroup

二、docker 安裝

docker 的相關(guān)安裝方法這里不作介紹,具體安裝參考 官檔

獲取當(dāng)前 docker 版本

$ sudo docker version
client version: 1.3.2
client api version: 1.15
go version (client): go1.3.3
git commit (client): 39fa2fa/1.3.2
os/arch (client): linux/amd64
server version: 1.3.2
server api version: 1.15
go version (server): go1.3.3
git commit (server): 39fa2fa/1.3.2

三、docker 基礎(chǔ)用法

docker hub : docker鏡像首頁(yè),包括官方鏡像和其它公開鏡像

因?yàn)閲?guó)情的原因,國(guó)內(nèi)下載 docker hub 官方的相關(guān)鏡像比較慢,可以使用 docker.cn 鏡像,鏡像保持和官方一致,關(guān)鍵是速度塊,推薦使用。

3.1 search images

$ sudo docker search ubuntu

3.2 pull images

$ sudo docker pull ubuntu # 獲取 ubuntu 官方鏡像 $ sudo docker images # 查看當(dāng)前鏡像列表

3.3 running an interactive shell

$ sudo docker run -i -t ubuntu:14.04 /bin/bash

docker run - 運(yùn)行一個(gè)容器-t - 分配一個(gè)(偽)tty (link is external)-i - 交互模式 (so we can interact with it)ubuntu:14.04 - 使用 ubuntu 基礎(chǔ)鏡像 14.04/bin/bash - 運(yùn)行命令 bash shell

注: ubuntu 會(huì)有多個(gè)版本,通過(guò)指定 tag 來(lái)啟動(dòng)特定的版本 [image]:[tag]

$ sudo docker ps # 查看當(dāng)前運(yùn)行的容器, ps -a 列出當(dāng)前系統(tǒng)所有的容器 container id  image    command    created    status    ports    names
6c9129e9df10  ubuntu:14.04  /bin/bash 6 minutes ago  up 6 minutes       cranky_babbage

3.4 相關(guān)快捷鍵退出:

ctrl-dorexit

detach:ctrl-p + ctrl-q

attach:docker attach container-id

四、docker 命令幫助

4.1 dockerhelp

docker command

$ sudo docker # docker 命令幫助

commands:
 attach attach to a running container     # 當(dāng)前 shell 下 attach 連接指定運(yùn)行鏡像
 build  build an image from a dockerfile    # 通過(guò) dockerfile 定制鏡像
 commit create a new image from a container's changes # 提交當(dāng)前容器為新的鏡像
 cp  copy files/folders from the containers filesystem to the host path
    # 從容器中拷貝指定文件或者目錄到宿主機(jī)中
 create create a new container      # 創(chuàng)建一個(gè)新的容器,同 run,但不啟動(dòng)容器
 diff  inspect changes on a container's filesystem # 查看 docker 容器變化
 events get real time events from the server   # 從 docker 服務(wù)獲取容器實(shí)時(shí)事件
 exec  run a command in an existing container  # 在已存在的容器上運(yùn)行命令
 export stream the contents of a container as a tar archive 
    # 導(dǎo)出容器的內(nèi)容流作為一個(gè) tar 歸檔文件[對(duì)應(yīng) import ]
 history show the history of an image     # 展示一個(gè)鏡像形成歷史
 images list images         # 列出系統(tǒng)當(dāng)前鏡像
 import create a new filesystem image from the contents of a tarball 
    # 從tar包中的內(nèi)容創(chuàng)建一個(gè)新的文件系統(tǒng)映像[對(duì)應(yīng) export]
 info  display system-wide information    # 顯示系統(tǒng)相關(guān)信息
 inspect return low-level information on a container # 查看容器詳細(xì)信息
 kill  kill a running container      # kill 指定 docker 容器
 load  load an image from a tar archive    # 從一個(gè) tar 包中加載一個(gè)鏡像[對(duì)應(yīng) save]
 login  register or login to the docker registry server 
    # 注冊(cè)或者登陸一個(gè) docker 源服務(wù)器
 logout log out from a docker registry server   # 從當(dāng)前 docker registry 退出
 logs  fetch the logs of a container     # 輸出當(dāng)前容器日志信息
 port  lookup the public-facing port which is nat-ed to private_port
    # 查看映射端口對(duì)應(yīng)的容器內(nèi)部源端口
 pause  pause all processes within a container  # 暫停容器
 ps  list containers        # 列出容器列表
 pull  pull an image or a repository from the docker registry server
    # 從docker鏡像源服務(wù)器拉取指定鏡像或者庫(kù)鏡像
 push  push an image or a repository to the docker registry server
    # 推送指定鏡像或者庫(kù)鏡像至docker源服務(wù)器
 restart restart a running container     # 重啟運(yùn)行的容器
 rm  remove one or more containers     # 移除一個(gè)或者多個(gè)容器
 rmi  remove one or more images     
    # 移除一個(gè)或多個(gè)鏡像[無(wú)容器使用該鏡像才可刪除,否則需刪除相關(guān)容器才可繼續(xù)或 -f 強(qiáng)制刪除]
 run  run a command in a new container
    # 創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令
 save  save an image to a tar archive    # 保存一個(gè)鏡像為一個(gè) tar 包[對(duì)應(yīng) load]
 search search for an image on the docker hub   # 在 docker hub 中搜索鏡像
 start  start a stopped containers     # 啟動(dòng)容器
 stop  stop a running containers      # 停止容器
 tag  tag an image into a repository    # 給源中鏡像打標(biāo)簽
 top  lookup the running processes of a container # 查看容器中運(yùn)行的進(jìn)程信息
 unpause unpause a paused container     # 取消暫停容器
 version show the docker version information   # 查看 docker 版本號(hào)
 wait  block until a container stops, then print its exit code 
    # 截取容器停止時(shí)的退出狀態(tài)值
run 'docker command --help' for more information on a command.

docker option

usage of docker:
 --api-enable-cors=false    enable cors headers in the remote api      # 遠(yuǎn)程 api 中開啟 cors 頭
 -b, --bridge=""      attach containers to a pre-existing network bridge   # 橋接網(wǎng)絡(luò)
           use 'none' to disable container networking
 --bip=""        use this cidr notation address for the network bridge's ip, not compatible with -b
           # 和 -b 選項(xiàng)不兼容,具體沒(méi)有測(cè)試過(guò)
 -d, --daemon=false      enable daemon mode           # daemon 模式
 -d, --debug=false      enable debug mode           # debug 模式
 --dns=[]        force docker to use specific dns servers     # 強(qiáng)制 docker 使用指定 dns 服務(wù)器
 --dns-search=[]      force docker to use specific dns search domains   # 強(qiáng)制 docker 使用指定 dns 搜索域
 -e, --exec-driver="native"    force the docker runtime to use a specific exec driver  # 強(qiáng)制 docker 運(yùn)行時(shí)使用指定執(zhí)行驅(qū)動(dòng)器
 --fixed-cidr=""      ipv4 subnet for fixed ips (ex: 10.20.0.0/16)
           this subnet must be nested in the bridge subnet (which is defined by -b or --bip)
 -g, --group="docker"     group to assign the unix socket specified by -h when running in daemon mode
           use '' (the empty string) to disable setting of a group
 -g, --graph="/var/lib/docker"   path to use as the root of the docker runtime    # 容器運(yùn)行的根目錄路徑
 -h, --host=[]       the socket(s) to bind to in daemon mode     # daemon 模式下 docker 指定綁定方式[tcp or 本地 socket]
           specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
 --icc=true        enable inter-container communication      # 跨容器通信
 --insecure-registry=[]     enable insecure communication with specified registries (no certificate verification for https and enable http fallback) (e.g., localhost:5000 or 10.20.0.0/16)
 --ip="0.0.0.0"       default ip address to use when binding container ports  # 指定監(jiān)聽地址,默認(rèn)所有 ip
 --ip-forward=true      enable net.ipv4.ip_forward         # 開啟轉(zhuǎn)發(fā)
 --ip-masq=true       enable ip masquerading for bridge's ip range
 --iptables=true      enable docker's addition of iptables rules     # 添加對(duì)應(yīng) iptables 規(guī)則
 --mtu=0        set the containers network mtu        # 設(shè)置網(wǎng)絡(luò) mtu
           if no value is provided: default to the default route mtu or 1500 if no default route is available
 -p, --pidfile="/var/run/docker.pid" path to use for daemon pid file       # 指定 pid 文件位置
 --registry-mirror=[]     specify a preferred docker registry mirror     
 -s, --storage-driver=""    force the docker runtime to use a specific storage driver # 強(qiáng)制 docker 運(yùn)行時(shí)使用指定存儲(chǔ)驅(qū)動(dòng)
 --selinux-enabled=false    enable selinux support          # 開啟 selinux 支持
 --storage-opt=[]      set storage driver options         # 設(shè)置存儲(chǔ)驅(qū)動(dòng)選項(xiàng)
 --tls=false       use tls; implied by tls-verify flags      # 開啟 tls
 --tlscacert="/root/.docker/ca.pem"  trust only remotes providing a certificate signed by the ca given here
 --tlscert="/root/.docker/cert.pem"  path to tls certificate file        # tls 證書文件位置
 --tlskey="/root/.docker/key.pem"  path to tls key file          # tls key 文件位置
 --tlsverify=false      use tls and verify the remote (daemon: verify client, client: verify daemon) # 使用 tls 并確認(rèn)遠(yuǎn)程控制主機(jī)
 -v, --version=false     print version information and quit       # 輸出 docker 版本信息

4.2 docker search

$ sudo docker search --help

usage: docker search term

search the docker hub for images # 從 docker hub 搜索鏡像 --automated=false only show automated builds
 --no-trunc=false don't truncate output
 -s, --stars=0 only displays with at least xxx stars

示例:

$ sudo docker search -s 100 ubuntu # 查找 star 數(shù)至少為 100 的鏡像,找出只有官方鏡像 start 數(shù)超過(guò) 100,默認(rèn)不加 s 選項(xiàng)找出所有相關(guān) ubuntu 鏡像 name  description     stars  official automated
ubuntu official ubuntu base image 425 [ok]

4.3 docker info

$ sudo docker info 
containers: 1 # 容器個(gè)數(shù) images: 22 # 鏡像個(gè)數(shù) storage driver: devicemapper # 存儲(chǔ)驅(qū)動(dòng) pool name: docker-8:17-3221225728-pool
 pool blocksize: 65.54 kb
 data file: /data/docker/devicemapper/devicemapper/data
 metadata file: /data/docker/devicemapper/devicemapper/metadata
 data space used: 1.83 gb
 data space total: 107.4 gb
 metadata space used: 2.191 mb
 metadata space total: 2.147 gb
 library version: 1.02.84-rhel7 (2014-03-26) execution driver: native-0.2 # 存儲(chǔ)驅(qū)動(dòng) kernel version: 3.10.0-123.el7.x86_64
operating system: centos linux 7 (core)

4.4 docker pull && docker push

$ sudo docker pull --help # pull 拉取鏡像 usage: docker pull [options] name[:tag] pull an image or a repository from the registry

 -a, --all-tags=false download all tagged images in the repository $ sudo docker push # push 推送指定鏡像 usage: docker push name[:tag] push an image or a repository to the registry

示例:

$ sudo docker pull ubuntu # 下載官方 ubuntu docker 鏡像,默認(rèn)下載所有 ubuntu 官方庫(kù)鏡像 
$ sudo docker pull ubuntu:14.04 # 下載指定版本 ubuntu 官方鏡像
$ sudo docker push 192.168.0.100:5000/ubuntu # 推送鏡像庫(kù)到私有源[可注冊(cè) docker 官方賬戶,推送到官方自有賬戶] $ sudo docker push 192.168.0.100:5000/ubuntu:14.04 # 推送指定鏡像到私有源

4.5 docker images

列出當(dāng)前系統(tǒng)鏡像

$ sudo docker images --help

usage: docker images [options] [name] list images

 -a, --all=false show all images (by default filter out the intermediate image layers) # -a 顯示當(dāng)前系統(tǒng)的所有鏡像,包括過(guò)渡層鏡像,默認(rèn) docker images 顯示最終鏡像,不包括過(guò)渡層鏡像 -f, --filter=[] provide filter values (i.e. 'dangling=true') --no-trunc=false don't truncate output
 -q, --quiet=false only show numeric ids

示例:

$ sudo docker images # 顯示當(dāng)前系統(tǒng)鏡像,不包括過(guò)渡層鏡像 $ sudo docker images -a # 顯示當(dāng)前系統(tǒng)所有鏡像,包括過(guò)渡層鏡像 $ sudo docker images ubuntu # 顯示當(dāng)前系統(tǒng) docker ubuntu 庫(kù)中的所有鏡像 repository     tag     image id   created    virtual size
ubuntu      12.04    ebe4be4dd427 4 weeks ago   210.6 mb
ubuntu      14.04    e54ca5efa2e9 4 weeks ago   276.5 mb
ubuntu      14.04-ssh   6334d3ac099a 7 weeks ago   383.2 mb

4.6 docker rmi

刪除一個(gè)或者多個(gè)鏡像

$ sudo docker rmi --help

usage: docker rmi image [image...] remove one or more images

 -f, --force=false force removal of the image # 強(qiáng)制移除鏡像不管是否有容器使用該鏡像 --no-prune=false do not delete untagged parents # 不要?jiǎng)h除未標(biāo)記的父鏡像

4.7 docker run

$ sudo docker run --help

usage: docker run [options] image [command] [arg...] run a command in a new container

 -a, --attach=[] attach to stdin, stdout or stderr.
 -c, --cpu-shares=0 cpu shares (relative weight) # 設(shè)置 cpu 使用權(quán)重 --cap-add=[] add linux capabilities
 --cap-drop=[] drop linux capabilities
 --cidfile="" write the container id to the file # 把容器 id 寫入到指定文件 --cpuset="" cpus in which to allow execution (0-3, 0,1) # cpu 綁定 -d, --detach=false detached mode: run container in the background, print new container id # 后臺(tái)運(yùn)行容器 --device=[] add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc) --dns=[] set custom dns servers # 設(shè)置 dns --dns-search=[] set custom dns search domains # 設(shè)置 dns 域搜索 -e, --env=[] set environment variables # 定義環(huán)境變量 --entrypoint="" overwrite the default entrypoint of the image # ? --env-file=[] read in a line delimited file of env variables # 從指定文件讀取變量值 --expose=[] expose a port from the container without publishing it to your host # 指定對(duì)外提供服務(wù)端口 -h, --hostname="" container host name # 設(shè)置容器主機(jī)名 -i, --interactive=false keep stdin open even if not attached # 保持標(biāo)準(zhǔn)輸出開啟即使沒(méi)有 attached --link=[] add link to another container (name:alias) # 添加鏈接到另外一個(gè)容器 --lxc-conf=[] (lxc exec-driver only) add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1" -m, --memory="" memory limit (format: <number><optional unit>, where unit = b, k, m or g) # 內(nèi)存限制 --name="" assign a name to the container # 設(shè)置容器名 --net="bridge" set the network mode for the container # 設(shè)置容器網(wǎng)絡(luò)模式 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for this container 'container:<name|id>': reuses another container network stack 'host': use the host network stack inside the container. note: the host mode gives the container full access to local system services such as d-bus and is therefore considered insecure.
 -p, --publish-all=false publish all exposed ports to the host interfaces # 自動(dòng)映射容器對(duì)外提供服務(wù)的端口 -p, --publish=[] publish a container's port to the host    # 指定端口映射 format: ip:hostport:containerport | ip::containerport | hostport:containerport (use 'docker port' to see the actual mapping) --privileged=false give extended privileges to this container # 提供更多的權(quán)限給容器 --restart="" restart policy to apply when a container exits (no, on-failure[:max-retry], always) --rm=false automatically remove the container when it exits (incompatible with -d) # 如果容器退出自動(dòng)移除和 -d 選項(xiàng)沖突 --security-opt=[] security options
 --sig-proxy=true proxify received signals to the process (even in non-tty mode). sigchld is not proxied.
 -t, --tty=false allocate a pseudo-tty # 分配偽終端 -u, --user="" username or uid # 指定運(yùn)行容器的用戶 uid 或者用戶名 -v, --volume=[] bind mount a volume (e.g., from the host: -v /host:/container, from docker: -v /container) # 掛載卷 --volumes-from=[] mount volumes from the specified container(s) # 從指定容器掛載卷 -w, --workdir="" working directory inside the container # 指定容器工作目錄

示例:

$ sudo docker images ubuntu
repository   tag     image id   created    virtual size
ubuntu    14.04    e54ca5efa2e9 4 weeks ago   276.5 mb
... ... $ sudo docker run -t -i -c 100 -m 512mb -h test1 -d --name="docker_test1" ubuntu /bin/bash # 創(chuàng)建一個(gè) cpu 優(yōu)先級(jí)為 100,內(nèi)存限制 512mb,主機(jī)名為 test1,名為 docker_test1 后臺(tái)運(yùn)行 bash 的容器 a424ca613c9f2247cd3ede95adfbaf8d28400cbcb1d5f9b69a7b56f97b2b52e5 $ sudo docker ps 
container id  image   command   created    status    ports  names
a424ca613c9f  ubuntu:14.04 /bin/bash 6 seconds ago  up 5 seconds     docker_test1 $ sudo docker attach docker_test1
root@test1:/# pwd /
root@test1:/# exit exit

關(guān)于cpu優(yōu)先級(jí):

by default all groups have 1024 shares. a group with 100 shares will get a ~10% portion of the cpu time -archlinux cgroups

4.8 docker start|stop|kill... ...

dockerstart|stop|kill|restart|pause|unpause|rm|commit|inspect|logs

docker start container [container...]# 運(yùn)行一個(gè)或多個(gè)停止的容器

docker stop container [container...]
# 停掉一個(gè)或多個(gè)運(yùn)行的容器-t選項(xiàng)可指定超時(shí)時(shí)間

docker kill [options] container [container...]# 默認(rèn) kill 發(fā)送 sigkill 信號(hào)-s可以指定發(fā)送 kill 信號(hào)類型

docker restart [options] container [container...]# 重啟一個(gè)或多個(gè)運(yùn)行的容器-t選項(xiàng)可指定超時(shí)時(shí)間

docker pause container# 暫停一個(gè)容器,方便 commitdocker unpause container# 繼續(xù)暫停的容器

docker rm [options] container [container...]
# 移除一個(gè)或多個(gè)容器

-f, --force=false force removal of running container

-l, --link=false remove the specified link and not the underlying container

-v, --volumes=false remove the volumes associated with the container

docker commit [options] container [repository[:tag]]
# 提交指定容器為鏡像

-a, --author="" author (e.g., "john hannibal smith hannibal@a-team.com")

-m, --message="" commit message

-p, --pause=true pause container during commit# 默認(rèn) commit 是暫停狀態(tài)

docker inspect container|image [container|image...]

# 查看容器或者鏡像的詳細(xì)信息docker logs container# 輸出指定容器日志信息

-f, --follow=false follow log output# 類似 tail -f

-t, --timestamps=false show timestamps

--tail="all" output the specified number of lines at the end of logs (defaults to all logs)

參考文檔:docker run reference

4.9 docker 1.3 新增特性和命令digital signature verification

docker 1.3 版本將使用數(shù)字簽名自動(dòng)驗(yàn)證所有官方庫(kù)的來(lái)源和完整性,如果一個(gè)官方鏡像被篡改或者被破壞,目前 docker 只會(huì)對(duì)這種情況發(fā)出警告而并不阻止容器的運(yùn)行。

docker exec --help

usage: docker exec [options] container command [arg...] run a command in an existing container

 -d, --detach=false detached mode: run command in the background
 -i, --interactive=false keep stdin open even if not attached
 -t, --tty=false allocate a pseudo-tty

為了簡(jiǎn)化調(diào)試,可以使用docker exec命令通過(guò) docker api 和 cli 在運(yùn)行的容器上運(yùn)行程序。

$ docker exec -it ubuntu_bash bash

上例將在容器 ubuntu_bash 中創(chuàng)建一個(gè)新的 bash 會(huì)話。

tune container lifecycles withdocker create

我們可以通過(guò)docker run <image name>命令創(chuàng)建一個(gè)容器并運(yùn)行其中的程序,因?yàn)橛泻芏嘤脩粢髣?chuàng)建容器的時(shí)候不啟動(dòng)容器,所以docker create應(yīng)運(yùn)而生了。

$ docker create -t -i fedora bash6d8af538ec541dd581ebc2a24153a28329acb5268abe5ef868c1f1a261221752

上例創(chuàng)建了一個(gè)可寫的容器層 (并且打印出容器 id),但是并不運(yùn)行它,可以使用以下命令運(yùn)行該容器:

$ docker start -a -i 6d8af538ec5bash-4.2#

security options

通過(guò)--security-opt選項(xiàng),運(yùn)行容器時(shí)用戶可自定義 selinux 和 apparmor 卷標(biāo)和配置。

$ docker run --security-opt label:type:svirt_apache -i -t centos \ bash

上例只允許容器監(jiān)聽在 apache 端口,這個(gè)選項(xiàng)的好處是用戶不需要運(yùn)行 docker 的時(shí)候指定--privileged選項(xiàng),降低安全風(fēng)險(xiǎn)。

參考文檔:docker 1.3: signed images, process injection, security options, mac shared directories

4.10 docker 1.5 新特性

參考文檔:docker 1.5 新特性

五、docker 端口映射

# find ip address of container with id <container_id> 通過(guò)容器 id 獲取 ip $ sudo docker inspect <container_id> | grep ipaddress | cut -d '"' -f 4

無(wú)論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問(wèn)不到的。此外,除了端口只能本地訪問(wèn)外,對(duì)于容器的另外一個(gè)問(wèn)題是這些 ip 在容器每次啟動(dòng)的時(shí)候都會(huì)改變。

docker 解決了容器的這兩個(gè)問(wèn)題,并且給容器內(nèi)部服務(wù)的訪問(wèn)提供了一個(gè)簡(jiǎn)單而可靠的方法。docker 通過(guò)端口綁定主機(jī)系統(tǒng)的接口,允許非本地客戶端訪問(wèn)容器內(nèi)部運(yùn)行的服務(wù)。為了簡(jiǎn)便的使得容器間通信,docker 提供了這種連接機(jī)制。

5.1 自動(dòng)映射端口

-p使用時(shí)需要指定--expose選項(xiàng),指定需要對(duì)外提供服務(wù)的端口

$ sudo docker run -t -p --expose 22 --name server ubuntu:14.04

使用docker run -p自動(dòng)綁定所有對(duì)外提供服務(wù)的容器端口,映射的端口將會(huì)從沒(méi)有使用的端口池中 (49000..49900) 自動(dòng)選擇,你可以通過(guò)docker ps、docker inspect <container_id>或者docker port <container_id> <port>確定具體的綁定信息。

5.2 綁定端口到指定接口

基本語(yǔ)法

$ sudo docker run -p [([<host_interface>:[host_port]])|(<host_port>):]<container_port>[/udp] <image> <cmd>

默認(rèn)不指定綁定 ip 則監(jiān)聽所有網(wǎng)絡(luò)接口。

綁定 tcp 端口

# bind tcp port 8080 of the container to tcp port 80 on 127.0.0.1 of the host machine.
 $ sudo docker run -p 127.0.0.1:80:8080 <image> <cmd> 
# bind tcp port 8080 of the container to a dynamically allocated tcp port on 127.0.0.1 of the host machine. 
$ sudo docker run -p 127.0.0.1::8080 <image> <cmd> 
# bind tcp port 8080 of the container to tcp port 80 on all available interfaces of the host machine.
 $ sudo docker run -p 80:8080 <image> <cmd> 
# bind tcp port 8080 of the container to a dynamically allocated tcp port on all available interfaces 
$ sudo docker run -p 8080 <image> <cmd>

綁定 udp 端口

# bind udp port 5353 of the container to udp port 53 on 127.0.0.1 of the host machine. $ sudo docker run -p 127.0.0.1:53:5353/udp <image> <cmd>

六、docker 網(wǎng)絡(luò)配置

Docker的知識(shí)點(diǎn)有哪些

圖: docker - container and lightweight virtualization

dokcer 通過(guò)使用 linux 橋接提供容器之間的通信,docker0 橋接接口的目的就是方便 docker 管理。當(dāng) docker daemon 啟動(dòng)時(shí)需要做以下操作:

creates the docker0 bridge if not present

# 如果 docker0 不存在則創(chuàng)建

searches for an ip address range which doesn't overlap with an existing route

# 搜索一個(gè)與當(dāng)前路由不沖突的 ip 段

picks an ip in the selected range

# 在確定的范圍中選擇 ip

assigns this ip to the docker0 bridge

# 綁定 ip 到 docker06.1 docker 四種網(wǎng)絡(luò)模式

四種網(wǎng)絡(luò)模式摘自 docker 網(wǎng)絡(luò)詳解及 pipework 源碼解讀與實(shí)踐

docker run 創(chuàng)建 docker 容器時(shí),可以用 --net 選項(xiàng)指定容器的網(wǎng)絡(luò)模式,docker 有以下 4 種網(wǎng)絡(luò)模式:

host 模式,使用 --net=host 指定。

container 模式,使用 --net=container:nameorid 指定。

none 模式,使用 --net=none 指定。

bridge 模式,使用 --net=bridge 指定,默認(rèn)設(shè)置

host 模式

如果啟動(dòng)容器的時(shí)候使用 host 模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的 network namespace,而是和宿主機(jī)共用一個(gè) network namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的 ip 等,而是使用宿主機(jī)的 ip 和端口。

例如,我們?cè)?10.10.101.105/24 的機(jī)器上用 host 模式啟動(dòng)一個(gè)含有 web 應(yīng)用的 docker 容器,監(jiān)聽 tcp 80 端口。當(dāng)我們?cè)谌萜髦袌?zhí)行任何類似 ifconfig 命令查看網(wǎng)絡(luò)環(huán)境時(shí),看到的都是宿主機(jī)上的信息。而外界訪問(wèn)容器中的應(yīng)用,則直接使用 10.10.101.105:80 即可,不用任何 nat 轉(zhuǎn)換,就如直接跑在宿主機(jī)中一樣。但是,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。

container 模式

這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè) network namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的 ip,而是和一個(gè)指定的容器共享 ip、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過(guò) lo 網(wǎng)卡設(shè)備通信。

none模式

這個(gè)模式和前兩個(gè)不同。在這種模式下,docker 容器擁有自己的 network namespace,但是,并不為 docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說(shuō),這個(gè) docker 容器沒(méi)有網(wǎng)卡、ip、路由等信息。需要我們自己為 docker 容器添加網(wǎng)卡、配置 ip 等。

bridge模式

Docker的知識(shí)點(diǎn)有哪些

圖:the container world | part 2 networking

bridge 模式是 docker 默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會(huì)為每一個(gè)容器分配 network namespace、設(shè)置 ip 等,并將一個(gè)主機(jī)上的 docker 容器連接到一個(gè)虛擬網(wǎng)橋上。當(dāng) docker server 啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為 docker0 的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的 docker 容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過(guò)交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。接下來(lái)就要為容器分配 ip 了,docker 會(huì)從 rfc1918 所定義的私有 ip 網(wǎng)段中,選擇一個(gè)和宿主機(jī)不同的ip地址和子網(wǎng)分配給 docker0,連接到 docker0 的容器就從這個(gè)子網(wǎng)中選擇一個(gè)未占用的 ip 使用。如一般 docker 會(huì)使用 172.17.0.0/16 這個(gè)網(wǎng)段,并將 172.17.42.1/16 分配給 docker0 網(wǎng)橋(在主機(jī)上使用 ifconfig 命令是可以看到 docker0 的,可以認(rèn)為它是網(wǎng)橋的管理接口,在宿主機(jī)上作為一塊虛擬網(wǎng)卡使用)

6.2 列出當(dāng)前主機(jī)網(wǎng)橋

$ sudo brctl show # brctl 工具依賴 bridge-utils 軟件包 bridge name bridge id stp enabled interfacesdocker0 8000.000000000000 no

6.3 查看當(dāng)前 docker0 ip

$ sudo ifconfig docker0docker0 link encap:ethernet hwaddr xx:xx:xx:xx:xx:xxinet addr:172.17.42.1 bcast:0.0.0.0 mask:255.255.0.0

在容器運(yùn)行時(shí),每個(gè)容器都會(huì)分配一個(gè)特定的虛擬機(jī)口并橋接到 docker0。每個(gè)容器都會(huì)配置同 docker0 ip 相同網(wǎng)段的專用 ip 地址,docker0 的 ip 地址被用于所有容器的默認(rèn)網(wǎng)關(guān)。

6.4 運(yùn)行一個(gè)容器

$ sudo docker run -t -i -d ubuntu /bin/bash52f811c5d3d69edddefc75aff5a4525fc8ba8bcfa1818132f9dc7d4f7c7e78b4 $ sudo brctl showbridge name bridge id stp enabled interfacesdocker0 8000.fef213db5a66 no vethqcdy1n

以上, docker0 扮演著 52f811c5d3d6 container 這個(gè)容器的虛擬接口 vethqcdy1n interface 橋接的角色。

使用特定范圍的 ip

docker 會(huì)嘗試尋找沒(méi)有被主機(jī)使用的 ip 段,盡管它適用于大多數(shù)情況下,但是它不是萬(wàn)能的,有時(shí)候我們還是需要對(duì) ip 進(jìn)一步規(guī)劃。docker 允許你管理 docker0 橋接或者通過(guò)-b選項(xiàng)自定義橋接網(wǎng)卡,需要安裝bridge-utils軟件包。

基本步驟如下:

ensure docker is stopped

# 確保 docker 的進(jìn)程是停止的

create your own bridge (bridge0 for example)

# 創(chuàng)建自定義網(wǎng)橋

assign a specific ip to this bridge
# 給網(wǎng)橋分配特定的

ipstart docker with the -b=bridge0 parameter

# 以 -b 的方式指定網(wǎng)橋

# stopping docker and removing docker0 $ sudo service docker stop $ sudo ip link set dev docker0 down $ sudo brctl delbr docker0 # create our own bridge $ sudo brctl addbr bridge0 $ sudo ip addr add 192.168.5.1/24 dev bridge0 $ sudo ip link set dev bridge0 up # confirming that our bridge is up and running $ ip addr show bridge0
4: bridge0: <broadcast,multicast> mtu 1500 qdisc noop state up group default
  link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
  inet 192.168.5.1/24 scope global bridge0
    valid_lft forever preferred_lft forever # tell docker about it and restart (on ubuntu) $ echo 'docker_opts="-b=bridge0"' >> /etc/default/docker $ sudo service docker start

參考文檔: network configuration

6.5 不同主機(jī)間容器通信

不同容器之間的通信可以借助于 pipework 這個(gè)工具:

$ git clone https://github.com/jpetazzo/pipework.git$ sudo cp -rp pipework/pipework /usr/local/bin/

安裝相應(yīng)依賴軟件

$ sudo apt-get install iputils-arping bridge-utils -y

橋接網(wǎng)絡(luò)

橋接網(wǎng)絡(luò)可以參考 日常問(wèn)題處理 tips 關(guān)于橋接的配置說(shuō)明,這里不再贅述。

# brctl showbridge name bridge id stp enabled interfacesbr0 8000.000c291412cd no eth0docker0 8000.56847afe9799 no vetheb48029

可以刪除 docker0,直接把 docker 的橋接指定為 br0。也可以保留使用默認(rèn)的配置,這樣單主機(jī)容器之間的通信可以通過(guò) docker0,而跨主機(jī)不同容器之間通過(guò) pipework 新建 docker 容器的網(wǎng)卡橋接到 br0,這樣跨主機(jī)容器之間就可以通信了。

ubuntu

$ sudo service docker stop

$ sudo ip link set dev docker0 down$ sudo brctl delbr docker0

$ echo 'docker_opts="-b=br0"' >> /etc/default/docker

$ sudo service docker start

centos 7/rhel 7

$ sudo systemctl stop docker

$ sudo ip link set dev docker0 down$ sudo brctl delbr docker0

$ cat /etc/sysconfig/docker | grep 'options='options=--selinux-enabled -b=br0 -h fd://

$ sudo systemctl start docker

pipework

Docker的知識(shí)點(diǎn)有哪些

不同容器之間的通信可以借助于 pipework 這個(gè)工具給 docker 容器新建虛擬網(wǎng)卡并綁定 ip 橋接到 br0

$ git clone https://github.com/jpetazzo/pipework.git
$ sudo cp -rp pipework/pipework /usr/local/bin/
$ pipework 
syntax:
pipework <hostinterface> [-i containerinterface] <guest> <ipaddr>/<subnet>[@default_gateway] [macaddr][@vlan]
pipework <hostinterface> [-i containerinterface] <guest> dhcp [macaddr][@vlan]
pipework --wait [-i containerinterface]

如果刪除了默認(rèn)的 docker0 橋接,把 docker 默認(rèn)橋接指定到了 br0,則最好在創(chuàng)建容器的時(shí)候加上--net=none,防止自動(dòng)分配的 ip 在局域網(wǎng)中有沖突。

$ sudo docker run --rm -ti --net=none ubuntu:14.04 /bin/bash
root@a46657528059:/#
$         # ctrl-p + ctrl-q 回到宿主機(jī) shell,容器 detach 狀態(tài)
$ sudo docker ps
container id  image     command    created     status     ports   names
a46657528059  ubuntu:14.04  "/bin/bash"  4 minutes ago  up 4 minutes        hungry_lalande
$ sudo pipework br0 -i eth0 a46657528059 192.168.115.10/24@192.168.115.2 
# 默認(rèn)不指定網(wǎng)卡設(shè)備名,則默認(rèn)添加為 eth1
# 另外 pipework 不能添加靜態(tài)路由,如果有需求則可以在 run 的時(shí)候加上 --privileged=true 權(quán)限在容器中手動(dòng)添加,
# 但這種安全性有缺陷,可以通過(guò) ip netns 操作
$ sudo docker attach a46657528059
root@a46657528059:/# ifconfig eth0
eth0   link encap:ethernet hwaddr 86:b6:6b:e8:2e:4d 
     inet addr:192.168.115.10 bcast:0.0.0.0 mask:255.255.255.0
     inet6 addr: fe80::84b6:6bff:fee8:2e4d/64 scope:link
     up broadcast running multicast mtu:1500 metric:1
     rx packets:8 errors:0 dropped:0 overruns:0 frame:0
     tx packets:9 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1000 
     rx bytes:648 (648.0 b) tx bytes:690 (690.0 b)

root@a46657528059:/# route -n
kernel ip routing table
destination   gateway     genmask     flags metric ref  use iface
0.0.0.0     192.168.115.2  0.0.0.0     ug  0   0    0 eth0
192.168.115.0  0.0.0.0     255.255.255.0  u   0   0

使用ip netns添加靜態(tài)路由,避免創(chuàng)建容器使用--privileged=true選項(xiàng)造成一些不必要的安全問(wèn)題:

$ docker inspect --format="{{ .state.pid }}" a46657528059 # 獲取指定容器 pid
6350
$ sudo ln -s /proc/6350/ns/net /var/run/netns/6350
$ sudo ip netns exec 6350 ip route add 192.168.0.0/16 dev eth0 via 192.168.115.2
$ sudo ip netns exec 6350 ip route  # 添加成功
192.168.0.0/16 via 192.168.115.2 dev eth0 
... ...

在其它宿主機(jī)進(jìn)行相應(yīng)的配置,新建容器并使用 pipework 添加虛擬網(wǎng)卡橋接到 br0,測(cè)試通信情況即可。

另外,pipework 可以創(chuàng)建容器的 vlan 網(wǎng)絡(luò),這里不作過(guò)多的介紹了,官方文檔已經(jīng)寫的很清楚了,可以查看以下兩篇文章:

pipework 官方文檔docker 網(wǎng)絡(luò)詳解及 pipework 源碼解讀與實(shí)踐七、dockerfile

docker 可以通過(guò) dockerfile 的內(nèi)容來(lái)自動(dòng)構(gòu)建鏡像。dockerfile 是一個(gè)包含創(chuàng)建鏡像所有命令的文本文件,通過(guò)docker build命令可以根據(jù) dockerfile 的內(nèi)容構(gòu)建鏡像,在介紹如何構(gòu)建之前先介紹下 dockerfile 的基本語(yǔ)法結(jié)構(gòu)。

dockerfile 有以下指令選項(xiàng):

  1. from

  2. maintainer

  3. run

  4. cmd

  5. expose

  6. env

  7. add

  8. copy

  9. entrypoint

  10. volume

  11. user

  12. workdir

  13. onbuild

7.1 from

用法:

from <image>

或者

from <image>

  1. from指定構(gòu)建鏡像的基礎(chǔ)源鏡像,如果本地沒(méi)有指定的鏡像,則會(huì)自動(dòng)從 docker 的公共庫(kù) pull 鏡像下來(lái)。

  2. from必須是 dockerfile 中非注釋行的第一個(gè)指令,即一個(gè) dockerfile 從from語(yǔ)句開始。

  3. from可以在一個(gè) dockerfile 中出現(xiàn)多次,如果有需求在一個(gè) dockerfile 中創(chuàng)建多個(gè)鏡像。

  4. 如果from語(yǔ)句沒(méi)有指定鏡像標(biāo)簽,則默認(rèn)使用latest標(biāo)簽。

7.2 maintainer

用法:

maintainer <name>

指定創(chuàng)建鏡像的用戶

run 有兩種使用方式

run

run "executable", "param1", "param2"

每條run指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令,并提交為新的鏡像,后續(xù)的run都在之前run提交后的鏡像為基礎(chǔ),鏡像是分層的,可以通過(guò)一個(gè)鏡像的任何一個(gè)歷史提交點(diǎn)來(lái)創(chuàng)建,類似源碼的版本控制。

exec 方式會(huì)被解析為一個(gè) json 數(shù)組,所以必須使用雙引號(hào)而不是單引號(hào)。exec 方式不會(huì)調(diào)用一個(gè)命令 shell,所以也就不會(huì)繼承相應(yīng)的變量,如:

run [ "echo", "$home" ]

這種方式是不會(huì)達(dá)到輸出 home 變量的,正確的方式應(yīng)該是這樣的

run [ "sh", "-c", "echo", "$home" ]

run產(chǎn)生的緩存在下一次構(gòu)建的時(shí)候是不會(huì)失效的,會(huì)被重用,可以使用--no-cache選項(xiàng),即docker build --no-cache,如此便不會(huì)緩存。

7.3 cmd

cmd有三種使用方式:

cmd "executable","param1","param2"cmd "param1","param2"cmd command param1 param2 (shell form)

cmd指定在 dockerfile 中只能使用一次,如果有多個(gè),則只有最后一個(gè)會(huì)生效。

cmd的目的是為了在啟動(dòng)容器時(shí)提供一個(gè)默認(rèn)的命令執(zhí)行選項(xiàng)。如果用戶啟動(dòng)容器時(shí)指定了運(yùn)行的命令,則會(huì)覆蓋掉cmd指定的命令。

cmd會(huì)在啟動(dòng)容器的時(shí)候執(zhí)行,build 時(shí)不執(zhí)行,而run只是在構(gòu)建鏡像的時(shí)候執(zhí)行,后續(xù)鏡像構(gòu)建完成之后,啟動(dòng)容器就與run無(wú)關(guān)了,這個(gè)初學(xué)者容易弄混這個(gè)概念,這里簡(jiǎn)單注解一下。

7.4 expose

expose <port> [<port>...]

告訴 docker 服務(wù)端容器對(duì)外映射的本地端口,需要在 docker run 的時(shí)候使用-p或者-p選項(xiàng)生效。

7.5 env

env <key> <value> # 只能設(shè)置一個(gè)變量env <key>=<value> ... # 允許一次設(shè)置多個(gè)變量

指定一個(gè)環(huán)節(jié)變量,會(huì)被后續(xù)run指令使用,并在容器運(yùn)行時(shí)保留。

例子:

env myname="john doe" mydog=rex\ the\ dog \ mycat=fluffy

等同于

env myname john doeenv mydog rex the dogenv mycat fluffy

7.6 add

add <src>... <dest>

add復(fù)制本地主機(jī)文件、目錄或者遠(yuǎn)程文件 urls 從 并且添加到容器指定路徑中 。

支持通過(guò) go 的正則模糊匹配,具體規(guī)則可參見(jiàn) go filepath.match

add hom* /mydir/ # adds all files starting with "hom"add hom?.txt /mydir/ # ? is replaced with any single character

路徑必須是絕對(duì)路徑,如果 不存在,會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)目錄路徑必須是 dockerfile 所在路徑的相對(duì)路徑如果是一個(gè)目錄,只會(huì)復(fù)制目錄下的內(nèi)容,而目錄本身則不會(huì)被復(fù)制7.7 copy

copy <src>... <dest>

copy復(fù)制新文件或者目錄從 并且添加到容器指定路徑中 。用法同add,唯一的不同是不能指定遠(yuǎn)程文件 urls。

7.8 entrypointentrypoint "executable", "param1", "param2"entrypoint command param1 param2 (shell form)

配置容器啟動(dòng)后執(zhí)行的命令,并且不可被 docker run 提供的參數(shù)覆蓋,而cmd是可以被覆蓋的。如果需要覆蓋,則可以使用docker run --entrypoint選項(xiàng)。

每個(gè) dockerfile 中只能有一個(gè)entrypoint,當(dāng)指定多個(gè)時(shí),只有最后一個(gè)生效。

exec form entrypoint 例子

通過(guò)entrypoint使用 exec form 方式設(shè)置穩(wěn)定的默認(rèn)命令和選項(xiàng),而使用cmd添加默認(rèn)之外經(jīng)常被改動(dòng)的選項(xiàng)。

from ubuntuentrypoint ["top", "-b"]cmd ["-c"]

通過(guò) dockerfile 使用entrypoint展示前臺(tái)運(yùn)行 apache 服務(wù)

from debian:stablerun apt-get update && apt-get install -y --force-yes apache2expose 80 443volume ["/var/www", "/var/log/apache2", "/etc/apache2"]entrypoint ["/usr/sbin/apache2ctl", "-d", "foreground"]

shell form entrypoint 例子

這種方式會(huì)在/bin/sh -c中執(zhí)行,會(huì)忽略任何cmd或者docker run命令行選項(xiàng),為了確保docker stop能夠停止長(zhǎng)時(shí)間運(yùn)行entrypoint的容器,確保執(zhí)行的時(shí)候使用exec選項(xiàng)。

from ubuntuentrypoint exec top -b

如果在entrypoint忘記使用exec選項(xiàng),則可以使用cmd補(bǔ)上:

from ubuntuentrypoint top -bcmd --ignored-param1 # --ignored-param2 ... --ignored-param3 ... 依此類推

7.9 volume

volume ["/data"]

創(chuàng)建一個(gè)可以從本地主機(jī)或其他容器掛載的掛載點(diǎn),后續(xù)具體介紹。

7.10 user

user daemon

指定運(yùn)行容器時(shí)的用戶名或 uid,后續(xù)的run、cmd、entrypoint也會(huì)使用指定用戶。

7.11 workdir

workdir /path/to/workdir

為后續(xù)的run、cmd、entrypoint指令配置工作目錄??梢允褂枚鄠€(gè)workdir指令,后續(xù)命令如果參數(shù)是相對(duì)路徑,則會(huì)基于之前命令指定的路徑。

workdir /aworkdir bworkdir crun pwd

最終路徑是/a/b/c。

workdir指令可以在env設(shè)置變量之后調(diào)用環(huán)境變量:

env dirpath /pathworkdir

$dirpath/$dirname

最終路徑則為 /path/$dirname。

7.12 onbuild

onbuild [instruction]

配置當(dāng)所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時(shí),所執(zhí)行的操作指令。

例如,dockerfile 使用如下的內(nèi)容創(chuàng)建了鏡像 image-a:

[...]onbuild add . /app/srconbuild

run /usr/local/bin/python-build --dir /app/src[...]

如果基于 image-a 創(chuàng)建新的鏡像時(shí),新的 dockerfile 中使用 from image-a 指定基礎(chǔ)鏡像時(shí),會(huì)自動(dòng)執(zhí)行 onbuild 指令內(nèi)容,等價(jià)于在后面添加了兩條指令。

# automatically run the following

add . /app/src

run /usr/local/bin/python-build --dir /app/src

使用onbuild指令的鏡像,推薦在標(biāo)簽中注明,例如 ruby:1.9-onbuild。

7.13 dockerfile examples

# nginx
#
# version        0.0.1

from   ubuntu
maintainer victor vieux <victor@docker.com>

run apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server

# firefox over vnc
#
# version        0.3

from ubuntu

# install vnc, xvfb in order to create a 'fake' display and firefox
run apt-get update && apt-get install -y x11vnc xvfb firefox
run mkdir ~/.vnc
# setup a password
run x11vnc -storepasswd 1234 ~/.vnc/passwd
# autostart firefox (might not be the best way, but it does the trick)
run bash -c 'echo "firefox" >> /.bashrc'

expose 5900
cmd  ["x11vnc", "-forever", "-usepw", "-create"]

# multiple images example
#
# version        0.1

from ubuntu
run echo foo > bar
# will output something like ===> 907ad6c2736f

from ubuntu
run echo moo > oink
# will output something like ===> 695d7793cbe4

# you?ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
# /oink.

7.14 docker build

$ docker build --help

usage: docker build [options] path | url | -

build a new image from the source code at path

 --force-rm=false   always remove intermediate containers, even after unsuccessful builds # 移除過(guò)渡容器,即使構(gòu)建失敗
 --no-cache=false   do not use cache when building the image               # 不實(shí)用 cache    
 -q, --quiet=false  suppress the verbose output generated by the containers        
 --rm=true      remove intermediate containers after a successful build        # 構(gòu)建成功后移除過(guò)渡層容器
 -t, --tag=""     repository name (and optionally a tag) to be applied to the resulting image in case of success

參考文檔:dockerfile reference

7.15 dockerfile 最佳實(shí)踐使用.dockerignore文件

為了在docker build過(guò)程中更快上傳和更加高效,應(yīng)該使用一個(gè).dockerignore文件用來(lái)排除構(gòu)建鏡像時(shí)不需要的文件或目錄。例如,除非.git在構(gòu)建過(guò)程中需要用到,否則你應(yīng)該將它添加到.dockerignore文件中,這樣可以節(jié)省很多時(shí)間。

避免安裝不必要的軟件包

為了降低復(fù)雜性、依賴性、文件大小以及構(gòu)建時(shí)間,應(yīng)該避免安裝額外的或不必要的包。例如,不需要在一個(gè)數(shù)據(jù)庫(kù)鏡像中安裝一個(gè)文本編輯器。

每個(gè)容器都跑一個(gè)進(jìn)程

在大多數(shù)情況下,一個(gè)容器應(yīng)該只單獨(dú)跑一個(gè)程序。解耦應(yīng)用到多個(gè)容器使其更容易橫向擴(kuò)展和重用。如果一個(gè)服務(wù)依賴另外一個(gè)服務(wù),可以參考 linking containers together。

最小化層

我們知道每執(zhí)行一個(gè)指令,都會(huì)有一次鏡像的提交,鏡像是分層的結(jié)構(gòu),對(duì)于dockerfile,應(yīng)該找到可讀性和最小化層之間的平衡。

多行參數(shù)排序

如果可能,通過(guò)字母順序來(lái)排序,這樣可以避免安裝包的重復(fù)并且更容易更新列表,另外可讀性也會(huì)更強(qiáng),添加一個(gè)空行使用\換行:

run apt-get update && apt-get install -y \ bzr \ cvs \ git \ mercurial \ subversion

創(chuàng)建緩存

鏡像構(gòu)建過(guò)程中會(huì)按照dockerfile的順序依次執(zhí)行,每執(zhí)行一次指令 docker 會(huì)尋找是否有存在的鏡像緩存可復(fù)用,如果沒(méi)有則創(chuàng)建新的鏡像。如果不想使用緩存,則可以在docker build時(shí)添加--no-cache=true選項(xiàng)。

從基礎(chǔ)鏡像開始就已經(jīng)在緩存中了,下一個(gè)指令會(huì)對(duì)比所有的子鏡像尋找是否執(zhí)行相同的指令,如果沒(méi)有則緩存失效。在大多數(shù)情況下只對(duì)比dockerfile指令和子鏡像就足夠了。add和copy指令除外,執(zhí)行add和copy時(shí)存放到鏡像的文件也是需要檢查的,完成一個(gè)文件的校驗(yàn)之后再利用這個(gè)校驗(yàn)在緩存中查找,如果檢測(cè)的文件改變則緩存失效。run apt-get -y update命令只檢查命令是否匹配,如果匹配就不會(huì)再執(zhí)行更新了。

為了有效地利用緩存,你需要保持你的 dockerfile 一致,并且盡量在末尾修改。

dockerfile 指令from: 只要可能就使用官方鏡像庫(kù)作為基礎(chǔ)鏡像run: 為保持可讀性、方便理解、可維護(hù)性,把長(zhǎng)或者復(fù)雜的run語(yǔ)句使用\分隔符分成多行不建議run apt-get update獨(dú)立成行,否則如果后續(xù)包有更新,那么也不會(huì)再執(zhí)行更新避免使用run apt-get upgrade或者dist-upgrade,很多必要的包在一個(gè)非privileged權(quán)限的容器里是無(wú)法升級(jí)的。如果知道某個(gè)包更新,使用apt-get install -y xxx標(biāo)準(zhǔn)寫法run apt-get update && apt-get install -y package-bar package-foo

例子:

run apt-get update && apt-get install -y \
  aufs-tools \
  automake \
  btrfs-tools \
  build-essential \
  curl \
  dpkg-sig \
  git \
  iptables \
  libapparmor-dev \
  libcap-dev \
  libsqlite3-dev \
  lxc=1.0* \
  mercurial \
  parallel \
  reprepro \
  ruby1.9.1 \
  ruby1.9.1-dev \
  s3cmd=1.1.0*

cmd: 推薦使用cmd [“executable”, “param1”, “param2”…]這種格式,cmd [“param”, “param”]則配合entrypoint使用

expose: dockerfile 指定要公開的端口,使用docker run時(shí)指定映射到宿主機(jī)的端口即可env: 為了使新的軟件更容易運(yùn)行,可以使用env更新path變量。如env path /usr/local/nginx/bin:$path確保cmd ["nginx"]即可運(yùn)行

env也可以這樣定義變量:

env pg_major 9.3
env pg_version 9.3.4
run curl -sl http://example.com/postgres-$pg_version.tar.xz | tar -xjc /usr/src/postgress && …
env path /usr/local/postgres-$pg_major/bin:$path

addorcopy:add比copy多一些特性「tar 文件自動(dòng)解包和支持遠(yuǎn)程 url」,不推薦添加遠(yuǎn)程 url

如不推薦這種方式:

add http://example.com/big.tar.xz /usr/src/things/

run tar -xjf /usr/src/things/big.tar.xz -c /usr/src/things

run make -c /usr/src/things all

推薦使用 curl 或者 wget 替換,使用如下方式:

run mkdir -p /usr/src/things \

&& curl -sl http://example.com/big.tar.gz \ | tar -xjc /usr/src/things \

&& make -c /usr/src/things all

如果不需要添加 tar 文件,推薦使用copy。

參考文檔:

best practices for writing dockerfilesdockerfile最佳實(shí)踐(一)dockerfile最佳實(shí)踐(二)八、容器數(shù)據(jù)管理

docker管理數(shù)據(jù)的方式有兩種:

數(shù)據(jù)卷數(shù)據(jù)卷容器8.1 數(shù)據(jù)卷

數(shù)據(jù)卷是一個(gè)或多個(gè)容器專門指定繞過(guò)union file system的目錄,為持續(xù)性或共享數(shù)據(jù)提供一些有用的功能:

數(shù)據(jù)卷可以在容器間共享和重用數(shù)據(jù)卷數(shù)據(jù)改變是直接修改的數(shù)據(jù)卷數(shù)據(jù)改變不會(huì)被包括在容器中數(shù)據(jù)卷是持續(xù)性的,直到?jīng)]有容器使用它們添加一個(gè)數(shù)據(jù)卷

你可以使用-v選項(xiàng)添加一個(gè)數(shù)據(jù)卷,或者可以使用多次-v選項(xiàng)為一個(gè) docker 容器運(yùn)行掛載多個(gè)數(shù)據(jù)卷。

$ sudo docker run --name data -v /data -t -i ubuntu:14.04 /bin/bash 
# 創(chuàng)建數(shù)據(jù)卷綁定到到新建容器,新建容器中會(huì)創(chuàng)建 /
data 數(shù)據(jù)卷 bash-4.1# ls -ld /data/drwxr-xr-x 2 root root 4096 jul 23 06:59 /data/bash-4.1
# df -thfilesystem type size used avail use% mounted on... ... ext4 91g 4.6g 82g 6% /data

創(chuàng)建的數(shù)據(jù)卷可以通過(guò)docker inspect獲取宿主機(jī)對(duì)應(yīng)路徑

$ sudo docker inspect data... ... 
"volumes": { "/data": "/var/lib/docker/vfs/dir/151de401d268226f96d824fdf444e77a4500aed74c495de5980c807a2ffb7ea9" }, # 可以看到創(chuàng)建的數(shù)據(jù)卷宿主機(jī)路徑 ... ...

或者直接指定獲取

$ sudo docker inspect --format="{{ .volumes }}" datamap[/data: /var/lib/docker/vfs/dir/151de401d268226f96d824fdf444e77a4500aed74c495de5980c807a2ffb7ea9]

掛載宿主機(jī)目錄為一個(gè)數(shù)據(jù)卷

-v選項(xiàng)除了可以創(chuàng)建卷,也可以掛載當(dāng)前主機(jī)的一個(gè)目錄到容器中。

$ sudo docker run --name web -v /source/:/web -t -i ubuntu:14.04 /bin/bashbash-4.1# ls -ld /web/drwxr-xr-x 2 root root 4096 jul 23 06:59 /web/bash-4.1# df -th... ... ext4 91g 4.6g 82g 6% /webbash-4.1# exit

默認(rèn)掛載卷是可讀寫的,可以在掛載時(shí)指定只讀

$ sudo docker run --rm --name test -v /source/:/test:ro -t -i ubuntu:14.04 /bin/bash

8.2 創(chuàng)建和掛載一個(gè)數(shù)據(jù)卷容器

如果你有一些持久性的數(shù)據(jù)并且想在容器間共享,或者想用在非持久性的容器上,最好的方法是創(chuàng)建一個(gè)數(shù)據(jù)卷容器,然后從此容器上掛載數(shù)據(jù)。

創(chuàng)建數(shù)據(jù)卷容器

使用--volumes-from選項(xiàng)在另一個(gè)容器中掛載 /test 卷。不管 test 容器是否運(yùn)行,其它容器都可以掛載該容器數(shù)據(jù)卷,當(dāng)然如果只是單獨(dú)的數(shù)據(jù)卷是沒(méi)必要運(yùn)行容器的。

添加另一個(gè)容器

$ sudo docker run -t -i -d --volumes-from test --name test2 ubuntu:14.04 /bin/bash

也可以繼承其它掛載有 /test 卷的容器

$ sudo docker run -t -i -d --volumes-from test1 --name test3 ubuntu:14.04 /bin/bash

Docker的知識(shí)點(diǎn)有哪些

8.3 備份、恢復(fù)或遷移數(shù)據(jù)卷備份

$ sudo docker run --rm --volumes-from test -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/test.tar /testtar: removing leading `/' from member names/test//test/b/test/d/test/c/test/a

啟動(dòng)一個(gè)新的容器并且從test容器中掛載卷,然后掛載當(dāng)前目錄到容器中為 backup,并備份 test 卷中所有的數(shù)據(jù)為 test.tar,執(zhí)行完成之后刪除容器--rm,此時(shí)備份就在當(dāng)前的目錄下,名為test.tar。

$ ls # 宿主機(jī)當(dāng)前目錄下產(chǎn)生了 test 卷的備份文件 test.tar test.tar

恢復(fù)

你可以恢復(fù)給同一個(gè)容器或者另外的容器,新建容器并解壓備份文件到新的容器數(shù)據(jù)卷

$ sudo docker run -t -i -d -v /test --name test4 ubuntu:14.04 /bin/bash $ sudo docker run --rm --volumes-from test4 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/test.tar -c / # 恢復(fù)之前的文件到新建卷中,執(zhí)行完后自動(dòng)刪除容器 test/ test/b test/d test/c test/a

8.4 刪除 volumes

volume 只有在下列情況下才能被刪除:

docker rm -v刪除容器時(shí)添加了-v選項(xiàng)docker run --rm運(yùn)行容器時(shí)添加了--rm選項(xiàng)

否則,會(huì)在/var/lib/docker/vfs/dir目錄中遺留很多不明目錄。

參考文檔:

managing data in containers深入理解docker volume(一)深入理解docker volume(二)九、鏈接容器

docker 允許把多個(gè)容器連接在一起,相互交互信息。docker 鏈接會(huì)創(chuàng)建一種容器父子級(jí)別的關(guān)系,其中父容器可以看到其子容器提供的信息。

9.1 容器命名

在創(chuàng)建容器時(shí),如果不指定容器的名字,則默認(rèn)會(huì)自動(dòng)創(chuàng)建一個(gè)名字,這里推薦給容器命名:

1、給容器命名方便記憶,如命名運(yùn)行 web 應(yīng)用的容器為 web2、為 docker 容器提供一個(gè)參考,允許方便其他容器調(diào)用,如把容器 web 鏈接到容器 db

可以通過(guò)--name選項(xiàng)給容器自定義命名:

$ sudo docker run -d -t -i --name test ubuntu:14.04 bash $ sudo docker inspect --format="{{ .nmae }}" test/test

注:容器名稱必須唯一,即你只能命名一個(gè)叫test的容器。如果你想復(fù)用容器名,則必須在創(chuàng)建新的容器前通過(guò)docker rm刪除舊的容器或者創(chuàng)建容器時(shí)添加--rm選項(xiàng)。

9.2 鏈接容器

鏈接允許容器間安全通信,使用--link選項(xiàng)創(chuàng)建鏈接。

$ sudo docker run -d --name db training/postgre

基于 training/postgres 鏡像創(chuàng)建一個(gè)名為 db 的容器,然后下面創(chuàng)建一個(gè)叫做 web 的容器,并且將它與 db 相互連接在一起

$ sudo docker run -d -p --name web --link db:db training/webapp python app.py

--link <name or id>:alias選項(xiàng)指定鏈接到的容器。

查看 web 容器的鏈接關(guān)系:

$ sudo docker inspect -f "{{ .hostconfig.links }}" web[/db:/web/db]

可以看到 web 容器被鏈接到 db 容器為/web/db,這允許 web 容器訪問(wèn) db 容器的信息。

容器之間的鏈接實(shí)際做了什么?一個(gè)鏈接允許一個(gè)源容器提供信息訪問(wèn)給一個(gè)接收容器。在本例中,web 容器作為一個(gè)接收者,允許訪問(wèn)源容器 db 的相關(guān)服務(wù)信息。docker 創(chuàng)建了一個(gè)安全隧道而不需要對(duì)外公開任何端口給外部容器,因此不需要在創(chuàng)建容器的時(shí)候添加-p或-p指定對(duì)外公開的端口,這也是鏈接容器的最大好處,本例為 postgresql 數(shù)據(jù)庫(kù)。

docker 主要通過(guò)以下兩個(gè)方式提供連接信息給接收容器:

環(huán)境變量更新/etc/hosts文件環(huán)境變量

當(dāng)兩個(gè)容器鏈接,docker 會(huì)在目標(biāo)容器上設(shè)置一些環(huán)境變量,以獲取源容器的相關(guān)信息。

首先,docker 會(huì)在每個(gè)通過(guò)--link選項(xiàng)指定別名的目標(biāo)容器上設(shè)置一個(gè)<alias>_name環(huán)境變量。如果一個(gè)名為 web 的容器通過(guò)--link db:webdb被鏈接到一個(gè)名為 db 的數(shù)據(jù)庫(kù)容器,那么 web 容器上會(huì)設(shè)置一個(gè)環(huán)境變量為webdb_name=/web/webdb.

以之前的為例,docker 還會(huì)設(shè)置端口變量:

$ sudo docker run --rm --name web2 --link db:db training/webapp env. . .db_name=/web2/dbdb_port=tcp://172.17.0.5:5432 db_port_5432_tcp=tcp://172.17.0.5:5432 # <name>_port_<port>_<protocol> 協(xié)議可以是 tcp 或 udpdb_port_5432_tcp_proto=tcpdb_port_5432_tcp_port=5432db_port_5432_tcp_addr=172.17.0.5. . .

注:這些環(huán)境變量只設(shè)置給容器中的第一個(gè)進(jìn)程,類似一些守護(hù)進(jìn)程 (如 sshd ) 當(dāng)他們派生 shells 時(shí)會(huì)清除這些變量

更新/etc/hosts文件

除了環(huán)境變量,docker 會(huì)在目標(biāo)容器上添加相關(guān)主機(jī)條目到/etc/hosts中,上例中就是 web 容器。

$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bashroot@aed84ee21bde:/opt/webapp
# cat /etc/hosts172.17.0.7 aed84ee21bde. . .172.17.0.5 db

/etc/host文件在源容器被重啟之后會(huì)自動(dòng)更新 ip 地址,而環(huán)境變量中的 ip 地址則不會(huì)自動(dòng)更新的。

十、構(gòu)建私有庫(kù)

docker 官方提供了 docker registry 的構(gòu)建方法 docker-registry

10.1 快速構(gòu)建

快速構(gòu)建 docker registry 通過(guò)以下兩步:

安裝 docker運(yùn)行 registry:docker run -p 5000:5000 registry

這種方法通過(guò) docker hub 使用官方鏡像 official image from the docker hub

10.2 不使用容器構(gòu)建 registry安裝必要的軟件

$ sudo apt-get install build-essential python-dev libevent-dev python-pip liblzma-dev

配置 docker-registry

sudo pip install docker-registry

或者 使用 github clone 手動(dòng)安裝

$ git clone https://github.com/dotcloud/docker-registry.git

$ cd docker-registry/

$ cp config/config_sample.yml config/config.yml$ mkdir /data/registry -p

$ pip install .

運(yùn)行

docker-registry

高級(jí)啟動(dòng)方式 [不推薦]

使用gunicorn控制:

gunicorn -c contrib/gunicorn_config.py docker_registry.wsgi:application

或者對(duì)外監(jiān)聽開放

gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application

10.3 提交指定容器到私有庫(kù)

$ docker tag ubuntu:12.04 私有庫(kù)ip:5000/ubuntu:12.04$ docker push 私有庫(kù)ip:5000/ubuntu

以上就是“Docker的知識(shí)點(diǎn)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI