东湖之滨 发表于 2024-6-23 19:43:54

docker从安装到部署项目,一篇文章教会你

1、什么是Docker

   起首看下Docker图标:   https://img-blog.csdnimg.cn/0f9b7c8312c74698b8729773706a444f.png
   一条小鲸鱼上面有些集装箱,比较形象的阐明白Docker的特点,以后见到这个图标等同见到了Docker   1.1、容器技能

   1. Docker是一个开源的应用容器引擎,它基于Go语言开辟,并服从Apache2.0开源协议   2.   使用Docker可以让开辟者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意       Linux呆板上,也可以实现虚拟化   3. Docker容器完全使用沙箱机制,相互之间不会有任何接口,这保证了容器之间的安全性   4. Docker诞生于2013年初,目前有两个版本:Community Edition(CE,社区版)和       EnterpriseEdition(EE,企业版)   1.2、容器与虚拟机比较虚拟机:

https://img-blog.csdnimg.cn/4b6fbe8681fd474d9c70d3675767a3b9.png
虚拟机:
   1. 虚拟机(Virtual Machine)指通过软件模仿的具有完备硬件系统功能的、运行在一个完全隔离环境中的完备计算机系统   2.   在实体计算机中可以或许完成的工作在虚拟机中都可以或许实现   3.   在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量   4.   每个虚拟机都有独立的CMOS、硬盘和操纵系统,可以像使用实体机一样对虚拟机进行操纵   区别:   1.   虚拟机是在一台物理机上,使用虚拟化技能,虚拟出来多个操纵系统,每个操纵系统之间是隔离   的。Docker是开源的应用容器引擎,依然需要先在电脑上安装操纵系统,然后安装Docker容器管   理器   2.   虚拟机是在硬件级别进行虚拟化,而Docker是在操纵系统的层面虚拟化   3.   虚拟机是通过模仿硬件搭建操纵系统,而Docker则是复用操纵系统   4.   虚拟机实现了操纵系统之间的隔离,Docker只是历程之间的隔离,所以虚拟机的隔离级别更高,安全性更强   5. Docker的运行速度更快   6. Docker的文件要小的多,虚拟机密大的多   1.3、Docker特点

1、更高效的使用系统资源

   Docker对系统资源的使用率很高,无论是应用实行速度,内存损耗或者文件存储速度,都要比传统虚拟机技能更高效。因此,对比虚拟化技能,一个相同设置的主机往往可以运行更多数量的应用   2、更快速的启动时间

   传统的虚拟化技能启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完备的操纵系统,因此可以做到秒级,乃至毫秒级的启动时间,大大节约了开辟测试,部署的时间   3、一致的运行环境

   开辟过程中常见的一个题目是环境一致题目,由于开辟环境、测试环境、生产环境不一致,导致有些   bug并未在开辟过程中发现。   而Docker的镜像提供了除内核外完备的运行时环境,确保环境一致性,从而不会在出现这段代码在我呆板上没题目这类题目   Docker是一个采用集装箱思想出现技能,把相关依赖及运行代码打到一起,到达开辟环境,测试环境,     部署环境一样,淘汰由于环境不一致而出现题目 4、持续支付和部署

   对开辟和运维人员来说,最希望就是一次创建和部署,可以在任意地方运行。而且使用Docker file使镜像构建透明化,不但仅开辟团队可以明白应用运行环境,也方便运维团队明白应用运行所需条件,资助更好的生产环境中部署该镜像5、更轻松的迁移

   由于Docker确保了实行环境的一致性,使得应用的迁移更加容易。      Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,乃至是笔记本、其运行结果是一致的。      因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的环境   6、更轻松的维护和扩展

   Docker使用的分层存储以及镜像技能,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简朴,基于基础镜像进一步扩展镜像也变得十分简朴。      此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本   2、Docker组件学习

https://img-blog.csdnimg.cn/073c4d0f472943b688c901b3347a6463.png

2.1、Docker客户端和服务器

   1. Docker是一个客户端-服务器(C/S)架构程序。   2. Docker客户端只需要向Docker服务器或者保卫历程发出请求,服务器或者保卫历程将完玉成部工作并返回结果。   3. Docker提供了一个命令行工具Docker以及一整套RESTful API。   4.   你可以在同一台宿主机上运行Docker保卫历程和客户端,也可以从当地的Docker客户端毗连到运行在另一台宿主机上的长途Docker保卫历程    https://img-blog.csdnimg.cn/f17c0bbca75a41fca0763c3289b3921e.png
2.2、Docker镜像

   1.   镜像是构建Docker的基石。   2.   用户基于镜像来运行自己的容器。   3.   镜像也是Docker生命周期中的“构建”部分。   4.   镜像是基于团结文件系统的一种层式结构,由一系列指令一步一步构建出来。   5.   例如:添加一个文件;实行一个命令;打开一个窗口。也可以将镜像当作容器的“源代码”。   6.   镜像体积很小,非常“便携”,易于分享、存储和更新   2.3、Registry(注册中心/镜像仓库)

   1. Docker用Registry来生存用户构建的镜像。   2. Registry分为公共和私有两种。   3. Docker公司运营公共的Registry叫做Docker Hub。   4.   用户可以在Docker Hub注册账号,分享并生存自己的镜像      阐明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry   2.4、Docker容器

   1. Docker可以资助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。   2.   容器是基于镜像启动起来的,容器中可以运行一个或多个历程。   3.   我们可以以为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者实行阶段。   4.   容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务   所以Docker容器就是:一个镜像格式;一些列尺度操纵;一个实行环境     Docker鉴戒了尺度集装箱的概念:   尺度集装箱将货物运往天下各地,Docker将这个模型运用到自己的筹划中,唯一不同的是:集装箱运输货物,而Docker运输软件(所以说Docker图标很形象)           》和集装箱一样,Docker在实行上述操纵时,并不关心容器中到底装了什么,它不管是web服务器,   还是数据库,或者是应用程序服务器什么的。全部的容器都按照相同的方式将内容“装载”进去           》Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,再把容器部署到具体的主机中。像尺度集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且只管通用            》使用Docker,我们可以快速的构建一个应用程序服务器、一个消息总线、一套实用工具、一个持续   集成(CI)测试环境或者任意一种应用程序、服务或工具。我们可以在当地构建一个完备的测试环境,也可以为生产或开辟快速复制一套复杂的应用程序栈   https://img-blog.csdnimg.cn/33fa7b8669024b689e1ab0c5910d99af.png
3、Docker的安装

   1. Docker   是一个开源的应用容器引擎,让开辟者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何盛行的   Linux或Windows   呆板上,也可以实现虚拟化。容器是完全使用沙   箱机制,相互之间不会有任何接口。   2.   这是官网上对Docker的介绍。说白了,Docker就是方便我们环境搭建和开辟使用的   本日告急是教大家怎样搭建一个docker,资助刚刚接触docker的同学快速搭建docker。好了,废话不多说,开始   3.1、准备工作

1、准备Linux服务器

   Linux服务器一台,且上面的安装的Centos系统内核要不低于3.10。你可以通过uname -r来查询当前内核版本,我当地的虚拟机:   https://img-blog.csdnimg.cn/a2d16f4711a04c918e0045ae2edf2791.png
2、清除系统残余项

   假如你的Llinux服务器之前没有装过Docker,可以直接跳过此步骤   sudo yum remove docker
    https://img-blog.csdnimg.cn/507b9bf867d345cb8fa796a4330021ed.png
   我这台Linux服务器上刚装的虚拟机,是新的,所以没有什么需要删除的    3、安装下载Docker

   接下来我就通过FinalShell工具来输入命令了   安装下载Docker的命令如下:   sudo yum install -y yum-utils device-mapper-persistent-data lvm2    输入命令后回车,等一会,等他安装完毕:   https://img-blog.csdnimg.cn/5b811c5dee0b4646b630a1185a724e3a.png
   安装完毕是如许了:   https://img-blog.csdnimg.cn/47812a6607d14ed2a106484c246b31ff.png
4、添加阿里云的软件源

   输入下面命令:   sudo yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo https://img-blog.csdnimg.cn/5ec0180096774c1092a307825c6723a9.png

   装这个的目的是以后每个软件都优先从阿里云的软件库中下载,假如阿里云仓库没有,才会去   docker.hub中下载,提高我们的下载速度。(与maven仓库同理)   5、更新yum缓存

   为了保证能更新和下载需要的服务:如docker   输入命令并且更新成功命令   sudo yum makecache fasthttps://img-blog.csdnimg.cn/66ec1252d1e64a89a946b823b8b25ad1.png

   1.   我们在更新   yum   源或者出现设置yum源之后,通常都会使用   yum makecache   生成缓存,这个命令是将软件包信息提前在当地缓存一份,用来提高搜索安装软件的速度   2.   假如觉得占用磁盘空间,可以使用yum clean指令清除缓存:【yum clean all】   3.2、安装Docker

1、安装Docker

   安装Docker,Docker版本分为:CE(社区免费版)和EE(企业版,安全CE)   命令如下:   sudo yum -y install docker-cehttps://img-blog.csdnimg.cn/8ed1d397b85b4cb48c0f05b0007dba09.png
 https://img-blog.csdnimg.cn/fae6087c33b64d8bb681460287f37918.png
开始下载并安装Docker,稍等一会,系统正在下载   看到complete,表示下载安装成功了   2、启动Docker

   如下命令启动Docker:   sudo systemctl start docker    查看Docker是否成功,输入命令:   docker info    我们可以看到Docker已经安装成功且容器与镜像数都为0,是一个全新的docker服务   至此,我们Docker安装成功了   https://img-blog.csdnimg.cn/27168407ebfd40c59f7e4290384caa36.png3、开机启动Docker

   如下命令启动Docker:    sudo systemctl start docker    查看Docker是否成功,输入命令:      docker info https://img-blog.csdnimg.cn/74369eb265b742f5b19da8a31217e6cd.png
   我们可以看到   Docker   已经安装成功且容器与镜像数都为   0   ,是一个全新的   docker   服务      至此,我们   Docker   安装成功了         3   、开机启动   Docker        如下命令可以设置   Docker   随着   Linux   开机而启动        sudo systemctl enable docker   https://img-blog.csdnimg.cn/8bae0626c34547e38eeb623c266aeefb.png
   
    4、移除Docker-ce服务

sudo yum remove docker-ce 5、删除Docker依赖项

sudo rm -rf /var/lib/docker 4、Docker常用命令

docker search 镜像名称 //搜索镜像
docker pull 镜像名称:版本号 //拉取对应版本的镜像
docker pull 镜像名称 //默认拉取最新的镜像
docker images //查看本地已下载的镜像
docker ps //查看正在运行的容器
docker ps -a //查看所有的容器(包括run、stop、exited状态的)
docker container ls //查看正在运行的容器
docker rm 容器ID //只能删除没有在运行的容器
docker rm -f 容器ID //可以删除正在运行的容器
docker run -p 本地主机端口号:容器服务端口号 --name 容器名字 [-e 配置信息修改] -d 镜像名字
docker start 容器ID //启动容器
docker stop 容器ID //终止容器
docker rmi 镜像名称orID //删除镜像
docker rmi 镜像名称orI --force //强制删除镜像 4.1、制止与启动容器

   制止正在运行的容器:docker stop   容器名/容器id   启动已运行过的容器:docker start   容器名/容器id   4.2、文件拷贝

   假如我们需要将文件拷贝到容器内可以使用cp命令   docker cp 需要拷贝的文件或目录容器名称:容器目录    也可以将文件从容器内拷贝出来   docker cp 容器名称:容器目录需要拷贝的文件或目录
docker cp /1.txt redis:/ #把linux中的/1.txt文件,拷贝到redis容器中的 / 根目录 docker
cp redis:/2.txt / #把redis容器中的 /2.txt ,拷贝到 linux的 / 根目录
4.3、目录挂载

        
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,如许我们就可以通过修改宿主机某个目录的文件从而去影响容器。

   创建容器 添加-v参数 后边为宿主机目录:容器目录   docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos:7
     假如你共享的是多级的目录,大概会出现权限不敷的提示:permission denied      这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数--privileged=true来解决挂载的目录没有权限的题目   4.4、查看容器IP地点

   我们可以通过以下命令查看容器运行的各种数据   docker inspect mycentos2    也可以直接实行下面的命令直接输出IP地点   docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2
4.5、删除容器

   删除指定的容器:docker rm   容器名/容器ID   留意,只能删除制止的容器   删除全部容器:   docker rm docker ps -a -q
4.6、登录容器

   我们先查看一下正在运行的容器:   https://img-blog.csdnimg.cn/594b0e1e7bbe41dc8c3546c058413e45.png    目前有JDK和MySQL都在运行,接着看   1、使用attach进入容器

docker attach 53   此中的   “53”   指的是什么呢?   我们启动的Java镜像的容器ID是“53d4afb331e4”,所以,   docker attach   命令后面,你可以指定容器ID来进入具体的容器。可以指定53、53d4、53d4afb等任意长度的值,都代表了当前的java容器   https://img-blog.csdnimg.cn/7e60b387426c4b0e9ea5a2849fed1a3d.png 除了使用容器ID进入容器之外,也可以使用容器的别名进入容器:
docker attach java
2、使用exec命令进入容器

   通过容器别名进入容器:   docker exec -it java /bin/bash
    通过容器ID进入容器:   docker exec -it 53 /bin/bash
    进入容器后,可以查看Java的版本信息,如下图所示:   https://img-blog.csdnimg.cn/62f853688c6b4c1dbe2d57d3b7d132fc.png
5、Docker安装常用软件

5.1、安装 MySQL

   起首在Docker仓库中搜索一下MySQL,命令如下:   docker search mysql
    结果:   https://img-blog.csdnimg.cn/d74e9c63d0ea4c048e0bc8ce53922d3d.png
我们这里安装MySQL8.0 的,命令如下:
   docker pull mysql:8.0
docker pull mysql //默认拉取最新版本
    下载中,稍等一会   https://img-blog.csdnimg.cn/c25100173e574bc7964feff9a18df321.png
   查看当地仓库镜像是否下载成功   https://img-blog.csdnimg.cn/047f710109d44d73bd707a35f5930098.png
   docker images mysql:8.0https://img-blog.csdnimg.cn/492205450b2b49fe8f4345029e95994a.png
   运行MySQL8.0容器:   docker run -p 3307:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0
参数说明:
-p 将本地主机的端口映射到docker容器端口(因为本机的3306端口已被其它版本占用,所以使用3307)
--name 容器名称命名
-e 配置信息,配置root密码
-d 镜像名称https://img-blog.csdnimg.cn/0fc9e4898215427f869c1e394f0ced37.png

    查看mysql8.0容器运行环境   docker ps https://img-blog.csdnimg.cn/e4643587463b4ee7ae995fda5ef2f7b9.png

    docker登录mysql   docker exec -it mysql8.0 bash
mysql -uroot -phttps://img-blog.csdnimg.cn/5279579dde644410858560f98c55b7f0.png

然后输入暗码root就可以登录成功了
   接下来,我们用当地的【Navicat Premium 15】工具来毗连这个数据库试试:       https://img-blog.csdnimg.cn/825f44fda9c14ab899763832039ec36e.png
   查询版本号:   select version();    结果:    https://img-blog.csdnimg.cn/fb57d1cf60824b6aa6e056c549960a5f.png
5.2、安装JDK

   命令:   docker pull primetoninc/jdk:1.8https://img-blog.csdnimg.cn/f3d4f3c34eb649dbbf8c31aad857b60d.png

    安装完成:   https://img-blog.csdnimg.cn/cd9b8a5d7a6c40059e52f9ff33b61156.png
   启动JAVA镜像容器:   docker run -d -it --name java primetoninc/jdk:1.8
参数说明:
run:启动一个镜像容器
-d:指定容器运行于后台
-it:-i 和 -t 的缩写;
-i:以交互模式运行容器,通常与 -t 同时使用
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name:第一个“java”是为容器指定了一个别名,而第二个“java”指的是下载镜像时的名称https://img-blog.csdnimg.cn/c9ce95ce87b443b4ad1d33aa0abdbd9a.png
   看下是否安装成功:   java -versrion    https://img-blog.csdnimg.cn/0ba4e0f88a1a40c9835b00fcab0de77c.png
   搞定,安装成功了    6、Docker中部署jar包运行

6.1、准备一个jar包

   我这里趁便写了一个SpringBoot项目,里面什么都没有,只有一个定时任务,每隔两秒打印一句话而   已:   pom依赖:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.test</groupId>
<artifactId>DockerDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--1、引入SpringBoot-->
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencies>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.5.RELEASE</version>
<configuration>
<!--自己手动导入的jar包也需要打包-->
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version><configuration>
<!--测试包下的代码出错不影响项目的编译-->
<testFailureIgnore>true</testFailureIgnore>
<!--跳过测试包代码-->
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
<finalName>dockerDemo</finalName>
</build>
</project>
    启动类:   
@SpringBootApplication
@EnableScheduling
public class App {
    public static void main(String[] args){
      SpringApplication.run(App.class, args);
    }
}
    定时任务:   
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class TestTask {

    @Scheduled(fixedRate = 2000)
    public void test(){
      System.out.println("定时任务:每隔两秒执行一次" + new Date());
    }

}     没有yml设置文件   windows当地启动时可以出来结果的,如下图所示:   6.2、创建DockerFile文件

   在Linux的opt目录中新建dockerTest文件夹,如下:(opt目录自己任意选择,我这里以opt目录为例)   https://img-blog.csdnimg.cn/7175743beba54c5cb1ff616fd8ebf764.png
   然后使用工具将我们准备好的jar包传到该目录:   https://img-blog.csdnimg.cn/a6487f4956f34ce7bb5bcf0f6316bc9a.png
   OK,目前jar包已经上传完成了,接下来在该目录中,新建DockerFile文件,内容如下:(我这里是当地新建DockerFile编辑好内容后上传到)   # jdk 是一个已有的包含 jdk 的镜像
FROM java
# 作者签名
MAINTAINER libigtong
# 简化 jar 的名字路径
COPY dockerDemo.jar /app.jar
# 执行 java -jar 命令 (CMD:在启动容器时才执行此行。RUN:构建镜像时就执行此行)
CMD java -jar /app.jar
# 设置对外端口为 8080
EXPOSE 8080
    然后将【DockerFile】文件上传到【dockerTest】目录中,结果如下:   https://img-blog.csdnimg.cn/cb006358770f4500ac0714ee11016cb3.png
6.3、生成镜像

   生成本工程的镜像:   docker build -t docker_test:docker_demo -f /opt/dockerTest/Dockerfile
/opt/dockerTest
    生成成功,然后使用【docker images】命令查看了全部的镜像,果然有docker这个镜像了   https://img-blog.csdnimg.cn/c0eb5d0e899140d0a4c42c8c6395f1ed.png6.4、启动镜像

docker run --name dockerApp -p 8080:8080 -d 28dae64bba9d
   从上面实行结果可以看出,镜像已经启动了   6.5、启动容器

docker start cc7c3a1582d0   查看正在运行的容器:   https://img-blog.csdnimg.cn/8b76d6db8c8f427d9f163870c8e2d912.png
6.6、运行结果查看

   上面我们将容器已经启动了,那么怎么看我们那个jar包的运行结果了?   现在我们只需要进入到容器中就可以了:   
   docker attach cc7c3a1582d0https://img-blog.csdnimg.cn/ed102e2b08a54419a2bcef2ffa0ce1a2.png
   阐明已经成功的运行jar包了   接下来我们关闭容器试试:   
   docker stop cc7c3a1582d0https://img-blog.csdnimg.cn/dea780c544c74f788785825c9c15b033.png

    别的一个不停做打印的窗口就立马制止打印了:   https://img-blog.csdnimg.cn/b8c8e6268eef4cdd8ed473296a1afedc.png
      测试成功,   jar   包可以正常的启动和制止了   
        觉得有用,点赞收藏支持一下,大家的支持是我写下去的动力呀 QAQ~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: docker从安装到部署项目,一篇文章教会你