#docker-compose build --no-cache //重新創建容器,不管有沒有 #docker-compose up #docker-compose up -d //后台啟動並運行容器,如果沒有會先執行build,如果有只啟動
#docker-compose build --no-cache && docker-compose up -d
asp.net core
#docker run -it --rm --entrypoint /bin/bash tlz.netcore.ssodemo:1.0
進入docker容器里面,啟動運行asp.net core的程序
#dotnet TLZ.COM.NetCore.View.SSODemo.dll 手動在容器里運行程序,觀察運行時的錯誤
redis.Docker.json ,redis容器名稱通過docker ps 查看 name字段得到,文章下面有
{ "Redis": { "AutoStart": true, "DbIndex": 1, "Password": "315360007", "AllowAdmin": true, "AbortConnect": false, "ReadWriteHost": [ "trusting_euclid:6379" ], "ReadOnlyHost": [], "MaxWritePoolSize": 65000, "MaxReadPoolSize": 65000, "ConnectTimeout": 1000, "DistributedCacheEnabled": true, "ApplicationDiscriminator": "6A9C3ED7EAC624E4FF988388627D723CB53C9542863F0B286A6482709BA7E141", "DataProtectionKey": "AspNetCore-DataProtection-Redis-Keys" } }
再次進入Docker容器里面,查看hosts文件,和命令行方式運行dotnet程序並且指定運行時的環境變量
#docker run -it --rm --entrypoint /bin/bash --link trusting_euclid tlz.netcore.ssodemo:1.0 ( trusting_euclid 是 redis容器的NAMES)
#cat /etc/hosts
#dotnet TLZ.COM.NetCore.View.SSODemo.dll --environment=Docker
#docker run -it --rm -p 27777:7777 --link trusting_euclid --network bridge dotnetcore/easyui /bin/bash #dotnet TLZ.COM.NetCore.View.EasyUIDemo.dll --environment=Docker
ASP.NET Core 發布之后通過命令控制監聽地址和環境變量
java & springboot
#docker run -it --rm --entrypoint /bin/bash tb.com.sbmsm.demo:1.0
#java -jar tb.easyuidemo.jar --spring.profiles.active=docker 手動在容器里運行程序,觀察運行時的錯誤
找不到設置的數據庫連接地址。之前是192.168.0.82,現在改成heuristic_stallman,因為同一個宿主機,不同的docker容器之間沒法互相通信。
查看hosts文件,發現沒有heuristic_stallman
cat /etc/hosts
換一種方式運行,增加heuristic_stallman,同時設置訪問端口
docker run -it --rm --entrypoint /bin/bash -p 18090:8090 --link heuristic_stallman tb.com.sbmsm.demo:1.0
查看hosts文件,發現有了heuristic_stallman
cat /etc/hosts
這時候在運行java的程序就可以了,同時由於運行容器的時候指定了訪問端口,通過瀏覽器也可以訪問到了。
#java -jar tb.easyuidemo.jar --spring.profiles.active=docker 手動在容器里運行程序,觀察運行時的錯誤
#同一台宿主機里面的多個docker容器,運行一個docker容器的java程序,連另一個運行docker容器里面的mysql,默認是連接不通的。
#原因為本機內部的多個docker容器在運行互相連接時,沒有通過本機的防火牆,默認是無法互聯的。
修改程序數據庫連接字符串,寫上mysql的docker運行時的名字
直接通過命令的方式運行進入docker指定的鏡像容器里面,查看容器里hosts的信息,注意:現在用的是openjdk8的鏡像啟動的,並且指定link和workdir
#docker run --rm --workdir /app --link heuristic_stallman -it openjdk:8 /bin/bash #cat /etc/hosts 手動在容器里運行程序,查看容器里面hosts的信息
用下面的方式,運行之后程序就可以通了,但是docker里面並沒有將這個java程序打包進去。繼續往下
查看linxu里面需要運行的java程序位置。
#ll /data/web/springboot/deploy
直接通過命令的方式運行進入docker指定的鏡像容器里面
注意:現在用的是openjdk的鏡像啟動的,並且使用數據卷的方式,將外部java程序的目錄進行映射到容器里,運行java的jar程序是在linux系統里面,並不是在docker容器里面的jar程序,繼續指定link,同時指定端口后,運行之后可以通過瀏覽器訪問了。
#docker run --rm -v /data/web/springboot/deploy:/app --workdir /app --link heuristic_stallman -p 18090:8090 openjdk:8 java -jar tb.easyuidemo.jar --spring.profiles.active=docker
如何實現打包的方式,讓docker里面的java程序能夠訪問另外一個docker里面mysql的數據庫呢?
首先需要了解當前宿主機里面docker的網絡使用情況,發現每一個netcore和java的程序,被docker之后都會創建一個獨立名稱的network。
#docker network ls 查看docker的全部網絡(了解docker當前的網絡情況)
查看所有docker鏡像,包括未運行的鏡像
docker ps -a (查看所有docker鏡像,包括未運行的)
查看一個net core的docker容器的network名稱是什么,通過容器ID的方式查看
docker inspect 5d727bb33b58 (netcore的容器ID)
查找mysql運行時用到的network名稱,首選需要找到mysql的docker容器使用的ID和NAMES
#docker ps 查找mysql運行時docker容器的ID和NAMES
查看mysql運行時docker容器用到的network名稱是bridge
#docker inspect df687bae1933 (mysql的容器ID)查看mysql運行時docker容器用到的網絡名稱是bridge
這時候就知道為什么之前的docker程序鏡像,不管是net還是java都無法訪問當前宿主機的mysql的docker容器了,是因為他們的network名稱不同導致的。
docker-compose.xml 修改配置文件,增加external_links(設置NAMES的值)和指定network_mode(設置Networks的值)
version: '3.4' services: tb.com.sbmsm.demo: image: tb.com.sbmsm.demo:1.0 build: context: ./tb.com.sbmsm.demo dockerfile: ./tb.view.sbmsm.easyuidemo/Dockerfile ports: - 18090:8090 external_links: - heuristic_stallman:heuristic_stallman network_mode: bridge
Dockerfile(原來的,不需要修改)
FROM openjdk:8 AS base WORKDIR /app EXPOSE 8090 FROM maven:3-jdk-8 AS build WORKDIR /app COPY . . RUN mvn clean install -Dmaven.test.skip=true -f tb.common/pom.xml -s settings.xml; \ mvn clean install -Dmaven.test.skip=true -f tb.db/pom.xml -s settings.xml; \ mvn clean package -Dmaven.test.skip=true -f tb.view.sbmsm.easyuidemo/pom.xml -s settings.xml FROM base AS final WORKDIR /app COPY --from=build /app/tb.view.sbmsm.easyuidemo/target/tb.easyuidemo.jar . ENTRYPOINT ["java", "-jar", "tb.easyuidemo.jar", "--spring.profiles.active=docker"]
使用docker-compose命令重新打包
#docker-compose build (重新創建docker鏡像)
#docker-compose up (前台方式重新運行,查看是否還有錯誤信息)
查看docker容器(包含沒有啟動的java容器)
#docker ps -a 查看容器(包含沒有啟動的java容器)
查看docker容器為java的信息,看到link和networks都已經設置到docker容器里面了。
#docker inspect 95967302d33d(java的容器ID)查看docker容器里的信息
重新運行docker容器,這時java的docker容器網絡就通了,進去看一下/etc/hosts文件里面的內容
#docker start 95967302d33d (運行已經創建好的docker容器) #docker exec -it 95967302d33d /bin/bash(進入運行的docker容器)查看hosts文件
#cat /etc/hosts
這時容器里面就已經設置好了hosts文件和網絡信息。由於這次是通過已經打包好java程序的docker容器運行的,所以,端口信息也已經有了,直接通過瀏覽器就可以訪問了。