之前就瞭解過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
官方參考:
https://docs.docker.com/compo...
https://hub.docker.com/_/nginx