- 本文記錄生成自己的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)如下:
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內(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)建完畢之后:
此時(shí)docker images
查看鏡像,可以看到剛構(gòu)建完的自己命名的learndocker:v1哲戚,當(dāng)然同時(shí)也下載了java:8的鏡像(這里可以看出分層構(gòu)建鏡像的思想)奔滑。kafka鏡像是本人之前下載的。
此時(shí)可以正常啟動(dòng)容器并將宿主的8080端口與鏡像的8080端口映射顺少,執(zhí)行命令docker run -p 8080:8080 <鏡像id>
朋其,此時(shí)我并沒有讓容器在后臺(tái)啟動(dòng),所以當(dāng)我退出終端時(shí)脆炎,容器會(huì)停止梅猿。
保持終端不關(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)生成):
生成正常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一致
CMD
或ENTRYPOINT
容器啟動(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