zoukankan      html  css  js  c++  java
  • Docker使用小结(二)Docker仓库 Docker数据管理 端口映射与容器互联

    1 Docker访问仓库

    **第三方镜像 **
    需要登陆docker账号

    root@slave1:/home/xxx/Documents# docker pull index.tenxcloud.com/docker_library/node:latest
    Error response from daemon: pull access denied for index.tenxcloud.com/docker_library/node, repository does not exist or may require 'docker login'
    

    搭建本地私有仓库
    1)使用registry 镜像创建私高仓库
    安装Docker 后, 可以通过官方提供的registry 镜像来简单搭建一套本地私有仓库环境:

    root@slave1:/home/xxx/Documents# docker run -d -p 5000:5000 registry:2    #自动下载井启动一个registry容器,创建本地的私有仓库服务。
    Unable to find image 'registry:2' locally
    2: Pulling from library/registry
    c87736221ed0: Pull complete
    1cc8e0bb44df: Pull complete
    54d33bcb37f5: Pull complete
    e8afc091c171: Pull complete
    b4541f6d3db6: Pull complete
    Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
    Status: Downloaded newer image for registry:2
    40761724cd46b129753d1d74bf51a4744d609b68a00edfc5179a922510fab1e7
    

    查看所有容器

    root@slave1:/home/xxx/Documents# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS                    NAMES
    40761724cd46        registry:2          "/entrypoint.sh /etc…"   10 minutes ago      Up 10 minutes                    0.0.0.0:5000->5000/tcp   dazzling_hopper
    

    默认情况下,仓库会被创建在容器的/var/lib/registry目录下。可以通过-v 参数来将镜像文件存放在本地的指定路径。将上传的镜像放到/opt/data/registry目录:

    docker run -d -p 5000 5000 -v /opt / data/registry:/var/l ib/registry registry :2
    

    此时在本地将启动一个私有仓库服务,监听端口为5000 。
    2)管理仓库
    查看已有镜像

    root@slave1:/home/xxx/Documents# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              16.04               5e13f8dd4c1a        6 weeks ago         120MB
    

    使用docker tag 命令将这个镜像标记为10.0.2.2:5000/test (格式为docker tag IMAGE [:TAG] [REGISTRY.HOST/] [USERNAME/] NAME [:TAG ]

    root@slave1:/home/xxx/Documents# docker tag ubuntu:16.04 10.0.2.2:5000/test
    root@slave1:/home/xxx/Documents# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
    10.0.2.2:5000/test   latest              5e13f8dd4c1a        6 weeks ago         120MB
    ubuntu               16.04               5e13f8dd4c1a        6 weeks ago         120MB
    

    使用docker push 上传标记的镜像:

    # docker push 10.0.2.2:5000/test
    

    curl查看仓库10.0.2.2:5000中的镜像:

    # curl http://10.0.2.2:5000/v2/search
    

    上传成功后,可以到任意一台能访问到10.0.2.2 地址的机器去下载这个镜像。比较新的Docker 版本对安全性要求较高,会要求仓库支持SSL/TLS 证书。对于内部使用的私有仓库,可以自行配置证书或关闭对仓库的安全性检查。首先,修改Docker daemon 的启动参数,添加如下参数,表示信任这个私有仓库,不进行安全证书检查:DOCKER_OPTS;”-- insecure-registry 10.0.2.2:500 ”之后重启Docker 服务,并从私有仓库中下载镜像到本地

    root@slave1:/home/xxx/Documents#  service docker restart
    root@slave1:/home/xxx/Documents# docker pull 10.0.2.2:5000/test
    root@slave1:/home/xxx/Documents# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
    10.0.2.2:5000/test   latest              5e13f8dd4c1a        6 weeks ago         120MB
    

    下载后,还可以添加一个更通用的标签ubuntu: 16. 04 ,方便后续使用:

    root@slave1:/home/xxx/Documents# docker tag 10.0.2.2:5000/test ubuntu:16.04
    

    2 Docker数据管理

    在生产环境中使用Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
    容器中的管理数据主要有两种方式:
    口数据卷(Data Volumes) : 容器内数据直接映射到本地主机环境;
    口数据卷容器( Data Volume Containers ) : 使用特定容器维护数据卷。
    介绍如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中。接下来,介绍如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。
    数据卷
    数据卷( Data Volumes ) 是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux 中的mount 行为。
    数据卷可以提供很多有用的特性:
    口数据卷可以在容器之间共事和重用,容器间传递数据将变得高效与方便;
    口对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
    口对数据卷的更新不会影响镜像,解摘开应用和数据;
    口卷会一直存在,直到没有容器使用,可以安全地卸载它。
    创建数据卷
    Docker 提供了volume 子命令来管理数据卷,如下命令可以快速在本地创建一个数据卷:

    root@slave1:/home/xxx/Documents# docker volume create -d local test
    test
    

    查看/var/lib/docker /volumes 路径下,会发现所创建的数据卷位置:

    root@slave1:/home/xxx/Documents# ls -l /var/lib/docker/volumes
    -rw------- 1 root root 32768 9月  10 11:04 metadata.db
    drwxr-xr-x 3 root root  4096 9月  10 11:04 test
    

    除了create 子命令外, docker volume 还支持inspect (查看详细信息)、ls (列出已有数据卷)、prune (清理无用数据卷)、rm (删除数据卷)等

    root@slave1:/home/xxx/Documents# docker volume inspect test  #数据卷查看详细信息
    [
        {
            "CreatedAt": "2019-09-10T11:04:12+08:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/test/_data",
            "Name": "test",
            "Options": {},
            "Scope": "local"
        }
    ]
    
    root@slave1:/home/xxx/Documents# docker volume ls  #列出已有数据卷
    DRIVER              VOLUME NAME
    local               8ed823897243d9ef96538d5362760c81c8612e7a35380dfb599178e612325b93
    local               test
    

    绑定数据卷
    除了使用volume 子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
    在用docker [container] run命令的时候,可以使用-mount 选项来使用数据卷。
    - mount 选项支持三种类型的数据卷,包括:
    volume : 普通数据卷,映射到主机/var/ lib /docke r /volumes 路径下;
    bind :绑定数据卷,映射到主机指定路径下;
    tmpfs :临时数据卷,只存在于内存中。
    下面使用training/webapp 镜像创建一个Web 容器,并创建一个数据卷挂载到容器的/opt/webapp 目录:

    root@slave1:/home/xxx/Documents# docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py  #报错 不存在/webapp 使
    用下面命令之后 再试一下
    
    

    上述命令等同于使用旧的-v 标记可以在容器内创建一个数据卷:

    root@slave1:/home/xxx/Documents# docker run -d -P --name web -v /webapp:/opt/webapp training/webapp python app.py
    Unable to find image 'training/webapp:latest' locally
    latest: Pulling from training/webapp
    e190868d63f8: Pull complete
    909cd34c6fd7: Pull complete
    0b9bfabab7c1: Pull complete
    a3ed95caeb02: Pull complete
    10bbbc0fc0ff: Pull complete
    fca59b508e9f: Pull complete
    e7ae2541b15b: Pull complete
    9dd97ef58ce9: Pull complete
    a4c1b0cb7af7: Pull complete
    Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
    Status: Downloaded newer image for training/webapp:latest
    4bcc83dac6efb860a4590fb1c3540759876417714c52bb33a73013ec38414a1f
    

    使用training/webapp 镜像创建一个Web1 容器,并创建一个数据卷挂载到容器的/opt/webapp 目录:

    root@slave1:/home/xxx/Documents# docker run -d -P --name web1 --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py
    d7a066b7f5aaf384ac5871d50c94e4985107869b34129181d9ebd188f010501c
    

    这个功能在进行应用测试的时候十分方便,比如用户可以放置一些程序或数据到本地目录中实时进行更新,然后在容器内运行和使用。
    另外,本地目录的路径必须是绝对路径,容器内路径可以为相对路径。如果目录不存在, Docker 会自动创建。
    Docker 挂载数据卷的默认权限是读写( rw ) ,用户也可以通过ro 指定为只读:

    root@slave1:/home/xxx/Documents# docker run -d -P --name d7a066b7f5aaf384ac5871d50c94e4985107869b34129181d9ebd188f010501c -v /webapp:/opt/webapp:ro training/webapp python app.py
    ee35606b7e5dec26e544d60878f94137973c691ad0821a8604730a95f97f3863
    

    加了:ro之后,容器内对所挂载数据卷内的数据就无法修改了。
    如果直接挂载一个文件到容器,使用文件编辑工具,包括vi 或者sed - - in place的时候,可能会造成文件inode 的改变。从Docker 1.1.0 起,这会导致报错误信息。所以推荐的方式是直接挂载文件所在的目录到容器内。

    数据卷容器
    如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
    首先,创建一个数据卷容器dbdata , 并在其中创建一个数据卷挂载到/dbdata :

    root@slave1:/home/xxx/Documents# docker run -it -v /dbdata --name dbdata ubuntu
    root@257d18f2f4dd:/#
    

    查看/dbdata目录:

    root@257d18f2f4dd:/# ls
    bin   dbdata  etc   lib    media  opt   root  sbin  sys  usr
    boot  dev     home  lib64  mnt    proc  run   srv   tmp  var
    

    然后,可以在其他容器中使用--volumes-from 来挂载dbdata 容器中的数据卷,例如创建dbldb2 两个容器,并从dbdata容器挂载数据卷:

    root@slave1:/home/xxx/Documents# docker run -it --volumes-from dbdata --name db1 ubuntu
    root@1709a48e760e:/# exit
    exit
    root@slave1:/home/xxx/Documents# docker run -it --volumes-from dbdata --name db2 ubuntu
    root@94eeab14f62c:/# exit
    exit
    

    此时, 容器dbldb2 都挂载同一个数据卷到相同的/dbdata 目录,三个容器任何一方在该目录下的写人,其他容器都可以看到
    dbdata 容器中创建一个test 文件:

    root@slave1:/home/xxx/Documents# docker start 94eeab14f62c   #启动db2容器
    94eeab14f62c
    root@slave1:/home/xxx/Documents# docker attach 94eeab14f62c  #进入容器
    root@94eeab14f62c:/# ls                                      #查看目录
    bin   dbdata  etc   lib    media  opt   root  sbin  sys  usr
    boot  dev     home  lib64  mnt    proc  run   srv   tmp  var
    root@94eeab14f62c:/# cd /dbdata                              #进入dbdata目录
    root@94eeab14f62c:/dbdata# touch test                        #创建test文件
    root@94eeab14f62c:/dbdata# ls
    test
    
    

    dbl1容器内查看它:

    root@slave1:/home/xxx/Documents# docker run -it --volumes-from dbdata --name 1709a48e760e ubuntu  #db1容器
    root@6cc5d2d5ad79:/# ls
    bin   dbdata  etc   lib    media  opt   root  sbin  sys  usr
    boot  dev     home  lib64  mnt    proc  run   srv   tmp  var
    root@6cc5d2d5ad79:/# cd dbdata
    root@6cc5d2d5ad79:/dbdata# ls
    test
    

    或者使用前面提到的attach命令进入db1容器内查看:

    root@slave1:/home/xxx/Documents# docker start 1709a48e760e   #启动db1容器
    1709a48e760e
    root@slave1:/home/xxx/Documents# docker attach 1709a48e760e
    root@6cc5d2d5ad79:/# ls
    bin   dbdata  etc   lib    media  opt   root  sbin  sys  usr
    boot  dev     home  lib64  mnt    proc  run   srv   tmp  var
    root@6cc5d2d5ad79:/# cd dbdata
    root@6cc5d2d5ad79:/dbdata# ls
    test
    

    注意:使用attach进入容器时,需要先启动容器,否则会出现以下提示:

    root@slave1:/home/xxx/Documents# docker attach 1709a48e760e
    You cannot attach to a stopped container, start it first
    

    可以多次使用--volumes-from 参数来从多个容器挂载多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷

    root@slave1:/home/xxx/Documents# docker run -d --name db3 --volumes-from db1 training/postgres
    Unable to find image 'training/postgres:latest' locally
    latest: Pulling from training/postgres
    a3ed95caeb02: Pull complete
    6e71c809542e: Pull complete
    2978d9af87ba: Pull complete
    e1bca35b062f: Pull complete
    500b6decf741: Pull complete
    74b14ef2151f: Pull complete
    7afd5ed3826e: Pull complete
    3c69bb244f5e: Pull complete
    d86f9ec5aedf: Pull complete
    010fabf20157: Pull complete
    Digest: sha256:a945dc6dcfbc8d009c3d972931608344b76c2870ce796da00a827bd50791907e
    Status: Downloaded newer image for training/postgres:latest
    c06bced08bd6946ce2167eb7f02dcf3da796c540b0eafb380951d57a3ae4ecd2
    

    注意,使用--volumes-from 参数所挂载数据卷的容器自身并不需要保持再运行状态。
    如果删除了挂载的容器(包括dbdata db ``和db2 ),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用dock er rm -v` 命令来指定同时删除关联的容器。
    使用数据卷容器可以让用户在容器之间自由地升级和移动数据卷,具体的操作见下一节.
    利用数据卷容器来迁移数据
    利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

    1. 备份
      使用下面的命令来备份dbdata 数据卷容器内的数据卷:
    root@slave1:/home/xxx/Documents# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
    

    首先利用ubuntu 镜像创建了一个容器worker 。使用--volumes-from dbdata 参数来让worker 容器挂载dbdata 容器的数据卷( 即dbdata 数据卷);使用-v$ (pwd) : /bac kup参数来挂载本地的当前目录到worker 容器的/backup 目录。
    worker 容器启动后,使用tar cvf /backup/backup.tar /dbdata 命令将/dbdata下内容备份为容器内的/backup/backup. tar ,即宿主主机当前目录下的backup.tar

    1. 恢复
      要恢复数据到一个容器,首先创建一个带有数据卷的容器dbdata2:
    root@slave1:/home/xxx/Documents# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
    

    然后创建另一个新的容器,挂载dbdata2 的容器,并使用untar 解压备份文件到所挂载的容器卷中:

    root@slave1:/home/xxx/Documents# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
    Unable to find image 'busybox:latest' locally
    latest: Pulling from library/busybox
    7c9d20b9b6cd: Pull complete
    Digest: sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e
    Status: Downloaded newer image for busybox:latest
    dbdata/
    dbdata/test
    

    通过数据卷和数据卷容器对容器内的数据进行共享、备份和恢复等操作,通过这些机制,即使容器在运行中出现故障,用户也不必担心数据发生丢失,只需要快速地重新创建容器即可。

    3 端口映射与容器互联

    在实践中, 经常会碰到需要多个服务组件容器共同协作的情况, 这往往需要多个容器之间能够互相访问到对方的服务。Docker 除了通过网络访间外, 还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问。
    端口映射实现容器访问
    1)从外部访问容器应用
    在启动容器时, 如果不指定对应参数, 在容器外部是无法通过网络来访问容器内的网络应用和服务的。当容器中运行一些网络应用, 要让外部访问这些应用时, 可以通过-P或-p参数来指
    定端口映射。

    root@slave1:/home/xxx/Documents# docker run -d -P training/webapp python app.py
    419bf896b24023396c411dc6e9718c415505f69184fa807074b4a9b0eeec7ab3
    root@slave1:/home/zyy/Documents# docker ps -l
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
    419bf896b240        training/webapp     "python app.py"     9 seconds ago       Up 7 seconds        0.0.0.0:32771->5000/tcp   hardcore_shamir
    

    可以使用docker ps 看到, 本地主机的32771 被映射到了容器的5000 端口。访间宿主主机的32771 端口即可访问容器内web 应用提供的界面。
    同样, 可以通过docker logs 命令来查看应用的信息:

    root@slave1:/home/xxx/Documents# docker logs -f hardcore_shamir
    * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
    

    注意:-p 可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有IP:HostPort:ContainerPortIIP:: ContainerPortIHostPort:ContainerPort

    2)映射所有接口地址
    使用HostPort:ContainerPort格式本地的5000端口映射到容器的5000端口,可以执行如下命令:

    root@slave1:/home/xxx/Documents# docker run -d -p 5000:5000 training/webapp python app.py
    2ebb57dad1d4430133f56c8a9e238b9c0622d4036c2fd063fd01cc2d8de70e5d
    

    此时默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口。例如:

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

    3)映射到指定地址的指定端口
    可以使用IP:HostPart:ContainerPort格式指定映射使用一个特定地址,比如localhost地址127.0.0.1:

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

    4)映射到指定地址的任意端口

    使用IP::ContainerPort绑定localhost的任意端口到容器的5000端口,本地主机会自动分配一个端口:

    root@slave1:/home/xxx/Documents# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
    13c8e9e5123b6731c91b7e60cd95050d8067dd23420c828cb7508ee711320170
    

    还可以使用udp标记来指定udp端口:

    root@slave1:/home/xxx/Documents# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
    2f0c22deff8877fe1b711446e536edee1117a4e27b4b00f2e8787267d18a3059
    

    5)查看映射端口配置

    使用docker port来查看当前映射的端口配置,也可以查看到绑定的地址:

    root@slave1:/home/xxx/Documents# docker port hardcore_shamir 5000
    0.0.0.0:32771
    

    另外,容器有自己的内部网络和IP地址,使用docker [container] inspect+容器ID可以获取容器的具体信息。

    互联网机制实现快捷互访
    容器的互联(linking)是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
    1)自定义容器命名
    连接系统依据容器的名称来执行。首先需要自定义一个好记的容器命名。虽然当创建容器的时候,系统默认会分配一个名字,但自定义命名容器有两个好处:
    - 自定义的命名,比较好记,比如一个Web应用容器可以给它起名叫web, 一目了然;
    - 当要连接其他容器时候(即便重启),也可以使用容器名而不用改变,比如连接web容器到db容器。

    使用--name标记可以为容器自定义命名:

    root@slave1:/home/xxx/Documents# docker run -d -P --name web training/webapp python app.py
    511678ee937939e33c935d364375edc3b61acd3e299c6b2b63e65b2a2523f48a
    

    使用docker ps来验证设定的命名:

    root@slave1:/home/xxx/Documents# docker ps -l
    CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                     NAMES
    511678ee9379        training/webapp     "python app.py"     About a minute ago   Up About a minute   0.0.0.0:32772->5000/tcp   web
    

    也使用docker [container) inspect来查看容器的名字:

    root@slave1:/home/xxx/Documents# docker  inspect -f "{{.Name}}" 511678ee9379 
    /web
    

    注意:容器的名称是唯一的。如果已经命名了一个叫web的容器,当你要再次使用web这个名称的时候,需要先用docker rm命令删除之前创建的同名容器。
    2)容器互联
    使用--link参数可以让容器之间安全地进行交互。创建一个新的数据库容器:

    root@slave1:/home/xxx/Documents# docker run -d --name db training/postgres
    048e7b6c61e9ec56e0462c5076d09d00255d932c380bfc4c9127958143777e42
    
    root@slave1:/home/xxx/Documents# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
    048e7b6c61e9        training/postgres   "su postgres -c '/us…"   About a minute ago   Up About a minute   5432/tcp            db
    

    删除之前创建的web容器:

    root@slave1:/home/xxx/Documents# docker rm -f web
    web
    

    创建一个新的web容器,并将它连接到db容器:

    root@slave1:/home/xxx/Documents# docker run -d -P --name web --link db:db training/webapp python app.py
    e88a580668bc18733f6f685817430b37e8f072a1aaf08462f7cb3c0dc3c9fc3b
    

    此时,db容器和web容器建立互联关系。--link参数的格式为--link name: alias, 其中name是要链接的容器的名称,alias是别名。现在使用docker ps 来查看容器的连接:

    root@slave1:/home/xxx/Documents# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
    e88a580668bc        training/webapp     "python app.py"          2 minutes ago       Up About a minute   0.0.0.0:32773->5000/tcp              web
    048e7b6c61e9        training/postgres   "su postgres -c '/us…"   5 minutes ago       Up 5 minutes        5432/tcp                             db
    

    看到自定义命名的容器: db 和web, db 容器的names 列有db 也有web/db。这表示web 容器链接到db 容器, web 容器将被允许访问db 容器的信息。
    Docker 相当于在两个互联的容器之间创建了一个虚机通道, 而且不用映射它们的端口到宿主主机上。在启动db 容器的时候并没有使用-p -P 标记, 从而避免了暴露数据库服务端口到外部网络上。
    Docker 通过两种方式为容器公开连接信息:
    口更新环境变量;
    口 更新/etc/hosts 文件。
    使用env 命令来查看web 容器的环境变量:

    root@slave1:/home/xxx/Documents# docker run --rm --name web2 --link db:db training/webapp env
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=226b133d997a
    DB_PORT=tcp://172.17.0.2:5432
    DB_PORT_5432_TCP=tcp://172.17.0.2:5432
    DB_PORT_5432_TCP_ADDR=172.17.0.2
    DB_PORT_5432_TCP_PORT=5432
    DB_PORT_5432_TCP_PROTO=tcp
    DB_NAME=/web2/db
    DB_ENV_PG_VERSION=9.3
    HOME=/root
    

    其中DB_开头的环境变量是供web 容器连接db 容器使用, 前缀采用大写的连接别名。除了环境变量, Docker 还添加host信息到父容器的/etc/hosts 的文件。下面是父容器web的hosts 文件:

    root@slave1:/home/xxx/Documents# docker run -t -i --rm --link db:db training/webapp /bin/bash
    root@e9e98e537bec:/opt/webapp# cat /etc/hosts
    127.0.0.1    localhost
    ::1    localhost ip6-localhost ip6-loopback
    fe00::0    ip6-localnet
    ff00::0    ip6-mcastprefix
    ff02::1    ip6-allnodes
    ff02::2    ip6-allrouters
    172.17.0.2    db b3c84640e83a
    172.17.0.4    e9e98e537bec
    

    这里有2 个hosts 信息, 第一个是db 容器的IP 和主机名,第二个是web 容器, web 容器用自己的id 作为默认主机名。
    可以在web 容器中安装ping 命令来测试跟db 容器的连通:

    root@e9e98e537bec:/opt/webapp# apt-get install -yqq inetutils-ping
    (Reading database ... 18233 files and directories currently installed.)
    Removing ubuntu-minimal (1.325) ...
    Removing iputils-ping (3:20121221-4ubuntu1.1) ...
    Selecting previously unselected package inetutils-ping.
    (Reading database ... 18221 files and directories currently installed.)
    Preparing to unpack .../inetutils-ping_2%3a1.9.2-1_amd64.deb ...
    Unpacking inetutils-ping (2:1.9.2-1) ...
    Setting up inetutils-ping (2:1.9.2-1) ...
    root@e9e98e537bec:/opt/webapp# ping db
    PING db (172.17.0.2): 56 data bytes
    64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.528 ms
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.193 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.112 ms
    64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.207 ms
    64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.114 ms
    64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.175 ms
    64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.115 ms
    64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.113 ms
    64 bytes from 172.17.0.2: icmp_seq=8 ttl=64 time=0.114 ms
    64 bytes from 172.17.0.2: icmp_seq=9 ttl=64 time=0.115 ms
    64 bytes from 172.17.0.2: icmp_seq=10 ttl=64 time=0.115 ms
    64 bytes from 172.17.0.2: icmp_seq=11 ttl=64 time=0.222 ms
    64 bytes from 172.17.0.2: icmp_seq=12 ttl=64 time=0.287 ms
    64 bytes from 172.17.0.2: icmp_seq=13 ttl=64 time=0.116 ms
    64 bytes from 172.17.0.2: icmp_seq=14 ttl=64 time=0.210 ms
    64 bytes from 172.17.0.2: icmp_seq=15 ttl=64 time=0.115 ms
    ^C--- db ping statistics ---
    16 packets transmitted, 16 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 0.112/0.178/0.528/0.105 ms
    

    ping来测试db容器, 它会解析成172.17.0.2。用户可以链接多个子容器到父容器, 比如可以链接多个web到同一个db容器上。
    在生产环境中, 网络方面的需求更加复杂和多变, 包括跨主机甚至跨数据中心的通信,这时候往往就需要引入额外的机制, 例如SDN (软件定义网络)或NFV (网络功能虚拟化)的相关技术。
    后面小节将进一步探讨如何通过libnetwork 来实现跨主机的容器通信, 以及Docker 网络的高级功能和配置。

  • 相关阅读:
    创建类type (底层代码)
    getitem, setitem, delitem (把类实例化成字典的类型)
    类的三种方法(静态方法,类方法,属性方法)
    class(类的使用说明)
    Java泛型
    Java时间操作常用api
    JVM加载class文件的原理机制
    int和Integer区别
    final
    Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
  • 原文地址:https://www.cnblogs.com/eugene0/p/11503455.html
Copyright © 2011-2022 走看看