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

最新文章

  1. mapreduce任务中Shuffle和排序的过程
  2. android sdk manager 无法更新
  3. Codeforces Round #322 (Div. 2) C. Developing Skills 优先队列
  4. iOS:KVO/KVC 的概述与使用
  5. Linux read/write fread/fwrite两者区别
  6. 继承Application实现Android数据共享
  7. UVA - 10339-Watching Watches
  8. 一周Maven框架学习随笔
  9. User Agent 大全
  10. Druid中配置双数据库
  11. Spark资源调度
  12. android hook native函数
  13. unity3d常用组件及分析
  14. win10:如何开启自带虚拟机
  15. java远程调用linux的命令或者脚本
  16. Scramble String leetcode java
  17. 为Subline Text 3 添加支持ini文件语法高亮
  18. Sql语法高级应用之三:存储过程
  19. lintcode 66.67.68 二叉树遍历(前序、中序、后序)
  20. Sass之二(进阶篇)

热门文章

  1. Elasticsearch配置集群环境
  2. Electron – 项目报错整理(打包~2): electron-packager踩坑
  3. LAMP搭建随笔
  4. 最小生成树算法总结(Kruskal,Prim)
  5. SecureCRT 按退格键出现 ^H 的解决办法  
  6. Android studio中修改xml文件无效问题
  7. P4802 [CCO 2015]路短最
  8. 性能优化 && 用户体验
  9. 问题 C: To Fill or Not to Fill
  10. svn提交更新代码提示Please execute the 'Cleanup' command 的解决办法