成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

不正宗 docker 入門(mén)教程-使用 docker-compose (3/3)

MorePainMoreGain / 2019人閱讀

摘要:看看它里面的鏡像是怎么寫(xiě)的還是很有收獲的相關(guān)不正宗入門(mén)教程啟動(dòng)一個(gè)容器不正宗入門(mén)教程構(gòu)建一個(gè)鏡像不正宗入門(mén)教程使用博客原文

本章通過(guò)一個(gè)具體的demo來(lái)了解 docker-compose
docker-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)鍵詞都起著什么作用:

version

這個(gè)規(guī)定了文件的版本, 既然有 3 就肯定不用 2 啊, 雖然兩者沒(méi)沖突,但是我喜歡, 2 和 3 版本之間有輕微的變動(dòng),具體區(qū)別你可以在寫(xiě)配置文件時(shí)產(chǎn)生的報(bào)錯(cuò)信息來(lái)體驗(yàn)一下

network
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 一遍

volume
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)必要這么搞了

service

這個(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í) ARGENV 的區(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,networkservices, 而且相關(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

相關(guān)文章

  • 正宗 docker 入門(mén)教程-啟動(dòng)一個(gè)容器(1/3)

    摘要:從命名上就知道這是一篇簡(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ì)...

    YorkChen 評(píng)論0 收藏0
  • 慕課網(wǎng)_《Docker入門(mén)》學(xué)習(xí)總結(jié)

    摘要:時(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...

    CoorChice 評(píng)論0 收藏0
  • docker-compose安裝及簡(jiǎn)單入門(mén)

    摘要:編排一組容器的啟停的工具,直接在官方倉(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...

    honmaple 評(píng)論0 收藏0
  • EOS開(kāi)發(fā)教程-Docker構(gòu)建EOS環(huán)境

    摘要:確認(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í),而且...

    omgdog 評(píng)論0 收藏0
  • Docker 入門(mén)(二):從實(shí)例來(lái)看 Dockerfile 和 Compose

    摘要:安裝完成后,可以用以下命令查看下版本信息。另外,如果要?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 容器...

    xingqiba 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<