Docker Image
我们介绍一下如何构造一个自定义的 Docker Image。在Docker 中,我们使用Dokcerfile 构建一个docker的描述。
首先我们定义一下需要启动一个什么应用,以 web app 为例,我们有以下需求:
- 操作系统:centos
- 更新软件:yum -y update
- 安装依赖:yum
- 安装Python依赖:pip
- 复制源代码到 /opt 文件夹
- 使用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可以被外部访问,则一般有两个方法:
- 使用之前介绍过的port mapping 的方式,将外部端口与Container 端口映射
- 使用 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