Docker--未完结

2023-09-15 23:06:50

一.Docker是干什么的

在没亲自使用过之前,再多的术语也仅仅是抽象,只有写的人或者使用过的人能看懂。
所以,作为新手来说,只要知道Docker是用于部署项目就够了,下面展示如何用Docker部署项目及Docker常用命令。

二、安装Docker

# 1、yum 包更新到最新 
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y 
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
#6 然后我们就可以启动docker了
systemctl start docker

关联知识点:Docker进程相关的命令

#1.启动docker服务
systemctl start docker
#2.停止docker服务
systemctl stop docker
#3.重启docker服务
systemctl restart docker
#4.查看docker服务状态
systemctl status docker
#5.设置开机启动docker服务
systemctl enable docker

三.用Docker部署应用

简单说就是先搜索镜像,然后再拉取(下载)镜像,最后再根据镜像创建容器。

1、部署MySQL

【1】搜索mysql镜像
docker search mysql
【2】拉取mysql镜像(这里拉取最新版)
docker pull mysql:latest
【3】创建容器
docker run --name mysql-server  -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306  -d mysql:latest

–name:容器的名字
-e 设置mysql密码,要记住你设置的密码
-p 3306:3306 将docker中的3306端口映射到宿主机的3306端口,外界要访问的就是3306端口
-d 根据什么镜像来创建的

【4】开始使用mysql
docker exec -it mysql-server bash
mysql -uroot -p

或者将两个命令合起来使用

docker exec -it mysql-server mysql -uroot -p

注:

(1)使用docker exec命令,可以在容器中启动一个新的进程,并且可以与该进程进行交互。(2)在Docker中,-it是两个选项的组合:-i-t
综合使用-it选项,可以在容器中运行交互式进程,并且通过终端与之进行交互,比如在终端中键入命令或者接收命令的输出。在上述命令中,docker exec -it mysql-server mysql -uroot -p打开了一个交互式的MySQL会话,可以使用MySQL的命令行工具与数据库进行交互。

【5】用datagrip连接mysql

除了常规的要设置腾讯云防火墙和linux的防火墙,连接时候还要将高级的选项除了useSSL要为false,allowPublicKeyRetrieval也要改为true。

2、部署redis

【1】搜索redis镜像
docker search redis
【2】拉取redis镜像
docker pull redis:5.0
【3】用该redis镜像创建容器运行
#从docker的6379端口映射到宿主机的6379端口,命名为c_redis
docker run -id --name=c_redis -p 6379:6379 redis:5.0

四.镜像和容器

1.概念

可以看到有两个非常重要的概念:镜像和容器。

【1】Docker 镜像可以看作是一个应用程序运行所需的所有文件和依赖项的打包版本。类比于照片,Docker 镜像就像是一张静态的照片,记录了应用程序的全部内容和状态。可以通过构建  Dockerfile 文件来创建镜像,也可以向 Docker Hub 等镜像仓库下载别人构建好的镜像。我们上面就是拉取别人的镜像。


【2】Docker 容器则是根据镜像创建的运行实例,其主要作用是隔离不同的应用程序或应用程序的不同版本,以便它们不会相互干扰。类比于卡通里的小木屋,Docker 容器就像是一个动态的小木屋,可以在其中运行应用程序并与外部系统交互。

为什么要隔离呢?比如有两个写好了两个springboot程序,一个运行在java8的环境,一个运行在java17的环境,那样的话如果没有docker或者虚拟机,那么两个程序肯定要有一个不能运行。
其他软件之间也可能会发生这种问题,不同的app所需的依赖会冲突,导致部分程序不能运行,这不是我们想看到的。

而Docker容器都有自己的文件系统和网络接口,(可以看成是类似于虚拟机)和其他容器以及宿主机完全隔离。

从logo我们可以看到,如果docker是那只鲸鱼,那么容器就是上面的集装箱。

2.相关命令

接下来介绍镜像和容器相关的命令:

与镜像相关:

#查看本地所有的镜像
docker images
##查看所用镜像的id
docker images -q
#搜索镜像:从网络中查找需要的镜像
docker search 镜像名称
#拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号
#如果版本号不指定则是最新的版本,如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。
docker pull 镜像名称
#删除镜像:删除本地镜像
docker rmi 镜像id #删除指定本地镜像
docker rmi 'docker images -q' #删除所有本地镜像

与容器相关:

#查看容器
docker ps   #查看正在运行的容器
docker ps -a        #查看所有容器
#创建容器
docker run 参数
#进入容器,退出容器不会关闭
docker exec 参数
#停止容器
docker stop 容器名称/id
#启动容器
docker start 容器名称/id
#删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除
docker rm 容器名称/id
#查看容器信息,如网络信息等
docker inspect 容器名称

docker run的参数说明:
-i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器后,退出容器后,容器自动关闭。
-t:为容器重新分配一个伪输入终端,通常与-i同时使用。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器。退出后,容器不会关闭。
-name:为创建容器命名。

4.Dockerfile

【1】Dockerfile概念

Dockerfile是一个文本文件,包含了一条条指令,包含了一条条指令,每一条指令构建一层,属于基础镜像,最终构建出一个新的镜像。

可以统一开发测试运维的环境,为整个团队提供一个完全一致的开发环境,实现应用的无缝移植。

【2】案例:用dockerfile部署springboot容器

(1)idea中用maven的package命令打包,如果之前打包过可能要用clear命令一下。

(2)用ssh工具,例如finalshell上传到服务器(我是root目录下创建个docker-files文件夹来存储)

(3)在这个文件夹下创建springboot_dockerfile文件,编写dockerfile--不用记,重点知道关键字是什么意思

FROM java:17
MAINTAINER flyingpig <1839976096@qq.com>
ADD uuAttendance-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 9090
WORKDIR /app
CMD java -jar app.jar > /app/hello.log

然后就编辑完毕,退出先cd到刚刚创建的root/docker-files

cd /root/docker-files

使用编写好的dockerfile构建镜像:

docker build -f ./springboot_dockerfile -t app .

各个步骤的解释【自己根据实际情况进行修改】:

#指定父镜像,指定dockerfile基于那个image构建
FROM java:17
#定义作者信息,用来标明这个dockerfile谁写的 
MAINTAINER flyingpig <1839976096@qq.com>
#将jar包添加到镜像中(生成镜像)
#其中uuAttendance-0.0.1-SNAPSHOT.jar是原来jar包的名称,app.jar是添加到容器后的jar包
ADD uuAttendance-0.0.1-SNAPSHOT.jar app.jar
#指定容器内部的工作目录 如果没有创建则自动创建,
#这里自己定义,就知道在哪里,不用用find指定去寻找hello.log日志
WORKDIR /app
#定义容器启动执行的命令
CMD java -jar /app/hello.log




通过dockerfile构建镜像:docker bulid -f dockerfile的文件路径 -t 镜像名称:版本
不写版本表示最新版
docker build -f ./springboot_dockerfile -t app .

(4)然后就能运行镜像了(但是会遇到问题,看下面)

 docker run --name uuAttendance app:latest

【3】遇到的问题

然后你运行你的springboot项目,如果说你的项目没调用到数据库,那么一点问题都没有。如果说你有用到mysql数据库,那么的话程序就无法正常运行,打开日志,发现报错:

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

接下去我们讲讲docker的网络问题。这是不是顺其自然的学习下面这个知识点了,O(∩_∩)O哈哈~。

五.Docker网络--Docker如何处理容器的网络访问

【1】会出现上面问题的具体原理这里不讲,想了解的话去看狂神的视频:
34、Docker0网络详解_哔哩哔哩_bilibili

【2】然后讲讲怎么解决上述的问题:
最简单的解决方法就是在每次docker run的时候添加--net=host,直接用host作为网络。
如果这样写的话端口映射就可以删了,没用。

例如:

docker run --name mysql-server --net=host -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
docker run -id --net=host --name=c_redis redis:5.0
 docker run --name uuAttendance --net=host app:latest

’这样就可以实现不同容器之间使用host网络,从而可以直接使用localhost访问。

【3】但是这样并不推荐,更好的方法是建立一个网络

1.运行以下命令来创建一个自定义网络:

#创建一个网络命名为my_network
docker network create my_network

2.创建网络后,你可以在启动容器时将其连接到该网络。例如:

docker run -id --net=my_network --name=c_redis -p 6379:6379 redis:5.0

在这个网络中的容器就可以相互连接啦。

六.服务编排

更多推荐

第九天:QT入门保姆教程(常用的控件,信号与槽,定时器 QTimer,样式表 Qt Style Sheets,sqlite3数据库,开发板串口)

QT的简介我另外分享了一个qt案例源码包,里面包括文章中的任务源码和一系列常用案例需要的点击此处下载官网www.qt.ioQT是一个基于C++的跨平台的应用程序开发框架跨平台:一次编写,到处编译主流的平台都支持,如:Windows,Linux,Android,MacOS...应用程序:主要用于GUI程序开发,也可以用于

RT-Thread(学习)

RT-Thread是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。经过16个年头的沉淀,伴随着物联网的兴起,它正演变成一个功能强大、组件丰富的物联网操作系统。RT-Thread概述RT-Thread,全称是RealTime-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,

2023年最全详解:什么是销售管理?销售管理必备百科指南!

销售管理是什么?怎么样进行销售管理?都有哪些销售管理类型?销售管理都有哪些职责?如何高效的进行销售管理?本篇,我们将带大家深入浅出的了解销售管理,并且通过crm客户管理系统将销售管理的作用发挥到最大化!一、什么是销售管理?销售管理是现代企业不可或缺的重要部分。它涵盖了企业销售过程中的所有活动,包括市场营销、销售策略、销

企业商标信息API:品牌管理的秘密武器

引言当今数字时代,品牌管理变得比以往任何时候都更具挑战性。企业需要不断创新、保护知识产权、实时监测市场动态以及应对竞争压力。在这个竞争激烈的环境中,企业商标信息API已经成为品牌管理的秘密武器,为企业提供了无可估量的价值。企业商标信息API的作用企业商标信息API是一种应用程序接口,它允许企业访问商标数据库中的关键数据

生产制造业厂家固定资产怎么管理

固定资产的管理对于企业的运营效率和盈利能力具有重要影响。然而,传统的固定资产管理方法往往存在许多问题,如资产的低效使用、维护成本高昂以及决策者对资产价值缺乏准确了解等。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因此,我们需要采用一种全新的方式来管理我们的固定资产。本

MySQL常见面试题(一)

😀前言在数据库管理系统中,存储引擎起着核心的角色,它决定了数据管理和存储的方式。MySQL作为一个领先的开源关系型数据库管理系统,提供了多种存储引擎来满足不同的需求和优化不同的应用。除了选择合适的存储引擎,数据库的设计还涉及到范式设计和表设计,这两者都对数据库的性能和数据一致性有深远的影响。在本文中,我们将探讨MyS

清易低功耗智能雨量监测站概述

一、低功耗智能雨量监测站概述产品概述低功耗智能雨量监测站基于智能传感、无线通信、智能处理与智能控制等物联网技术的开发,利用智能传感技术,通过传感器测量降雨量,并使用物联网进行传输。无需专门的通信线路,在联网的状态下,数据可快速、主动的上报到云平台,用户可在电脑或手机,随时随地浏览数据。二、技术参数测量参数降雨量◇测量范

Faunadb

Faunadb和googlespanner都属于云分布式数据库天然支持分片(无需做分表分库操作,一库搞定,当然价格另说),国内的也有比如TiDBOceanbase等本文使用java语言,其他语言可以跳过;有想直接使用的可以参考(无法访问外网,可以搞个vpn吧!!!,有时会遇到网络问题):GitHub-fauna/fau

WebGIS开发教程:Cesium里面的Entity和primitive有什么区别

EntityEntity是Cesium中最重要的概念之⼀,它通常用于描述具有坐标位置的实际对象,例如⻜机、汽⻋、楼房、⼈物等。每个Entity实例都有不同的属性,例如位置、姿态、缩放、颜⾊、贴图等,并且可以通过编程⽅式创建、修改、删除。Entity的优点是⾮常灵活和易于使用。由于Entity是更⾼层次的概念,因此它可以

Vue中如何进行跨域处理

Vue中的跨域请求处理:解决前端开发中的常见问题跨域请求是前端开发中常见的问题之一。Vue.js是一款流行的前端框架,如何在Vue中处理跨域请求是每个Vue开发者都需要了解的重要课题。本文将深入探讨什么是跨域请求,为什么它会出现,以及如何在Vue中处理跨域请求,包括使用代理、JSONP、CORS等方法。什么是跨域请求?

开源网安入选广东省网络空间安全标准化技术委员会新技术及应用安全技术工作组成员单位

近日,第二届广东省网络空间安全标准化技术委员会(GD/TC124)(以下简称省网安标委)正式成立。为进一步发挥省网安标委在支撑网络强国建设、推进网络安全产业高质量发展过程中,示范引领核心技术攻关、创新产品研发、行业应用推广的重要作用,由省网安标委秘书处拟牵头组建数据安全技术工作组、网络安全技术工作组、新技术及应用安全技

热文推荐