Docker 三劍客之docker-compose

1、Compose簡介
Compose是用於定義和運行多容器Docker應用程序的工具。經過Compose,可使用YAML文件來配置應用程序的服務。而後,使用一個命令,就能夠從配置中建立並啓動全部服務。html

Docker-Compose是一個容器編排工具。經過一個.yml或.yaml文件,將全部的容器的部署方法、文件映射、容器端口映射等狀況寫在一個配置文件裏,執行docker-compose up命令就像執行腳本同樣,一個一個的安裝並部署容器。mysql

Dockerfile 可讓用戶管理一個單獨的應用容器;而 Compose 則容許用戶在一個模板(YAML 格式)中定義一組相關聯的應用容器,例如一個 Web 服務容器再加上後端的數據庫服務容器等。
Docker 三劍客之docker-composenginx

docker-compose的術語:
服務(service):一個應用容器,實際上能夠運行多個相同鏡像的實例。
項目(project):由一組關聯的應用容器組成的一個完整的業務單元。git

由此能夠得出:一個項目能夠由多個服務(容器)關聯而成,而compose是面向項目進行管理的。
2、Compose的安裝及使用
若想使用compose這個容器編排工具,那麼,必須是基於docker這個服務,安裝docker,而後下載docker-compose這個命令,咱們能夠去github官方網站搜索「docker/compose」
Docker 三劍客之docker-compose
Docker 三劍客之docker-compose
Docker 三劍客之docker-compose
一、在docker主機上執行github上獲得的命令github

[root@docker01 ~]# curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@docker01 ~]# chmod +x /usr/local/bin/docker-compose

執行上面的兩條命令後,咱們就可使用docker-compose這個編排工具了。web

在進行編寫.yml文件以前,咱們須要知道每一個compose版本所支持的docker版本是哪些?在咱們下載compose命令時,其實下面已經給出了參考列表。
前面是版本號,後面是對應的版本所支持的docker服務版本
Docker 三劍客之docker-compose
查看docker的版本:sql

[root@docker01 ~]# docker -v
Docker version 18.09.0, build 4d60db4

經過上述查看操做,能夠知道,當前個人docker版本是18.09,那麼基本可使用全部的compose版本,由於其能夠向下兼容,只要高於compose版本所支持的docker版本便可
3、編寫.yml文件
一、構建簡單的Nginx服務.yml文件docker

[root@docker01 ~]# mkdir compose
[root@docker01 ~]# cd compose/
[root@docker01 compose]# vim docker-compose.yml
version: "3"
services:
  nginx:
    container_name: web-nginx
    image: nginx:latest
    restart: always
    ports:
      - 80:80
    volumes:
      - /root/compose/webserver:/usr/share/nginx/html
 [root@docker01 compose]# docker-compose up -d
#執行上述命令後,會自動在當前目錄下生成一個webserver的目錄,對應的就是容器中的html目錄
[root@docker01 compose]# echo "hello world" > webserver/index.html
[root@docker01 compose]# curl 127.0.0.1       # 訪問本機測試
hello world

咱們基於本身寫dockerfile文件構建鏡像並運行容器後,都須要進入容器手動啓動一下其運行的服務,而經過上面的的例子,能夠看到,容器運行後,其服務也是出於運行狀態的,這是怎麼作到的呢?咱們能夠經過執行「docker ps」命令進行查看容器的運行信息
Docker 三劍客之docker-compose數據庫

[root@docker03 compose]# alias dc='docker-compose'
[root@docker01 ~]# dc -f compose/docker-compose.yml up -d
#若運行時,沒有與.yml文件出於同一目錄,那麼可使用-f選項指定.yml文件的路徑

二、compose+dockerfile構建鏡像apache

[root@docker03 compose]# vim docker-compose.yml 

version: "3"
services:
  nginx:
    build: .
    container_name: web-nginx
    image: mynginx:1.0
    restart: always
    ports:
      - 80:80
    volumes:
      - /root/compose/webserver:/usr/share/nginx/html
[root@docker03 compose]# vim Dockerfile
FROM nginx:latest
ADD html /usr/share/nginx/html
VOLUME /etc/nginx
[root@docker03 compose]# mkdir html          # 建立dockerfile中指定的目錄
[root@docker03 compose]# docker-compose build          # 使用.yml構建鏡像
[root@docker03 compose]# docker run -itd --name nginx-test -p 80 mynginx:1.0 
[root@docker03 compose]# docker ps          # 查看映射的端口

客戶端訪問其映射到docker主機上的端口,看到的頁面以下(能夠看到,在dockerfile中的ADD配置行並無生效):
Docker 三劍客之docker-compose
查看容器的/etc/nginx目錄是否掛載到了docker主機上:

[root@docker03 compose]# docker inspect nginx-test

Docker 三劍客之docker-compose

#切換至本地映射的目錄
[root@docker03 compose]# cd /var/lib/docker/volumes/ce367403fbc2f1e48e2ed3f7fe1f5761312c3d7c5824fd9437dfcbc7eb7294eb/_data/
[root@docker03 _data]# ls          # 查看該目錄下的文件,發現其就是容器中/etc/nginx目錄下的配置文件
conf.d          koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params  koi-win  modules     scgi_params  win-utf

三、Dockerfile&&compose更新容器內的服務版本

[root@docker03 compose]# rm -rf *
[root@docker03 compose]# vim Dockerfile
FROM httpd
ADD testfile.txt /root
[root@docker03 compose]# vim docker-compose.yml
version: "3"
services:
  httpd:
    build: .
    container_name: myhttpd
    image: myhttpd:latest
    restart: always
    ports:
      - 80:80
    volumes:
      - ./webserver:/usr/local/apache2/htdocs
[root@docker03 compose]# docker ps -a -q | xargs docker rm -f
#爲了解決端口衝突問題,我先刪除以前運行的全部容器
[root@docker03 compose]# docker-compose up -d           # 基於.yml文件運行容器 
[root@docker03 compose]# echo "./webserver/index.html" > webserver/index.html              # 添加首頁文件
[root@docker03 compose]# curl 127.0.0.1
./webserver/index.html             # 訪問測試
[root@docker03 compose]# docker exec myhttpd cat /root/testfile.txt               #查看容器內root目錄下的testfile.txt文件的內容
hello world.
#至此,模擬的服務1.0版本就完成了,那麼進行升級到2.0版本
#就是將容器內root目錄下的testfile.txt文件內容更改下
[root@docker03 compose]# echo "hello world 2.0" > testfile.txt 
#修改本地的testfile.txt文件內容
[root@docker03 compose]# docker-compose build          #更新鏡像
[root@docker03 compose]# docker-compose up -d          #基於更新後的鏡像,更新容器內容
[root@docker03 compose]# docker exec myhttpd cat /root/testfile.txt         # 能夠看到已經更新
hello world 2.0
附:
[root@docker01 wordpress]# docker-compose stop    #中止當前.yml文件運行的容器
[root@docker01 wordpress]# docker-compose rm      #刪除當前.yml文件運行的容器
Going to remove wordpress_wordpress_1, wordpress_db_1
Are you sure? [yN] y      #輸入「y」確認

經過上面一系列的更新操做,不難發現,只要.yml文件檢測到了dockerfile所關聯的文件內容發生了改變,那麼就會從新構建鏡像,而後再次啓動.yml文件,就會更新原來的容器內容,也就模擬實現了微服務的版本更新。
四、使用.yml文件搭建博客平臺
軟件包(提取碼:1231)

[root@docker03 wordpress]# ls
docker-compose.yml  mysql-5.7.tar  wordpress.tar
#導入鏡像
[root@docker03 wordpress]# docker load < mysql-5.7.tar 
[root@docker03 wordpress]# docker load < wordpress.tar 
#可查看.yml文件中的內容,其中包括了一些用戶名、密碼及數據掛載的目錄信息
[root@docker03 wordpress]# cat docker-compose.yml 
version: '3.1'
services:
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 808:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: 123.com
      WORDPRESS_DB_NAME: wordpress

  db:
    image: mysql:5.7
    restart: always
    volumes:
      - /root/wordpress/mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: 123.com
      MYSQL_ROOT_PASSWORD: 123.com
[root@docker03 wordpress]# docker ps -a -q | xargs docker rm -f
#清空以前的全部容器,以防衝突
[root@docker03 wordpress]# docker-compose up -d
#執行上述命令後,便可客戶端訪問docker主機的80端口了

客戶端訪問docker主機的IP地址,填寫相關信息:
Docker 三劍客之docker-compose
Docker 三劍客之docker-compose
Docker 三劍客之docker-compose
而後就能夠看到博客後臺了
Docker 三劍客之docker-compose

相關文章
相關標籤/搜索