安裝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
再檢視瀏覽器
重新整理一下