為專案配置docker
之前就瞭解過docker
,但是一直沒有自己配置過docker
。這次自己為專案配置了一下docker,在這裡做一下總結記錄。
Dockerfile和docker-compose
首先,在以往的專案中,都是使用DockerFile + docker-compose
的形式來配置docker的,所以,首先就需要了解這兩者的關係。
我們要知道的是,如果我們只使用dockerfile
就可以完成對docker的映象配置。那麼,為什麼我們還要使用docker-compose
呢?
最開始是這樣的,我們只是用docker中的一些命令,就可以實現配置一個映象。但是這是有問題的:不能儲存
。所以就是用dockerfile
將建立映象的過程記錄下來,然後我們只需要使用:
docker build
就可以建立一個映象。
現在問題又來了:我想建立一個完整的專案,光是有一個映象是不夠的,比如我們的專案中就需要使用nginx
、mysql
、redis
才能夠啟動專案。
雖然我們也可以考慮使用一個dockerfile
,然後寫成一個映象,但是這就不可複用了。所以更加合理的做法應該是我們分別為nginx
、mysql
、redis
建立一個映象,然後將這些映象結合起來使用。
docker-compose
就是幫我們實現這個問題的。
所以,總結來說,dockerfile
是用來建立單個映象的,而docker-compose
是用來建立一個專案的。
Dockerfile
首先先說一下Dockerfile
的建立。在這個專案中,我們只寫了一條語句:
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'
這是宣告我們要使用哪種版本的語法
的,不同版本的略有差異。
宣告服務
按照我們上面所說,需要nginx
、mysql
、redis
三個映象,也就是需要三個服務:
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