生成自定義Docker鏡像

  • 本文記錄生成自己的Docker鏡像的兩個(gè)例子。第一個(gè)是在一個(gè)SpringBoot工程基礎(chǔ)上生成鏡像拧揽,第二個(gè)是在普通的基于Tomcat的Web工程的基礎(chǔ)上生成鏡像。

Docker常用命令

拉取鏡像
docker pull <鏡像名>:[tag]

列出所有鏡像(加上參數(shù)-a 可以包括中間層鏡像铲汪,還有-q--format 等實(shí)用參數(shù))
docker image ls

查看鏡像葵诈、容器、數(shù)據(jù)卷所占用的空間
docker system df

刪除鏡像
docker image rm [選項(xiàng)] <鏡像1> [<鏡像2> ...]

啟動(dòng)鏡像
docker run [OPTIONS] <鏡像>
[OPTIONS]常用參數(shù):
-d: 后臺(tái)運(yùn)行容器劲适,并返回容器ID楷掉;
-i: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用霞势;
-t: 為容器重新分配一個(gè)偽輸入終端烹植,通常與 -i 同時(shí)使用斑鸦;
-p: 端口映射,格式為:主機(jī)(宿主)端口:容器端口草雕;
--name "xxx": 為容器指定一個(gè)名稱巷屿;

以交互式終端方式進(jìn)入容器
docker exec -it <容器名> /bin/bash

重命名容器
docker rename <oldname> <newname>

使用 Dockerfile 創(chuàng)建鏡像,這個(gè)后面必須跟參數(shù)墩虹,且須有一個(gè).
docker build

docker 容器中安裝vim
apt-get update
apt-get install vim

生成SpringBoot的Web工程的鏡像

創(chuàng)建SpringBoot的工程

首先創(chuàng)建一個(gè)簡(jiǎn)單的SpringBoot工程嘱巾,工程很簡(jiǎn)單,功能是訪問localhost:8080從而跳轉(zhuǎn)到指定頁(yè)面败晴。工程中只有一個(gè)TestController浓冒,這個(gè)TestController的默認(rèn)路徑指向index.html頁(yè)面栽渴,這個(gè)index.html在resources目錄下的templates.home中尖坤。static.home可以忽略,其中存的只是index.html的樣式文件闲擦。

工程目錄結(jié)構(gòu)如下:

SpringBoot工程目錄結(jié)構(gòu)

TestController的內(nèi)容慢味,沒有任何邏輯,只是跳轉(zhuǎn)到index.html頁(yè)面:

package com.example.learndocker.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class TestController {

    @RequestMapping(value = "")
    public String home() {
        return "home/index";
    }
}

為了返回頁(yè)面墅冷,需要引用模板引擎纯路,pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>learn-docker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>learn-docker</name>
    <description>sth about docker</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

執(zhí)行LearnDockerApplication的main方法,在瀏覽器訪問localhost:8080寞忿,可以看到如下頁(yè)面:

SpringBoot啟動(dòng)后訪問localhost:8080

生成Docker鏡像

接下來生成docker鏡像驰唬。首先將SpringBoot打成jar包,然后在任意位置創(chuàng)建Dockerfile文件腔彰,我是在learn-docker的工程目錄下創(chuàng)建的叫编,為了方便,我直接在IDEA中編輯了霹抛。

添加了Dockerfile文件搓逾,并且打包工程之后,工程目錄結(jié)構(gòu)如下:

Dockerfile所在目錄
Dockerfile所在目錄

Dockerfile內(nèi)容如下:

#docker倉(cāng)庫(kù)的JDK鏡像
FROM java:8
#掛載點(diǎn)(根據(jù)需要可以不要)杯拐,即容器中/tmp(這個(gè)目錄是springboot內(nèi)嵌的Tomcat默認(rèn)使用目錄)的改動(dòng)會(huì)同步到主機(jī)的指定目錄
VOLUME /tmp
#將自己的jar包加入生成的鏡像中(在JDK這一層的基礎(chǔ)上加上我們的jar構(gòu)建新的鏡像)
ADD target/learn-docker-0.0.1-SNAPSHOT.jar learn-docker.jar
#容器啟動(dòng)完執(zhí)行
ENTRYPOINT ["java","-jar","learn-docker.jar"]

分析:運(yùn)行springboot的web工程霞篡,需要操作系統(tǒng)+JDK/JRE,所以需要以操作系統(tǒng)鏡像作為基礎(chǔ)端逼,然后加入JDK/JRE朗兵,再加上自己的jar,生成自定義鏡像顶滩。

但是因?yàn)镈ocker鏡像是分層構(gòu)建余掖,所以官方的java:8鏡像中已經(jīng)包含了操作系統(tǒng)的鏡像這一層,所以此處直接引用此基礎(chǔ)鏡像即可诲祸。然后加入我們自己的jar浊吏,在基礎(chǔ)鏡像的基礎(chǔ)上生成新的鏡像而昨。并設(shè)置當(dāng)啟動(dòng)容器時(shí),啟動(dòng)springboot的jar包即可找田。

當(dāng)然歌憨,如果不想使用現(xiàn)有的Java鏡像,也可以下載好JDK/JRE墩衙,并以現(xiàn)有的操作系統(tǒng)的鏡像為基礎(chǔ)(有很多優(yōu)化過的體積很小的操作系統(tǒng)基礎(chǔ)鏡像务嫡,比如alpine),加入JDK/JRE漆改,同時(shí)加入我們自己的jar心铃,配置好Java環(huán)境變量,生成新的鏡像挫剑,這樣會(huì)使得新鏡像的層數(shù)少一層去扣,原則上是層數(shù)越少越好。

執(zhí)行命令docker build -t learndocker:v1 .構(gòu)建鏡像樊破,注意命令后面有一個(gè).不能少愉棱,構(gòu)建過程:

鏡像構(gòu)建過程

構(gòu)建完畢之后:

構(gòu)建鏡像完畢

此時(shí)docker images查看鏡像,可以看到剛構(gòu)建完的自己命名的learndocker:v1哲戚,當(dāng)然同時(shí)也下載了java:8的鏡像(這里可以看出分層構(gòu)建鏡像的思想)奔滑。kafka鏡像是本人之前下載的。

查看鏡像.jpg

此時(shí)可以正常啟動(dòng)容器并將宿主的8080端口與鏡像的8080端口映射顺少,執(zhí)行命令docker run -p 8080:8080 <鏡像id>朋其,此時(shí)我并沒有讓容器在后臺(tái)啟動(dòng),所以當(dāng)我退出終端時(shí)脆炎,容器會(huì)停止梅猿。

啟動(dòng)容器

保持終端不關(guān)閉,此時(shí)訪問瀏覽器localhost:8080腕窥,可以看到與之前同樣的頁(yè)面粒没,整個(gè)定制鏡像并啟動(dòng)的過程成功。

為了理解掛載點(diǎn)的意思簇爆,在啟動(dòng)時(shí)使用docker run -v /Users/shakeli/idea_workspace/learn-docker/test:/tmp -p 8080:8080 6b2bd203cc3f來啟動(dòng)癞松,即使用-v參數(shù)加了宿主目錄與容器目錄的映射關(guān)系,那么會(huì)在/Users/shakeli/idea_workspace/learn-docker/test的目錄下入蛆,同步容器中/tmp目錄中的內(nèi)容(如果test目錄不存在會(huì)自動(dòng)生成):

1552494286526.jpg

生成正常Web工程的Docker鏡像

經(jīng)過上面的分析响蓉,我們可以分析如果只是正常的web工程,我們的Dockerfile最少需要哪些指令哨毁。由于springboot集成了Tomcat枫甲,而如果不用springboot,那么我們需要加上Tomcat,理論上來說如果從0構(gòu)建想幻,那么需要:操作系統(tǒng)+JDK/JRE+Tomcat粱栖。

由于JDK/JRE需要操作系統(tǒng),而Tomcat又需要JDK/JRE脏毯,那么如果我們以現(xiàn)有的官方鏡像為基礎(chǔ)闹究,實(shí)際上只需要Tomcat的作為基礎(chǔ)鏡像即可,當(dāng)然食店,如果不使用現(xiàn)有的Tomcat鏡像渣淤,而是以操作系統(tǒng)鏡像為基礎(chǔ),加入JDK/JRE吉嫩,加入Tomcat价认,會(huì)比使用現(xiàn)有Tomcat作為基礎(chǔ)鏡像少一層。

未完待續(xù)……

附Dockerfile常用指令

附Dockerfile的常用指令
FROM <image>:<tag> 指定基礎(chǔ)鏡像自娩,必須在Dockerfile第一行
MAINTAINER <name>指定維護(hù)者信息
RUN <command>在鏡像中要執(zhí)行的命令
WORKDIR:指定當(dāng)前工作目錄用踩,相當(dāng)于 cd
EXPOSE <port> [<port>...]指定容器要打開的端口
ENV <key> <value>或者ENV <key>=<value> ...指定一個(gè)/多個(gè)環(huán)境變量,會(huì)被后續(xù) RUN 指令使用椒功,并在容器運(yùn)行時(shí)保持
ADD <src> <dest>把文件復(fù)制到鏡像中捶箱,src可以是鏈接
COPY <src>... <dest>COPY的<src>只能是本地文件,其他用法與ADD一致
CMDENTRYPOINT容器啟動(dòng)時(shí)執(zhí)行的命令动漾,兩者有些許區(qū)別,可以組合使用
ARG <name>[=<default value>] 設(shè)置變量

IDEADocker插件

未完待續(xù)……

常用容器相關(guān)命令

Nginx

主要是將日志目錄和配置文件目錄映射到本機(jī)指定目錄
docker run --name nginxdatahub -d -p 80:80 -p 443:443 -v /Users/xxxx/nginxconf/:/etc/nginx -v /Users/xxxx/logs/:/usr/local/etc nginx

特別注意荠锭,如果要讓Nginx映射到宿主機(jī)旱眯,需要將Nginx容器配置文件中的127.0.0.1改為host.docker.internal,并在宿主機(jī)添加如下Host:
127.0.0.1 host.docker.internal

MySQL

啟動(dòng)容器:
docker run --name mysql1 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root123 -d mysql:5.7
開啟binlog:
首先正常進(jìn)入: docker exec -it mysql1 /bin/bash
然后修改配置文件:vim /etc/mysql/mysql.conf.d/mysqld.cnf
加入:
log-bin=/var/lib/mysql/mysql-bin
server-id=1
然后重啟容器:
docker restart xxxx

kafka

創(chuàng)建容器(使用spotify/kafka鏡像)
docker run --name mykafka -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=localhost --env ADVERTISED_PORT=9092 -d spotify/kafka
查看主題
cd opt/kafka_2.11-0.10.1.0/
./bin/kafka-topics.sh --list --zookeeper localhost:2181
創(chuàng)建主題
./bin/kafka-topics.sh --create --topic topic2 --zookeeper localhost:2181 --replication-factor=1 --partitions=1
查看主題信息
./bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
刪除主題
./bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic test
需要配置delete.topic.enable=true
為topic增加分區(qū)
./bin/kafka-topics.sh –zookeeper 127.0.0.1:2181 –alter –partitions 20 –topic
發(fā)送消息
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
讀取消息
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

參考

Docker —— 從入門到實(shí)踐
Docker命令大全
Dockerfile命令詳解(超全版本)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末证九,一起剝皮案震驚了整個(gè)濱河市删豺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愧怜,老刑警劉巖呀页,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拥坛,居然都是意外死亡蓬蝶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門猜惋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丸氛,“玉大人,你說我怎么就攤上這事著摔』捍埽” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)禾锤。 經(jīng)常有香客問我私股,道長(zhǎng),這世上最難降的妖魔是什么恩掷? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任庇茫,我火速辦了婚禮,結(jié)果婚禮上螃成,老公的妹妹穿的比我還像新娘旦签。我一直安慰自己,他們只是感情好寸宏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布宁炫。 她就那樣靜靜地躺著,像睡著了一般氮凝。 火紅的嫁衣襯著肌膚如雪羔巢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天罩阵,我揣著相機(jī)與錄音竿秆,去河邊找鬼。 笑死稿壁,一個(gè)胖子當(dāng)著我的面吹牛幽钢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傅是,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匪燕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了喧笔?” 一聲冷哼從身側(cè)響起帽驯,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎书闸,沒想到半個(gè)月后尼变,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浆劲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嫌术,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梳侨。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛉威,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出走哺,到底是詐尸還是另有隱情蚯嫌,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站择示,受9級(jí)特大地震影響束凑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栅盲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一汪诉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谈秫,春花似錦扒寄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至硕淑,卻和暖如春课竣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背置媳。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工于樟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拇囊。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓迂曲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親寂拆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奢米,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355