nginx鏡像制作實戰
docker容器的主業
docker理念里,容器啟動時,應當為它指定主業是什么,如nginx容器主業就是nginx代理服務,tomcat容器就是web服務等等
1、容器創建時,必須指定主業任務,如不指定,則容器無事可干立即退出。
2、在dockerfile打包鏡像時,可以使用cmd命令來指定一個默認的主業,如下:
3、既然鏡像里是默認主業,即意味着創建容器時,可以覆蓋此默認命令,如下
推薦的ENTRYPOINT方式
1、鏡像本身應該有穩定的主業,應當指定后即不能更改用途,於是引入ENTRYPOINT
2、使用ENTRYPOINT字義即容器入口,它不能被run中cmd覆蓋,如下例:
執行:docker build -t nginxx:v3 .
以后使用nginxx:v3這個鏡像時,只能做nginx服務來使用啦
手動打包springboot鏡像
我們需要對業務項目打包發布,一樣需要制作成為業務鏡像,供運維使用,下面講述springboot的制作過程:
1、將springboot打好的jar包上傳
2、在同級目錄下,創建Dockerfile文件,內容如下:
3、dockerfile打包業務鏡像
4、啟動鏡像,即得到業務運行
docker run -d -p 8090:8090 --name member member:v1
5、瀏覽器打開頁面校驗:http://192.168.244.7:8090/
maven源碼打包用法
更多的情況,我們是直接在運維環境里,上傳源碼,直接maven打包jar,然后再進一步打包成鏡像,與手動打包過程類似
如果環境中沒有安裝maven,請手動安裝,腳本如下:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
# yum-config-manager --enable epel-apache-maven
// 安裝maven
# yum install -y apache-maven
1、上傳原碼到docker環境中(一般是git/svn直接拉取源碼)
2、maven打包
mvn clean package
生成的jar在同級target目錄下
3、執行docker命令生成鏡像
dockerfile文件內容
命令創建鏡像
maven插件打包
前面打springboot包的方式,需要手動上傳項目jar或者源碼到服務器(違和感很強),這對於開發人員日常發布開發環境項目,極為不便
下面,演示一個maven插件:docker-maven-plugin用法,來打通環境。
前提條件
1、需要我們windows上安裝docker服務
2、需要docker服務配置http倉庫接口,windows上docker服務配置如下(傳統配置模式無權限修改文件)
本地環境配置
1、windows上安裝docker-toolbox,傻瓜安裝即可。
2、打開Docker Quickstart Terminal終端,等待初始始化完成后。
3、輸入docker-machine env命令,返回docker服務的api接口和證書位置,如下:
4、輸入docker-machine ssh命令,進入sh環境中,配置http倉庫路徑
修改文件配置(當前用戶是docker不是root,要sudo提升至root):
sudo vi /var/lib/boot2docker/profile
5、修改完成,保存。重啟docker服務
sudo /etc/init.d/docker restart
項目環境配置maven插件
在我們的工程pom中加入docker-maven-plugin插件的配置,如下
1、其中,imageName配置鏡像的全路徑名,即指定私庫的名稱
2、dockerHost和dockerCertPath對應配置上一步中docker的api和證書值
打包運行
以idea為例,整個項目裝配完成,只需要操作maven的一二三步驟,即直接鏡像進入倉庫,整個過程毫無違和感
若使用的不是idea工具,可直接使用maven命令,一句完成打包,如下:
校驗鏡像倉庫結果
至此,我們的服務器環境,已經可以直接運行docker run 鏡像得到結果了
Docker-Compose使用
當項目涉及容器較多時,需要一個管理容器的工具
docker-compose安裝
curl方式安裝
sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
增加可執行權限
sudo chmod +x /usr/local/bin/docker-compose
查看版本
docker-compose version
docker-compose.yaml命令
docker-compose的命令與docker命令極為相似,用法上沒有區別,下面列出它特有的幾種命令:
up 創建並啟動容器:docker-compose up -d --scale 服務名=數字
---------- d表示后台運行,scale是表示對應的服務同時啟動幾個容器
down 停止並刪除容器: docker-compose down
---------- 會停掉容器,並刪除掉容器。如果不希望刪除容器,請使用stop
docker-compose實戰
編寫一個項目整體服務,一個網關nginx + springboot的集群,如上圖
其中nginx服務,將配置文件掛載在主機當前項目目錄的路徑下:nginx/conf.d/
命令:docker-compose up -d
docker-compose up -d --scale member-1=2
把member-1服務啟動兩個容器
Docker網絡路由
docker的跨主機網絡路由
假設我們現在有兩台docker主機,各啟動了自己的容器在運行
問題由來
1、在網橋模式下,同一個主機下的容器,使用同一個網橋docker0,它們組成一個局域網,如上圖主機1的172.17.6.0網段下的三個容器
2、同一個主機下的容器,相互之間網絡是通的
3、但不同主機下,是不同的局域網,它們之間網絡不能互通。如:172.17.6.2的容器,想要訪問172.17.8.2的容器
方案
a機192.168.244.7,容器網段172.17.6.1/16,a機起了容器ip是172.17.6.2
b機192.168.244.8,容器網段172.17.8.1/16,b機起了容器ip是172.17.8.2
兩台機分別配置路由表
a機,route add -net 172.17.8.0 netmask 255.255.255.0 gw 192.168.244.8
b機,route add -net 172.17.6.0 netmask 255.255.255.0 gw 192.168.244.7
添加好后,路由表類似下圖
然后a機ping b機容器,發現仍是ping不通,卡住ping不通,就是數據包被drop掉了
ip_forward配置
我們在b機上使用以下命令查看網絡包轉發情況,發現有掉包
iptables -t filter -nvL FORWARD
我們需要b機上配置,尋找172.17段ip的網絡包不要丟掉,要轉發
a機: iptables -I DOCKER --dst 172.17.0.0/16 -j ACCEPT
b機: iptables -I DOCKER --dst 172.17.0.0/16 -j ACCEPT
網絡ok,整個網絡包的流程,完整如下: