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

Docker(二)Image 与网络的更多相关文章

  1. Docker入门篇(二)之docker的单主机网络

    Docker 安装时会自动在host上创建三个网络,我们可用 docker network ls命令查看: [root@localhost ~]# docker network ls NETWORK ...

  2. docker从零开始网络(二)桥接网络

    使用桥接网络 在网络方面,桥接网络是链路层设备,它在网络段之间转发流量.桥接网络可以是硬件设备或在主机内核中运行的软件设备. 就Docker而言,桥接网络使用软件桥接器,该软件桥接器允许连接到同一桥接 ...

  3. docker学习3-虚拟网络模式

    一.虚拟机网络模式 在理解docker网络隔离前,先看下之前虚拟机里对网络的处理,VirtualBox中有4中网络连接方式: NAT Bridged Adapter Internal Host-onl ...

  4. Docker Swarm 创建overlay网络

    Docker Swarm 创建overlay网络 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1. ...

  5. docker进阶——数据管理与网络

    一.数据卷管理 用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者 需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及 到容器的数据管理 (1)Data Vo ...

  6. Docker的4种网络模式

    我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=host指定. · container ...

  7. Docker实践(2)—虚拟网络

    1 docker(container)的虚拟网络 docker的虚拟网络结构: host创建一个虚拟bridge,每个container对应一个虚拟网络设备(TAP设备),与bridge一起构成一个虚 ...

  8. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  9. Docker(二)

    Docker Compose 多主机网络 容器集群管理 Docker结合Jenkins构建持续集成环境 Docker结合Consul实现服务发现 Docker API 日志管理

  10. Docker基础内容之网络基础

    网络命名空间基本原理 单机版多容器实例网络交互原理 在宿主机上面打开两张网卡eth0与eth1,打通两张网卡的链路 在test1上面启动一个veth网卡,创建一个namespace:并桥接到eth0上 ...

随机推荐

  1. Mybaits(9)MyBatis级联-2

    一.鉴别器和一对多级联 1.完善体检表,分为男雇员体检和女雇员体检表 (1)持久层dao编写 package com.xhbjava.dao; import com.xhbjava.domain.Ma ...

  2. matlab中的输出显示函数

    matlab中的输出显示函数 在matlab中使用的显示函数有disp.sprintf.fprintf比较常用.下面来介绍一下他们的用法. 1.disp()函数: disp(x)主要是用来输出变量x的 ...

  3. Protobuf用法

    官方文档 什么是 protocol buffer? Protocol buffers are a flexible, efficient, automated mechanism for serial ...

  4. Spark调优指南

    Spark相关问题 Spark比MR快的原因? 1) Spark的计算结果可以放入内存,支持基于内存的迭代,MR不支持. 2) Spark有DAG有向无环图,可以实现pipeline的计算模式. 3) ...

  5. netty 4.x用户使用指南

    引言 问题 现在我们使用通用的应用程序或库来相互通信.例如,我们经常使用HTTP客户机从web服务器检索信息,并通过web服务调用远程过程调用.然而,通用协议或其实现有时不能很好地进行扩展.这就像我们 ...

  6. 基于Docker的Consul集群实现服务发现

    服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的. ...

  7. 00 - PXE | 环境准备

    00 - PXE | 环境准备 TFTP PXE 1. TFTP服务搭建 安装环境Centos7.3 1.1 安装 # yum install xinetd # yum install tftp # ...

  8. 标准化建筑的 FRESH 原则

    前记 大家好,我是小镭. 我在钢结构领域从业十余年,虽然工作内容是关于建筑的,但如果问我什么是建筑,我却一时答不出来. 记得小时候我读过一篇文章,说建筑是凝固的音乐. 后来我看了些书,觉得建筑是空间. ...

  9. 纪中23日c组T2 2159. 【2017.7.11普及】max 洛谷P1249 最大乘积

    纪中2159. max 洛谷P1249 最大乘积 说明:这两题基本完全相同,故放在一起写题解 纪中2159. max (File IO): input:max.in output:max.out 时间 ...

  10. P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】【最大流】

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...