1-Docker-基础

本文内容多处参考黑马程序员的公开资料,仅用来个人梳理,原资料地址:https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec

Docker介绍

为什么要用Docker?

以Mysql安装为例,想要在Linux系统上安装Mysql,常规操作需要:

  • 查看已安装的mysql并卸载
  • 官网查找mysql的linux版本,并下载tar包,上传到服务器
  • 服务器上解压缩包,完成安装

步骤非常繁琐,且难以记忆。

随着项目的复杂,可能用到多台服务器,每个服务器的运行环境又不同,个人的安装流程、部署脚本又不一定适用,就会有各种问题。

为了简化这些流程,就有了Docker

Linux系统下Docker安装

以Linux CentOS 7系统为例

渠道地址备注
官方安装文档https://docs.docker.com/engine/install/centos/
黑马程序员教程安装文档https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d推荐
网络教程-Docker安装https://www.cnblogs.com/Liyuting/p/17022739.html
网络教程-配置镜像加速器https://blog.csdn.net/elong490/article/details/114627211

Docker快速入门:部署MySQL

安装

安装命令

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql

安装命令解读

**docker run -d:**创建并运行一个容器,-d参数表示后台运行

**--name mysql:**容器别名,可以是别的

**-p 3306:3306:**端口映射,宿主机端口:容器内端口

  • 容器是隔离环境,外界不可访问
  • 通过映射,将宿主机端口和容器内端口连接起来,访问宿主机指定端口时,就可以访问容器内的端口
  • 容器内端口由容器内的进程决定,MySQL默认端口是3306;宿主机端口可任意指定,不冲突即可,通常与容器内端口一致

**-e key:value:**配置容器内的一些参数,这是通用格式

  • TZ:指定时区
  • MYSQL_ROOT_PASSWORD:指定mysql密码

**mysql:**镜像的名字,Docker会根据这个名字搜索并下载,不可随意设置

  • 完整格式:镜像名字:版本
  • 该写法默认等同于:mysql:latest,即mysql镜像的最新版本

容器和镜像【概念】

上述安装命令不仅仅在CentOS系统是这样的,在其他系统中也是这样。

使用Docker可以达到这样效果的原因是:Docker自动搜索并下载的Mysql不是安装包,而是镜像

【镜像,image】:包含软件本身(这里是MySQL),还包含其运行所需要的环境、配置、系统级函数库。即镜像运行是有自己独立的环境,可以跨系统运行

【容器,container】:上述这一套独立运行的隔离环境

image-20240110105318978

镜像的来源有哪些?

  • 官方提供:https://hub.docker.com
  • 自己基于官方的基础镜像制作

Docker常见命令

官方命令大全:https://docs.docker.com/engine/reference/commandline/cli/

表格展示命令

命令说明文档地址
docker pull拉取镜像docker pull
docker push推送镜像到DockerRegistrydocker push
docker images查看本地镜像docker images
docker rmi删除本地镜像docker rmi
docker run创建并运行容器(不能重复创建)docker run
docker stop停止指定容器docker stop
docker start启动指定容器docker start
docker restart重新启动容器docker restart
docker rm删除指定容器docs.docker.com
docker ps查看正在运行的容器docker ps
docker logs查看容器运行日志docker logs
docker exec进入容器docker exec
docker save保存镜像到本地压缩文件docker save
docker load加载本地压缩文件到镜像docker load
docker inspect查看容器详细信息docker inspect

图示命令关联

image-20240110111033107

设置Docker开机自启动

# Docker开机自启
systemctl enable docker

# Docker容器开机自启
docker update --restart=always [容器名/容器id]

命令起别名

修改/root/.bashrc文件

[root@localhost ~]# vi /root/.bashrc

添加如下内容

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# === 新增内容
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
# === 

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

Docker数据卷

容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:

  • 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?

  • MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?

  • 我想要让Nginx代理我的静态资源怎么办?

因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。通过数据卷可以实现该功能

什么是数据卷?

**数据卷(volume)**是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

以nginx为例,他有两个关键目录:

  • html目录:放置静态资源
  • conf目录:放置配置文件

我们要用nginx,就需要操作这两个目录下的文件,但是这些文件放在容器内部,经试验可以知道,容器内没有vi编辑器,修改内容及其不方便。

所以要用数据卷,将宿主机目录和容器内目录连接起来,方便操作

image-20240110114028859

图示:

  • 创建两个数据卷:html、conf,分别关联容器内的两个目录:/etc/nginx/html/etc/nginx/conf
  • 同时数据卷指向宿主机的两个目录,这样宿主机和容器的目录就关联起来了,称为挂载

数据卷命令

常用命令

命令说明文档地址
docker volume create创建数据卷docker volume create
docker volume ls查看所有数据卷docs.docker.com
docker volume rm删除指定数据卷docs.docker.com
docker volume inspect查看某个数据卷的详情docs.docker.com
docker volume prune清除数据卷docker volume prune

容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建

默认数据卷所在目录:创建的数据卷,默认目录在:/var/lib/docker/volumes/数据卷名字/_data

示例:nginx指定数据卷安装

docker run -d \
	--name nginx \
	-p 80:80 \
	-v html:/usr/share/nginx/html \
	nginx

匿名卷

当创建容器的时候,未指定数据卷,就会创建一个匿名卷,卷名由一串hash值组成

挂载本地目录或文件

与数据卷的区别

可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。

在很多情况下,我们会直接将容器目录与宿主机指定目录挂载

# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件

注意:本地目录或文件,必须以/./开头,即以绝对路径或相对路径开头。若以名字开头,会被认为是数据卷名而非本地目录名

示例:MySQL的安装与本地目录挂载

DockerHub关于Mysql的镜像手册:https://hub.docker.com/_/mysql

安装要求:

  • 挂载数据存储目录:/var/lib/mysql
  • 挂载初始化SQL脚本目录:/docker-entrypoint-initdb.d
  • 挂载配置文件目录:/etc/mysql/conf.d

宿主机目录准备

  • 创建要挂载的目录:/root/mysql/conf/root/mysql/init
  • 放入对应文件

安装MySQL

# 1.删除原来的MySQL容器
docker rm -f mysql

# 2.进入root目录
cd ~

# 3.创建并运行新mysql容器,挂载本地目录
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  mysql

Docker自定义镜像

前面我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?

镜像结构

镜像搭建步骤

前面介绍了有关镜像的概念。自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。

从0部署一个java应用,大致流程如下

  • 准备Linux服务器
  • 安装并配置JDK
  • 上传jar包
  • 运行jar包

对应自定义镜像大概也是如下:

  • 准备Linux运行环境(非全部,仅基础运行环境即可)
  • 安装并配置JDK
  • 拷贝jar包
  • 配置启动脚本

“层”的概念

上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合

但镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer(层)

这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作

download_image

镜像结构文件:Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。

我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。

这种记录镜像结构的文件就称为Dockerfile,其官方文档:https://docs.docker.com/engine/reference/builder/

常用命令

指令说明示例
FROM指定基础镜像FROM centos:6
ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录,并改名COPY ./xx.jar /tmp/app.jar
RUN执行Linux的shell命令,一般是安装过程的命令RUN yum install gcc
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的,可以不是这个EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

Dockerfile文件

构建java镜像的DockerFile文件内容

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

上述制作过程中,针对不同的java项目,都要用到Linux环境、JDK环境,仅jar包不同,所以就可以把前两层封装为一个镜像,然后调用

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

镜像制作

准备好文件,放在同一个目录下:

  • Dockerfile文件
  • jar包

执行命令:

# 进入jar包、Dockerfile文件所在目录
cd /root/demo

# 开始构建
docker build -t docker-demo:1.0 .

镜像运行

docker run -d --name demo-java -p 8080:8080 docker-demo:1.0

访问

  • Linux虚拟机内访问:curl localhost:8080/hello/count
  • 虚拟机外访问:
    • 记得开放端口
    • Linux ip地址:8080/hello/count

Docker网络

什么是Docker网络?

一个java项目往往需要访问各种中间件,例如Redis、MySQL等,容器之间是可以相互访问的

# 1.用基本命令,寻找Networks.bridge.IPAdemo-javaress属性
docker inspect mysql

# 也可以使用format过滤结果,得到IP地址如下:172.17.0.2
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAdemo-javaress}}{{end}}' mysql

# 2.然后通过命令进入demo-java容器
docker exec -it demo-java bash

# 3.在容器内,通过ping命令测试网络,通顺
ping 172.17.0.2

但是这个ip是虚拟的,不固定。如果在开发时候写死ip,往往会导致部署的时候连接失败。

Docker网络就可以用来解决这个问题,通过建立一个Docker网络,将容器加载进来,就可以通过容器名字访问了

常见命令

命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docs.docker.com
docker network rm删除指定网络docs.docker.com
docker network prune清除未使用的网络docs.docker.com
docker network connect使指定容器连接加入某网络docs.docker.com
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect

自定义网络

命令创建一个网络

[root@localhost ~]# docker network create hmall

查看网络

[root@localhost ~]# docker network ls
# 结果
NETWORK ID     NAME      DRIVER    SCOPE
639bc44d0a87   bridge    bridge    local
403f16ec62a2   hmall     bridge    local
0dc0f72a0fbb   host      host      local
cd8d3e8df47b   none      null      local

让demo-java和mysql两个容器都加入该网络,可以起别名

docker network connect hmall mysql --alias db
docker network connect hmall demo-java

进入demo-java容器,尝试别名访问

[root@localhost ~]# docker exec -it demo-java bash
[root@localhost ~]# ping db
# 结果:通顺
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms

进入demo-java容器,尝试容器名访问

[root@localhost ~]# ping mysql
# 结果:通顺
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/325338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前任开发在代码里下毒了,支付下单居然没加幂等

分享是最有效的学习方式。 故事 又是一个风和日丽没好的一天,小猫戴着耳机,安逸地听着音乐,撸着代码,这种没有会议的日子真的是巴适得板。 不料祸从天降,组长火急火燎地跑过来找到了小猫。“快排查一下,目…

【Emgu CV教程】5.1、几何变换之平移

图像的几何变换对于图像处理来说,也是最基础的那一档次,包括平移、旋转、缩放、透视变换等等,也就是对图像整理形状的改变,用到的函数都比较简单,理解起来也很容易。但是为了凑字数,还是一个函数一个函数的…

类和对象特性

#include<iostream> #include<string> using namespace std; class peron{ public:peron(string person){cout << "peron调用构造函数" << endl;tperson person;}~peron(){cout << "peron调用析构函数" << endl;}//手…

22k+star炒鸡好用的开源的网盘神器FileBrowser Docker自建个人网盘神器教程

目录 简介 1.拉取镜像 2.创建并启动容器 2.1创建目录 2.2启初始化一个容器用于导出配置文件和数据库&#xff0c;只挂载数据目录 2.3先将数据库文件和配置文件复制出来 2.4停止容器并删除容器 2.5创建完整的容器 3.愉快地使用 3.1示例&#xff1a; 3.2图片预览 3.3json…

快速更改flutter已有项目的项目名称和id等

如果你使用了别人已有的仓库模板或者想更改现有项目的名称&#xff0c;是一件非常繁琐的工作&#xff0c;需要修改全平台的文件还是相当麻烦的&#xff0c;所以这里推荐一个小工具&#xff0c;可以帮助大家快速实现更改项目名称的目的&#xff0c;这个工具地址&#xff1a;rena…

YOLOv8改进 | 检测头篇 | 利用DBB重参数化模块魔改检测头实现暴力涨点 (支持检测、分割、关键点检测)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,本文给大家带来的二次创新机制是通过DiverseBranchBlock(DBB)模块来改进我们的检测头形成一个新的检测头Detect_DBB,其中DBB是一种重参数化模块,其训练时采用复杂结构,推理时…

Java Chassis 3技术解密:注册中心分区隔离

原文链接&#xff1a;Java Chassis 3技术解密&#xff1a;注册中心分区隔离-云社区-华为云 注册中心负责实例的注册和发现&#xff0c;对微服务可靠运行起到举足轻重的作用。实例变更感知周期是注册中心最重要的技术指标之一。感知周期代表提供者的实例注册或者下线后&#xf…

MVP的思维方式

MVP释义&#xff1a;做最小可行产品&#xff0c;做最有价值的人 首席产品官MVP社区 2023-09-04 08:53 北京 MVP&#xff0c;即“Minimum Viable Product”&#xff0c;中文翻译为“最小可行产品”&#xff0c;指的是在产品开发过程中&#xff0c;将资源集中在最核心的功能上&a…

Redis教程——Redis bitmap位图操作(图解)

在平时开发过程中&#xff0c;经常会有一些 bool 类型数据需要存取。比如记录用户一年内签到的次数&#xff0c;签了是 1&#xff0c;没签是 0。如果使用 key-value 来存储&#xff0c;那么每个用户都要记录 365 次&#xff0c;当用户成百上亿时&#xff0c;需要的存储空间将非…

帆软后台(外观配置-主题)文件上传漏洞

漏洞利用 帆软上传主题获取shell&#xff08;管理系统-外观配置&#xff09; 添加主题上传的压缩包中放入shell.jsp马 &#xff08;没有添加主题功能直接构造数据包&#xff09; POST /WebReport/ReportServer?opfr_attach&cmdah_upload&filenametest.zip&widt…

uniapp中,子组件给父页面传值(父组件)

前言 最近在做的一个小程序项目中&#xff0c;有一个身份切换的功能&#xff0c;点击切换按钮时&#xff0c;子组件向父组件传递身份信息&#xff0c;父页面依据这个身份信息对页面进行显示与隐藏。 具体实现 子组件中定义一个点击事件,在这里是identitySwitching()方法 &l…

Vue项目中如何解决跨域详解

文章目录 一、跨域是什么二、如何解决CORSProxy方案一方案二方案三 一、跨域是什么 跨域本质是浏览器基于同源策略的一种安全手段 同源策略&#xff08;Sameoriginpolicy&#xff09;&#xff0c;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能 所谓同源&#x…

如何学习three.js

如何学习three.js 前言1. 基础概念场景&#xff08;Scene&#xff09;&#xff1a; three.js中所有物体的容器。你可以把它想象成一个舞台&#xff0c;在这里添加物体、光源等。相机&#xff08;Camera&#xff09;&#xff1a; 决定了哪部分场景会被渲染。最常用的是透视相机&…

SecureCRT6中文版安装资源,一键安装

SecureCRT 6 是一款由 VanDyke Software 开发的终端仿真程序&#xff0c;它为用户提供了一个安全的远程访问工具&#xff0c;可以通过 SSH、Telnet、Rlogin 和串口等协议连接到远程服务器或设备。 它适用于各种操作系统&#xff0c;如 Windows、Mac 和 Linux。它提供了强大的功…

SELinux、SELinux运行模式、破解Linux系统密码、firewalld防火墙介绍、构建基本FTP服务、systemd管理服务、设置运行模式

1 路漫漫其修远兮&#xff0c;吾将上下而求索 2 DNS服务器 作用&#xff1a;负责域名解析的服务器&#xff0c;将域名解析为IP地址 /etc/resolv.conf:指定DNS服务器地址配置文件 3 常用的网络工具 ip命令&#xff08;Linux最基础的命令&#xff09; 1.查看IP地址 [rootserv…

C#,入门教程(19)——循环语句(for,while,foreach)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(18)——分支语句&#xff08;switch-case&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124039953 一、for循环 当老师进入教室&#xff0c;从门口开始分别按行、列点名&#xff0c;看看哪位翘课&…

【脑筋急转弯系列】乒乓球称重问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

EndNote登录一直显示The username/password specified is not valid

EndNote登录一直显示The username/password specified is not valid EndNote20今天想打开之前的share library的时候一直显示 ‘The Username/password specified is not valid’&#xff0c;查了很多解决方案&#xff0c;现在献上解决方案&#xff1a; 该密码然后重新登陆…

js 回文串

思路&#xff1a; 判断一个字符串是否为回文字符串的基本思路是比较字符串的正序和倒序是否相同。 两者相同&#xff0c;则该字符串是回文字符串&#xff0c;否则不是。 要实现这一思路&#xff0c;我们可以使用 JavaScript 字符串的一些方法。我是忽略了所有的空格和符号&…

超融合之道:亚信安慧AntDB 8.0版本引领数据库创新

在当今多变的数据应用场景中&#xff0c;AntDB作为行业领先的超融合流式实时数仓&#xff0c;秉承着“融合实时”的研发理念&#xff0c;全面应对企业日益复杂的数据处理需求。通过SQL接口访问多种执行引擎&#xff0c;AntDB在实现交易、分析等多重能力的“超融合”方面取得了显…