爲項目配置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

相關文章
相關標籤/搜索