Docker-compose是Docker容器工具,經過yml文件定義多docker容器應用,方便快速啓動、中止N多容器。使用docker-compose命令根據yml文件的定義建立或管理多容器,但限於單臺宿主機,若是跨主機管理容器,可用Docker Smarm或流行K8S。php
Docker compose安裝
經過pip安裝docker-compose。html
#pip install docker-compose # docker-compose -v #查看版本 docker-compose version 1.24.1, build 4667896
若是 pip install docker-compose 安裝時間比較長,從官網下載(緣由都懂的),可更換鏡像源。java
#pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose # -i 指定鏡像源地址
Docker compose實施例子
公司正好有個小項目,取名partner,基於spring boot的。需進行訪問,加上Nginx,計劃用docker-compose作。
目錄結構以下:mysql
[root@docker-qa docker-compose]# drwxr-xr-x 2 root root 4096 Sep 12 16:29 b2b-partner -rw-r--r-- 1 root root 660 Sep 12 15:52 docker-compose.yml drwxr-xr-x 3 root root 4096 Sep 12 15:04 logs #其中存放全部容器log,容器應用log目錄映射 drwxr-xr-x 3 root root 4096 Sep 12 15:28 nginx [root@docker-qa docker-compose]# pwd /data/docker/docker-compose
Nginx和partner目錄分別是兩個應用容器,存放基礎配置、jar包、Dockerfile。nginx
#ll b2b-partner/ 總用量 61672 -rw-r--r-- 1 root root 63145378 Sep 12 12:05 b2b-partner.jar -rw-r--r-- 1 root root 457 Sep 12 14:50 Dockerfile # ll nginx/ 總用量 20 drwxr-xr-x 2 root root 4096 Sep 12 16:42 conf.d -rw-r--r-- 1 root root 349 Sep 12 12:10 Dockerfile -rw-r--r-- 1 root root 705 Sep 12 11:41 nginx.conf -rw------- 1 root root 1679 Sep 12 11:26 xmbaby.com.cn.key -rw------- 1 root root 3973 Sep 12 11:26 xmbaby.com.cn.pem
容器partner的Dockerfile:spring
# This is b2b-partner # Version: 1.0 # Author: yuhuanghui # Base image FROM registry.cn-hangzhou.aliyuncs.com/xmbaby-pre/ms-jdk8 # Maintainer MAINTAINER b2b-partner-qa yuhuanghui@alaxiaoyou.com # Set timezome ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone #EXPOSE 8081 ADD b2b-partner.jar /data/httpd/ WORKDIR /data/httpd/ ENTRYPOINT java -Xmx256m -Xss512k -jar b2b-partner.jar
容器Nginx的Dockerfile:sql
# This is b2b-nginx # Version: 1.0 # Author: yuhuanghui # Base image FROM nginx:1.12 # Maintainer MAINTAINER b2b-nginx yuhuanghui@alaxiaoyou.com # Set timezome ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN mkdir -p /data/certs/ COPY ./xmbaby.com.cn.* /data/certs/ #https訪問,需SSL證書
docker-compose.yml的services編寫規則,主要包含version、services、network
關鍵的docker-compose.yml以下:docker
version: '2.2' services: #db: # image:mysql:5.7 #image 若是本地沒有鏡像,則會在公共鏡像倉庫拉取對應鏡像 nginx: build: ./nginx #build 基於指定Dockerfile路徑,compose利用它進行構建 container_name: b2b-nginx #depends_on: #depends_on 容器依賴 #- b2b-partner #links: # links 連接到其餘服務器中的容器,使用alias別名則會在容器的/etc/hosts文件建立 #- db:mysql5.7 #- b2b-partner:b2b-partner volumes: #volumes掛載目錄(Host:Container),ro表示只讀 - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./logs/nginx:/var/log/nginx/ ports: #ports 映射端口(Host:Container) - "80:80" - "443:443" restart: always command: nginx -g 'daemon off;' #command 會覆蓋容器啓動後默認執行的命令。 b2b-partner: build: ./b2b-partner container_name: b2b-partner ports: - "8091:8081" restart: always
docker-compose.yml中還有network網絡模式,有:服務器
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
這裏docker-compose.yml中沒有指定network,但進行docker-compose up -d 命令啓動時會顯示「Creating network "docker-compose_default" with the default driver」,會建立默認的network。
其中nginx配置parner的server虛擬主機主要配置以下:網絡
server { listen 443; server_name aaa; index index.html index.htm index.php; ssl on; ssl_certificate /data/certs/aaa; ssl_certificate_key /data/certs/aaa; ssl_session_timeout 5m; access_log /var/log/nginx/aaa-ssl.access.log main; error_log /var/log/nginx/aaa-ssl.error.log; location / { proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_buffer_size 64k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_max_temp_file_size 512m; proxy_connect_timeout 1800; proxy_read_timeout 1800; proxy_send_timeout 1800; #proxy_pass http://aaa:8091; proxy_pass http://172.17.0.1:8091; } }
上面的反向代理配置剛開始是 「#proxy_pass http://b2b-partner:8091;」 發現不行,後面換成docker0虛擬網橋IP(其餘docker容器的網關),即 「proxy_pass http://172.17.0.1:8091;」 測試經過。
次日忽然靈光開竅,測試發現,其實反向代理proxy_pass端口不是映射出去的端口,是容器內的端口,換成「proxy_pass http://b2b-partner:8081;」, 測試經過。Nginx容器反向代理的格式是:「proxy_pass http://容器名稱:容器Port;」。
運行Docker compose及docker-compose經常使用命令
經常使用命令:
docker-compose up -d #構建啓動docker-compose.yml中容器,後臺運行
docker-compose down #刪除全部容器
docker-compose config -q #驗證docker-compose.yml文件配置,配置正確,不輸出任何東西
docker-compose ps #顯示全部容器
docker-compose build nginx #構建nginx鏡像
docker-compose rm nginx #刪除nginx容器
docker-compose start nginx #啓動nginx容器
docker-compose stop nginx #中止nginx容器
docker-compose logs -f nginx #查看nginx容器實時log
根據如上命令,啓動docker-compose。第一次輸入docker-compose up -d會進行構建文件中的鏡像,須要先進入docker-compose目錄進行up、down命令等操做。
[root@docker-qa docker-compose]# docker-compose up -d Creating network "docker-compose_default" with the default driver Creating b2b-partner ... done Creating b2b-nginx ... done [root@docker-qa docker-compose]# docker-compose down Stopping b2b-nginx ... done Stopping b2b-partner ... done Removing b2b-nginx ... done Removing b2b-partner ... done Removing network docker-compose_default [root@docker-qa docker-compose]# docker-compose ps Name Command State Ports #----------------------------------------------------------------------------------------------- b2b-nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp b2b-partner /bin/sh -c java -Xmx256m - ... Up 0.0.0.0:8091->8081/tcp