博文大綱:
1、Compose簡介
2、Compose的安裝使用
3、編寫.yml文件html
Compose是用於定義和運行多容器Docker應用程序的工具。經過Compose,可使用YAML文件來配置應用程序的服務。而後,使用一個命令,就能夠從配置中建立並啓動全部服務。mysql
Docker-Compose是一個容器編排工具。經過一個.yml或.yaml文件,將全部的容器的部署方法、文件映射、容器端口映射等狀況寫在一個配置文件裏,執行docker-compose up命令就像執行腳本同樣,一個一個的安裝並部署容器。nginx
Dockerfile 可讓用戶管理一個單獨的應用容器;而 Compose 則容許用戶在一個模板(YAML 格式)中定義一組相關聯的應用容器,例如一個 Web 服務容器再加上後端的數據庫服務容器等,以下:git
由此能夠得出:一個項目能夠由多個服務(容器)關聯而成,而compose是面向項目進行管理的。github
若想使用compose這個容器編排工具,那麼,必須是基於docker這個服務,若須要安裝部署docker服務器,能夠參考博文:Docker的安裝詳細配置,而後下載docker-compose這個命令,咱們能夠去github官方網站搜索「docker/compose」,以下:web
[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這個編排工具了。sql
在進行編寫.yml文件以前,咱們須要知道每一個compose版本所支持的docker版本是哪些?在咱們下載compose命令時,其實下面已經給出了參考列表,以下:docker
查看docker的版本:數據庫
[root@docker01 ~]# docker -v Docker version 18.09.0, build 4d60db4
經過上述查看操做,能夠知道,當前個人docker版本是18.09,那麼基本可使用全部的compose版本,由於其能夠向下兼容,只要高於compose版本所支持的docker版本便可。apache
[root@docker01 ~]# mkdir compose [root@docker01 ~]# cd compose/ [root@docker01 compose]# vim docker-compose.yml #編寫.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」命令進行查看容器的運行信息,以下:
其中的奧祕就在於COMMAND那一列下面的指令「nginx -g daemon off」,表示關閉後臺,可使Nginx出於當前第一個進程,以便保證Nginx容器的服務是開啓的。
[root@docker01 ~]# dc -f compose/docker-compose.yml up -d #若運行時,沒有與.yml文件出於同一目錄,那麼可使用-f選項指定.yml文件的路徑
[root@docker01 compose]# vim docker-compose.yml #修改.yml文件 version: "3" services: nginx: build: . #這裏指定dockerfile的路徑,能夠寫相對路徑或絕對路徑 container_name: web-nginx image: mynginx:1.0 restart: always ports: - 80:80 volumes: - /root/compose/webserver:/usr/share/nginx/html [root@docker01 compose]# vim Dockerfile #編寫dockerfile文件以下 FROM nginx:latest ADD html /usr/share/nginx/html VOLUME /etc/nginx [root@docker01 compose]# mkdir html #建立dockerfile中指定的目錄 [root@docker01 compose]# docker-compose build #使用.yml構建鏡像 [root@docker01 compose]# docker run -itd --name test -p 80 mynginx:1.0 [root@docker01 compose]# docker ps #查看映射的端口
客戶端訪問其映射到docker主機上的端口,看到的頁面以下(能夠看到,在dockerfile中的ADD配置行並無生效):
查看容器的/etc/nginx目錄是否掛載到了docker主機上:
[root@docker01 compose]# docker inspect test #查看test容器的詳細信息
在返回的信息找到如下字段:
[root@docker01 compose]# cd /var/lib/docker/volumes/2f487a274061c0c4a12dea2e8ebdefa34d3c23526baf4b8ea14df1d07851696b/_data #切換至本地映射的目錄 [root@docker01 _data]# ls #查看該目錄下的文件,發現其就是test容器中/etc/nginx目錄下的配置文件 conf.d koi-win nginx.conf win-utf fastcgi_params mime.types scgi_params koi-utf modules uwsgi_params
[root@docker01 compose]# rm -rf * [root@docker01 compose]# vim Dockerfile FROM httpd ADD testfile.txt /root [root@docker01 compose]# echo "hello world." > testfile.txt [root@docker01 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@docker01 compose]# docker ps -a -q | xargs docker rm -f #爲了解決端口衝突問題,我先刪除以前運行的全部容器 [root@docker01 compose]# docker-compose up -d #基於.yml文件運行容器 [root@docker01 compose]# echo "./webserver/index.html" > webserver/index.html #添加首頁文件 [root@docker01 compose]# curl 127.0.0.1 #訪問測試,能夠看到添加的首頁文件內容 ./webserver/index.html [root@docker01 compose]# docker exec myhttpd cat /root/testfile.txt #查看容器內root目錄下的testfile.txt文件的內容 hello world. #至此,模擬的服務1.0版本就完成了,那麼進行升級到2.0版本 #就是將容器內root目錄下的testfile.txt文件內容更改下 [root@docker01 compose]# echo "hello world 2.0" > testfile.txt #修改本地的testfile.txt文件內容 [root@docker01 compose]# docker-compose build #更新鏡像 [root@docker01 compose]# docker-compose up -d #基於更新後的鏡像,更新容器內容 [root@docker01 compose]# docker exec myhttpd cat /root/testfile.txt #能夠看到容器中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文件,就會更新原來的容器內容,也就模擬實現了微服務的版本更新。
這裏的搭建博客平臺,其實徹底能夠照搬,咱們租一臺雲服務器,在上面運行docker服務,便可參考下面的配置,搭建出屬於咱們本身的博客平臺,特別簡單。
首先須要下載我提供的鏡像包及.yml文件
[root@docker01 wordpress]# ls #上傳我提供的文件 docker-compose.yml mysql-5.7.tar wordpress.tar #導入鏡像 [root@docker01 wordpress]# docker load < mysql-5.7.tar [root@docker01 wordpress]# docker load < wordpress.tar #可自行查看.yml文件中的內容,其中包括了一些用戶名、密碼及數據掛載的目錄信息 [root@docker01 wordpress]# docker ps -a -q | xargs docker rm -f #刪除我這裏正在運行的容器,以防止端口衝突 [root@docker01 wordpress]# docker-compose up -d #執行.yml文件 #執行上述命令後,便可客戶端訪問docker主機的80端口了
客戶端訪問docker主機的IP地址:
填寫相關信息:
至此,博客平臺就搭建完成了,至於其功能頁面,自行研究吧!!!
———————— 本文至此結束,感謝閱讀 ————————