今天玩一下怎么構(gòu)建一個我們自己的docker鏡像,然后我們試試將本地的springboot項目打包成一個鏡像,然后發(fā)送到遠(yuǎn)程服務(wù)器的docker中,最后我們運行這個docker鏡像成功訪問; 提前須知:要知道docker的基本操作,怎么拉取鏡像,啟動容器;還有云服務(wù)器是centos7
1.手動構(gòu)建一個jdk8的鏡像 我們知道docker的每一個鏡像其實就是一個單獨的linux操作系統(tǒng),只不過不同的鏡像里面裝的軟件不一樣; 所以我們要怎么做一個自己的鏡像呢?肯定不可能先去做一個linux操作系統(tǒng)的鏡像吧,這也太坑爹了..... 解決方案是我們在做一個自己的鏡像的時候,需要依賴一個linux鏡像,就像一個類一樣,你需要繼承一個父類之后你就擁有了父類的所有功能,然后只需要專注于開發(fā)自己的功能就好; 所以自己做鏡像的本質(zhì)就是我們在linux鏡像的基礎(chǔ)上,我們給它安裝一點東西,然后再打包成一個鏡像,就行了,很容易;
1.1.準(zhǔn)備 首先準(zhǔn)備jdk8的安裝包和一個文件名為docker_jdk8的文件,這個文件名可以隨意
然后docker拉取一個centos7的鏡像:docker pull centos:7
1.2 編寫docker_jdk8文件 這個docker_jdk8其實就是一個dockerfile的文件,主要是一些特殊的關(guān)鍵字+linux命令,關(guān)鍵字如下所示:
編寫文件,注意安裝包的名字和解壓之后的名字 #依賴的鏡像名稱和版本號 FROM centos:7 #指定鏡像創(chuàng)建者信息,這里可以隨意寫 MAINTAINER java小新人 #切換工作目錄,這里就是當(dāng)你一進(jìn)入容器所在的目錄 WORKDIR /usr #創(chuàng)建一個目錄 RUN mkdir /usr/local/java #把jdk壓縮包添加到容器中并解壓 ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/ #配置java環(huán)境變量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_171 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH
文件寫完之后,使用命令打包鏡像:docker build -f ./docker_jdk8 -t myjdk1.8:1.0 . -f表示要執(zhí)行的dockerfile文件路徑,-t表示打包后的鏡像名,冒號后面表示我們鏡像的版本
查看鏡像,可以看到我們自己的鏡像已經(jīng)做出來了; 可以使用命令:docker run -it myjdk1.8 /bin/bash 進(jìn)入容器看看jdk是否配置成功(注意,使用這個命令進(jìn)入容器的話,每一次都會創(chuàng)建一個新的容器,你可以先啟動,然后使用docker exec -it 容器id /bin/bash進(jìn)入容器)
2.搭建私有倉庫 我們創(chuàng)建了這么厲害的一個jdk8的鏡像,我們不能一個人默默的使用,肯定需要我們的小伙伴也能用一下,快樂是要分享的嘛( ̄▽ ̄)ノ 而且總不能我們換了一臺服務(wù)器都需要這樣手動的構(gòu)建這個鏡像吧,這種重復(fù)的工作我們可是不想去干的; 所以我們需要弄一個私有倉庫,將我們做出來的鏡像丟到私有倉庫中,然后小伙伴想用可以直接去拉取就行了;
2.1 拉取私有倉庫鏡像 私有倉庫本質(zhì)上也是一個docker鏡像,我們使用命令:docker pull registry
2.2.修改docker配置文件 使用命令:vim /etc/docker/daemon.json 這里配置的第一個是docker的源,提高下載速度;第二個就是配置私有倉庫地址,填入你的ip,讓docker信任你的私有倉庫 注意,私有倉庫的端口是5000端口,等下我們啟動私有倉庫容器的時候會用到這個端口的; { "registry-mirrors": [ "https://registry.", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ], "insecure-registries":["你的本機ip:5000"] }
2.3 使用私有倉庫 因為改了配置文件,首先我們需要重啟docker:systemctl restart docker 然后啟動私有倉庫容器:docker run -id --name registry -p 5000:5000 registry 注意,綁定的5000端口哦?。?!還有,可以使用-v /opt/registry:/var/lib/registry 參數(shù)進(jìn)行目錄掛載,私有倉庫容器中鏡像默認(rèn)是放在/var/lib/registry中的,掛載了之后可以防止把容器刪了里面的鏡像就都沒有了,我這里圖方便就沒有弄的這么麻煩,后續(xù)的刪除私有倉庫的操作也需要用到這個目錄! 然后根據(jù)下面這個路徑訪問能看到這個就是成功了!
2.4. 上傳鏡像 將前面我們做的jdk8的鏡像放到這個私有倉庫里面; 首先必須標(biāo)記一下我們的鏡像:docker tag myjdk1.8:1.0 106.52.104.190:5000/myjdk1.8:1.0
注意,后面的這個名字是你linux服務(wù)器的ip地址加上私有倉庫的端口,標(biāo)記的作用,你可以看做可以更好區(qū)分私有倉庫鏡像和從公有倉庫拉取的鏡像,名字必須要是這樣的格式,后面的推送就是根據(jù)這個名字的ip和端口進(jìn)行推送到私有倉庫的
然后將這標(biāo)記的鏡像給推送到私有倉庫:docker push 106.52.104.190:5000/myjdk1.8:1.0 我們?nèi)绻”镜貍}庫鏡像的話,只需要使用:docker pull 106.52.104.190:5000/myjdk1.8:1.0 注意要帶上ip和端口以及版本號,由于是本次倉庫拉取的,所以速度賊快~ 我們查看一下私有倉庫中的鏡像:
3.sprignboot項目配置docker 服務(wù)器部署java項目的方式很多種: 最開始在服務(wù)器部署javaweb項目,首先安裝tomcat,配置環(huán)境變量,然后將我們的項目打成war包丟到tomcat中的webapp中,啟動tomcat,就可以訪問了 后來使用了springboot之后,我們可以將springboot項目打包成一個jar包,然后使用nohup java -jar app.jar & 這種方式運行一個項目,就可以訪問了; 然后用了docker之后,我們不需要手動安裝tomcat了,可以直接使用tomcat鏡像,啟動容器,然后將容器中tomcat的webapp目錄掛載到宿主機上的xxx目錄,我們只需要將項目war包丟到宿主機的xxx目錄,然后啟動tomcat容器就可以訪問了;(springboot項目可以打成jar包,然后使用jdk鏡像就行了) 但是上面這種方式還是需要我們?nèi)ナ謩哟騱ar包,丟到服務(wù)器上,很繁瑣,我們還可以進(jìn)行簡化一下:在springboot項目中配置docker插件,我們只需要輸入打包命令,就可以將項目打包成一個docker鏡像,上傳到docker私有倉庫中,其他人也可以在這個私有倉庫中拉取這個鏡像啟動容器;
3.1 準(zhǔn)備 首先,我們隨便創(chuàng)建一個springboot項目
3.2 在pom.xml文件中配置docker插件 我們看看pom.xml文件,改的地方就兩個,一個是finalName標(biāo)簽設(shè)置打包后的名字,另外就是增加了docker插件; <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://maven./POM/4.0.0 https://maven./xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.protagonist</groupId> <artifactId>dockerimg</artifactId> <version>0.0.1-SNAPSHOT</version> <name>dockerimg</name> <description>測試將項目打包成docer鏡像</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> <!-- 跳過測試,要么添加這一行,要么就是就使用我下面那個跳過單元測試的插件!?。?!原因:spring-boot-maven-plugin插件已經(jīng)集成了maven-surefire-plugin插件,會自動運行 junit test --> <skipTests>true</skipTests> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <!-- 這里我們定義一下項目打包后的項目名 --> <finalName>testdocerimg</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.7.RELEASE</version> <configuration> <mainClass>com.protagonist.dockerimg.DockerimgApplication</mainClass> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- 注意:只有下面這一個插件是我新增的,其他的都是自動生成的--> <!-- 跳過單元測試 --> <!-- <plugin>--> <!-- <groupId>org.apache.maven.plugins</groupId>--> <!-- <artifactId>maven-surefire-plugin</artifactId>--> <!-- <configuration>--> <!-- <skipTests>true</skipTests>--> <!-- </configuration>--> <!-- </plugin>--> <!-- docker的maven插件,官網(wǎng):https://github.com/spotify/docker‐maven‐plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <!-- 打包成鏡像的名字 --> <imageName>106.52.104.190:5000/${project.artifactId}:${project.version}</imageName> <!-- 依賴的鏡像 --> <baseImage>myjdk1.8:1.0</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory} </directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <!-- 遠(yuǎn)程訪問docker的端口2375 ,這個需要在docker中配置 --> <dockerHost>http://106.52.104.190:2375</dockerHost> </configuration> </plugin> </plugins> </build> </project> 其實上面這個docker插件的配置就是跟dockerfile文件一樣的效果;
3.3 配置docker遠(yuǎn)程連接 需要配置docker能夠支持遠(yuǎn)程連接: 使用命令:vim /lib/systemd/system/docker.service 在ExecStart的后面添加 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock 這就表示允許任何人遠(yuǎn)程向你的docker私有倉庫中傳鏡像;
修改了之后還需要重新啟動一下docker,重新啟動私有倉庫容器; systemctl daemon-reload systemctl restart docker docker start registry
3.4 打包并遠(yuǎn)程上傳docker鏡像 使用命令:mvn clean package docker:build -DpushImage
直到看到下圖這個就表示成功:
打開服務(wù)器查一下鏡像,可以看到我們的項目已經(jīng)被制作成了鏡像,并且已經(jīng)上傳過來,而且還丟給私有倉庫中一份了;
3.5 啟動鏡像 使用命令:docker run -di --name dockerimg -p 8081:8081 106.52.104.190:5000/dockerimg:0.0.1-SNAPSHOT 可以查看docker容器啟動日志:docker logs -f 容器id 啟動之后瀏覽器訪問:
ps:2375端口打開了之后,第二天我的服務(wù)器就被拉去挖礦了......我也是醉了╮(╯_╰)╭
|
|