为项目配置docker

以前就了解过docker,可是一直没有本身配置过docker。此次本身为项目配置了一下docker,在这里作一下总结记录。mysql

Dockerfile和docker-compose

首先,在以往的项目中,都是使用DockerFile + docker-compose的形式来配置docker的,因此,首先就须要了解这二者的关系。nginx

咱们要知道的是,若是咱们只使用dockerfile就能够完成对docker的镜像配置。那么,为何咱们还要使用docker-compose呢?redis

最开始是这样的,咱们只是用docker中的一些命令,就能够实现配置一个镜像。可是这是有问题的:不能保存。因此就是用dockerfile将建立镜像的过程记录下来,而后咱们只须要使用:sql

docker build

就能够建立一个镜像。docker

如今问题又来了:我想建立一个完整的项目,光是有一个镜像是不够的,好比咱们的项目中就须要使用nginxmysqlredis才可以启动项目。网络

虽然咱们也能够考虑使用一个dockerfile,而后写成一个镜像,可是这就不可复用了。因此更加合理的作法应该是咱们分别为nginxmysqlredis建立一个镜像,而后将这些镜像结合起来使用。app

docker-compose就是帮咱们实现这个问题的。ui

因此,总结来讲,dockerfile是用来建立单个镜像的,而docker-compose是用来建立一个项目的。code

Dockerfile

首先先说一下Dockerfile的建立。在这个项目中,咱们只写了一条语句:ip

FROM registry.cn-beijing.aliyuncs.com/mengyunzhi/nginx:1.13.12

FROM是第一条命令,而且是必须的一条命令,它指定了基础镜像。

在这里,咱们使用的基础镜像是托管在阿里docker仓库中的镜像。

咱们也能够从docker官方仓库中获取镜像:

FROM nginx:1.13.12

可是有可能在拉取镜像的时候比较慢。

docker-compose

docker-compose咱们经过配置docker-compose.yml来实现。

声明版本

version: '3'

这是声明咱们要使用哪一种版本的语法的,不一样版本的略有差别。

声明服务

按照咱们上面所说,须要nginxmysqlredis三个镜像,也就是须要三个服务:

services:
  alice.mysql:

  alice.nginx:

  alice.redis:

而后咱们以mysql为例,说明须要哪些命令来构建service。

首先咱们要使用上面建立的Dockerfile,对获取的镜像进行构建(build)。

services:
  alice.mysql:
    build:
      context: ./mysql

context选项指定了基础镜像。

而后就是image

services:
  alice.mysql:
    build:
      context: ./mysql
    image: mysql:5.7

image指定了服务使用的镜像名,这个在咱们没有上面的构建命令(build)时,会先找本地是否有对应的镜像,若是没有,compose会尝试拉取镜像。

端口(ports):

services:
  alice.mysql:
    build:
      context: ./mysql
    image: mysql:5.7
    ports:
      - "3309:3306"

将docker容器的3306端口映射到本地的3309端口。

环境(environment):

services:
  alice.mysql:
    build:
      context: ./mysql
    image: mysql:5.7
    ports:
      - "3309:3306"
    environment:
      - MYSQL_USER=root
      - MYSQL_PASSWORD=
      - MYSQL_ALLOW_EMPTY_PASSWORD=true
      - MYSQL_DATABASE=alice

其实我更喜欢将这一部分叫作环境变量,由于这部分是用来定义变量的。

最后,由于咱们是要将多个服务结合起来,使项目运行的,因此就须要各个容器间进行通讯。因此就须要使用网络(networks)进行配置,将各个服务放在同一个局域网下:

services:
  alice.mysql:
    build:
      context: ./mysql
    image: mysql:5.7
    ports:
      - "3309:3306"
    environment:
      - MYSQL_USER=root
      - MYSQL_PASSWORD=
      - MYSQL_ALLOW_EMPTY_PASSWORD=true
      - MYSQL_DATABASE=alice
    networks:
      aliceNetwork:
        ipv4_address: 172.28.8.4

这里使用了ipv4_address为其分配了一个静态IP地址。

声明网络

上面咱们使用了网络,那是为服务定义网络,其实在这以前,咱们还须要定义一个本身的网络:

networks:
  aliceNetwork:
    ipam:
      config:
        - subnet: 172.28.8.0/24

这里声明了一个子网段,因此能够看到上面mysql的网络是172.28.8.4这种形式,其实只是从这个网段中随便选了一个。

完整配置文件:

# 版本号
version: '3'

# 服务
services:
  alice.mysql:
    build:
      context: ./mysql
    image: mysql:5.7
    ports:
      - "3309:3306"
    environment:
      - MYSQL_USER=root
      - MYSQL_PASSWORD=
      - MYSQL_ALLOW_EMPTY_PASSWORD=true
      - MYSQL_DATABASE=alice
    networks:
      aliceNetwork:
        ipv4_address: 172.28.8.4

  alice.nginx:
    build:
      context: ./nginx
    image: nginx:1.13.12
    volumes:
      - ./:/etc/nginx/conf.d
      - ./app:/usr/local/app
    ports:
      - 9000:80
      - 9001:81
    networks:
      aliceNetwork:
        ipv4_address: 172.28.8.3

  alice.redis:
    build:
      context: ./redis
    image: redis:alpine
    ports:
      - "6380:6379"
    networks:
      aliceNetwork:
        ipv4_address: 172.28.8.5

networks:
  aliceNetwork:
    ipam:
      config:
        - subnet: 172.28.8.0/24

官方参考:
https://docs.docker.com/compo...
https://hub.docker.com/_/nginx

相关文章
相关标签/搜索