摘要:看看它里面的鏡像是怎么寫的還是很有收獲的相關不正宗入門教程啟動一個容器不正宗入門教程構建一個鏡像不正宗入門教程使用博客原文
本章通過一個具體的demo來了解 docker-composedocker-compose 是做什么的
在構建一個完整的服務時,我們通常啟動一個容器, 一旦出現(xiàn)多個容器需要同時啟動的時候手打是下下之策, 因為時間一長難免會忘記細節(jié),寫腳本也不是不可以,但是大家沒有達成共識時腳本也很難維護...
docker-compose 就是來解決這個痛點, 只需要按照統(tǒng)一的格式書寫,那么大家生成的容器也都是一致的, 在團隊開發(fā)的時候扔一個配置好的 docker-compose 能節(jié)省很多時間和口水
配置 docker-compose這是我構建的一個開發(fā)環(huán)境的容器:dnmp
首先下載下來
git clone https://github.com/gaopengfei123123/dnmp.git && cd dnmp
我們第一件事就是先瞄一眼 .env 文件, 這里設置了很多常量,一會根據個人需求來調整
第二步才是打開 docker-compose.yml 文件, 看后綴都能猜到這是一個配置文件, 另外 docker-compose.yml 是根據縮進來進行分層的,注意書寫格式
# docker-compose.yml # 語法版本( 3 和 2 區(qū)別有點大, 比如 3 取消了 volume_from 的相關語法) version: "3" networks: frontend: driver: ${NETWORKS_DRIVER} backend: driver: ${NETWORKS_DRIVER} volumes: mysql_volume: driver: ${VOLUMES_DRIVER} redis_volume: driver: ${VOLUMES_DRIVER} rabbitmq_volume: driver: ${VOLUMES_DRIVER} # 服務編排 services: # workspace: # image: tianon/true # container_name: dnmp-www # volumes: # - ./www:/usr/share/nginx/html # NGINX ############################################# nginx: container_name: dnmp-nginx build: context: ./nginx args: - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER} - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT} depends_on: - php-fpm ports: - "${NGINX_HOST_HTTP_PORT}:80" - "${NGINX_HOST_HTTPS_PORT}:443" volumes: # 沒必要把配置文件用卷來掛載, 不然就算配置更新了 nginx 也是要重啟的 # 掛載運行代碼目錄 - ${APP_CODE_PATH_HOST}:/var/www # 掛載日志目錄 - ${NGINX_HOST_LOG_PATH}:/var/log/nginx # 使用 networks 取代 links 在同一個網絡模式下的服務是互通的 # 在service 中使用其他的 service 就直接調用 service 名就行, 不用管 ip 地址, docker 會自己維護一套 networks: - frontend - backend # PHP-FPM ############################################# php-fpm: container_name: dnmp-php-fpm # 這里的args 是屬于 build 下面的,用于構建./php-fpm/Dockerfile 文件中 ARG 參數指定 php 版本 build: context: ./php-fpm args: - PHP_VERSION=${PHP_VERSION} volumes: - ${APP_CODE_PATH_HOST}:/var/www - ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini expose: - "9000" networks: - backend redis: container_name: dnmp-redis build: context: ./redis args: - REDIS_SET_PASSWORD=${REDIS_SET_PASSWORD} ports: - ${REDIS_HOST_PORT}:6379 volumes: # 這里卷掛載的是本地文件 # - ${DATA_PATH_HOST}/redis:/data # 這里創(chuàng)建一個 redis_volume來存放數據 - redis_volume:/data # Mysql ############################################# mysql: container_name: dnmp-mysql # 鏡像來源: https://github.com/docker-library/mysql/blob/fc3e856313423dc2d6a8d74cfd6b678582090fc7/5.7/Dockerfile image: mysql:${MYSQL_VERSION} volumes: # - ${DATA_PATH_HOST}/mysql:/var/lib/mysql - mysql_volume:/var/lib/mysql # 容器只要停止就會重啟 restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} ports: - ${MYSQL_HOST_PORT}:3306
接下來看看它的關鍵詞都起著什么作用:
這個規(guī)定了文件的版本, 既然有 3 就肯定不用 2 啊, 雖然兩者沒沖突,但是我喜歡, 2 和 3 版本之間有輕微的變動,具體區(qū)別你可以在寫配置文件時產生的報錯信息來體驗一下
networks: frontend: driver: ${NETWORKS_DRIVER} backend: driver: ${NETWORKS_DRIVER}
${NETWORKS_DRIVER} 是從 .env 文件中取的值, 下面的同理
這一塊就相當于執(zhí)行 docker network create -d bridge frontend && docker network create -d bridge backend
在本地持久化的建立一個網絡配置,稍后方便容器進行連接, 當然這里也不止是一個 driver 參數,具體配置情況還是參考docker network inspect dnmp_frontend 來看一下
沒有設置名字的配置當需要名字的時候會 {當前docker-compose.yml文件名}_{key} 這種格式
有了 network 配置就極大的簡化了老版的 --links 命令, 只要屬于同一個 network 就能互相訪問到, 而不是每新增一個服務就要把原來的服務都 link 一遍
volumes: mysql_volume: driver: ${VOLUMES_DRIVER} redis_volume: driver: ${VOLUMES_DRIVER} rabbitmq_volume: driver: ${VOLUMES_DRIVER}
和 network 部分一樣, 持久化的創(chuàng)建幾個 volume, 相當于命令 docker network create mysql_volume等等
這算是 v3 的一個新特性, 在 v2 的時候, 為了共享數據大家會創(chuàng)建一個什么鏡像都不繼承的image, 所有容器的 volume 都會和它連接, 現(xiàn)在有了 volume 就沒必要這么搞了
這個是本章的重點, 我們來看下面的例子中的注釋, 按序號來
services: #1 創(chuàng)建一個服務叫做nginx服務 nginx: #2 為了顯得個性化一點,我們指定這個容器的名字叫做 dnmp-nginx container_name: dnmp-nginx #3 標明這個服務的 Dockerfile 的地址,用相對路徑方便項目遷移 build: #3.1 相當于命令: # docker build ./nginx -t dnmp-nginx # --build-arg PHP_UPSTREAM_CONTAINER=xxx # --build-arg PHP_UPSTREAM_PORT=zzz context: ./nginx #3.2 這里 ${NGINX_PHP_UPSTREAM_PORT} 的值是從 .env 文件中取的, args 屬于構建時傳入的參數 args: - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER} - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT} #4 在啟動這個容器之前先啟動 php-fpm 這個容器 depends_on: - php-fpm #5 將本地端口和容器端口綁定, 本地哪個端口就看 .env 里怎么寫的 ports: - "${NGINX_HOST_HTTP_PORT}:80" - "${NGINX_HOST_HTTPS_PORT}:443" #6 設置需要掛載的卷, 這里時將本地目錄和容器綁定, 也可以像 services.redis 那樣和創(chuàng)建好的卷綁定 volumes: # 沒必要把配置文件用卷來掛載, 不然就算配置更新了 nginx 也是要重啟的 # 掛載運行代碼目錄 - ${APP_CODE_PATH_HOST}:/var/www # 掛載日志目錄 - ${NGINX_HOST_LOG_PATH}:/var/log/nginx # 使用 networks 取代 links 在同一個網絡模式下的服務是互通的 # 在service 中使用其他的 service 就直接調用 service 名就行, 不用管 ip 地址, docker 會自己維護一套 #7 設置容器從屬的網絡, 同一個網絡下可互相訪問 networks: - frontend - backend
在上文的 #3 步驟看其他的service也有直接使用image的, 這是直接從遠程獲取鏡像的方式
配置文件寫完了, 我們看下nginx的構建文件
# in file ./nginx/Dockerfile #1 選擇繼承的鏡像 FROM nginx:1.13.1-alpine #2 各種標簽 LABEL maintainer="GPF <5173180@qq.com>" #3 容器中執(zhí)行命令, 且把本地的配置文件添加進去 #https://yeasy.gitbooks.io/docker_practice/content/image/build.html RUN mkdir -p /etc/nginx/cert && mkdir -p /etc/nginx/conf.d && mkdir -p /etc/nginx/sites COPY ./nginx.conf /etc/ngixn/nginx.conf COPY ./conf.d/ /etc/nginx/conf.d/ COPY ./cert/ /etc/nginx/cert/ COPY ./sites /etc/nginx/sites/ #4 這里也是設置構建參數, 不過相同 key 值會被 docker-compose 中的給覆蓋掉 ARG PHP_UPSTREAM_CONTAINER=php-fpm ARG PHP_UPSTREAM_PORT=9000 #5 ${PHP_UPSTREAM_CONTAINER} 就在構建時的參數使用方式 RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf #6 設置掛載的目錄, 該目錄下文件變化不會影響到容器 VOLUME ["/var/log/nginx", "/var/www"] #7 設置目錄運行時所處在容器中的目錄地址 WORKDIR /usr/share/nginx/html
#5 就是顯示了在 nginx 容器中怎么去訪問 php-fpm 這個容器, 直接調用 service 名稱就行
這里需要注意的時 ARG 和 ENV 的區(qū)別, 參考這篇文章: Docker中 Arg 和 Env 的區(qū)別
啟動docker-compse在配置好 .env 文件和 docker-compose.yml 配置文件后就可以啟動它了, 命令也很簡單,在同級目錄下運行:
docker-compose up -d
它會自動創(chuàng)建volume,network,services, 而且相關的運行參數都是按著配置文件來的, 這樣一來每個完整docker-compose.yml中的service就相當于時一個整體,每個服務又屬于各自的容器,這樣操控是不是節(jié)省了很多代碼呢?
查看這些容器的運行狀況也很是簡單
docker-compose ps # 或者使用更方便的一個工具: ctop , github地址: https://github.com/bcicen/ctop
可操控單一容器一樣, 但是它會把這一組容器都囊括了進去,操控起來只需要知道操控哪個服務,而一些參數就寫在配置文件當中已經默認添加了
一些常用的命令:
# 終止整個服務集合 docker-compose stop # 終止指定的服務 (這有個點就是啟動的時候會先啟動 depond_on 中的容器,關閉的時候不會影響到 depond_on 中的) docker-compose stop nginx # 查看容器的輸出日志 docker-compose logs -f [services...] # 構建鏡像時不使用緩存(能避免很多因為緩存造成的問題) docker-compose build --no-cache --force-rm # 移除指定的容器 docker-compose rm nginx
本來熟悉命令的最好方式就是 用->犯錯->排錯->用 這種循環(huán), 有什么不懂的 谷歌bing 都能查到, 直接 docker-compose --help 也能猜出命令的大概作用, 這里就不細說了
還有個很不錯的 docker-compose 項目就是 laradock, dnmp 就是仿照著它寫的, 不過網絡不好的情況下別運行 laradock, 它現(xiàn)在做的太臃腫了。。。。 看看它里面的鏡像是怎么寫的還是很有收獲的
相關不正宗 Docker 入門教程-啟動一個容器(1/3)
不正宗 Docker 入門教程-構建一個鏡像(2/3)
不正宗 Docker 入門教程-使用 Docker-Compose (3/3)
博客原文
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27375.html
摘要:從命名上就知道這是一篇簡單粗暴的新手入門教程,為什么要簡單粗暴我認為有自學能力的人幫他入門就夠了,不能自學的一時半會兒也教不會,不符合入門教程的初衷,建議出門左拐去找找視頻教程本章目標大概了解是個什么玩意知道常用的指令參數能啟動一個容器不然 從命名上就知道這是一篇簡單粗暴的docker新手入門教程, 為什么要簡單粗暴? 我認為有自學能力的人幫他入門就夠了, 不能自學的一時半會兒也教不會...
摘要:時間年月日星期六說明本文部分內容均來自慕課網。必填用于執(zhí)行命令,當執(zhí)行完畢后,將產生一個新的文件層。可選指定此鏡像啟動時默認執(zhí)行命令。可選用于指定需要暴露的網絡端口號。可選向鏡像中掛載一個卷組。 時間:2017年09月16日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com 教學源碼:無 學習源碼:無 第一章:課程簡介 1-1 課程介紹 Docke...
摘要:編排一組容器的啟停的工具,直接在官方倉庫下載二進制文件。啟動多任務只需多增加一個指定該容器暴露的端口號用啟動,用查看啟動成功關閉一組服務注意要在文件所在的目錄執(zhí)行該命令才可關閉對應的容器會停止并刪除容器,網絡等入門到此結束 docker-compose 編排一組容器的啟停的工具,直接在官方github倉庫下載二進制文件。 安裝 1. 下載docker-compose sudo curl...
摘要:確認安裝成功并且服務啟動之后,再繼續(xù)進行下一步。適用于開發(fā)者的定制環(huán)境,其中包含編譯智能合約需要的相關工具和依賴庫。由于我們是開發(fā)者,因此我們選用這個。此時也可以通過的請求,直接訪問查詢分享一個開發(fā)視頻教程,密碼 由于EOS的版本在不斷的更新迭代,本地編譯最新版本的方式更新比較繁瑣,而且容易出問題。 因此,我們推薦使用Docker容器的方式配置EOS本地測試環(huán)境,這樣方便維護升級,而且...
摘要:安裝完成后,可以用以下命令查看下版本信息。另外,如果要刪除剛運行的兩個容器,可以總結本文從數據持久化開始說起,淺談了和并附送如何用這兩種方式分別搭建環(huán)境,并在對比中展示了它們各自的特點。 上一文中提到,每次對容器做了改動,如果不把它 commit 成新的鏡像,在刪除容器后,數據也會丟失,有沒有什么更好的辦法來保存數據呢?使用數據卷就可以解決這個問題。 另外,相對于用 commit 容器...
閱讀 1377·2021-10-13 09:39
閱讀 1337·2021-09-23 11:22
閱讀 2247·2019-08-30 14:05
閱讀 1062·2019-08-29 17:03
閱讀 777·2019-08-29 16:24
閱讀 2231·2019-08-29 13:51
閱讀 662·2019-08-29 13:00
閱讀 1305·2019-08-29 11:24