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