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

原文地址:https://www.cnblogs.com/zackstang/p/11939977.html