以前就瞭解過docker
,可是一直沒有本身配置過docker
。此次本身爲項目配置了一下docker,在這裏作一下總結記錄。mysql
首先,在以往的項目中,都是使用DockerFile + docker-compose
的形式來配置docker的,因此,首先就須要瞭解這二者的關係。nginx
咱們要知道的是,若是咱們只使用dockerfile
就能夠完成對docker的鏡像配置。那麼,爲何咱們還要使用docker-compose
呢?redis
最開始是這樣的,咱們只是用docker中的一些命令,就能夠實現配置一個鏡像。可是這是有問題的:不能保存
。因此就是用dockerfile
將建立鏡像的過程記錄下來,而後咱們只須要使用:sql
docker build
就能夠建立一個鏡像。docker
如今問題又來了:我想建立一個完整的項目,光是有一個鏡像是不夠的,好比咱們的項目中就須要使用nginx
、mysql
、redis
纔可以啓動項目。網絡
雖然咱們也能夠考慮使用一個dockerfile
,而後寫成一個鏡像,可是這就不可複用了。因此更加合理的作法應該是咱們分別爲nginx
、mysql
、redis
建立一個鏡像,而後將這些鏡像結合起來使用。app
docker-compose
就是幫咱們實現這個問題的。ui
因此,總結來講,dockerfile
是用來建立單個鏡像的,而docker-compose
是用來建立一個項目的。code
首先先說一下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.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