Docker是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个可移植的容器中。
一、依赖
<?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">
<parent>
<artifactId>springboot-demo</artifactId>
<groupId>com.et</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>docker</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker Maven Plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version> <!-- 使用最新版本 -->
<configuration>
<imageName>springboot-demo/springboot-with-docker</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- End of Docker Maven Plugin -->
</plugins>
</build>
</project>
二、配置文件和启动类
server:
port: 8088
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
三、Dockerfile
Dockerfile 的本质就是将一系列修改、安装、构建、操作的命令整合到一起,去构建一个个性化的镜像
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD docker-1.0-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
在my-project-server模块下创建docker目录,在docker目录下创建Dockerfile。代码如下:
FROM openjdk:8-jre #指定基础镜像,项目是使用jdk8开发的项目,指定的基础镜像为openjdk:8-jre
MAINTAINER Micromaple <micromaple@qq.com> #项目维护人员
RUN mkdir /app #执行命令,在根目录下创建app目录
COPY my-project-server-1.0.0-SNAPSHOT.jar /app/app.jar #将宿主机当前目录下的my-project-server-1.0.0-SNAPSHOT.jar文件拷贝到app目录下,并重命名为app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod,druid-prod"]#指定容器启动程序及参数
EXPOSE 8899 #指定运行时容器提供服务的端口
四、Controller
@Controller
public class HelloWorldController {
@RequestMapping("/hello")
@ResponseBody
public Map<String, Object> showHelloWorld(){
Map<String, Object> map = new HashMap<>();
map.put("msg", "HelloWorld");
return map;
}
}
五、构建镜像
①、在虚拟机创建目录:mkdir -p /usr/local/docker/my-project/docker
②、将打包后的my-project-server-1.0.0-SNAPSHOT.jar文件和Dockerfile文件上传至该目录
mvn clean package docker:build 或者 docker build -t my-project-server:v1 .
docker images 查看镜像
六、运行容器
docker run -p 8088:8088 springboot-demo/springboot-with-docker
访问地址http://127.0.0.1:8088/hello,返回
{“msg”:“HelloWorld”}
搭建私服
一、搭建 Docker Registry
创建目录
mkdir -p /usr/local/docker/registry
在该目录下创建Docker Registry 的 docker-compose.yml。
cd /usr/local/docker/registry
version: '3.1'
services:
registry:
image: registry
restart: always
container_name: registry
ports:
- 5000:5000
volumes:
- ./data:/var/lib/registry
启动容器
docker-compose up -d
二、搭建 Docker Registry WebUI
创建目录
mkdir -p /usr/local/docker/docker-registry-frontend
在该目录下创建Docker Registry 的 docker-compose.yml。内容如下:
【需要将ENV_DOCKER_REGISTRY_HOST的值更改为自己搭建的 DockerRegistry 服务的IP】
cd /usr/local/docker/docker-registry-frontend
version: '3.1'
services:
frontend:
image: konradkleine/docker-registry-frontend:v2
ports:
- 8080:80
volumes:
- ./certs/frontend.crt:/etc/apache2/server.crt:ro
- ./certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=192.168.110.158(Docker仓库的IP)
- ENV_DOCKER_REGISTRY_PORT=5000
启动容器
docker-compose up -d
浏览器访问http://192.168.110.158:8080/,效果如下:
三、客户端配置
在需要上传 Docker 镜像的客户端需配置daemon.json,完整路径在 /etc/docker/daemon.json
vi /etc/docker/daemon.json
"insecure-registries": [
"Docker仓库的IP:5000"
]
完整的json
{
"registry-mirrors": [ // 为镜像加速地址,这里为我自己申请的加速地址。大家可以自己申请一个,也可以在网上找一个。
"https://xxx.mirror.aliyuncs.com"
],
"insecure-registries": [ //Docker仓库的IP
"192.168.110.158:5000"
]
}
重新启动服务
systemctl daemon-reload
systemctl restart docker
四、上传私服
搭建以及配置完成后,需要将我们之前构建的镜像上传至我们自己的Docker仓库。
①、镜像标记
使用 docker tag 将 my-project-server:v1 这个镜像标记为 192.168.110.158:5000/my-project-server:v1
192.168.110.158为Docker仓库的IP
格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
②、镜像上传
使用 docker push 上传镜像
③、查看镜像
使用 curl 查看 192.168.110.158:5000/v2/_catalog 地址,可以看到上传成功的镜像
从搭建的WebUI上可视化的查看我们的镜像。效果图如下:
④、验证
五、容器启动
镜像构建并上传至完成后,可以直接使用Docker Compose来启动容器。实现一次构建到处运行。
创建目录
mkdir -p /usr/local/docker/my-project
在该目录下创建Docker Registry 的 docker-compose.yml。内容如下:
cd /usr/local/docker/my-project
version: '3.1'
services:
my_project_server:
image: 192.168.110.158:5000/my-project-server:v1
container_name: my-project-server
restart: always
ports:
- 8899:8899
volumes:
- ./logs:/logs
environment:
TZ: Asia/Shanghai
启动容器
docker-compose up -d
查看容器启动状态
docker ps -a
访问查询所有用户接口http://ip:8899/sys-user/get/all