1. 程式人生 > >安裝docker並架構nginx+tomcat容器

安裝docker並架構nginx+tomcat容器

本文在centos7 上安裝docker,並建立三個容器,一個nginx,兩個tomcat容器。客戶請求nginx,可以隨機分配到任意一個tomcat上。
本文安裝的是docker-ce 版本,這個版本是免費的。
1.安裝docker
安裝需要的包
使用非root使用者登入

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

設定穩定的倉庫

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com
/linux/centos/docker-ce.repo

安裝docker CE

sudo yum install docker-ce

啟動docker

sudo systemctl start docker

執行hello-world image

sudo docker run hello-world

通常會報下面錯誤,這是由於國內網路原因,可以多試幾次,實在不行就算了,應該安裝沒問題,這只是個demo而已。
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout.

對於非root使用者,如果不想使用sudo, 可以將使用者新增到docker組

sudo usermod -aG docker tanzhang

需要退出重新登入,此時就不用加sudo 。

配置映象加速器
預設docker 沒有daemon.json 所以要自己新建,放到/etc/docker/daemon.json 。
可以檢視https://yq.aliyun.com/articles/29941使用方法。登入容器Hub服務註冊一個,獲取為你獨立分配的加速地址。
新建一個daemon.json。只需放入以下內容即可。
{
“registry-mirrors”: [“address”]
}

下載centos映象

docker search centos 
docker pull docker.io/centos

檢視映象

docker images 

這裡寫圖片描述
建立docker 容器 -i表示互動模式,-t表示分配一個root使用者

docker run -i -t docker.io/centos /bin/bash 

這裡寫圖片描述
此時已經進入容器內部,系統會自動分配一個root使用者
當利用 docker run 來建立容器時,Docker 在後臺執行的標準操作包括:
檢查本地是否存在指定的映象,不存在就從公有倉庫下載
利用映象建立並啟動一個容器
分配一個檔案系統,並在只讀的映象層外面掛載一層可讀寫層
從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去
從地址池配置一個 ip 地址給容器
執行使用者指定的應用程式
執行完畢後容器被終止
docker run的引數:
-a=map[]: 附加標準輸入、輸出或者錯誤輸出
–c=0: 共享CPU格式(相對重要)
–cidfile=“”: 將容器的ID標識寫入檔案
–d=false: 分離模式,在後臺執行容器,並且打印出容器ID
–e=[]:設定環境變數
–h=“”: 容器的主機名稱
–i=false: 保持輸入流開放即使沒有附加輸入流
–privileged=false: 給容器擴充套件的許可權
–m=“”: 記憶體限制 (格式:, unit單位 = b, k, m or g)
–n=true: 允許映象使用網路
–p=[]: 匹配映象內的網路埠號 支援格式:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
–rm=false:當容器退出時自動刪除容器 (不能跟 -d一起使用)
–t=false: 分配一個偽造的終端輸入
–u=“”: 使用者名稱或者ID
–dns=[]: 自定義容器的DNS伺服器
–v=[]: 建立一個掛載繫結:[host-dir]:[container-dir]:[rw|ro].如果容器目錄丟失,docker會建立一個新的卷
–volumes-from=“”: 掛載容器所有的卷
–entrypoint=“”: 覆蓋映象設定預設的入口點
–w=“”: 工作目錄內的容器
–lxc-conf=[]: 新增自定義-lxc-conf=“lxc.cgroup.cpuset.cpus = 0,1″
–sig-proxy=true: 代理接收所有程序訊號(even in non-tty mode)
–expose=[]: 讓你主機沒有開放的埠
–link=“”: 連線到另一個容器(name:alias)
–name=“”: 分配容器的名稱,如果沒有指定就會隨機生成一個 ,容器的名稱是唯一的。
–P=false: Publish all exposed ports to thehost interfaces 公佈所有顯示的埠主機介面

退出容器
exit
退出不關閉
ctrl+p+q
檢視容器

docker ps -a

這裡寫圖片描述

容器操作
docker start/stop/restart/attach
-i,可以直接進入互動模式(相當於先start再attach)
docker attach ,進入一個正在執行的容器

生成映象
docker commit [OPTION] < newImageName>

docker commit 03579926f597 init-centos

這裡寫圖片描述

刪除容器和映象
docker rm 刪除指定容器
docker rmi 刪除一個或多個image
docker ps -a -q | xargs docker rm 刪除所有的容器
持久化容器
docker export > /tmp/.tar
這裡寫圖片描述
持久化映象
docker save > /tmp/.tar
這裡寫圖片描述
匯入持久化容器
cat /tmp/export_container.tar | docker import - :
這裡寫圖片描述
注意,匯入之後是生成新的映象而不是容器!
匯入持久化映象
docker rmi 刪除映象
docker load < /tmp/save_image.tar 載入映象
docker tag load:tag 為映象打TAG
這裡寫圖片描述
兩種方式的比較:
匯出容器再匯入為映象的方式會丟失歷史資訊,而儲存映象再載入為映象的方式不會丟失歷史和層,可以做到層回滾

2.給容器配置ssh
登入容器
這裡寫圖片描述
修改密碼
這裡寫圖片描述
安裝ssh服務

yum install -y penssl openssh-server

啟動服務

/usr/sbin/sshd

報錯,執行下列命令,生成key

ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

這裡寫圖片描述

ctrl+p+q 退出
將剛剛的修改生成新的映象

docker commit 03579926f597 sshd-centos

這裡寫圖片描述

以上面sshd-centos 映象生成三個container,一個按照nginx,連個安裝tomcat.
安裝tomcat
用sshd-centos映象生成container, -p 是主機埠和container埠對映,這樣訪問主機埠就可以訪問container.

docker run -it -p 10020:22 sshd-centos /bin/bash

開啟ssh服務

/usr/sbin/sshd

用putty連線container
這裡寫圖片描述

安裝jdk

yum search jdk 
yum install -y java-1.8.0-openjdk.x86_64
tar -zxvf apache-tomcat-8.5.23.tar.gz

將修改儲存為新的映象

docker commit 983d6aaa8ffb tomcat-os

下面將啟動兩個container, 一個名字叫tomcat001. 一個叫tomcat002.

docker run --name=tomcat001 -it -p 18080:8080 -p 10020:22 tomcat-os  /bin/bash

啟動後進入container內 開啟ssh服務和tomcat服務。
這裡寫圖片描述

docker run --name=tomcat002 -it -p 18081:8080 -p 10021:22 tomcat-os /bin/bash

這裡寫圖片描述

瀏覽器訪問
這裡寫圖片描述

安裝nginx

進入一個安裝了ssh服務,沒有安裝tomcat的容器。
先安裝依賴庫

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安裝

yum install nginx -y

生成映象

docker commit 03579926f597 nginx-os

啟動新容器,–link 指定可以連線的容器,使用此引數可以讓容器之間通訊。

docker run --name=nginx --link=tomcat001:t01 --link=tomcat002:t02  -it -p 10080:80 -p 10022:22 nginx-ssh-centos  /bin/bash

修改配置檔案

vi /etc/nginx/nginx.conf

加入一下內容,t01,t02 為兩個tomcat 容器別名

upstream bo.test.com {
        server t01:8080 weight=1;
        server t02:8080 weight=1;
   }

完整的nginx.conf

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
    upstream bo.test.com {
        server t01:8080 weight=1;
        server t02:8080 weight=1;
    }
    include /etc/nginx/conf.d/*.conf;
}

修改default.conf

vi /etc/nginx/conf.d/default.conf

改掉location配置

location ~ {
        proxy_pass http://bo.test.com;
    }

啟動服務

/usr/sbin/nginx

如果已經啟動,可以reload

/usr/sbin/nginx -s reload

瀏覽器訪問
這裡寫圖片描述
說明配置成功,但不知道訪問的是哪個tomcat容器,可以分別到兩個tomcat容器裡修改examples 專案裡的index.html 檔案。

vi /root/apache-tomcat-8.5.23/webapps/examples/index.html

分別在body先加入

<body>
this is container tomcat001
<body>
this is container tomcat002

再檢視瀏覽器
這裡寫圖片描述
重新整理一下
這裡寫圖片描述