P1 Docker:入门到精通

178 阅读16分钟

一.学习Docker前的学习流程

java全栈:
    1.前端
    2.数据库
    3.javaweb
    4.框架
    5.spingcloud微服务
    6.常用技术栈
    7.分析开源项目
    8.Linux以及阿里云ECS部署

二.学前准备

1.Linux基础
2.springboot(可选)

三.Docker学习内容

1.Docker入门(单机版Docker搭建应用)
    <1>概述
    <2>安装
    <3>命令:镜像命令,容器命令,操作命令...(类比于java的关键字)
    <4>Docker镜像
    <5>容器的数据卷:因为Docker和服务器与数据库是互相隔离的
    <6>DockerFile:把微服务项目构建成镜像
    <7>Docker网络原理
    <8>IDEA怎么整合Docker
2.Docker进阶(企业级Docker)
    <1>Docker Compose:处理集群,做编排
    <2>Docker Swarm:管理集群
    <3>CI/CD:如jenkins的流水线
     

四.是什么

1.Docker的历史

 不懂历史,只算是会使用api的初级开发工程师 ;
 2010年,一个小团队最开始成立的公司是dotCloud,处理pass的云计算服务(类似于VM做的事情,用了容器化技术),他们后来把容器化技术命名为Docker,Docker刚出来的时候没有被关注,2013年团队就把Docker开源了,201449日,Docker1.0发布

2.体量小的特点

<1>虚拟化技术

虚拟机和Docker都是虚拟化技术,容器化技术出来之前,我们都是用虚拟机技术

<2>虚拟机

在windows中装一个Vmware,通过这个软件我们可以虚拟一台或多台电脑

Snipaste_2022-01-12_14-46-59.png

<3>docker

容器化技术不是模拟一个完整的操作系统,比如安装一个centos7,只需要按照他的核心就够了,把所有东西打包隔离
只需要管软件就行了,体量比虚拟机小很多,他强调隔离和镜像(用最核心的环境,比如linux最低4m就够了,启动环境+jdk环境+mysql环境),只需要运行镜像就可以使用  

Snipaste_2022-01-12_14-52-08.png

<4>虚拟机和容器化技术对比

传统虚拟机,需要虚拟出一套硬件,运行一套完整的操作系统,然后在操作系统上安装和运行软件
容器内的应用可以直接运行在宿主机上的内容,容器是没有内核的,不用虚拟出一套硬件系统,每个容器间互相隔离,每个容器内都有属于自己文件系统,互不影响

3.Docker基本组成

<1>Docker架构图

    用客户端启动docker里面的容器,这个容器再去数据仓库下载

Snipaste_2022-01-12_15-12-48.png

<2>镜像(image)

I.是什么

i.docker的镜像好比是一个模板,可以通过这个模板创建容器服务
如Tomcat镜像:run=> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
ii.用来打包软件运行环境和基于运行环境开发的软件,包含了运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件

II.怎么用

i.远程仓库下载
ii.朋友拷贝给你
iii.自己制作镜像DockerFile

III.Docker镜像加载原理

UFS:联合文件系统

IV.分层理解

image.png

V.制作自己的镜像(commit)

Snipaste_2022-01-13_11-29-06.png Snipaste_2022-01-13_11-28-23.png

<3>容器(container)

Docker利用容器化技术,可以独立运行一个或一组应用,通过镜像创建,
容器可以启动,删除,停止...基本命令
可以把容器当成一个简易的linux系统,项目就放在这个简易的linux系统上

<4>仓库(repository)

仓库是用来存放镜像的地方,好比自己的开源项目放在Github上一样
仓库分为共有仓库和私有仓库:(默认是国外的)
    Docker Hub(国外的)
    阿里云...都有容器服务器(需要配置镜像加速)

五.为什么用

1.之前发项目遇到的问题:

一款产品上线:开发->上线,需要两套环境,
开发 - - - 运维
环境配置十分麻烦,每一台机器都需要部署环境(集群Redis、ES、Hadoop...),部署错了需要从头来
之前发布项目是发jar包或war包(需要部署Redis、Mysql、jdk、ES...环境),为了能够发jar包的时候带上环境,就出现了Docker
传统:开发打好jar包交给运维部署
现在:开发打包部署上线,一套流程完成

2.Docker给出的解决方案

Snipaste_2022-01-12_13-34-11.png

针对开发和运维遇到的问题,Docker的解决方案是把环境和项目一起打包成镜像,然后通过互相隔离的机制就可以实现
<1>是什么
<2>为什么用
I.能够更快速的交付和部署应用
    传统:看帮助文档,安装程序
    Docker:打包镜像发布测试,一键运行
II.更便捷的升级和扩缩容
   使用Docker,部署应用就和搭积木一样,比如项目要升级的,想要换里面的环境(如Tomcat5 ——> Tomcat8)
   传统:很麻烦,需要联调
   Docker:把带着环境打包好的项目做升级,把jar包给运维就可以
III.更简单的系统运维
   使用容器化技术之后,开发和测试环境高度一致
IV.更高效的计算资源利用
   Docker是内核级别的虚拟化,不用像传统虚拟机一样需要管理程序的支持,可以满足一个物理机上可以运行多个容器实例
<3>怎么用

3.DevOps(开发运维)

六.怎么用

1.安装(默认工作路径:/var/lib/docker)

<1>环境准备

I.需要一点儿Linux基础
II.系统Centos7
III.使用xshell连接远程服务器

<2>系统版本查看

[root@userAlex /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
#centos7

<3>环境查看

 [root@userAlex /]# uname -r
 3.10.0-957.21.3.el7.x86_64
 #内核时3.10以上的
 

<4>.查看帮助文档进行安装

I.卸载旧版本

Snipaste_2022-01-12_15-41-20.png

II.安装新版本

i.使用存储库安装
①.yum方式下载安装包:
 yum install -y yum-utils
②.设置镜像的仓库
I.国外的,很慢
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
II.推荐用国内的,阿里云Docker镜像地址
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo       
③.更新yum软件包索引
yum makecache fast
④.安装Docker相关的源
yum install docker-ce docker-ce-cli containerd.io
# docker-ce 社区版本
# docker-ee 企业版
⑤.启动docker
systemctl start docker
⑥.查看是否成功安装
docker version
⑦.运行helloworld镜像,测试并分析流程

Snipaste_2022-01-12_16-18-49.png

分析run helloworld流程:
执行docker run之后,docker做了什么事情,即docker run的运行原理
docker在本机寻找镜像,并判断本机有没有这个镜像,如果有就运行,如果没有就去阿里云加速上(Docker Hab太慢)远程下载;
远程仓库判断是否可以找到,找不到就返回找不到,找到了就下载镜像到本地        

Snipaste_2022-01-12_16-45-40.png

⑧.查看helloworld镜像的位置
docker images    

Snipaste_2022-01-12_16-20-07.png

⑨.卸载docker(卸载依赖,删除目录)
systemctl stop docker
    卸载 Docker 引擎、CLI 和 Containerd 软件包:
yum remove docker-ce docker-ce-cli containerd.io
    主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷:
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
⑩.配置阿里云镜像加速

image.png image.png

image.png

ii.离线安装
①下载arm架构对应安装包
Index of linux/static/stable/aarch64/
位置:/export/software
②压缩
tar -zxvf docker-18.06.3-ce.tgz -C /export/server
③复制docker下的二进制文件到/usr/bin
cp ./docker/* /usr/bin
④ 创建docker.service文件并编辑
  cd /etc/systemd/system/
  touch docker.service
  vim docker.service
  
#--insecure-registry=192.168.205.230改为自己ip
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=172.16.205.137
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target
⑤添加可执行权限
chmod +x docker.service
⑥加载docker.service(只要修改了该文件就需要再次加载)
systemctl daemon-reload
⑦启动docker并查看状态
systemctl start docker
systemctl status docker
docker -v
iii.一键安装和卸载脚本
①在docker-18.06.3-ce.tgz同目录下,创建docker.service,打开编辑文件,编辑上面一样的内容
②一键安装脚本
touch install.sh
vim install.sh

#!/bin/sh
 
echo '解压tar包'
tar -xvf $1
echo '将docker目录下所有文件复制到/usr/bin目录'
cp docker/* /usr/bin
echo '将docker.service 复制到/etc/systemd/system/目录'
cp docker.service /etc/systemd/system/
echo '添加文件可执行权限'
chmod +x /etc/systemd/system/docker.service
echo '重新加载配置文件'
systemctl daemon-reload
echo '启动docker'
systemctl start docker
echo '设置开机自启'
systemctl enable docker.service
echo 'docker安装成功'
docker -v
③找到docker-18.06.3-ce.tgz同目录下,还有上边创建的docker.service,install.sh,uninstall.sh这3个文件:分别给install.sh和uninstall.sh赋予可执行权限。
  chmod +x install.sh
  chmod +x uninstall.sh
④开始安装
  sh install.sh docker-18.06.3-ce.tgz
⑤一键卸载脚本
touch uninstall.sh
vim uninstall.sh    
#!/bin/sh
 
echo '停止docker'
systemctl stop docker
echo '删除docker.service'
rm -f /etc/systemd/system/docker.service
echo '删除docker文件'
rm -rf /usr/bin/docker*
echo '重新加载配置文件'
systemctl daemon-reload
echo '卸载成功'

2.Docker常用命令

image.png 帮助文档:docs.docker.com/engine/refe…
image.png

<1>镜像命令

Snipaste_2022-01-12_17-25-49.png

image.png Snipaste_2022-01-12_21-25-18.png Snipaste_2022-01-12_21-27-15.png

image.png

Snipaste_2022-01-12_21-29-51.png

<2>容器命令

image.png Snipaste_2022-01-12_21-40-49.png

Snipaste_2022-01-12_21-43-09.png

Snipaste_2022-01-12_21-47-21.png

Snipaste_2022-01-12_21-55-27.png

Snipaste_2022-01-12_21-56-28.png image.png

<3>日志,元数据,进程查看

Snipaste_2022-01-12_22-02-43.png Snipaste_2022-01-12_22-51-29.png Snipaste_2022-01-12_22-53-45.png Snipaste_2022-01-12_22-55-59.png Snipaste_2022-01-13_18-25-59.png

<4>进入容器与拷贝(拷贝是手动的过程,-v 卷挂载实现自动同步)命令

Snipaste_2022-01-13_08-59-05.png Snipaste_2022-01-13_09-01-57.png Snipaste_2022-01-13_09-08-27.png

3.Docker练习

<1>部署Nginx

    I.搜索镜像 search(先去docker hub搜索,有更全的信息)
    II.下载镜像 pull
    III.本地运行测试       

Snipaste_2022-01-13_09-25-33.png

Snipaste_2022-01-13_09-28-10.png

    IV.端口暴露概念        

Snipaste_2022-01-13_09-24-02.png

<2>部署Tomcat

Snipaste_2022-01-13_09-41-10.png

七.Docker镜像底层原理

1.底层的系统结构

Client-Server结构,Docker这个的守护进程运行在主机(宿主)上。通过Socket从客户端访问。DockerServer接收到Docker-Client的指令,就会执行这个命令        

Snipaste_2022-01-12_16-56-46.png

2.Docker比vm快的原因

Snipaste_2022-01-12_16-59-18.png

3.制作自己的一个镜像

参考上面Docker对于镜像的说明

八.容器数据卷(volume)(卷技术)(容器的挂载)

1.是什么

docker的理念是把应用和环境打包成一个镜像,然后run就是容器了,而数据都在容器中,如果容器删除,数据机会丢失;但是我们的需求是数据可以持久化;比如说下载了一个mysql镜像,执行run转为容器,一旦删除这个容器数据也会丢失,相当于删库跑路,我们的需求是把Mysql的数据存在本地或其他地方而不是存在容器
所以要有一个容器之间数据共享的技术:让Docker容器中产生的数据同步到本地,这样删除容器数据就不会丢失。这就是卷技术(也叫目录的挂载,就是将容器内的目录,挂载到Linux或虚拟机上)

Snipaste_2022-01-13_12-30-40.png

挂载:        

Snipaste_2022-01-13_12-48-19.png

2.为什么要用

思考:上面用docker部署一个最简单的Tomcat,会发现确实东西,如果要放进去项目,需要进入容器手动把项目放到webapps下;我们要实现的是,在容器外部提供一个映射路径webapps,当我们在外部的映射路径下放置项目时,会自动同步到容器内。
举例:我们上面部署的容器是tomcat+网页,如果删了docker,东西都没了;获取另外一个容器里有tomcat+mysql,删了docker,数据都没了,肯定是不行的,所以要解决这个问题
解决容器的持久化和同步操作,使用容器卷技术后,修改只需要在本地修改,容器内会自动同步
总结就是实现容器的数据持久化功能

3.使用数据卷(怎么用)

<1>方式一:直接通过命令挂载

I.使用命令挂载

docker run -it -v 主机目录:容器目录

Snipaste_2022-01-13_12-49-27.png

II.测试容器内数据和本机数据是否同步

同步的过程可以理解为双向绑定

Snipaste_2022-01-13_12-53-37.png Snipaste_2022-01-13_13-00-07.png image.png

III.测试删除容器后,本机数据是否可以保留

IV.测试Mysql同步数据

i.连接数据库,同步数据

Snipaste_2022-01-13_14-34-34.png Snipaste_2022-01-13_14-37-53.png

ii.删掉容器,查看本地数据是否可以保留
发现,就算我们把容器删除,挂载到本地的数据卷依旧没有丢失,实现了数据持久化功能

Snipaste_2022-01-13_14-44-48.png

Snipaste_2022-01-13_14-42-42.png

V.具名挂载和匿名挂载

i.使用

Snipaste_2022-01-13_14-55-05.png

Snipaste_2022-01-13_14-55-36.png

ii.区分具名挂载和匿名挂载和指定路径的挂载方式

Snipaste_2022-01-13_14-59-08.png

iii.扩展

Snipaste_2022-01-13_15-00-50.png

<2>方式二:初始DockerFile-实现卷挂载的另一种方式

DockerFile就是用来构建docker镜像的构建文件

I.创建dockerfile文件,编写脚本用来生成镜像

挂载的时候,前面通过-v,还有具名挂载,匿名挂载方式,还可以在构建镜像的同时挂载     

Snipaste_2022-01-13_15-15-58.png Snipaste_2022-01-13_15-12-23.png

II.启动自己写的容器

Snipaste_2022-01-13_15-18-52.png

III.容器内部创建一个文件,并查看卷挂载的路径

Snipaste_2022-01-13_15-27-12.png

IV.测试文件是否同步出去了

Snipaste_2022-01-13_15-34-05.png

<3>.卷挂载技术总结

如果构建镜像的时候没有挂载卷,就需要手动挂载(-v 卷名:容器内路径)

4.数据卷容器(把容器变为数据卷容器)

多个容器之间通过数据卷挂载实现数据共享,如多个mysql之间的数据同步;
--volumes from

Snipaste_2022-01-13_15-59-28.png

<1>启动多个容器

I.启动第一个容器

Snipaste_2022-01-13_16-10-28.png Snipaste_2022-01-13_16-11-57.png

II.启动第二个容器

Snipaste_2022-01-13_16-14-44.png

<2>数据同步

在父容器创建一个文件,查看另外一个容器是否同步  
I.在第一个容器的挂载文件中新建文件   

Snipaste_2022-01-13_16-17-39.png

II.查看第二个容器是否生成文件完成同步

Snipaste_2022-01-13_16-22-23.png

<3>测试同步

删除父容器,不影响另外的容器,还可以访问文件——>备份的机制,不是共享的机制(共享的化,删除其中一个,别的也访问不到) 

I.共享

Snipaste_2022-01-13_16-33-41.png

II.数据卷容器

Snipaste_2022-01-13_16-35-01.png

<4>.多个mysql实现数据共享

Snipaste_2022-01-13_16-45-35.png

5.结论

容器之间配置信息的传递:比如做集群的时候经常要把集群的文件拷贝到多个配置文件里,每一个服务器上都要有
数据卷容器的生命周期一直持续到没有人使用为止,但是一旦使用-v持久化到了本地,本地的数据是不会被删除的
****通过容器数据卷,就可以做到数据持久化,并用挂载的方式把重要的文件挂载到文件系统内,这样删除容器,容器的数据就不会消失,可以在本地找到

九.DockerFile(命令参数脚本)(制作一个镜像)

1.是什么

<1>DockerFile就是用来构建docker镜像的构建文件
<2>构建过程

2.为什么用

1.docker file是面向开发的,我们要发布项目,做镜像,就需要编写dockerfile 文件
2.在公司中做容器部署的时候,docker是一个交付的标准,之前是需要叫一个jar包或者war包,现在就是交一个docker镜像,因此要使用docker file把代码和服务构建成镜像;
之前发布的是jar或war包,现在就算是jar包,也要变成Docker镜像,当启动镜像的时候,里面的jar包全部自动运行
3.Docker三部曲
Docker File:构建文件,定义了一切的步骤,好比是源代码
DockerImages:通过Docker File构建生成的镜像,这就是最终发布和运行的产品 
Docker容器 :是镜像运行起来提供服务的

3.怎么用

<1>构建步骤

i.编写一个dockerfile文件
ii.docker build构建成为一个镜像
iii.docker run 运行镜像
iv.docker push发布镜像:可以发布到两个地方(相当于开源)
    Docker Hub
    阿里云镜像仓库

<2>Docker File的指令

Snipaste_2022-01-13_17-32-39.png

<3>实例:构建自己的centos

Snipaste_2022-01-13_17-35-10.png

I.创建一个目录

[root@userAlex /]# cd home
[root@userAlex home]# ls
alex  www
[root@userAlex home]# mkdir dockertest
[root@userAlex home]# ls
alex  dockertest  www

II.创建一个自己的docker file,并构建一个自己的centos

i.编写Docker File 文件
[root@userAlex dockertest]# vim mydockerfile-centos
[root@userAlex dockertest]# cat mydockerfile-centos
FROM centos
MAINTAINER alex<1021355326@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim 
RUN yum -y install net-tools 

EXPOSE 80

CMD echo $ MYPATH
CMD echo "---end---"
CMD /bin/bash

ii.通过编写的这个文件构建镜像
docker build -f mydockerfile-centos -t mycentos:0.1 .
#-f :指的是构建镜像用的是哪个dockerfile文件
#-t :生成的目标镜像名字,可以加版本号
iii.测试运行

Snipaste_2022-01-13_18-23-29.png

<4>CMD和ENTRYPOINT区别

image.png

I.cmd测试

使用cmd,启动容器时执行查看当前目录的命令

Snipaste_2022-01-13_21-10-00.png

Snipaste_2022-01-13_21-10-29.png

II.ENTRYPOINT

<5>实例:DockerFile制作Tomcat镜像

I.准备镜像文件:tomcat压缩包,jdk压缩包

[root@userAlex /]# cd home/alex
[root@userAlex alex]# ls
apache-tomcat-8.5.73  apache-tomcat-8.5.73.tar.gz  jdk-8u65-linux-x64.rpm

II.写阅读文档和Dockerfile文件(docker默认会找Dockerfile名字,写这个名字就不需要-f指定)

[root@userAlex alex]# touch read.txt
[root@userAlex alex]# vim Dockerfile
[root@userAlex alex]# cat Dockerfile
FROM centos
MAINTAINER alex<1021355326@qq.com>

COPY read.txt /usr/local/read.txt

ADD jdk-8u144-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.73.tar.gz /usr/local/

RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_65
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.73
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.73
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME /bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-8.5.73/bin/startup.sh && tail -F /url/local/apache-tomcat-8.5.73/bin/logs/catalina.out

III.构建镜像

[root@userAlex alex]# docker build -f Dockerfile -t diytomcat .
Successfully built 99d4e823eb47
Successfully tagged diytomcat:latest

IV.查看镜像

[root@userAlex java]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
diytomcat    latest    99d4e823eb47   2 minutes ago   689MB
mycentos     0.1       8f1c61bb3364   4 hours ago     326MB
centos       latest    5d0da3dc9764   3 months ago    231MB
[root@userAlex java]# 

V.启动

[root@userAlex /]# docker run -d -p 9090:8080 --name alextomcat -v /home/alex/test:/url/local/apache-tomcat-8.5.73/webapps/test -v /home/alex/tomcatlogs/:/url/local/apache-tomcat-8.5.73/logs diytomcat
#以后台方式运行容器;
#暴露端口对外9090,对内8080;
#给容器起名字alextomcat
#把容器内tomcat发布项目的目录挂载出来到宿主机的test目录(把容器内的test和外部的test绑定),以后发布tomcat的项目放到本地的test下,就会同步到容器内的对应文件
#把容器内的日志文件也挂载出来

VI.测试访问

[root@userAlex alex]# curl localhost:9090

VII.发布一个项目

因为做了卷挂载,直接在本地编写项目发布就可以    

image.png

十.发布自己的镜像

镜像可以发布到Dockler Hub或者阿里云镜像服务

1.发布到DockerHub

<1>从服务器登录DockerHub

image.png

[root@userAlex /]# docker login -u alex1021355326
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@userAlex /]#

<2>提交镜像push

[root@userAlex /]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
tomcat       latest    fb5657adc892   2 months ago   680MB
[root@userAlex /]# docker tag fb5657adc892 alex/tomcat:1.0
[root@userAlex /]# docker push alex/tomcat:1.0

2.发布到阿里云镜像服务

<1>登录阿里云

<2>找到容器镜像服务

<3>创建命名空间

存镜像的地方    

image.png

<4>创建镜像仓库

image.png

<5>从服务器登录阿里云

<6>提交镜像push

image.png

十一.Docker网络

需求:容器之间不使用ip或地址,怎么能直接用服务名字ping通

Snipaste_2022-01-14_11-42-33.png

  实现高可用
--link

Snipaste_2022-01-14_14-44-38.png

十二.springboot微服务打包成docker镜像

1.构建springboot项目

2.打包项目

3.编写dockerfile

4.构建镜像

5.发布运行

[root@userAlex home]# mkdir idea
[root@userAlex home]# ls
alex  dockertest  idea  www
[root@userAlex home]# cd idea
[root@userAlex idea]# ls
Dockerfile  test-0.0.1-SNAPSHOT.jar
[root@userAlex idea]# docker build -t alex666 .
Sending build context to Docker daemon  17.56MB
Step 1/5 : FROM java:8
[root@userAlex idea]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
alex666      latest    222f13d6ccf0   18 seconds ago   661MB
[root@userAlex idea]# docker run -d -P --name alex-springboot-web alex666
89af8dd17b8b3c253ae22c208512f2d239f4f193a6a2138cce6dd78d504a0a6e
[root@userAlex idea]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                     NAMES
89af8dd17b8b   alex666   "java -jar /app.jar …"   20 seconds ago   Up 19 seconds   0.0.0.0:49156->8080/tcp   alex-sp
root@userAlex idea]# curl localhost:49156
{"timestamp":"2022-03-13T14:40:42.750+00:00","status":404,"error":"Not Found","path":"/"}[root@userAlex idea]# 
[root@userAlex idea]# curl localhost:49156/hello
hello,docker[root@userAlex idea]#