Docker学习及部署SpringBoot项目
Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
基本概念:
1. 镜像: 相当于一个类,可以使用镜像创建多个容器(实例)。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。
2. 容器:容器是镜像的运行时实例(对象),容器可以被创建、启动、停止、删除、暂停等。
3. 仓库:可看成一个代码控制中心,用来保存镜像。
Docker安装(centos 7)
镜像加速:
阿里云容器镜像服务
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://自己的编码.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
可以使用 `docker info` 查看是否成功
Registry Mirrors:
https://94nd6qb9.mirror.aliyuncs.com/
Live Restore Enabled: false
Docker使用
Hello world
docker run ubuntu:15.10 /bin/echo "Hello world"
参数解析:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10: 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令
Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。
镜像命令
- docker images:列出本地主机上的镜像
- docker search image:查找 image镜像
- docker pull image[:TAG]:获取 image:版本 镜像
- docker inspect image:展示xxx镜像的细节,包括镜像层数据和元数据
- docker rmi -f 镜像ID:删除xxx镜像
- docker rmi -f $(docker images -qa) : 删除全部镜像
容器命令
- docker run image:新建并启动容器
- docker ps :列出当前所有正在运行的容器
- exit:容器停止退出
- ctrl + P + Q:容器不停止退出
- docker start image:启动容器
- docker restart image:重启容器
- docker kill image:强制停止容器 / stop
- docker rm 容器ID:删除已停止的容器
- docker rm -f $(docker ps -a -q) :一次删除多个容器
- docker exec -it 容器ID bashShell :进入正在运行的容器并以命令行交互
- docker attach 容器ID: 重新进入运行的容器
- docker run -d image:启动守护式容器,Docker容器后台运行,就必须有一个前台进程.
- docker logs -f -t --tail 容器ID:查看容器日志
* -t 是加入时间戳
* -f 跟随最新的日志打印
* --tail 数字 显示最后多少条
Dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤:编写Dockerfile文件------docker build --------docker run
执行Dockerfile流程:
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都完成
指令:
- FROM:基础镜像,当前新镜像是基于哪个镜像的
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建时需要运行的命令
- EXPOSE:当前容器对外暴露出的端口
- WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
- ENV :用来在构建镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- VOLUME:容器数据卷,用于数据保存和持久化工作
- CMD:指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
- ENTRYPOINT :指定一个容器启动时要运行的命令
重点:部署项目
1、下载项目所需要的 jdk linux
版本,本地建立 mydocker
文件夹,并将jdk cp
到文件夹下。
2、在 mydocker
文件夹中建立 Dockerfile
文件。
3、将java
项目打包mvn clean package -Dmaven.test.skip=true
,将jar包上传到 mydocker
文件夹中。
4、编写
Dockerfile
文件
# 建立一个新的镜像文件,以centos为基础模板
FROM centos:7
# 作者名 和 邮箱
MAINTAINER tyq <2950498345@qq.com>
# 创建一个新目录来存储jdk文件
RUN mkdir /usr/local/java
#将jdk压缩文件复制到镜像中,它将自动解压缩tar文件
ADD jdk-11.0.3_linux-x64_bin.tar.gz /usr/local/java/
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.3
ENV PATH $JAVA_HOME/bin:$PATH
#指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
WORKDIR /usr/local
#将宿主机目录下的文件拷贝进镜像 更名为bank-test.jar
ADD bank-1.0-SNAPSHOT.jar /bank-test.jar
# 当前容器对外暴露的端口
EXPOSE 8080
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/bank-test.jar"]
5、执行制作镜像命令:docker build -t bank-test .
- docker build -t ImageName:TagName dir
.
表示当前目录,指 jar包与Dockerfile 在同一目录下- -t − 给镜像加一个Tag
- ImageName − 给镜像起的名称
- TagName − 给镜像的Tag名
- Dir − Dockerfile所在目录
6、创建容器并进行端口映射docker run -d -it -p 8000:8080 bank-test
问题
出现:exec user process caused: exec format error
原因:可能是镜像和系统不兼容,在安装下载jdk的时候,选择了Linux ARM 64 RPM Package
版本,后面改成Linux x64 Compressed Archive
版本,重新部署,succ
通常手机的CPU架构是ARM,电脑的CPU架构是X86,X64 是 X86_X64的简称