macm1使用Docker制作jar镜像并连接宿主机mysql
本文目录
docker概念理解
Docker可以让开发者打包应用和依赖包到可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,并且容器是完全使用沙箱机制,相互之间无需任何接口。
Docker 使用 C/S 结构,即客户端/服务器体系结构。
- 服务端负责构建、运行和分发 Docker 镜像。
- 客户端和服务端可以运行在一台机器上,也可以通过 RESTful 、 Stock 或网络接口与远程 Docker 服务端进行通信。
docker version
Client:
Cloud integration: v1.0.29
Version: 20.10.22
...
Server: Docker Desktop 4.16.0 (95345)
Engine:
Version: 20.10.22
...
Docker Client 通过 REST API 与 Docker Host(dockerd 进程) 进行通信,执行的 docker 命令只与 Docker Host 进行交互。
在 Linux 下 Docker Host 可以是系统自身,而对于 Mac OS X 或 Windows 需要有一个中间的 Linux 操作系统,比如 Docker Desktop 实现的虚拟机,或者自己创建一个 Linux 虚拟机,装上 Docker 就能作为 Docker Host。
Docker Client 与 Docker Host 之间是 REST API,它们可以通过以下三种方式交互
- 本地 Socket 文件(/var/run/docker.sock)
- https (通常用 2376 端口)
- http (通常用 2376 端口)
一个完整的Docker主要由以下几部分构成:
①Docker客户端(Client):客户端使用docker命令或其他工具调用Docker API;
②Docker主机(Host):可以是一个物理机或者虚拟机,用于运行Docker服务进程和容器;
③Docker服务端(Server):Docker守护进程,运行Docker容器;
④Docker镜像(Images):可以理解为创建实例所使用的模板;
⑤Docker容器(Container):容器是从Docker镜像生成对外提供服务的一个或一组服务;
⑥Docker仓库(Registry):保存镜像的仓库,类似于git和svn这样的版本控制系
- Docker 客户端执行 docker run 命令。
- Docker Daemon 发现本地没有我们需要的镜像。
- Daemon 从 Docker Hub 下载镜像。
- 下载完成后,镜像被保存到本地。
- Docker Daemon 启动容器。
docker核心组成
docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)
镜像是 Docker 运行容器的前提,仓库是存放镜像的场所
镜像
Docker镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角
容器
docker容器是由docker镜像创建的运行实例,docker容器 = 镜像+可读层。
对于镜像和容器的理解
- 镜像是文件,容器是进程。
- 容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。
- 镜像可以看成Java中的类,而容器可以看做是类的实例化对象。
- 一个类可以有多个对象,同理,一个镜像可以有多个容器。
仓库
Docker仓库是一个集中存储、分发Docker镜像的仓库,客户端的docker pull和docker push命令都是直接与Docker仓库发生交互的。一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本
制作jar包镜像
dockerfile
#jdk版本
FROM openjdk:8-jdk-alpine
#挂载目录
VOLUME /tmp
#将jar包添加到容器中并更名为demosw.jar
ADD demoSw.jar demosw.jar
#docker运行命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/demosw.jar"]
jar包构建docker镜像
docker build -t demosw:0.1 .
查看镜像
docker images
REPOSITORY TAG
demosw 0.1
创建容器
docker run -p 8016:8016 --name xx(容器名) -d xxx(镜像名)
// success
docker run -p 18022:18022 --name demosw -d demosw:0.1
docker run -d -p 80:80 --name webserver nginx
-p 端口映射内:外
-d 后台运行
--name 容器名
其他命令
查看容器有没有在运行
docker ps
查看启动日志
docker logs --tail 300 -f demo
给已经运行的docker容器设置自动重启:
docker update –-restart=always demo
删除镜像
docker rmi -f xxx(IMAGE ID)
// -f 运行容器时强制删除镜像
删除两个id相同的镜像:使用repository和tag
docker rmi docker.io/redis:3.2
删除容器
docker rm -f smart_restaurant(容器名/ID)
// -f 停止并删除
// -v 删除挂载卷
// -l 删除容器连接,但保留容器
连接宿主机mysql
mac电脑可能会出现连接不上数据库的错误,此时需要将连接数据库的127.0.0.1
改成host.docker.internal
即可连接成功。
spring.datasource.url=jdbc:mysql://host.docker.internal:3306/demoSW?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
原因是docker是一个虚拟环境,127.0.0.1和localhost指的是虚拟环境内部,而不是外部宿主机,所以无法这样访问。