Docker是啥
Docker是一个开源的容器化平台 ,可以帮助开发者将应用程序 和其依赖的环境打包成一个可移植、可部署的容器。
Docker的主要目标是通过容器化技术,实现应用程序的快速部署、可移植性和可扩展性,从而简化应用程序的开发、测试和部署过程。
Docker与传统虚拟机的区别
虚拟机是一个主机模拟出多个主机(多个虚拟机),需要先拥有独立的系统。传统虚拟机,利用hypervisor,模拟出独立的硬件和系统,在此之上创建应用。(与主机而言,是同等地位)
docker 是在主机系统中建立多个应用及配套环境 ,把应用及配套环境独立打包成一个单位,是进程级的隔离。(于主机而言是个运行的进程)

Docker相对虚拟机的优势:
- 轻量级: 容器与宿主机共享操作系统内核,因此容器本身非常轻量级,启动和停止速度快,资源占用少。
- 可移植性: 容器可以在任何支持相应容器运行时的系统上运行,无需关注底层操作系统的差异,提供了高度的可移植性。
- 快速部署: 容器化应用程序可以通过简单的操作进行打包、分发和部署,减少了部署过程的复杂性和时间成本。
- 弹性扩展: 可以根据应用程序的需求快速创建、启动和停止容器实例,实现应用程序的弹性扩展和负载均衡。
- 环境隔离: 每个容器都具有独立的运行环境,容器之间相互隔离,不会相互干扰,提供了更好的安全性和稳定性。
Docker与Maven 类比
Docker Registry:可分为 公有Docker Registry 和 私有Docker Registry。 最常⽤的Docker Registry莫过于官方的 Docker Hub, 这也是默认的Docker Registry.
Docker架构

Docker Registry:可分为 公有Docker Registry 和 私有Docker Registry。 最常⽤的Docker Registry莫过于官方的 Docker Hub, 这也是默认的Docker Registry.
Images( Docker镜像):Docker镜像是一个只读模板,它包含创建 Docker容器的说明。
Container(容器):容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。
Client(客户端):Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识。
Docker命令
Docker安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)
- 安装:
yum install -y docker-ce-3:24.0.2-1.el7.x86_64 # 这是指定版本安装
- 启动并加入开机启动:
systemctl start docker && systemctl enable docker
- 验证是否安装成功/docker版本查看
docker version
镜像相关命令
- 搜索镜像
docker search java : 在Docker Hub中搜索含有 java这个关键词的镜像仓库
- 下载镜像
docker pull java:8 // 下载最新版本的 Java镜像,如果要下载指定版本则在java后面加冒号指定版本
- 列出下载镜像
docker images
- 删除镜像
docker rmi java // 强制删除加 -f
容器相关命令
1、新建并启动容器
docker run -d -p 91:80 nginx
docker run命令即可新建并启动一个容器,该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项。
docker run命令创建容器时,会先检查本地是否存在指定镜像。如果本地不存在该名称的镜像, Docker就会自动从 Docker Hub下载镜像并启动一个 Docker容器。
-d选项:表示后台运行
-P选项:随机端口映射
-p选项:指定端口映射,有以下四种格式。
-- ip:hostPort:containerPort
-- ip::containerPort
-- hostPort:containerPort
-- containerPort
--net选项:指定网络模式,该选项有以下可选参数:
--net=bridge:默认选项,表示连接到默认的网桥。
--net=host:容器使用宿主机的网络。--net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。
--net=none:不配置该容器的网络,用户可自定义网络配置。
2、列出运行中的容器
docker ps
3、停止容器
docker stop f0b1c8ab3633 -- 容器id
4、强制停止容器
docker kill f0b1c8ab3633
5、启动已经停止的容器
docker start f0b1c8ab3633
6、查看容器所有信息
docker inspect f0b1c8ab3633
7、查看容器日志
docker container logs f0b1c8ab3633
8、查看容器里的进程
docker top f0b1c8ab3633
9、容器与宿主机相互复制文件
docker cp 容器id:要拷贝的文件在容器里面的路径 宿主机的相应路径
如:docker cp 7aa5dc458f9d:/etc/nginx/nginx.conf /mydata/nginx
docker cp 要拷贝的宿主机文件路径 容器id:要拷贝到容器里面对应的路径
10、进入正在运行的容器
docker exec -it f0b1c8ab3633 /bin/bash (有的容器需要把 /bin/bash 换成 sh)
// 如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了
11、删除容器
docker rm f0b1c8ab3633 // 该命令只能删除已停止的容器,如需删除正在运行的容器,可使用-f参数
Dockerfile构建Docker镜像
Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。
在Dockerfile所在路径执行以下命令构建镜像:docker build -t nginx:tuling .
其中,-t指定镜像名字,命令最后的点(.)表示Dockerfile文件所在路径
使用Dockerfile构建微服务镜像
以项目tulingmall-member为例,将该微服务的可运行jar包构建成docker镜像
1、将jar包上传linux服务器/root/tulingmall/tulingmall-member目录,在jar包所在目录创建名为Dockerfile的文件。
2、在Dockerfile中添加以下内容
基于哪个镜像
From java:8
复制文件到容器
ADD tulingmall-member-0.0.5.jar /tulingmall-member-0.0.5.jar
声明需要暴露的端口
EXPOSE 8877
配置容器启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -jar /tulingmall-member-0.0.5.jar
3、使用docker build命令构建镜像
docker build -t tulingmall-member:0.0.5 .
4、启动镜像,加-d可在后台启动
docker run -d -p 8877:8877 tulingmall-member:0.0.5
加上JVM参数启动:
--cap-add=SYS_PTRACE 这个参数是让docker能支持在容器里能执行jdk自带类似jinfo,jmap这些命令,如果不需要在容器里执行这些命令可以不加
docker run -d -p 8877:8877 \
-e SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=192.168.65.174:8848 \
-e JAVA_OPTS='-Xmx1g -Xms1g -XX:MaxMetaspaceSize=512m' \
--cap-add=SYS_PTRACE \
tulingmall-member:0.0.5
5、访问会员服务接口
服务部署完成,即可以访问了。
将微服务镜像发布到阿里云远程镜像仓库
将微服务镜像发布到私有镜像仓库
- 搭建私有docker镜像仓库
2.上传镜像到私有仓库