zoukankan      html  css  js  c++  java
  • Docker(二)Image 与网络

    Docker Image

    我们介绍一下如何构造一个自定义的 Docker  Image。在Docker 中,我们使用Dokcerfile 构建一个docker的描述。

    首先我们定义一下需要启动一个什么应用,以 web app 为例,我们有以下需求:

    1. 操作系统:centos
    2. 更新软件:yum -y update
    3. 安装依赖:yum
    4. 安装Python依赖:pip
    5. 复制源代码到 /opt 文件夹
    6. 使用flask命令执行web server

    定义了需求后我们开始编写Dockerfile:

    FROM centos
    
    RUN yum -y update
    RUN yum -y install python3
    
    RUN pip3 install flask
    RUN pip3 install flask-mysql
    
    COPY . /opt/source-code 
    
    ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
    

     
    然后 build 此docker:

    docker build -t zack/webapp .

    若是需要上传此镜像到 docker hub,则可以使用 docker push zack/webapp 进行推送。

    Dockerfile 结构

    Dockerfile 可以的基本语法为:

     

    FROM ubuntu  => 基础image,可以是纯操作系统,也可以是基于其他image

    RUN yum -y update => 执行命令

    ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run => 在 image 以 docker container 运行后,执行的指令

    在 build 过程中,可以看到多个step:

    Step 1/7 : FROM centos

     ---> 0f3e07c0138f

    Step 2/7 : RUN yum -y update

     ---> Using cache

     ---> 45828a832352

    Step 3/7 : RUN yum -y install python3

     ---> Using cache

     ---> 6c66ca299317

    成功的 step 会被缓存,以减少下次build的时间。

    Docker Compose

    在部署多个container组件时,如web app、database、message system 等,一般我们不会每次部署一个container,而是使用 docker compose文件。例如:

    services:

        web:

            image: "zack/webapp"

        database:

            image: "mongodb"

        messaging:

            image: "redis:alpine"

        orchestration:

            image: "ansible"

    之后使用docker-compose up 即可部署一套系统,使用docker-compose stop 停止系统,或是使用docker-compose 下线整个系统。

    Docker 网络

    在 Docker 启动时,有3种网络模式,分别为Bridge、none、host。在执行docker run 时,默认的是bridge模式。

    Bridge

    在bridge 模式下,每个Container都是启动在私有子网下,并有自己的私有ip地址,一般是172.17.0.x,如:

     

    Container 之间客户相互访问,但是外部无法直接访问到内部的 docker container。若是需要Container可以被外部访问,则一般有两个方法:

    1. 使用之前介绍过的port mapping 的方式,将外部端口与Container 端口映射
    2. 使用 host network

    Host

    Host network 是将 Docker Container 的端口直接映射到主机同一端口,与port mapping的区别较为明显。使用 host network 启动时,可以用:

    docker run --network=host training/webapp

    None

    最后一个是 none network,在这种模式下启动的 container 将无任何ip地址。启动的方式为:

    docker run --network=none training/webapp

    自定义Docker网络

    在 bridge 网络模式下,docker默认子网使用的是 172.17.0.x 的地址,若是我们需要另一另一个网络呢?比如:

     

    在这种需求下,我们可以使用docker network create 命令创建一个网络。例如:

    > docker network create --driver bridge --subnet 182.18.0.0/16 custom-isolated-network

    之后我们即可使用 docker network ls 命令查看当前的docker 网络,如:

    > docker network ls

    NETWORK ID          NAME                      DRIVER              SCOPE

    686a2c7d0d84        bridge                    bridge              local

    ee612a9c4873        custom-isolated-network   bridge              local

    491d93c817b7        host                      host                local

    a3184c11c69b        none                      null                local

    之后即可使用以下命令将container 启动在此网络下:

    docker network run --network=custom-isolated-network training/webapp

    进一步验证:

    > docker exec 957cd71c547c ifconfig

    eth0      Link encap:Ethernet  HWaddr 02:42:b6:12:00:02

              inet addr:182.18.0.2  Bcast:182.18.255.255  Mask:255.255.0.0

  • 相关阅读:
    zr#955 折纸
    zr#954 分组
    p2513 [HAOI2009]逆序对数列
    p4161 [SCOI2009]游戏
    p4593 [TJOI2018]教科书般的亵渎
    622FThe Sum of the k-th Powers
    spoj1811 LCS
    后缀自动机
    p5342 [TJOI2019]甲苯先生的线段树
    p5339 [TJOI2019]唱、跳、rap和篮球
  • 原文地址:https://www.cnblogs.com/zackstang/p/11939977.html
Copyright © 2011-2022 走看看