Docker的鏡像製做與整套項目一鍵打包部署

Dockerfile經常使用指令介紹

指令 描述
FROM 構建的新鏡像是基於哪一個鏡像。例如:FROM centos:6
MAINTAINER 鏡像維護者姓名或郵箱地址。例如:MAINTAINER Mr.chen
RUN 構建鏡像時運行的Shell命令。例如:RUN ["yum","install","httpd"]
  或者RUN yum install httpd
CMD 運行容器時執行的Shell命令(能夠被運行時傳遞的參數覆蓋)。例如:CMD ["-c","/start.sh"]
  或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D
EXPOSE 聲明容器運行的服務端口。例如:EXPOSE 80 443
ENV 設置容器內環境變量。例如:ENV MYSQL_ROOT_PASSWORD 123456
ADD 拷貝文件或目錄到鏡像(能夠自動解壓縮或者下載)
  例如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html
  或者:ADD html.tar.gz /var/www/html
COPY 拷貝文件或目錄到鏡像(不能自動解壓縮)。例如:COPY ./start.sh /start.sh
ENTRYPOINT 運行容器時執行的Shell命令(不能被運行時傳遞的參數覆蓋)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"]
  或者ENTRYPOINT /bin/bash -c "/start.sh"
VOLUME 指定容器掛載點到宿主機自動生成的目錄或其餘容器
  例如:VOLUME ["/var/lib/mysql"]
USER 爲RUN,CMD和ENTRYPOINT執行命令指定運行用戶
  例如:USER Mr_chen
WORKDIR 爲RUN,CMD,ENTRYPOINT,COPY和ADD設置工做目錄(指定進入容器中默認被切換的目錄)。
  例如:WORKDIR /data
HEALTHCHECK 健康檢查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3
  CMD curl -f http://localhost/ || exit 1
ARG 在構建鏡像時指定一些參數。例如:ARG user

利用Dockerfile編寫簡單的nginxWeb鏡像

#首先開啓ipv4轉發
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf 
sysctl -p
net.ipv4.ip_forward = 1

#建立nginx的鏡像目錄
mkdir -p dockerfile/lib/centos/nginx
cd dockerfile/lib/centos/nginx

#準備Dockerfile文件
vim Dockerfile
FROM centos:7       #構建的新鏡像是基於哪一個鏡像(構建的nginx是基於centos7構建的,依賴centos7的系統支持,若是沒有鏡像自動下載)
MAINTAINER wk       #鏡像製做人     
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel      #構建鏡像時運行shell命令,yum安裝nginx的依賴包
ADD nginx-1.12.1.tar.gz /tmp          #拷貝文件或目錄到鏡像下,遇到壓縮文件自動解壓縮
RUN cd /tmp/nginx-1.12.1 && \         #運行shell命令編譯安裝nginx,make -j 給與2個線程編譯 
    ./configure --prefix=/usr/local/nginx && \
    make -j 2 && \
    make install
RUN rm -rf /tmp/nginx-1.12.1* && yum clean all      #刪除nginx源碼包和清空yum緩存,使容器最輕量化
COPY nginx.conf /usr/local/nginx/conf                   #拷貝文件或目錄到鏡像 
WORKDIR /usr/local/nginx                   #爲RUN,CMD,ENTRYPOINT,COPY和ADD設置工做目錄(指定進入容器中默認被切換的目錄)。
EXPOSE 80                            #聲明容器的端口號
CMD ["./sbin/nginx", "-g", "daemon off;"]         #運行容器時執行的shell命令 -g daemon off 不以守護進程的方式開啓nginx,即不之後臺運行的方式開啓nginx

#將事先準備好的nginx
-1.12.1.tar.gz和nginx.conf配置文件拷貝到當前目錄下 ls Dockerfile nginx-1.12.1.tar.gz nginx.conf #build基於nginx的docker鏡像 docker build -t nginx:1 .
#nginx主配置文件
cat
conf/nginx.conf user root; worker_processes auto; error_log logs/error.log info; pid logs/nginx.pid; events { use epoll; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; root html; index index.html index.php; location ~ \.php$ { root html; fastcgi_pass lnmp_php:9000; #lnmp_ph爲php容器主機名,對應的就是php的IP地址 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }

 

構建PHP網站平臺鏡像

#建立php的鏡像目錄
mkdir -p /root/dockerfile/lib/centos/php
cd /root/dockerfile/lib/centos/php

#準備Dockerfile文件
vim Dockerfile 
FROM centos:7                 #新鏡像基於centos7鏡像
MAINTAINER wk               #新鏡像製做人
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel      #運行shell安裝依賴
ADD php-5.6.31.tar.gz /tmp/        #將安裝包考到 /tmp下並自動解壓縮

RUN cd /tmp/php-5.6.31 && \        #編譯安裝php,複製php啓動文件.並修改啓動文件的配置
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
COPY php.ini /usr/local/php/etc        #將php主配置文件拷貝進去

RUN rm -rf /tmp/php-5.6.31* && yum clean all    #刪除不用的文件,清空yum緩存使容器最輕量化 
WORKDIR /usr/local/php        #進入容器的位置,也是php程序的位置
EXPOSE 9000               #開啓端口9000
CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]    #開啓php -c 指定主配置文件

#將事先準備好的php.ini文件及php-5.6.31.tar.gz拷貝到當前目錄下
ls
Dockerfile  php-5.6.31.tar.gz  php.ini

#build基於php的docker鏡像
docker build -t php:1 .

建立nginx-php網絡環境,並啓動容器

#建立一個叫作lnmp的網絡
docker network create lnmp
dad428646d8f8278f36b80b3b960493aee8be1960bb1f505bfeebc97022b6385

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0604a9338e1b        bridge              bridge              local
b68e9da0b1e6        host                host                local
dad428646d8f        lnmp                bridge              local
cf4b2d0b4394        none                null                local

#建立nginx-php網頁掛載目錄
mkdir -p /www

#啓動php容器 docker run -dit --name lnmp-php --net lnmp --mount type=bind,src=/www,dst=/usr/local/nginx/html php:1
5b49fc160f9e42364238a937149bbb475036b8a28feddf0fe05c1e70b414a151

#啓動nginx容器
docker run -dit --name lnmp-nginx --net lnmp -p 8888:80 --mount type=bind,src=/www,dst=/usr/local/nginx/html nginx:1
7ce4d14cf756859e814186090a12b770916f150ed2a5fab2f0dc6ba8c347aab8

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
7ce4d14cf756        nginx:1             "./sbin/nginx -g 'da…"   16 seconds ago      Up 15 seconds       0.0.0.0:8888->80/tcp   lnmp-nginx
5b49fc160f9e        php:1               "./sbin/php-fpm -c /…"   6 minutes ago       Up 6 minutes        9000/tcp               lnmp-php

#建立測試頁面php.info
echo "<?php phpinfo();?>" > /www/index.php

經過瀏覽器進行訪問測試php

 

構建JAVA網站環境鏡像

#建立java鏡像構建存儲目錄
mkdir -p dockerfile/lib/centos/tomcat
cd dockerfile/lib/centos/tomcat

#將所需軟件包拷貝到當前目錄下 ls
apache-tomcat-8.0.46.tar.gz  Dockerfile  jdk-8u45-linux-x64.tar.gz  server.xml

#籌備Dockerfile
vim Dockerfile
FROM centos:7           
MAINTAINER wk

ADD jdk-8u45-linux-x64.tar.gz /usr/local        #建立javaJDK環境
ENV JAVA_HOME /usr/local/jdk1.8.0_45       #強行生成一個環境變量

ADD apache-tomcat-8.0.46.tar.gz /usr/local    #解壓tomcat
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf   #複製配置文件

RUN rm -f /usr/local/*.tar.gz            #刪除安裝包 容器輕量化

WORKDIR /usr/local/apache-tomcat-8.0.46      #工做目錄 進入容器所在的目錄 EXPOSE 8080                       #映射端口 ENTRYPOINT ["./bin/catalina.sh", "run"]      #用catalina。sh run前臺啓動tomcat #build基於tomcat的鏡像 docker build -t tomcat:1 . #建立網頁掛載目錄 mkdir -p /app #啓動tomcat的容器進程 docker run -dit --name=tomcat -p 8080:8080 --network lnmp --mount type=bind,src=/app/,dst=/usr/local/apache-tomcat-8.0.46/webapps tomcat:1 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 15eca19688ca tomcat:1 "./bin/catalina.sh r…" 17 seconds ago Up 16 seconds 0.0.0.0:8080->8080/tcp tomcat 7ce4d14cf756 nginx:1 "./sbin/nginx -g 'da…" 2 hours ago Up About an hour 0.0.0.0:8888->80/tcp lnmp-nginx 5b49fc160f9e php:1 "./sbin/php-fpm -c /…" 2 hours ago Up About an hour 9000/tcp lnmp_php #建立網站測試頁 mkdir /app/ROOT vim /app/ROOT/index.html ddddddddddddddddddd

整套項目一鍵打包部署

Docker Compose用法

Compose是一個定義和管理多容器的工具,使用Python語言編寫。使用Compose配置文件描述多個容器應用的架構,好比使用什麼鏡像,數據卷,網絡,映射端口等;而後一條命令管理全部服務,好比啓動,中止,重啓等css

安裝

unzip docker-compose-linux-x86_64.zip 
Archive:  docker-compose-linux-x86_64.zip
  inflating: docker-compose         

ll docker-compose
-rw-r--r-- 1 root root 8858496 Aug 31  2017 docker-compose

chmod +x docker-compose

mv docker-compose /usr/bin/

 YAML文件格式及編寫注意事項

YAML是一種標記語言很直觀的數據序列化格式,可讀性高。相似於XML數據描述語言,語法比XML簡單的不少html

YAML數據結構經過縮進來表示,連續的項目經過減號來表示,鍵值對用冒號分隔,數組用中括號括起來,hash用花括號括起來java

YAML文件格式注意事項:python

  • 不支持製表符tab鍵縮進,須要使用空格縮進
  • 一般開頭縮進2個空格
  • 字符後縮進1個空格,如冒號,逗號,橫杆
  • 用井號註釋
  • 若是包含特殊字符用單引號引發來
  • 布爾值(true,false,yes,no,on,off)必須用引號括起來,這樣分析器會將他們解釋爲字符串。

配置文件經常使用字段mysql

字段 描述
build 下級字段dockerfile:指定Dockerfile文件名
  下級字段context;構建鏡像上下文路徑
image 指定鏡像
command 執行命令,覆蓋默認命令
container_name 指定容器名稱
deploy 指定部署和運行服務相關配置,只能在Swarm模式使用
environment 添加環境變量
networks 加入網絡,引用頂級networks下條目
ports 暴露端口,與-p相同,但端口不能低於60
volumes 掛載宿主機路徑或命名卷。若是是命名卷在頂級volumes定義卷名稱
restart 重啓策略,默認no,always | on-failure | unless-stopped
hostname

容器主機名linux

經常使用命令nginx

字段 描述
build 從新構建服務
ps 列出容器
up 建立和啓動容器
exec 在容器裏執行命令
scale 指定一個服務容器啓動數量
top 顯示容器進程
logs 查看容器輸出
down 刪除容器,網絡,數據卷和鏡像
stop/start/restart 中止/啓動/重啓服務

一鍵部署LNMP網站平臺

#查看compose_lnmp包
tree /root/compose_lnmp/
/root/compose_lnmp/
├── docker-compose.yml             #docker-compose啓動接口文件
├── mysql
│   ├── conf
│   │   └── my.cnf                 #mysql配置文件
│   └── data                       #待掛載mysql數據目錄
├── nginx
│   ├── Dockerfile                 #自定義nginx的Docker鏡像配置文件     
│   ├── nginx-1.12.1.tar.gz        #nginx源碼包
│   └── nginx.conf                 #nginx配置文件
├── php
│   ├── Dockerfile                 #自定義php的docker鏡像文件
│   ├── php-5.6.31.tar.gz          #php源碼包
│   └── php.ini                    #php配置文件 └── wwwroot                        #網頁目錄
    └── index.php                  #默認網頁文件 
vim docker-compose.yml       #docker-compose啓動接口文件必須是以.yml 結尾 他和ansbile都是python寫的
version: '3'            #容器版本爲3
services:             #容器服務有如下 
  nginx:              #nginx的容器
    hostname: nginx        #容器主機名爲nginx
    build:                     #指定dockerfile文件的位置
      context: ./nginx      #dockerfile文件位置在當前路徑下的nginx目錄裏
      dockerfile: Dockerfile   #dockerfile文件名:Dockerfile
    ports:             #指定映射端口主機81映射到80 - 81:80                  
    networks:                  #指定容器網卡在lnmp網橋 - lnmp
    volumes:                   #掛載當前目錄下的./wwwroot到容器nginx的網頁目錄 - ./wwwroot:/usr/local/nginx/html

  php:                         #和nginx相似
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  mysql:
    hostname: mysql
    image: mysql:5.6            #下載鏡像mysql5.6版本
    ports:                      
      - 3306:3306
    networks:
      - lnmp
    volumes:                        #掛載mysql主配置文件和數據文件 - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql  
    command: --character-set-server=utf8         #執行命令,覆蓋默認命令 
    environment:                            #添加環境變量
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: user
      MYSQL_PASSWORD: user123

networks:          #加入網絡lnmp,引用頂級networks下條目
  lnmp: 
#一鍵部署LNMP
docker-compose -f docker-compose.yml up        #-f指定當前目錄下的docker-compose爲啓動文件,up建立和啓動容器
#一鍵查看全部部署的容器進程
docker-compose -f docker-compose.yml ps
       Name                      Command               State           Ports          
-------------------------------------------------------------------------------------
composelnmp_mysql_1   docker-entrypoint.sh --cha ...   Up      0.0.0.0:3306->3306/tcp 
composelnmp_nginx_1   ./sbin/nginx -g daemon off;      Up      0.0.0.0:81->80/tcp     
composelnmp_php_1     ./sbin/php-fpm -c /usr/loc ...   Up      9000/tcp        
 #一鍵終止全部部署的容器進程
docker-compose -f docker-compose.yml stop
Stopping composelnmp_nginx_1 ... done
Stopping composelnmp_php_1   ... done
Stopping composelnmp_mysql_1 ... done

#一鍵啓動容器,在後臺運行
docker-compose -f docker-compose.yml start
#一鍵清理全部部署的容器進程 docker-compose -f docker-compose.yml down

   

一鍵部署Nginx反向代理Tomcat集羣實戰

#查看compose_nginx_tomcat包
[root@docker ~]# tree compose_nginx_tomcat/
compose_nginx_tomcat/
├── docker-compose.yml
├── mysql
│   ├── conf
│   │   └── my.cnf  #mysql的配置文件
│   └── data        #待掛載mysql數據目錄
├── nginx
│   ├── Dockerfile      #自定義鏡像配置文件
│   ├── nginx-1.12.1.tar.gz #源碼包
│   └── nginx.conf          #nginx配置文件
├── tomcat
│   ├── apache-tomcat-8.0.46.tar.gz #源碼包
│   ├── Dockerfile      #自定義鏡像配置文件
│   └── server.xml      #tomcat配置文件
└── webapps         
    └── ROOT
        └── index.html  #網頁測試文件
#查看docker-compose的啓動接口文件
 cat compose_nginx_tomcat/docker-compose.yml 
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 82:80
    networks:
      - lnmt
    volumes:
      - ./webapps:/opt/webapps
  tomcat01:
    hostname: tomcat01
    build: ./tomcat
    networks:
      - lnmt
    volumes:
      - /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45
      - ./webapps:/usr/local/apache-tomcat-8.0.46/webapps
  tomcat02:
    hostname: tomcat02
    build: ./tomcat
    networks:
      - lnmt
    volumes:
      - /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45   #docker宿主機的java環境被掛載了! - ./webapps:/usr/local/apache-tomcat-8.0.46/webapps    #掛載網頁目錄
  mysql:
    hostname: mysql
    image: mysql:5.6
    ports:
      - 3307:3306
    networks:
      - lnmt
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: db
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
networks:
  lnmt:

每一個容器安裝JAVA環境,會使容器過大,因此用本地java環境掛在到tomcat容器內,這樣節省空間c++

#因爲tomcat容器進程須要掛載docker宿主機本地的java環境
#因此在docker宿主機本地安裝jdk-8u45-linux-x64.tar.gz
tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local

#一鍵部署ngxin+tomcat反向代理集羣
docker-compose -f docker-compose.yml up

 

nginx反向代理配置文件
user  root; 
worker_processes  auto; 

error_log  logs/error.log  info;

pid        logs/nginx.pid; 


events {
    use epoll; 
}

http {

    include       mime.types;
    default_type  application/octet-stream;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log logs/access.log main;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream www.example.com {
        #ip_hash;
        server tomcat01:8080;      #在compose的接口文件裏定義的hostname主機名可直接解析爲IP
        server tomcat02:8080;
    }

    server {
        listen 80;
        server_name localhost;
    
    location / {
        proxy_pass http://www.example.com;
    }

        location ~ \.(html|css|js|jpg|png|gif)$ {
            root /opt/webapps/ROOT;
        }
    }
}
相關文章
相關標籤/搜索