摘要:深入容器和鏡像個(gè)日常使用技巧實(shí)戰(zhàn)通過(guò)系統(tǒng)自帶包安裝版本系統(tǒng)中已經(jīng)自帶了包,可以直接安裝。如果使用操作系統(tǒng)自帶包安裝,目前安裝的版本是比較舊的。然后重復(fù)上面的步驟即可。
Introduction
Docker helps developers build and ship higher-quality applications, faster." -- What is Docker
Reference Tutorials & Docsbasics-docker-containers-hypervisors-coreos
深入 Docker:容器和鏡像
Docker Tutorial - Cheatsheet
docker-curriculum
Practices & Resourcesdocker-cheat-sheet
10個(gè)日常Docker使用技巧
Books & ToolsDocker 實(shí)戰(zhàn)
Quick Start Installation Ubuntu通過(guò)系統(tǒng)自帶包安裝
Ubuntu 14.04 版本系統(tǒng)中已經(jīng)自帶了 Docker 包,可以直接安裝。
$ sudo apt-get update $ sudo apt-get install -y docker.io $ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker $ sudo sed -i "$acomplete -F _docker docker" /etc/bash_completion.d/docker.io
如果使用操作系統(tǒng)自帶包安裝 Docker,目前安裝的版本是比較舊的 0.9.1。 要安裝更新的版本,可以通過(guò)使用 Docker 源的方式。
通過(guò)Docker源安裝最新版本
要安裝最新的 Docker 版本,首先需要安裝 apt-transport-https 支持,之后通過(guò)添加源來(lái)安裝。
$ sudo apt-get install apt-transport-https $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 $ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" $ sudo apt-get update $ sudo apt-get install lxc-docker
14.04 之前版本
如果是較低版本的 Ubuntu 系統(tǒng),需要先更新內(nèi)核。
$ sudo apt-get update $ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring $ sudo reboot
然后重復(fù)上面的步驟即可。
安裝之后啟動(dòng) Docker 服務(wù)。
$ sudo service docker startCentOS
Docker 支持 CentOS6 及以后的版本。
CentOS6
對(duì)于 CentOS6,可以使用 EPEL 庫(kù)安裝 Docker,命令如下
$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm $ sudo yum install docker-io
CentOS7
CentOS7 系統(tǒng) CentOS-Extras 庫(kù)中已帶 Docker,可以直接安裝:
$ sudo yum install docker
安裝之后啟動(dòng) Docker 服務(wù),并讓它隨系統(tǒng)啟動(dòng)自動(dòng)加載。
$ sudo service docker start $ sudo chkconfig docker onDocker Toolbox(Mac & Windows)
docker-toolbox
早期在Windows或者M(jìn)AC環(huán)境下使用Docker主要利用的是Boot2Docker這個(gè)命令行工具,而Toolbox可以安裝你在開(kāi)發(fā)中運(yùn)行Docker時(shí)所需要的一切:Docker客戶端、Compose(僅Mac需要)、Kitematic、Machine以及VirtualBox。Toolbox使用Machine和VirtualBox在虛擬機(jī)中創(chuàng)建了一個(gè)引擎來(lái)運(yùn)行容器。在該虛擬機(jī)上,你可以使用Docker客戶端、Compose以及Kitematic來(lái)運(yùn)行容器。而Toolbox本身已經(jīng)可以取代了Boot2Docker的作用。
Docker的Toolbox主要集成了如下幾個(gè)不同的工具的集合:
Docker Client docker binary
Docker Machine docker-machine binary
Docker Compose docker-compose binary
Kitematic – Desktop GUI for Docker
Docker Quickstart Terminal app
以Mac系統(tǒng)為例,使用Docker Toolbox安裝Docker環(huán)境與Linux系統(tǒng)的區(qū)別在于,在標(biāo)準(zhǔn)的Linux系統(tǒng)上的安裝中,Docker客戶端、Docker守護(hù)進(jìn)程以及所有的容器都是直接運(yùn)行在本地的:
而在OS X或者Windows系統(tǒng)的安裝中,Docker的相關(guān)的程序是運(yùn)行在一個(gè)內(nèi)置的小型的Linux虛擬機(jī)中的。
在這里可以下載Toolbox的安裝程序,雙擊打開(kāi)按照步驟提示安裝好之后,即可以進(jìn)行下一步,首先在Applications文件夾或者Launchpad中打開(kāi)Docker QuickStart Terminal,該程序會(huì)直接打開(kāi)一個(gè)終端控制臺(tái),并且創(chuàng)建或者連接到一個(gè)叫default的虛擬機(jī)并且將控制臺(tái)登錄到該虛擬機(jī)中。當(dāng)然,用戶也可以用docker-machine命令來(lái)手動(dòng)創(chuàng)建或者登錄到虛擬機(jī)中:
From your shell:從命令行創(chuàng)建創(chuàng)建一個(gè)新的Docker虛擬機(jī)
$ docker-machine create --driver virtualbox default Creating VirtualBox VM... Creating SSH key... Starting VirtualBox VM... Starting VM... To see how to connect Docker to this machine, run: docker-machine env default
注意,該虛擬機(jī)相關(guān)的配置文件存放在~/.docker/machine/machines/default目錄下。
列舉所有可用的機(jī)器
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM default * virtualbox Running tcp://192.168.99.101:2376
獲取環(huán)境配置
$ docker-machine env default export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.101:2376" export DOCKER_CERT_PATH="/Users/mary/.docker/machine/machines/default" export DOCKER_MACHINE_NAME="default" # Run this command to configure your shell: # eval "$(docker-machine env default)"
連接到該虛擬機(jī)
$ eval "$(docker-machine env default)"Proxy & Mirror Proxy For boot2docker
如果是使用boot2docker配置的Docker的運(yùn)行環(huán)境,那么配置文件并沒(méi)有放置在Windows或者M(jìn)AC系統(tǒng)種,而是附著在了小的Linux虛擬機(jī)的內(nèi)核中。首先我們需要在boot2docker的命令行中進(jìn)入到VM的設(shè)置:
Creating Machine default... Creating VirtualBox VM... Creating SSH key... Starting VirtualBox VM... Starting VM... To see how to connect Docker to this machine, run: docker-machine env default Starting machine default... Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command. Setting environment variables for machine default... . . . ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ __/ \____\_______/ docker is configured to use the default machine with IP 192.168.99.100 For help getting started, check out the docs at https://docs.docker.com
現(xiàn)在可以修改 /var/lib/boot2docker/profile 這個(gè)文件來(lái)設(shè)置代理:
docker@boot2docker:~$ sudo vi /var/lib/boot2docker/profile
Tinycore 需要按照如下格式進(jìn)行配置: protocol://ip:port
安全起見(jiàn)我同時(shí)設(shè)置了 HTTP 與 HTTPS.
export HTTP_PROXY=http://your.proxy.name:8080 export HTTPS_PROXY=http://your.proxy.name:8080
現(xiàn)在你可以重啟整個(gè)服務(wù)以及Docker容器:
docker@boot2docker:~$ sudo /etc/init.d/docker restart docker@boot2docker:~$ exit Connection to localhost closed.
接下來(lái)就可以順利的運(yùn)行鏡像了:
bash-3.2$ docker search ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Official Ubuntu base image 356 stackbrew/ubuntu Official Ubuntu base image 39 crashsystems/gitlab-docker A trusted, regularly updated build of GitL...
這個(gè)改變即使以后的虛擬機(jī)重啟重置也都一直會(huì)被保留,因此只需要被設(shè)置一次。
Docker Hub MirrorDaoCloud提供Docker Hub Mirror服務(wù)。用戶可以進(jìn)入Docker Hub Mirror注冊(cè)入口注冊(cè)。在進(jìn)入控制臺(tái)頁(yè)面后直接點(diǎn)擊 啟動(dòng)你的加速器后,您即可得到一個(gè)Mirror的地址,將該地址配置在Docker Daemon的啟動(dòng)腳本中,重啟Docker Daemon即可使得Docker Hub Mirror配置生效。
Ubuntu:
安裝或升級(jí)Docker
Docker 1.3.2版本以上才支持Docker Hub Mirror機(jī)制,如果您還沒(méi)有安裝Docker或者版本過(guò)低,請(qǐng)安裝或升級(jí)版本。
配置Docker Hub Mirror
sudo echo "DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://xxx.m.daocloud.io"" >> /etc/default/docker service docker restart
請(qǐng)將xxx替換為您在 DaoCloud 上注冊(cè)后,為您專(zhuān)屬生成的Mirror地址鏈接名。 該腳本可以將 --registry-mirror 加入到您的Docker配置文件 /etc/defaults/docker中。
盡情享受Docker Hub Mirror
Docker Hub Mirror使用不需要任何附件操作,就像這樣下載官方Ubuntu鏡像
docker pull ubuntu
CentOS:
安裝或升級(jí)Docker
Docker 1.3.2版本以上才支持Docker Hub Mirror機(jī)制,如果您還沒(méi)有安裝Docker或者版本過(guò)低,請(qǐng)安裝或升級(jí)版本。
配置Docker Hub Mirror
sudo sed -i "s|OPTIONS=|OPTIONS=--registry-mirror=http://xxx.m.daocloud.io |g" /etc/sysconfig/docker service docker restart
請(qǐng)將xxx替換為您在 DaoCloud 上注冊(cè)后,為您專(zhuān)屬生成的Mirror地址鏈接名。
該腳本可以將 --registry-mirror 加入到您的Docker配置文件/etc/defaults/docker中。
盡情享受Docker Hub Mirror
Docker Hub Mirror使用不需要任何附件操作,就像這樣下載官方Ubuntu鏡像
docker pull ubuntu
MAC:
安裝或升級(jí)MAC版本下的Boot2Docker
Docker 1.3.2版本以上才支持Docker Hub Mirror機(jī)制,如果您還沒(méi)有安裝Docker或者版本過(guò)低,請(qǐng)安裝或升級(jí)版本。
配置Docker Hub Mirror
請(qǐng)確認(rèn)你的Boot2Docker已經(jīng)啟動(dòng),并執(zhí)行
boot2docker ssh sudo su echo "EXTRA_ARGS="--registry-mirror=http://xxx.m.daocloud.io"" >> /var/lib/boot2docker/profile && exit exit boot2docker restart
請(qǐng)將xxx替換為您在 DaoCloud 上注冊(cè)后,為您專(zhuān)屬生成的Mirror地址鏈接名。
盡情享受Docker Hub Mirror
Docker Hub Mirror使用不需要任何附件操作,就像這樣下載官方Ubuntu鏡像
docker pull ubuntu
Windows:
安裝或升級(jí)MAC版本下的Boot2Docker
Docker 1.3.2版本以上才支持Docker Hub Mirror機(jī)制,如果您還沒(méi)有安裝Docker或者版本過(guò)低,請(qǐng)安裝或升級(jí)版本。
配置Docker Hub Mirror
進(jìn)入Boot2Docker Start Shell,并執(zhí)行
sudo su echo "EXTRA_ARGS="--registry-mirror=http://xxx.m.daocloud.io"" >> /var/lib/boot2docker/profile exit # 重新啟動(dòng)Boot2Docker
請(qǐng)將xxx替換為您在 DaoCloud 上注冊(cè)后,為您專(zhuān)屬生成的Mirror地址鏈接名
盡情享受Docker Hub Mirror
Docker Hub Mirror使用不需要任何附件操作,就像這樣下載官方Ubuntu鏡像
docker pull ubuntuHello World
在Docker的學(xué)習(xí)中我們依舊可以借鑒經(jīng)典的HelloWorld,直接運(yùn)行docker run hello-world即可,不過(guò)需要注意的是,由于總所周知的原因,國(guó)內(nèi)往往無(wú)法順利的下載鏡像,如果遇到類(lèi)似的網(wǎng)絡(luò)的錯(cuò)誤可以參考上文中的代理或者鏡像的設(shè)置。
$ docker run hello-world Unable to find image "hello-world:latest" locally 511136ea3c5a: Pull complete 31cbccb51277: Pull complete e45a5af57b00: Pull complete hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (Assuming it was not already locally available.) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash For more examples and ideas, visit: http://docs.docker.com/userguide/Run Commands(運(yùn)行命令)
你的Container會(huì)在你結(jié)束命令之后自動(dòng)退出,使用以下的命令選項(xiàng)可以將容器保持在激活狀態(tài):
-i 即使在沒(méi)有附著的情況下依然保持STDIN處于開(kāi)啟。單純使用-i命令是不會(huì)出現(xiàn)root@689d580b6416:/ 這種前綴。
-t 分配一個(gè)偽TTY控制臺(tái)
所以run命令就變成了:
docker run -it -d shykes/pybuilder bin/bash
如果希望能夠附著到一個(gè)已經(jīng)存在的容器中,則利用exec命令:
docker exec -it CONTAINER_ID /bin/bashDocker Commands
docker-cheat-sheet
本章主要對(duì)于常見(jiàn)的Docker命令行命令進(jìn)行詳細(xì)介紹。
LifeCycle Containersdocker create 會(huì)創(chuàng)建一個(gè)容器但是不會(huì)立刻啟動(dòng)
docker run 會(huì)創(chuàng)建并且啟動(dòng)某個(gè)容器
如果只是希望有一個(gè)暫時(shí)性的容器,可以使用 docker run --rm 將會(huì)在容器運(yùn)行完畢之后刪除該容器。
如果希望在打開(kāi)某個(gè)容器之后能夠與其進(jìn)行交互, docker run -t -i 會(huì)創(chuàng)建一個(gè)TTY控制臺(tái)。
docker stop 會(huì)關(guān)閉某個(gè)容器
docker start 會(huì)啟動(dòng)某個(gè)容器
docker restart 會(huì)重新啟動(dòng)某個(gè)容器
docker rm 會(huì)刪除某個(gè)容器
如果希望能夠移除所有與該容器相關(guān)的Volume,可以使用-v參數(shù): docker rm -v.
docker kill 會(huì)發(fā)送SIGKILL信號(hào)量到某個(gè)容器
docker attach 會(huì)附著到某個(gè)正在運(yùn)行的容器
docker wait 會(huì)阻塞直到某個(gè)容器關(guān)閉
Imagesdocker images 會(huì)展示所有的鏡像
docker import 會(huì)從原始碼中創(chuàng)建鏡像
docker build 會(huì)從某個(gè)Dockfile中創(chuàng)建鏡像
docker commit 會(huì)從某個(gè)Container中創(chuàng)建鏡像
docker rmi 會(huì)移除某個(gè)鏡像
docker load 以STDIN的方式從某個(gè)tar包中加載鏡像
docker save 以STDOUT的方式將鏡像存入到某個(gè)tar包中
Info Containersdocker ps 會(huì)列舉出所有正在運(yùn)行的容器
docker ps -a 會(huì)展示出所有正在運(yùn)行的和已經(jīng)停止的容器
docker logs 從某個(gè)容器中獲取log日志
docker inspect 檢測(cè)關(guān)于某個(gè)容器的詳細(xì)信息
docker events 從某個(gè)容器中獲取所有的事件
docker port 獲取某個(gè)容器的全部的開(kāi)放端口
docker top 展示某個(gè)容器中運(yùn)行的全部的進(jìn)程
docker stats 展示某個(gè)容器中的資源的使用情況的統(tǒng)計(jì)信息
docker diff 展示容器中文件的變化情況
Imagesdocker history 展示鏡像的全部歷史信息
docker tag 為某個(gè)容器設(shè)置標(biāo)簽
Import&Exportdocker cp 在容器與本地文件系統(tǒng)之間進(jìn)行文件復(fù)制
docker export 將某個(gè)容器中的文件系統(tǒng)的內(nèi)容輸出到某個(gè)tar文件中
Executing Commandsdocker exec 在容器中運(yùn)行某個(gè)命令
如果需要在某個(gè)名字為foo的容器中運(yùn)行交互命令,可以使用:
docker exec -it foo /bin/bash.
Fundamental ContainersAn instance of an image is called container
容器是Docker的核心概念,其相較于我們認(rèn)為的虛擬機(jī)就好比進(jìn)程中的線程一樣。
LifeCycleImages Export/ImportA docker container exits when its main process finishes.
Docker 背后的驅(qū)動(dòng)力之一就是通過(guò)所有的 Docker 使服務(wù)器 能創(chuàng)建一個(gè)一致的環(huán)境,并且能創(chuàng)建一個(gè)能運(yùn)行在任何 Docker 服務(wù)器上的合適的模板或是鏡像。因此,Docker 能非常完美的支持,能非常容易的導(dǎo)出一個(gè)正在運(yùn)行的容器,并且重新導(dǎo)入另外一臺(tái) Docker 服務(wù)器。讓我們假設(shè)一下,例如這個(gè)示例,你有一個(gè)你將移動(dòng)到另外一臺(tái)服務(wù)器去的正在運(yùn)行的容器。這個(gè)進(jìn)程的功能就是把這個(gè)容器保存為一個(gè)鏡像,保存成 一個(gè) tar 文件,把它移動(dòng)到新的服務(wù)器,并且把這個(gè)鏡像加載進(jìn)新的 docker 服務(wù)器。
將Container提交為鏡像
$ docker commit 3a09b2588478 mynewimage 4d2eab1c0b9a13c83abd72b38e5d4b4315de3c9967165f78a7b817ca99bf191e
將鏡像打包
$ docker save mynewimage > /tmp/mynewimage.tar
在新的機(jī)器上載入鏡像
$ docker load < /tmp/mynewimage.tar
查看鏡像狀態(tài)
最后,運(yùn)行 docker images 命令檢查鏡像現(xiàn)在是否可用。
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE mynewimage latest 4d2eab1c0b9a 5 minutes ago 278.1 MB ubuntu 14.04 ad892dd21d60 11 days ago 275.5 MBDockerfile6b0a59aa7c48 11 days ago 169.4 MB 6cfa4d1f33fb 7 weeks ago 0 B
Dockerfile最佳實(shí)踐
Dockerfile優(yōu)化淺談
Dockerfile 由一行行命令語(yǔ)句組成,并且支持以 # 開(kāi)頭的注釋行。一般的,Dockerfile 分為四部分:基礎(chǔ)鏡像信息、維護(hù)者信息、鏡像操作指令和容器啟動(dòng)時(shí)執(zhí)行指令。例如:
# This dockerfile uses the ubuntu image # VERSION 2 - EDITION 1 # Author: docker_user # Command format: Instruction [arguments / command] .. # Base image to use, this must be set as the first line FROM ubuntu # Maintainer: docker_user(@docker_user) MAINTAINER docker_user docker_user@email.com # Commands to update the image RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list RUN apt-get update && apt-get install -y nginx RUN echo " daemon off;" >> /etc/nginx/nginx.conf # Commands when creating a new container CMD /usr/sbin/nginx
其中,一開(kāi)始必須指明所基于的鏡像名稱,接下來(lái)推薦說(shuō)明維護(hù)者信息。后面則是鏡像操作指令,例如 RUN 指令,RUN 指令將對(duì)鏡像執(zhí)行跟隨的命令。每運(yùn)行一條 RUN 指令,鏡像添加新的一層,并提交。最后是 CMD 指令,來(lái)指定運(yùn)行容器時(shí)的操作命令。
最后,這邊有一個(gè)Docker官方MongoDB的例子:
# # MongoDB Dockerfile # # https://github.com/dockerfile/mongodb # # Pull base image. FROM dockerfile/ubuntu # Install MongoDB. RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 && echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" > /etc/apt/sources.list.d/mongodb.list && apt-get update && apt-get install -y mongodb-org && rm -rf /var/lib/apt/lists/* # Define mountable directories. VOLUME ["/data/db"] # Define working directory. WORKDIR /data # Define default command. CMD ["mongod"] # Expose ports. # - 27017: process # - 28017: http EXPOSE 27017 EXPOSE 28017指令
指令的一般格式為 INSTRUCTION arguments,指令包括 FROM、MAINTAINER、RUN 等。
FROM
格式為 FROM
第一條指令必須為 FROM 指令。并且,如果在同一個(gè)Dockerfile中創(chuàng)建多個(gè)鏡像時(shí),可以使用多個(gè) FROM 指令(每個(gè)鏡像一次)。
MAINTAINER
格式為 MAINTAINER
RUN
格式為 RUN
前者將在 shell 終端中運(yùn)行命令,即 /bin/sh -c;后者則使用 exec 執(zhí)行。指定使用其它終端可以通過(guò)第二種方式實(shí)現(xiàn),例如 RUN ["/bin/bash", "-c", "echo hello"]。
每條 RUN 指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令,并提交為新的鏡像。當(dāng)命令較長(zhǎng)時(shí)可以使用 來(lái)?yè)Q行。
CMD
支持三種格式
CMD ["executable","param1","param2"] 使用 exec 執(zhí)行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執(zhí)行,提供給需要交互的應(yīng)用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認(rèn)參數(shù);
指定啟動(dòng)容器時(shí)執(zhí)行的命令,每個(gè) Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最后一條會(huì)被執(zhí)行。
如果用戶啟動(dòng)容器時(shí)候指定了運(yùn)行的命令,則會(huì)覆蓋掉 CMD 指定的命令。
EXPOSE
格式為 EXPOSE
告訴 Docker 服務(wù)端容器暴露的端口號(hào),供互聯(lián)系統(tǒng)使用。在啟動(dòng)容器時(shí)需要通過(guò) -P,Docker 主機(jī)會(huì)自動(dòng)分配一個(gè)端口轉(zhuǎn)發(fā)到指定的端口。
ENV
格式為 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
ADD
格式為 ADD
該命令將復(fù)制指定的
COPY
格式為 COPY
復(fù)制本地主機(jī)的
當(dāng)使用本地目錄為源目錄時(shí),推薦使用 COPY。
ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執(zhí)行)。
配置容器啟動(dòng)后執(zhí)行的命令,并且不可被 docker run 提供的參數(shù)覆蓋。
每個(gè) Dockerfile 中只能有一個(gè) ENTRYPOINT,當(dāng)指定多個(gè)時(shí),只有最后一個(gè)起效。
VOLUME
格式為 VOLUME ["/data"]。
創(chuàng)建一個(gè)可以從本地主機(jī)或其他容器掛載的掛載點(diǎn),一般用來(lái)存放數(shù)據(jù)庫(kù)和需要保持的數(shù)據(jù)等。
USER
格式為 USER daemon。
指定運(yùn)行容器時(shí)的用戶名或 UID,后續(xù)的 RUN 也會(huì)使用指定用戶。
當(dāng)服務(wù)不需要管理員權(quán)限時(shí),可以通過(guò)該命令指定運(yùn)行用戶。并且可以在之前創(chuàng)建所需要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時(shí)獲取管理員權(quán)限可以使用 gosu,而不推薦 sudo。
WORKDIR
格式為 WORKDIR /path/to/workdir。
為后續(xù)的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。
可以使用多個(gè) WORKDIR 指令,后續(xù)命令如果參數(shù)是相對(duì)路徑,則會(huì)基于之前命令指定的路徑。例如
WORKDIR /a WORKDIR b WORKDIR c RUN pwd
則最終路徑為 /a/b/c。
ONBUILD
格式為 ONBUILD [INSTRUCTION]。
配置當(dāng)所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時(shí),所執(zhí)行的操作指令。
例如,Dockerfile 使用如下的內(nèi)容創(chuàng)建了鏡像 image-A。
[...] ONBUILD ADD . /app/src ONBUILD 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à)于在后面添加了兩條指令。
FROM image-A #Automatically run the following ADD . /app/src RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的鏡像,推薦在標(biāo)簽中注明,例如 ruby:1.9-onbuild。
創(chuàng)建鏡像編寫(xiě)完成 Dockerfile 之后,可以通過(guò) docker build 命令來(lái)創(chuàng)建鏡像。
基本的格式為 docker build [選項(xiàng)] 路徑,該命令將讀取指定路徑下(包括子目錄)的 Dockerfile,并將該路徑下所有內(nèi)容發(fā)送給 Docker 服務(wù)端,由服務(wù)端來(lái)創(chuàng)建鏡像。因此一般建議放置 Dockerfile 的目錄為空目錄。也可以通過(guò) .dockerignore 文件(每一行添加一條匹配模式)來(lái)讓 Docker 忽略路徑下的目錄和文件。
要指定鏡像的標(biāo)簽信息,可以通過(guò) -t 選項(xiàng),例如
$ sudo docker build -t myrepo/myapp /tmp/test1/Storage:存儲(chǔ) Volume
docker-indepth-volumes
深入理解Docker Volume
數(shù)據(jù)卷是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,它繞過(guò) UFS,可以提供很多有用的特性:
數(shù)據(jù)卷可以在容器之間共享和重用
對(duì)數(shù)據(jù)卷的修改會(huì)立馬生效
對(duì)數(shù)據(jù)卷的更新,不會(huì)影響鏡像
卷會(huì)一直存在,直到?jīng)]有容器使用
*數(shù)據(jù)卷的使用,類(lèi)似于 Linux 下對(duì)目錄或文件進(jìn)行 mount。
創(chuàng)建與掛載 創(chuàng)建在用 docker run 命令的時(shí)候,使用 -v 標(biāo)記來(lái)創(chuàng)建一個(gè)數(shù)據(jù)卷并掛載到容器里。在一次 run 中多次使用可以掛載多個(gè)數(shù)據(jù)卷。
下面創(chuàng)建一個(gè) web 容器,并加載一個(gè)數(shù)據(jù)卷到容器的 /data 目錄。
$ sudo docker run -d -P --name web -v /data training/webapp python app.py
*注意:也可以在 Dockerfile 中使用 VOLUME 來(lái)添加一個(gè)或者多個(gè)新的卷到由該鏡像創(chuàng)建的任意容器。這將在容器內(nèi)創(chuàng)建路徑/data,它存在于聯(lián)合文件系統(tǒng)外部并可以在主機(jī)上直接訪問(wèn)。任何在該鏡像/data路徑的文件將被復(fù)制到volume。我們可以使用docker inspect命令找出Volume在主機(jī)存儲(chǔ)的地方:
$ docker inspect -f {{.Volumes}} web
你會(huì)看到以下類(lèi)似內(nèi)容:
map[/data:/var/lib/docker/vfs/dir/cde167197ccc3e138a14f1a4f...b32cec92e79059437a9]
這說(shuō)明Docker把在/var/lib/docker下的某個(gè)目錄掛載到了容器內(nèi)的/data目錄下。讓我們從主機(jī)上添加文件到此文件夾下:
$ sudo touch /var/lib/docker/vfs/dir/cde167197ccc3e13814f...b32ce9059437a9/test-file
進(jìn)入我們的容器內(nèi)可以看到:
$ root@CONTAINER:/# ls /data test-file
改變會(huì)立即生效只要將主機(jī)的目錄掛載到容器的目錄上。我們可以在Dockerfile中通過(guò)使用VOLUME指令來(lái)達(dá)到相同的效果:
FROM debian:wheezy VOLUME /data掛載目錄
使用 -v 標(biāo)記也可以指定掛載一個(gè)本地主機(jī)的目錄到容器中去。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上面的命令加載主機(jī)的 /src/webapp 目錄到容器的 /opt/webapp目錄。這個(gè)功能在進(jìn)行測(cè)試的時(shí)候十分方便,比如用戶可以放置一些程序到本地目錄中,來(lái)查看容器是否正常工作。本地目錄的路徑必須是絕對(duì)路徑,如果目錄不存在 Docker 會(huì)自動(dòng)為你創(chuàng)建它。
*注意:Dockerfile 中不支持這種用法,這是因?yàn)?Dockerfile 是為了移植和分享用的。然而,不同操作系統(tǒng)的路徑格式不一樣,所以目前還不能支持。
Docker 掛載數(shù)據(jù)卷的默認(rèn)權(quán)限是讀寫(xiě),用戶也可以通過(guò) :ro 指定為只讀。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
加了 :ro 之后,就掛載為只讀了。
掛載文件-v 標(biāo)記也可以從主機(jī)掛載單個(gè)文件到容器中
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
這樣就可以記錄在容器輸入過(guò)的命令了。
*注意:如果直接掛載一個(gè)文件,很多文件編輯工具,包括 vi 或者 sed --in-place,可能會(huì)造成文件 inode 的改變,從 Docker 1.1.0起,這會(huì)導(dǎo)致報(bào)錯(cuò)誤信息。所以最簡(jiǎn)單的辦法就直接掛載文件的父目錄。
Data Volume Container(數(shù)據(jù)卷容器) 數(shù)據(jù)共享 Separate Volume From 1.9自從Docker 1.9版本之后,volume不再僅僅作為docker run的一個(gè)flag,也作為一個(gè)多帶帶的子命令出現(xiàn)在Docker中。底層也為volume添加了諸如ls、create、inspect和rm等volume子命令的api。新的volume子命令可以允許用戶先創(chuàng)建volume,然后在啟動(dòng)的container的時(shí)候進(jìn)行掛載,此舉也更加方便了volume的管理。
$ docker volume create --name hello hello $ docker run -d -v hello:/world busybox ls /world
而在一個(gè)獨(dú)立的Volume被創(chuàng)建之后,就可以通過(guò)inspect命令來(lái)進(jìn)行信息查看:
Usage: docker volume inspect [OPTIONS] VOLUME [VOLUME...] Inspect one or more volumes -f, --format= Format the output using the given go template. --help=false Print usage
該命令會(huì)返回某個(gè)數(shù)據(jù)卷的基本信息,大概樣式如下圖所示:
$ docker volume create 85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d $ docker volume inspect 85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d [ { "Name": "85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d", "Driver": "local", "Mountpoint": "/var/lib/docker/volumes/85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d/_data" } ] $ docker volume inspect --format "{{ .Mountpoint }}" 85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d /var/lib/docker/volumes/85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d/_dataData Transfer
Network:網(wǎng)絡(luò)copying-data-between-docker-containers
Docker Networking: Reborn
Docker 1.9中正式引入了所謂的"Container Network Model",也就適合所謂的 CNM的概念。CNM即用于創(chuàng)建小型微分割的網(wǎng)絡(luò)來(lái)使得不同組的容器之間進(jìn)行相互連接。
Basic Usage 端口映射容器中可以運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部也可以訪問(wèn)這些應(yīng)用,可以通過(guò) -P 或 -p 參數(shù)來(lái)指定端口映射。
當(dāng)使用 -P 標(biāo)記時(shí),Docker 會(huì)隨機(jī)映射一個(gè) 49000~49900 的端口到內(nèi)部容器開(kāi)放的網(wǎng)絡(luò)端口。
使用 docker ps 可以看到,本地主機(jī)的 49155 被映射到了容器的 5000 端口。此時(shí)訪問(wèn)本機(jī)的 49155 端口即可訪問(wèn)容器內(nèi) web 應(yīng)用提供的界面。
$ sudo docker run -d -P training/webapp python app.py $ sudo 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
同樣的,可以通過(guò) docker logs 命令來(lái)查看應(yīng)用的信息。
$ sudo docker logs -f nostalgic_morse * Running on http://0.0.0.0:5000/ 10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 - 10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
-p(小寫(xiě)的)則可以指定要映射的端口,并且,在一個(gè)指定端口上只可以綁定一個(gè)容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
映射所有接口地址
使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以執(zhí)行
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
此時(shí)默認(rèn)會(huì)綁定本地所有接口上的所有地址。
映射到指定地址的指定端口
可以使用 ip:hostPort:containerPort 格式指定映射使用一個(gè)特定地址,比如 localhost 地址 127.0.0.1
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用 ip::containerPort 綁定 localhost 的任意端口到容器的 5000 端口,本地主機(jī)會(huì)自動(dòng)分配一個(gè)端口。
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
還可以使用 udp 標(biāo)記來(lái)指定 udp 端口
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
使用 docker port 來(lái)查看當(dāng)前映射的端口配置,也可以查看到綁定的地址
$ docker port nostalgic_morse 5000 127.0.0.1:49155.
注意:
容器有自己的內(nèi)部網(wǎng)絡(luò)和 ip 地址(使用 docker inspect 可以獲取所有的變量,Docker 還可以有一個(gè)可變的網(wǎng)絡(luò)配置。)
-p 標(biāo)記可以多次使用來(lái)綁定多個(gè)端口
例如
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
注意,網(wǎng)絡(luò)映射的操作只會(huì)在run命令中起作用,如果已經(jīng)運(yùn)行了一個(gè)容器,需要重新設(shè)置其網(wǎng)絡(luò)映射情況,請(qǐng)使用commit將容器轉(zhuǎn)化為鏡像之后再創(chuàng)建新的容器。
容器互聯(lián)(Links)容器的連接(linking)系統(tǒng)是除了端口映射外,另一種跟容器中應(yīng)用交互的方式。
該系統(tǒng)會(huì)在源和接收容器之間創(chuàng)建一個(gè)隧道,接收容器可以看到源容器指定的信息。
自定義容器命名連接系統(tǒng)依據(jù)容器的名稱來(lái)執(zhí)行。因此,首先需要自定義一個(gè)好記的容器命名。
雖然當(dāng)創(chuàng)建容器的時(shí)候,系統(tǒng)默認(rèn)會(huì)分配一個(gè)名字。自定義命名容器有2個(gè)好處:
自定義的命名,比較好記,比如一個(gè)web應(yīng)用容器我們可以給它起名叫web
當(dāng)要連接其他容器時(shí)候,可以作為一個(gè)有用的參考點(diǎn),比如連接web容器到db容器
使用 --name 標(biāo)記可以為容器自定義命名。
$ sudo docker run -d -P --name web training/webapp python app.py
使用 docker ps 來(lái)驗(yàn)證設(shè)定的命名。
$ sudo docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
也可以使用 docker inspect 來(lái)查看容器的名字
$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde /web
注意:容器的名稱是唯一的。如果已經(jīng)命名了一個(gè)叫 web 的容器,當(dāng)你要再次使用 web 這個(gè)名稱的時(shí)候,需要先用docker rm 來(lái)刪除之前創(chuàng)建的同名容器。
在執(zhí)行 docker run 的時(shí)候如果添加 --rm 標(biāo)記,則容器在終止后會(huì)立刻刪除。注意,--rm 和 -d 參數(shù)不能同時(shí)使用。
容器互聯(lián)使用 --link 參數(shù)可以讓容器之間安全的進(jìn)行交互。
下面先創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)容器。
$ sudo docker run -d --name db training/postgres
刪除之前創(chuàng)建的 web 容器
$ docker rm -f web
然后創(chuàng)建一個(gè)新的 web 容器,并將它連接到 db 容器
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
此時(shí),db 容器和 web 容器建立互聯(lián)關(guān)系。
--link 參數(shù)的格式為 --link name:alias,其中 name 是要鏈接的容器的名稱,alias 是這個(gè)連接的別名。
使用 docker ps 來(lái)查看容器的連接
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 349169744e49 training/postgres:latest su postgres -c "/usr About a minute ago Up About a minute 5432/tcp db, web/db aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp web
可以看到自定義命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。這表示 web 容器鏈接到 db 容器,web 容器將被允許訪問(wèn) db 容器的信息。
Docker 在兩個(gè)互聯(lián)的容器之間創(chuàng)建了一個(gè)安全隧道,而且不用映射它們的端口到宿主主機(jī)上。在啟動(dòng) db 容器的時(shí)候并沒(méi)有使用 -p 和 -P 標(biāo)記,從而避免了暴露數(shù)據(jù)庫(kù)端口到外部網(wǎng)絡(luò)上。
Docker 通過(guò) 2 種方式為容器公開(kāi)連接信息:
環(huán)境變量
更新 /etc/hosts 文件
使用 env 命令來(lái)查看 web 容器的環(huán)境變量
$ sudo docker run --rm --name web2 --link db:db training/webapp env . . . DB_NAME=/web2/db DB_PORT=tcp://172.17.0.5:5432 DB_PORT_5000_TCP=tcp://172.17.0.5:5432 DB_PORT_5000_TCP_PROTO=tcp DB_PORT_5000_TCP_PORT=5432 DB_PORT_5000_TCP_ADDR=172.17.0.5 . . .
其中 DB_ 開(kāi)頭的環(huán)境變量是供 web 容器連接 db 容器使用,前綴采用大寫(xiě)的連接別名。
除了環(huán)境變量,Docker 還添加 host 信息到父容器的 /etc/hosts 的文件。下面是父容器 web 的 hosts 文件
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash root@aed84ee21bde:/opt/webapp# cat /etc/hosts 172.17.0.7 aed84ee21bde . . . 172.17.0.5 db
這里有 2 個(gè) hosts,第一個(gè)是 web 容器,web 容器用 id 作為他的主機(jī)名,第二個(gè)是 db 容器的 ip 和主機(jī)名。可以在 web 容器中安裝 ping 命令來(lái)測(cè)試跟db容器的連通。
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping root@aed84ee21bde:/opt/webapp# ping db PING db (172.17.0.5): 48 data bytes 56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms 56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms 56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
用 ping 來(lái)測(cè)試db容器,它會(huì)解析成 172.17.0.5。*注意:官方的 ubuntu 鏡像默認(rèn)沒(méi)有安裝 ping,需要自行安裝。
用戶可以鏈接多個(gè)父容器到子容器,比如可以鏈接多個(gè) web 到 db 容器上。
Networking(網(wǎng)絡(luò))在Docker 1.9之后,Docker正式宣布可以將Networking應(yīng)用于生產(chǎn)環(huán)境中,并且可以與Swarm以及Compose進(jìn)行較好的結(jié)合。與傳統(tǒng)的Links相比,Networking具有以下優(yōu)勢(shì):
允許不同物理主機(jī)或者虛擬主機(jī)上的容器進(jìn)行通信
使用了Networking的容器可以很方便地進(jìn)行停止、啟動(dòng)或者重啟等操作而不用擔(dān)心會(huì)影響到與其他容器之間的連接
并不需要在連接到某個(gè)容器之前就直接創(chuàng)建它,換言之,Networking不再像原本的Links一樣會(huì)依賴某個(gè)容器而存在
Single Host Networking可以直接使用docker network命令來(lái)使用Networking,其中可以使用docker network create來(lái)創(chuàng)建一個(gè)新的網(wǎng)絡(luò),在這個(gè)示例中,我們會(huì)創(chuàng)建一個(gè)叫做frontend的網(wǎng)絡(luò)并且在其中運(yùn)行一個(gè)nginx容器:
$ docker network create frontend $ docker run -itd --net=frontend --name web nginx
我們使用網(wǎng)絡(luò)來(lái)分割應(yīng)用,乃至于分割應(yīng)用中的不同模塊。在本例子中,我們可以創(chuàng)建另一個(gè)包含了應(yīng)用程序的網(wǎng)絡(luò)app,然后將這個(gè)網(wǎng)絡(luò)與frontend網(wǎng)絡(luò)相連,命令如下所示:
$ docker network create app $ docker run -itd --name myapp --net=app$ docker network connect app web
這樣我們的Nginx服務(wù)器就可以使用myapp.app這個(gè)主機(jī)名來(lái)連接到應(yīng)用程序中。我們創(chuàng)建兩個(gè)基于busybox的容器來(lái)進(jìn)行嘗試:
$ docker run -d --name rose --net=frontend busybox top c1fa2dc7fa3a412b52b53f5facd25ba11e99c362d77be8cea4ff49f3d5e2cafc $ docker run --rm --net=frontend busybox ping -c 4 rose PING rose (172.19.0.2): 56 data bytes 64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.122 ms 64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.078 ms 64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.098 ms 64 bytes from 172.19.0.2: seq=3 ttl=64 time=0.241 ms
我們已將第二個(gè)容器附著到frontend網(wǎng)路中,并且用ping命令來(lái)進(jìn)行內(nèi)建的容器發(fā)現(xiàn),我們可以用inspect命令來(lái)查看網(wǎng)絡(luò)的詳情:
$ docker network inspect frontend [ { "Name": "frontend", "Id": "a639a457122020faa69a4ab906bc33217c9c6d73048f3dbbb69e53dbe5e0952c", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ {} ] }, "Containers": { "c1fa2dc7fa3a412b52b53f5facd25ba11e99c362d77be8cea4ff49f3d5e2cafc": { "EndpointID": "976bab21d4a11cd21d5d1c1560f67f39ef15245662aeacf097eb1d5c148ed748", "MacAddress": "02:42:ac:13:00:02", "IPv4Address": "172.19.0.2/16", "IPv6Address": "" } }, "Options": {} } ]
在前端網(wǎng)絡(luò)之外,我們也可以創(chuàng)建一個(gè)自定義的后端網(wǎng)絡(luò),用于連接其他容器:
$ docker network create backend 09733cac7890edca439cdc3d476b4cd1959e44065217aa581d359575b8d2288f $ docker network connect backend rose $ docker network inspect backend { "name": "backend", "id": "09733cac7890edca439cdc3d476b4cd1959e44065217aa581d359575b8d2288f", "scope": "local", "driver": "bridge", "ipam": { "driver": "default", "config": [ {} ] }, "containers": { "c1fa2dc7fa3a412b52b53f5facd25ba11e99c362d77be8cea4ff49f3d5e2cafc": { "endpoint": "438730c588915dd54dc694efdb3a15c77bc5e86c744f5f87a65f6ac46b43e5ad", "mac_address": "02:42:ac:14:00:02", "ipv4_address": "172.20.0.2/16", "ipv6_address": "" } }, "options": {} } ]
再看一下容器中具體的網(wǎng)絡(luò)的設(shè)置:
$ docker inspect -f "{{ json .NetworkSettings }}" rose { "Bridge": "", "SandboxID": "b600bebe1e2bb6dee92335e6acfe49215c30c4964d7a982711ec12c6acca3309", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/b600bebe1e2b", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "backend": { "EndpointID": "438730c588915dd54dc694efdb3a15c77bc5e86c744f5f87a65f6ac46b43e5ad", "Gateway": "172.20.0.1", "IPAddress": "172.20.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:14:00:02" }, "frontend": { "EndpointID": "976bab21d4a11cd21d5d1c1560f67f39ef15245662aeacf097eb1d5c148ed748", "Gateway": "172.19.0.1", "IPAddress": "172.19.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:13:00:02" } } }
而在容器中使用ifconfig命令查看時(shí):
$ docker exec rose ifconifg eth0 Link encap:Ethernet HWaddr 02:42:AC:13:00:02 inet addr:172.19.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:27 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2238 (2.1 KiB) TX bytes:1208 (1.1 KiB) eth1 Link encap:Ethernet HWaddr 02:42:AC:14:00:02 inet addr:172.20.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1296 (1.2 KiB) TX bytes:648 (648.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
而如果要將某個(gè)容器從網(wǎng)絡(luò)中斷開(kāi)時(shí),可以使用如下命令:
$ docker network disconnect backend rose
這種網(wǎng)絡(luò)配置方式的初衷即將服務(wù)獨(dú)立出來(lái)成為一個(gè)網(wǎng)絡(luò)中不同的容器之間相互交流的唯一信息。換言之,在實(shí)踐中,需要構(gòu)建出大量的小型網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)中只負(fù)責(zé)某個(gè)服務(wù)的通信,并且不同的網(wǎng)絡(luò)之間應(yīng)該是相互隔離的。一個(gè)典型的例子就是負(fù)載均衡器、前端、后端以及一個(gè)數(shù)據(jù)庫(kù)。
Network Customization在創(chuàng)建網(wǎng)絡(luò)的時(shí)候我們也可以設(shè)置很多的自定義的配置:
--aux-address=map[] auxiliary ipv4 or ipv6 addresses used by Network driver -d, --driver="bridge" Driver to manage the Network --gateway=[] ipv4 or ipv6 Gateway for the master subnet --help=false Print usage --ip-range=[] allocate container ip from a sub-range --ipam-driver=default IP Address Management Driver -o, --opt=map[] set driver specific options --subnet=[] subnet in CIDR format that represents a network segment
我們首先來(lái)看下--driver選項(xiàng),該選項(xiàng)可以來(lái)選定具體的網(wǎng)絡(luò)驅(qū)動(dòng)方式來(lái)管理網(wǎng)絡(luò),目前Docker提供了如下兩種驅(qū)動(dòng)器:
bridge -- This driver provides the same sort of networking via veth bridge devices that prior versions of docker use, it is the default.
overlay -- Not to be confused with the "overlay" storage driver (thanks overlayfs), this driver provides native multi-host networking for docker clusters. When using swarm, this is the default driver.
另一個(gè)常用的選項(xiàng)是--ipam-driver,用來(lái)確定IP地址是如何分配的。目前Docker僅內(nèi)置了一種IP地址分配方案,未來(lái)會(huì)添加上DHCP IAMP方式。
Multi-Host Networking Manager Web Interface DockerUI文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/26530.html
摘要:遷移版起因公司的之前一直是安裝在阿里云上的,考慮到隱私因素和安全性,準(zhǔn)備遷移到本地的內(nèi)網(wǎng)服務(wù)器內(nèi)。而且容器化現(xiàn)在的流行和一些好的特性,準(zhǔn)備這次用來(lái)部署。分析之前的用的一鍵安裝包,數(shù)據(jù)庫(kù)是規(guī)劃啟動(dòng)三個(gè)容器一個(gè)容器運(yùn)行一個(gè)容器運(yùn)行然后到上。 Gitlab遷移(Docker版) 起因 公司的gitlab之前一直是安裝在阿里云上的,考慮到隱私因素和安全性,準(zhǔn)備遷移到本地的內(nèi)網(wǎng)服務(wù)器內(nèi)。而且容器...
摘要:遷移版起因公司的之前一直是安裝在阿里云上的,考慮到隱私因素和安全性,準(zhǔn)備遷移到本地的內(nèi)網(wǎng)服務(wù)器內(nèi)。而且容器化現(xiàn)在的流行和一些好的特性,準(zhǔn)備這次用來(lái)部署。分析之前的用的一鍵安裝包,數(shù)據(jù)庫(kù)是規(guī)劃啟動(dòng)三個(gè)容器一個(gè)容器運(yùn)行一個(gè)容器運(yùn)行然后到上。 Gitlab遷移(Docker版) 起因 公司的gitlab之前一直是安裝在阿里云上的,考慮到隱私因素和安全性,準(zhǔn)備遷移到本地的內(nèi)網(wǎng)服務(wù)器內(nèi)。而且容器...
摘要:以指定模式分割字符串,返回結(jié)果為數(shù)組。為什么牢記,有什么用看代碼查找連續(xù)的相同的數(shù)字或者內(nèi)容是用子表達(dá)式只有字表達(dá)是中匹配的內(nèi)容才保存到緩存,這種行為叫捕獲。 前言 正則表達(dá)式之所以強(qiáng)大,是因?yàn)槠淠軐?shí)現(xiàn)模糊匹配,精確匹配沒(méi)有任何價(jià)值。 正則表達(dá)式學(xué)習(xí)筆記 第一章 JavaScript原型對(duì)象與原型鏈 1.1 正則表達(dá)式概念 RegExp:是正則表達(dá)式(regular expressio...
摘要:以指定模式分割字符串,返回結(jié)果為數(shù)組。為什么牢記,有什么用看代碼查找連續(xù)的相同的數(shù)字或者內(nèi)容是用子表達(dá)式只有字表達(dá)是中匹配的內(nèi)容才保存到緩存,這種行為叫捕獲。 前言 正則表達(dá)式之所以強(qiáng)大,是因?yàn)槠淠軐?shí)現(xiàn)模糊匹配,精確匹配沒(méi)有任何價(jià)值。 正則表達(dá)式學(xué)習(xí)筆記 第一章 JavaScript原型對(duì)象與原型鏈 1.1 正則表達(dá)式概念 RegExp:是正則表達(dá)式(regular expressio...
閱讀 2760·2021-11-25 09:43
閱讀 2123·2021-11-18 13:25
閱讀 4613·2021-09-22 15:52
閱讀 1886·2021-09-22 15:49
閱讀 2226·2019-08-30 15:54
閱讀 3021·2019-08-29 17:13
閱讀 2328·2019-08-29 16:54
閱讀 2266·2019-08-29 12:58