docker入門示例

學習步驟如下:

1. 建立docker容器運行程序
2. 用上面建立的docker容器加上Nginx實現簡單的負載均衡(與docker本身無關)
3. 建立基礎倉庫到阿里雲
4. 梳理宿主機與容器間的兩個Nginx關係

簡單說下docker

docker 是一種新興的虛擬化方式,跟傳統的虛擬化方式相比具有衆多優勢

  1. 更高效的利用系統資源,容器不需要進行硬件虛擬化已經運行完整的操作系統等額外開銷,所以對系統資源的利用率比較高;
  2. 啓動速度更快,原因和上面差不多;
  3. 一致的運行環境,一般稱需要經過開發環境、測試環境、生產環境,但是無法確保所有的環境都是一致的,
    所有就會出現同一段代碼在不同環境輸出的結果不一致,docker鏡像提供了相同的運行環境(出內核外),可以避免上述問題的發生;
  4. 在程序交付的運維時,只需要提供Dockerfile文件即可實現快速部署
  5. 方便遷移,由於每個容器都是一個獨立運行環境,和宿主機沒有直接關係;

docker包含三個概念:

1. 鏡像(image)
2. 容器(container)
3. 倉庫(repository)

這三個概念後面用到在說,方便理解

一、建立docker容器運行程序

這是我做的第一個比較簡單,首先建立的一個簡單的express項目,在項目的根目錄建立了一個Dockerfile文件(注意第一個字母大寫),後面調用run指令的時候docker會默認尋找這個文件,當然這個文件名也可以修改,但是需要得修改相應配置,在Dockerfile 中寫入下面代碼:

FROM node:slim

ENV HTTP_PORT 8000

COPY . /app 

WORKDIR /app

RUN npm install --registry=https://registry.npm.taobao.org

EXPOSE 8000

CMD [ "npm", "start" ]

FROM: 後面跟的是鏡像來源,也就是基於那個鏡像建立的鏡像, 其中node是鏡像名稱,slim 是鏡像版本號,這個node是官方給的基礎版本,官網的基礎鏡像還有很多,點擊這裏查看更多, 當然還有其他人自定義的優質鏡像這裏就羅列了,

ENV 指的是運行環境,一般程序都會分爲development、production 等,我這裏直接指定了端口號

COPY 複製,中間有個點 指的是當前目錄,複製到/app目錄,注意這裏不是複製到真實的目錄而已複製到容器的目錄,所以在真實目錄是看不到這個文件夾的

WORKDIR 指定工作目錄

RUN npm 安裝依賴包 並切換至淘寶源

EPOSE 容器輸出端口

CMD 執行啓動命令

在根項目根目錄下(也是Dockerfile 所在目錄)執行 下面代碼建立自己的鏡像

docker build -t myexpress .

build 是建立鏡像指令,-t 是添加鏡像標籤 注意後面有個空格和點,這裏的點指的是當前目錄,執行完上面命令之後再執行 docker images 就可以看到當前的擁有的鏡像了,在你自定義myexpress的鏡像之外 還多出了node的鏡像,這是因爲我們的鏡像是建立在node鏡像基礎之上的,下次在建立依賴node鏡像時,就不需要再次下載node鏡像了,因爲重複利用了,節省的資源

建立完鏡像後 ,我們就開始生成容器了,鏡像和容器的關係就像是 類和實例的關係,一個鏡像可以生成多個容器,執行下方指令生成容器:

docker run --name mycontainername -d -p 80:8000 myexpress
name 是給當前容器命名
d 是後端運行
p 80是容器端口 8000是映射到主機的端口
myexpress 是前面建立的進行名稱

項目已經運行起來,直接訪問宿主機ip 即可看到項目主頁

二、用上面建立的docker容器加上Nginx實現簡單的負載均衡

這個部分的出現純屬意外和docker沒有直接關係,我只是剛好看到這裏就記錄下來

在Nginx的配置文件 http下添加 upstream 代碼如下:

    upstream zmb {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }

zmb隨便取的只是個代號,後面可以添加weight屬性標識權重

然後在server 下location去添加配置 如下:

    location / {
        proxy_pass http://zmb;
    }

注意這裏的兩個zmb 必須保持一致

這樣在每次請求sever端口是都會循環訪問8080和8081端口,若有一個失敗則直接訪問下一個

三、建立基礎倉庫到阿里雲

這裏前提是必須要有一個阿里雲賬號,將代碼託管到阿里雲自己倉庫 https://code.aliyun.com, 我們建立一個 空項目 項目裏面只有一個Dockerfile 文件並把這個項目同步到自己的倉庫,Dockerfile的配置如下:

#version 1.0
#Author: zmb 
#Base image 
FROM centos
#MAINTAINER 
MAINTAINER zmb 
WORKDIR /usr/local/src
#download soft
RUN yum install -y  gcc make gcc-c++ openssl-devel wget zlib* perl perl-devel

#pcre��װ
WORKDIR /usr/local/src
RUN wget https://ncu.dl.sourceforge.net/project/pcre/pcre/8.41/pcre-8.41.tar.gz
RUN tar -zxf pcre-8.41.tar.gz
WORKDIR pcre-8.41
RUN ./configure 
RUN make && make install

#zib-1.2.11
WORKDIR /usr/local/src
RUN wget http://www.zlib.net/zlib-1.2.11.tar.gz
RUN tar -zxf zlib-1.2.11.tar.gz
WORKDIR zlib-1.2.11
RUN ./configure
RUN make && make install

#Openssl
WORKDIR /usr/local/src
RUN wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
RUN tar -zxf openssl-1.0.2l.tar.gz
WORKDIR openssl-1.0.2l
RUN  ./config -fPIC --prefix=/usr/local/openssl/ enable-shared
RUN make depend
RUN make && make install


#nginx
WORKDIR /usr/local/src
RUN wget http://nginx.org/download/nginx-1.13.6.tar.gz
RUN tar -zxf nginx-1.13.6.tar.gz 
WORKDIR nginx-1.13.6
RUN ./configure  --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-8.41 \
--with-zlib=/usr/local/src/zlib-1.2.11 \
--with-openssl=/usr/local/src/openssl-1.0.2l \
--with-stream
RUN make && make install

#nodejs
WORKDIR /usr/local/src
RUN wget https://nodejs.org/dist/v8.8.1/node-v8.8.1.tar.gz
RUN tar -zxf node-v8.8.1.tar.gz
WORKDIR node-v8.8.1
RUN ./configure
RUN make install
RUN npm config set registry https://registry.npm.taobao.org
RUN rm -rf /usr/local/src/*

這裏的代碼不做解釋 主要是在centos鏡像基礎上添加了Nginx和node

同步上去之後再 去阿里雲上點擊 容器鏡像服務 功能, 添加鏡像倉庫,代碼源設置爲阿里雲code,選取命名空間,選擇剛纔同步的代碼倉庫等,構建設置 勾選 在代碼更新時自動構建,
添加完成之後,列表也點擊設置–> 構建–> 立即構建,第一次構建需要編譯時間比較長,到此一個基礎的centos+Nginx+node的鏡像已經構建完成了,列表頁有個倉庫地址 後面引用項目就FROM該地址即可。

四、梳理宿主機與容器間的兩個Nginx關係

上面示例中容器中有個Nginx,一般容器外也會有個Nginx,那麼他們兩個之間有什麼關係或者說怎麼個運行步驟呢?
在一個宿主機中一般會有多個容器,容器外的Nginx根據端口號分發給各個容器的,容器Dockerfile文件中espose 可以設置暴露多個端口號,容器在構建時一般會映射端口號(-p 容器端口號和主機端口號),這裏容器的端口號應該是上面expose 中的一個,主機端口號應該和內部Nginx接受端口相對應,內部的Nginx再講端口映射到我們項目程序的端口,這樣看來內部的Nginx好像沒有多大作用(容器可以直接訪問主程序的),我是這樣認爲的,因爲在這個示例中外部是有配置Nginx的,如果外部要是什麼都沒有配置,也可以直接構建項目,因爲我們鏡像內部包含有Nginx做映射;
也就是說流程應該是這樣的 client 訪問宿主機 經過外部的Nginx的映射,到相應的容器(若espose沒有匹配到則無法訪問),容器接受到請求根據端口號經過內部Nginx的映射到我們的主程序中

以上是我個人的見解,有錯誤的地方還請指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章