国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

我的Docker筆記(補(bǔ)全ing)

alogy / 2572人閱讀

摘要:深入容器和鏡像個(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

basics-docker-containers-hypervisors-coreos

Reference Tutorials & Docs

深入 Docker:容器和鏡像

Docker Tutorial - Cheatsheet

docker-curriculum

Practices & Resources

docker-cheat-sheet

10個(gè)日常Docker使用技巧

Books & Tools

Docker 實(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 start
CentOS

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 on
Docker 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 Mirror

DaoCloud提供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 ubuntu 
Hello 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/bash
Docker Commands

docker-cheat-sheet

本章主要對(duì)于常見(jiàn)的Docker命令行命令進(jìn)行詳細(xì)介紹。

LifeCycle Containers

docker 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)閉

Images

docker 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 Containers

docker 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 展示容器中文件的變化情況

Images

docker history 展示鏡像的全部歷史信息

docker tag 為某個(gè)容器設(shè)置標(biāo)簽

Import&Export

docker cp 在容器與本地文件系統(tǒng)之間進(jìn)行文件復(fù)制

docker export 將某個(gè)容器中的文件系統(tǒng)的內(nèi)容輸出到某個(gè)tar文件中

Executing Commands

docker exec 在容器中運(yùn)行某個(gè)命令

如果需要在某個(gè)名字為foo的容器中運(yùn)行交互命令,可以使用:

docker exec -it foo /bin/bash.

Fundamental Containers

An instance of an image is called container

容器是Docker的核心概念,其相較于我們認(rèn)為的虛擬機(jī)就好比進(jìn)程中的線程一樣。

LifeCycle

A docker container exits when its main process finishes.

Images Export/Import

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 MB
                            6b0a59aa7c48        11 days ago         169.4 MB
                            6cfa4d1f33fb        7 weeks ago         0 B
Dockerfile

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,指令包括 FROMMAINTAINERRUN 等。

FROM

格式為 FROM FROM :

第一條指令必須為 FROM 指令。并且,如果在同一個(gè)Dockerfile中創(chuàng)建多個(gè)鏡像時(shí),可以使用多個(gè) FROM 指令(每個(gè)鏡像一次)。

MAINTAINER

格式為 MAINTAINER ,指定維護(hù)者信息。

RUN

格式為 RUN RUN ["executable", "param1", "param2"]

前者將在 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。指定一個(gè)環(huán)境變量,會(huì)被后續(xù) RUN 指令使用,并在容器運(yùn)行時(shí)保持。

例如

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ù)制指定的 到容器中的 。其中 可以是Dockerfile所在目錄的一個(gè)相對(duì)路徑;也可以是一個(gè) URL;還可以是一個(gè) tar 文件(自動(dòng)解壓為目錄)。

COPY

格式為 COPY

復(fù)制本地主機(jī)的 (為 Dockerfile 所在目錄的相對(duì)路徑)到容器中的 dest

當(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ù)的 RUNCMDENTRYPOINT 指令配置工作目錄。

可以使用多個(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/_data
Data Transfer

copying-data-between-docker-containers

Network:網(wǎng)絡(luò)

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

相關(guān)文章

  • 運(yùn)維記錄:Gitlab遷移 (docker篇)

    摘要:遷移版起因公司的之前一直是安裝在阿里云上的,考慮到隱私因素和安全性,準(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)。而且容器...

    mrcode 評(píng)論0 收藏0
  • 運(yùn)維記錄:Gitlab遷移 (docker篇)

    摘要:遷移版起因公司的之前一直是安裝在阿里云上的,考慮到隱私因素和安全性,準(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)。而且容器...

    MobService 評(píng)論0 收藏0
  • 正則表達(dá)式JavaScript版本回顧筆記

    摘要:以指定模式分割字符串,返回結(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...

    tigerZH 評(píng)論0 收藏0
  • 正則表達(dá)式JavaScript版本回顧筆記背誦版本

    摘要:以指定模式分割字符串,返回結(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...

    CoXie 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<