docker之docker-compose——容器管理


nginx鏡像制作實戰

docker容器的主業

docker理念里,容器啟動時,應當為它指定主業是什么,如nginx容器主業就是nginx代理服務,tomcat容器就是web服務等等

1、容器創建時,必須指定主業任務,如不指定,則容器無事可干立即退出。

2、在dockerfile打包鏡像時,可以使用cmd命令來指定一個默認的主業,如下:

 

 

3、既然鏡像里是默認主業,即意味着創建容器時,可以覆蓋此默認命令,如下

 

 

推薦的ENTRYPOINT方式

1、鏡像本身應該有穩定的主業,應當指定后即不能更改用途,於是引入ENTRYPOINT

2使用ENTRYPOINT字義即容器入口,它不能被runcmd覆蓋,如下例:

 

 

執行:docker build -t nginxx:v3 .

 

 

以后使用nginxx:v3這個鏡像時,只能做nginx服務來使用啦

手動打包springboot鏡像

我們需要對業務項目打包發布,一樣需要制作成為業務鏡像,供運維使用,下面講述springboot的制作過程:

1、將springboot打好的jar包上傳

2、在同級目錄下,創建Dockerfile文件,內容如下:

 

 

3dockerfile打包業務鏡像

 

 

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直接拉取源碼)

 

 

2maven打包

mvn clean package

 

 

生成的jar在同級target目錄下

 

 

3、執行docker命令生成鏡像

dockerfile文件內容

 

 

命令創建鏡像

 

 

 

maven插件打包

前面打springboot包的方式,需要手動上傳項目jar或者源碼到服務器(違和感很強),這對於開發人員日常發布開發環境項目,極為不便

下面,演示一個maven插件:docker-maven-plugin用法,來打通環境。

前提條件

1、需要我們windows上安裝docker服務

2、需要docker服務配置http倉庫接口,windowsdocker服務配置如下(傳統配置模式無權限修改文件)

本地環境配置

1windows安裝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配置鏡像的全路徑名,即指定私庫的名稱

2dockerHostdockerCertPath對應配置上一步中dockerapi和證書值

 

 

打包運行

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,它們組成一個局域網,如上圖主機1172.17.6.0網段下的三個容器

2、同一個主機下的容器,相互之間網絡是通的

3、但不同主機下,是不同的局域網,它們之間網絡不能互通。如:172.17.6.2的容器,想要訪問172.17.8.2的容器

方案

a192.168.244.7,容器網段172.17.6.1/16a機起了容器ip172.17.6.2

b192.168.244.8,容器網段172.17.8.1/16b機起了容器ip172.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

添加好后,路由表類似下圖

 

 

然后aping b機容器,發現仍是ping不通,卡住ping不通,就是數據包被drop掉了

ip_forward配置

我們在b機上使用以下命令查看網絡包轉發情況,發現有掉包

iptables -t filter -nvL FORWARD

 

我們需要b機上配置,尋找172.17ip的網絡包不要丟掉,要轉發

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,整個網絡包的流程,完整如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM