docker理念裏,容器啓動時,應當爲它指定主業是什麼,如nginx容器主業就是nginx代理服務,tomcat容器就是web服務等等nginx
1、容器建立時,必須指定主業任務,如不指定,則容器無事可幹當即退出。git
2、在dockerfile打包鏡像時,可使用cmd命令來指定一個默認的主業,以下:github
3、既然鏡像裏是默認主業,即意味着建立容器時,能夠覆蓋此默認命令,以下web
1、鏡像自己應該有穩定的主業,應當指定後即不能更改用途,因而引入ENTRYPOINTspring
2、使用ENTRYPOINT字義即容器入口,它不能被run中cmd覆蓋,以下例:docker
執行:docker build -t nginxx:v3 .apache
之後使用nginxx:v3這個鏡像時,只能作nginx服務來使用啦windows
咱們須要對業務項目打包發佈,同樣須要製做成爲業務鏡像,供運維使用,下面講述springboot的製做過程:api
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打包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文件內容
命令建立鏡像
前面打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
在咱們的工程pom中加入docker-maven-plugin插件的配置,以下
1、其中,imageName配置鏡像的全路徑名,即指定私庫的名稱
2、dockerHost和dockerCertPath對應配置上一步中docker的api和證書值
以idea爲例,整個項目裝配完成,只須要操做maven的一二三步驟,即直接鏡像進入倉庫,整個過程毫無違和感
若使用的不是idea工具,可直接使用maven命令,一句完成打包,以下:
至此,咱們的服務器環境,已經能夠直接運行docker run 鏡像獲得結果了
當項目涉及容器較多時,須要一個管理容器的工具
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的命令與docker命令極爲類似,用法上沒有區別,下面列出它特有的幾種命令:
up 建立並啓動容器:docker-compose up -d --scale 服務名=數字
---------- d表示後臺運行,scale是表示對應的服務同時啓動幾個容器
down 中止並刪除容器: docker-compose down
---------- 會停掉容器,並刪除掉容器。若是不但願刪除容器,請使用stop
編寫一個項目總體服務,一個網關nginx + springboot的集羣,如上圖
其中nginx服務,將配置文件掛載在主機當前項目目錄的路徑下:nginx/conf.d/
命令:docker-compose up -d
docker-compose up -d --scale member-1=2
把member-1服務啓動兩個容器
假設咱們如今有兩臺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掉了
咱們在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,整個網絡包的流程,完整以下: