<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                上面這種將所有服務放在一個容器內的模式有個形象的非官方稱呼:Fat Container。與之相對的是將服務分拆到容器的模式。從Docker的設計可以看到,構建鏡像的過程中可以指定唯一一個容器啟動的指令,因此Docker天然適合一個容器只運行一種服務,而這也是官方更推崇的。 分拆服務遇到的第一個問題就是,我們每一個服務的基礎鏡像從哪里來?這里有兩個選項: **選項一、 統一從標準的OS鏡像擴展**,比如下面分別是Nginx和MySQL鏡像 ~~~ FROM ubuntu:14.04 RUN apt-get update -y && apt-get install -y nginx ~~~ ~~~ FROM ubuntu:14.04 RUN apt-get update -y && apt-get install -y mysql ~~~ 這種方式的優點在于所有服務可以有一個統一的基礎鏡像,對鏡像進行擴展和修改時可以使用同樣的方式,比如選擇了ubuntu,就可以使用`apt-get`指令安裝服務。 問題在于大量的服務需要自己維護,特別是有時候需要某個服務的不同版本時,往往需要直接編譯源碼,調試維護成本都很高。 **選項二、 直接從Docker Hub繼承官方鏡像**,下面同樣是Nginx和MySQL鏡像 ~~~ FROM nginx:1.9.0 ~~~ ~~~ FROM mysql:5.6 ~~~ [Docker Hub](https://registry.hub.docker.com/)可以看做是Docker的Github,Docker官方已經準備好了大量[常用服務的鏡像](https://registry.hub.docker.com/repos/library/?s=stars),同時也有非常多第三方提交的鏡像。甚至可以基于[Docker-Registry](https://github.com/docker/docker-registry)項目在短時間內自己搭建一個私有的Docker Hub。 基于某個服務的官方鏡像去構建鏡像,有非常豐富的選擇,并且可以以很小的代價切換服務的版本。這種方式的問題在于官方鏡像的構建方式多種多樣,進行擴展時需要先了解原鏡像的`Dockerfile`。 出于讓服務搭建更靈活的考慮,我們選擇后者構建鏡像。 為了分拆服務,現在我們的目錄變為如下所示結構: ~~~ ~/Dockerfiles ├── mysql │?? └── Dockerfile ├── nginx │?? ├── Dockerfile │?? ├── nginx.conf │?? └── sites-enabled │?? ├── default.conf │?? └── evaengine.conf ├── php │?? ├── Dockerfile │?? ├── composer.phar │?? ├── php-fpm.conf │?? ├── php.ini │?? ├── redis.tgz └── redis └── Dockerfile ~~~ 即為每個服務創建單獨文件夾,并在每個服務文件夾下放一個Dockerfile。 ## MySQL容器 MySQL繼承自官方的[MySQL5.6鏡像](https://registry.hub.docker.com/_/mysql),Dockerfile僅有一行,無需做任何額外處理,因為普通需求官方都已經在鏡像中實現了,因此Dockerfile的內容為: ~~~ FROM mysql:5.6 ~~~ 在項目根目錄下運行 ~~~ docker build -t eva/mysql ./mysql ~~~ 會自動下載并構建鏡像,這里我們將其命名為`eva/mysql`。 由于容器運行結束時會丟棄所有數據庫數據,為了不用每次都要導入數據,我們將采用掛載的方式持久化MySQL數據庫,官方鏡像默認將數據庫存放在`/var/lib/mysql`,同時要求容器運行時必須通過環境變量設置一個管理員密碼,因此可以使用以下指令運行容器: ~~~ docker run -p 3306:3306 -v ~/opt/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it eva/mysql ~~~ 通過上面的指令,我們將本地的3306端口綁定到容器的3306端口,將容器內的數據庫持久化到本地的`~/opt/data/mysql`,并且為MySQL設置了一個root密碼`123456` ## Nginx容器 Nginx目錄下提前準備了Nginx配置文件`nginx.conf`以及項目的配置文件`default.conf`等。Dockerfile內容為: ~~~ FROM nginx:1.9 ADD nginx.conf /etc/nginx/nginx.conf ADD sites-enabled/* /etc/nginx/conf.d/ RUN mkdir /opt/htdocs && mkdir /opt/log && mkdir /opt/log/nginx RUN chown -R www-data.www-data /opt/htdocs /opt/log VOLUME ["/opt"] ~~~ 由于官方的[Nginx1.9](https://registry.hub.docker.com/_/nginx/)是基于Debian Jessie的,因此首先將準備好的配置文件復制到指定位置,替換鏡像內的配置,這里按照個人習慣,約定`/opt/htdocs`目錄為Web服務器根目錄,`/opt/log/nginx`目錄為Nginx的Log目錄。 同樣構建一下鏡像 ~~~ docker build -t eva/nginx ./nginx ~~~ 并運行容器 ~~~ docker run -p 80:80 -v ~/opt:/opt -it eva/nginx ~~~ 注意我們將本地的80端口綁定到容器的80端口,并將本地的`~/opt`目錄掛載到容器的`/opt`目錄,這樣就可以將項目源代碼放在`~/opt`目錄下并通過容器訪問了。 ## PHP容器 PHP容器是最復雜的一個,因為在實際項目中,我們很可能需要單獨安裝一些PHP擴展,并用到一些命令行工具,這里我們以Redis擴展以及Composer來舉例。首先將項目需要的擴展等文件提前下載到php目錄下,這樣構建時就可以從本地復制而無需每次通過網絡下載,大大加快鏡像構建的速度: ~~~ wget https://getcomposer.org/composer.phar -O php/composer.phar wget https://pecl.php.net/get/redis-2.2.7.tgz -O php/redis.tgz ~~~ php目錄下還準備好了php配置文件`php.ini`以及`php-fpm.conf`,基礎鏡像我們選擇的是[PHP 5.6-FPM](https://registry.hub.docker.com/_/php/),這同樣是一個Debian Jessie鏡像。官方比較親切的在鏡像內部準備了一個`docker-php-ext-install`指令,可以快速安裝如GD、PDO等常用擴展。所有支持的擴展名稱可以通過在容器內運行`docker-php-ext-install`獲得。 來看一下Dockerfile ~~~ FROM php:5.6-fpm ADD php.ini /usr/local/etc/php/php.ini ADD php-fpm.conf /usr/local/etc/php-fpm.conf COPY redis.tgz /home/redis.tgz RUN docker-php-ext-install gd \ && docker-php-ext-install pdo_mysql \ && pecl install /home/redis.tgz && echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini ADD composer.phar /usr/local/bin/composer RUN chmod 755 /usr/local/bin/composer WORKDIR /opt RUN usermod -u 1000 www-data VOLUME ["/opt"] ~~~ 在構建過程中做了這樣一些事情: 1. 復制php和php-fpm配置文件到相應目錄 2. 復制redis擴展源代碼到`/home` 3. 通過`docker-php-ext-install`安裝GD和PDO擴展 4. 通過`pecl`安裝Redis擴展 5. 復制composer到鏡像作為全局指令 按照個人習慣,仍然設置`/opt`目錄作為工作目錄。 這里有一個細節,在復制tar包文件時,使用的Docker指令是`COPY`而不是`ADD`,這是由于`ADD`指令會[自動解壓`tar`文件](https://docs.docker.com/reference/builder/#add)。 現在終于可以構建+運行了: ~~~ docker build -t eva/php ./php docker run -p 9000:9000 -v ~/opt:/opt -it eva/php ~~~ 在大多數情況下,Nginx和PHP所讀取的項目源代碼都是同一份,因此這里同樣掛載本地的`~/opt`目錄,并且綁定9000端口。 ## PHP-CLI的實現 php容器除了運行php-fpm外,還應該作為項目的php cli使用,這樣才能保證php版本、擴展以及配置文件保持一致。 例如在容器內運行Composer,可以通過下面的指令實現: ~~~ docker run -v $(pwd -P):/opt -it eva/php composer install --dev -vvv ~~~ 這樣在任意目錄下運行這行指令,等于動態將當前目錄掛載到容器的默認工作目錄并運行,這也是PHP容器指定工作目錄為`/opt`的原因。 同理還可以實現phpunit、npm、gulp等命令行工具在容器內運行。 ## Redis容器 為了方便演示,Redis僅僅作為緩存使用,沒有持久化需求,因此Dockerfile僅有一行 ~~~ FROM redis:3.0 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看