日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

構(gòu)建自己的docker鏡像

 Coder編程 2021-05-16

  今天玩一下怎么構(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ù)器就被拉去挖礦了......我也是醉了╮(╯_╰)╭

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多