SpringCloud微服务-Docker基本操作

Docker基本操作

文章目录

  • Docker基本操作
    • 1、镜像操作命令
      • 1.1、从DockerHub中拉取一个镜像并且查看
      • 1.2、镜像的导出和导入
    • 2、容器相关命令
      • 2.1、创建运行一个Nginx容器
      • 2.2、进入容器,并且修改容器中的文件
    • 3、数据卷
      • 3.1、操作数据卷命令
      • 3.2、案例实战-创建数据卷
      • 3.3、挂载数据卷-创建启动Nginx容器,将宿主机数据卷挂载到容器
      • 3.4、挂载目录-创建并运行MySQL容器,将宿主机目录挂载到容器
    • 4、Dockerfile自定义镜像
      • 4.1、镜像结构
      • 4.2、Dockerfile语法
      • 4.3、使用Dockerfile构建镜像,运行项目
        • 案例一:基于Ubuntu镜像构建一个新镜像,运行一个java项目
        • 案例二:基于java:8-alpine镜像,将一个Java项目构建为镜像

1、镜像操作命令

  • 镜像名称一般分两部分组成:[repository]:[tag]。

  • 在没有指定tag时,默认是latest,代表最新版本的镜像。

    Docker命令图解:

    image-20240229195652188

1.1、从DockerHub中拉取一个镜像并且查看

  1. 首先去镜像仓库搜索nginx镜像,比如DockerHub:

image-20240229195834100

  1. 根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx

image-20240229195931809

  1. 通过命令:docker images 查看拉取到的镜像

image-20240229200144589

1.2、镜像的导出和导入

  1. 利用docker xx --help命令查看docker save和docker load的语法

    image-20240229200344907

    命令:docker save -o nginx.tar nginx:latest

    image-20240229200908740

    之后就可以使用ll命令查看当前目录下生成名为nginx.tar的文件

  2. 使用docker tag创建新镜像mynginx1.0

  3. 使用docker save导出镜像到磁盘

常见的命令:

  • docker images:显示本地主机上的所有Docker镜像列表。

  • docker rmi:删除一个或多个本地主机上的Docker镜像。

  • docker pull:从Docker仓库中拉取一个Docker镜像到本地主机。

  • docker push:将本地主机上的Docker镜像推送到Docker仓库。

  • docker save:将一个或多个Docker镜像保存为一个tar归档文件。

  • docker load:从一个tar归档文件中加载一个或多个Docker镜像。

    真正开发的时候可以借助 --help命令来具体查看和学习各种命令的用法

2、容器相关命令

当在Linux中使用Docker时,以下是一些常用的Docker容器基本操作命令:

  1. docker run:创建并启动一个新的容器。
  2. docker start:启动一个已经存在的容器。
  3. docker stop:停止一个运行中的容器。
  4. docker restart:重启一个容器。
  5. docker pause:暂停一个容器的所有进程。
  6. docker unpause:恢复一个暂停的容器。
  7. docker rm:删除一个或多个容器。
  8. docker ps:列出当前正在运行的容器。
  9. docker ps -a:列出所有容器,包括停止的容器。
  10. docker exec:在运行中的容器中执行命令。
  11. docker logs:查看容器的日志输出。
  12. docker inspect:查看容器的详细信息。
  13. docker attach:附加到一个正在运行的容器中。
  14. docker cp:在容器和主机之间复制文件或目录。
  15. docker rename:重命名一个容器。

常见命令图解:

image-20240229202459803

2.1、创建运行一个Nginx容器

去docker hub查看Nginx的容器运行命令

image-20240229203810332

docker run --name some-nginx -d -p 8080:80 some-content-nginx

命令解读:

  • docker run :创建并运行一个容器
  • –name : 给容器起一个名字,比如叫做mn
  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
  • -d:后台运行容器
  • nginx:镜像名称,例如nginx

真实创建并运行:

docker run --name mn  -p 8080:80  -d nginx

image-20240229204303715

image-20240229204613107

2.2、进入容器,并且修改容器中的文件

以nginx为例:

  1. 进入容器。进入我们刚刚创建的nginx容器的命令为:

    docker exec -it mn bash 
    

    命令解读:

    • docker exec :进入容器内部,执行一个命令(但是不推荐在容器里面修改文件
    • -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互

    • mn :要进入的容器的名称

    • bash:进入容器后执行的命令,bash是一个linux终端交互命令

  2. 进入nginx的HTML所在目录 /usr/share/nginx/html

     cd /usr/share/nginx/html
    
  3. 修改index.html的内容(不能直接使用vi命令,因为镜像封装是只是封装了镜像必备的函数,而vi刚好没有封装)

    sed -i 's#Welcome to nginx#你好,Docker容器中的Nginx !#g' index.html 
    sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
    

    实质上只是对文件的内容进行替换。运行结果:

    在这里插入图片描述

  4. 可以使用exit命令来退出容器。

3、数据卷

问:数据卷解决了什么问题?

  1. 不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便。
  2. 数据不可复用:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的。
  3. 升级维护困难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了

答:容器与数据耦合的问题。

数据卷volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全.

3.1、操作数据卷命令

数据卷操作的基本语法如下:

语法:docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:(查看帮助文档)

image-20240229212237188

语法表格:

命令解释
create创建一个volume
inspect显示一个或多个volume的信息
ls列出所有的volume
prune删除未使用的volume
rm删除一个或多个指定的volume

3.2、案例实战-创建数据卷

  1. 创建数据卷
docker volume create html
  1. 查看所有数据
docker volume ls
  1. 查看数据卷详细信息卷
docker volume inspect html

image-20240229212907307

3.3、挂载数据卷-创建启动Nginx容器,将宿主机数据卷挂载到容器

我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录。

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

解释:

  • docker run :就是创建并运行容器

  • – name mn :给容器起个名字叫mn

  • -v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中

  • -p 8080:80 :把宿主机的8080端口映射到容器内的80端口

  • nginx :镜像名称

  • -d :表示后台运行

这样,我们就可以在挂载点的目录下找到我们访问Nginx首页的Index.html文件了,就可以使用vi编辑器或其他外部编辑器进行修改。

挂载并且启动容器再到访问全流程:(Nginx为例)

  1. 首先,需要创建html的数据卷(在3.2中已经实现);

  2. 使用-v命令添加在创建并且启动Docker容器的命令中(3.3中实现);

  3. 使用docker inspect html 查看数据卷的信息:

    image-20240301170214504

  4. 进入到挂载点进行修改里面的index.html内容;

  5. 在浏览器访问:

    image-20240301170323074

3.4、挂载目录-创建并运行MySQL容器,将宿主机目录挂载到容器

提示:目录挂载与数据卷挂载的语法是类似的:

  • -v [宿主机目录]:[容器内目录]

  • -v [宿主机文件]:[容器内文件]

  1. 在DockerHub中查找命令如下:

    docker pull mysql
    
  2. 创建目录/tmp/mysql/data

    image-20240301172710740

  3. 创建目录/tmp/mysql/conf,将配置文件hmy.cnf文件上传到/tmp/mysql/conf

    #配置文件内容(就是常见的配置,不用太在意,主要是测试)
    [mysqld]
    skip-name-resolve
    character_set_server=utf8
    datadir=/var/lib/mysql
    server-id=1000
    
  4. 去DockerHub查阅资料,创建并运行MySQL容器,要求:

    1. 挂载/tmp/mysql/data到mysql容器内数据存储目录

    2. 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件

    3. 设置MySQL密码

      “以下命令从DockerHub官网上查询得到”

    docker run \  
     --name mysql # 容器的名称
     -e MYSQL_ROOT_PASSWORD=toor \ #设置数据库密码
     -p 3306:3306 \ #数据库端口映射 
     -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ # 配置文件的挂载
     -v /tmp/mysql/data:/var/lib/mysql \  #数据(目录)文件挂载,记录所以Mysql的数据
     -d \ # 后台启动
     mysql:latest \
    
  5. 连接测试:image-20240301174951371

4、Dockerfile自定义镜像

4.1、镜像结构

  • 镜像是将应用程序及其需要的系统函数库环境配置依赖打包而成。

镜像是分层结构,每一层称为一个Layer

  • 基础镜像(BaseImage层):包含基本的系统函数库、环境变量、文件系统

  • Entrypoint:入口,是镜像中应用启动的命令

  • 其它( Layer 层):在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置

4.2、Dockerfile语法

什么是Dockerfile?

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

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

更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

4.3、使用Dockerfile构建镜像,运行项目

案例一:基于Ubuntu镜像构建一个新镜像,运行一个java项目

测试资料:百度网盘自取

步骤1:新建一个空文件夹docker-demo

步骤2:拷贝课前资料中的docker-demo.jar文件到docker-demo这个目录

步骤3:拷贝课前资料中的jdk8.tar.gz文件到docker-demo这个目录

步骤4:拷贝课前资料提供的Dockerfile到docker-demo这个目录

Dockerfile内容:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安装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 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

步骤5:进入docker-demo

image-20240302103906285

步骤6:运行命令:

docker build -t javaweb:1.0 .
# build :构建
# -t :tag ,后面接:[镜像名]:[版本(tag)]
# . :DockerFile 所在的目录

步骤七:启动镜像

docker run --name web -p 8090:8090 -d javaweb:1.0

步骤八:最后访问 http://192.168.12.131:8090/hello/count,其中的ip改成你的虚拟机ip

说明项目成功构建,并且成功将镜像部署在Docker容器下。

项目缺点:例如本例中,如果需要创建多个java项目的镜像,但是配置的Dockerfile文件中的操作,安装JDK等环境变量的配置是不必要的,就会导致代码和操作的冗余,当然解决方法如下一个案例所示。

案例二:基于java:8-alpine镜像,将一个Java项目构建为镜像

实现思路如下:

  1. 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile

  2. 拷贝课前资料提供的docker-demo.jar到这个目录中

  3. 编写Dockerfile文件:

    • 基于java:8-alpine作为基础镜像

    • 将app.jar拷贝到镜像中

    • 暴露端口

    • 编写入口ENTRYPOINT

    # 指定基础镜像
    FROM java:8-alpine
    # 如果报错,将上面的java:8改成openjdk:8
    
    # 暴露端口
    EXPOSE 8090
    # 入口,java项目的启动命令
    ENTRYPOINT java -jar /tmp/app.jar
    
  4. 使用docker build命令构建镜像

    docker build -t javaweb:2.0 .
    
  5. 使用docker run创建容器并运行

    docker run --name web -p 8090:8090 -d javaweb:2.0
    

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

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

相关文章

董兆祥出席工业废水资源化,开创变废为宝新途径演讲

演讲嘉宾&#xff1a;董兆祥 董事长 河北奥博水处理有限公司 演讲题目&#xff1a;工业废水资源化&#xff0c;开创变废为宝新途径 会议简介 “十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息化融合&#xff0c;明确“低碳经济”新的战略目标&#xff0c;热…

Vue+SpringBoot打造校园超市管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 供应商模块2.2 超市商品模块2.3 超市账单模块 三、系统设计3.1 前端架构设计3.2 后端架构设计 四、系统实现五、核心代码5.1 查询商品5.2 删除商品5.3 查询供应商5.4 查询账单5.5 新增账单 六、免责说明 一、摘要 1.1 …

UI自动化-(web端下拉选择框弹出框滚动条操作-实操入门)

1、下拉选择框操作 在 UI 自动化中,操作下拉选择框可以通过以下步骤进行: 定位下拉选择框元素:通过适当的元素定位方法,找到下拉选择框的元素。打开下拉框:例如通过点击(.click)来操作下拉框元素打开下拉框。选择选项:可以通过以下几种方式选择下拉框中的选项:根据索…

iOS卡顿原因与优化

iOS卡顿原因与优化 1. 卡顿简介 卡顿&#xff1a; 指用户在使用过程中出现了一段时间的阻塞&#xff0c;使得用户在这一段时间内无法进行操作&#xff0c;屏幕上的内容也没有任何的变化。 卡顿作为App的重要性能指标&#xff0c;不仅影响着用户体验&#xff0c;更关系到用户留…

基于springboot+vue的社区养老服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

STC8H的PWM输出的寄存器配置

STC8H的PWM分为两组&#xff0c;第一组PWMA可以实现互补输出。第二组PWMB只能实现单端输出。 PWMA&#xff08;1~4&#xff09;&#xff0c;PWMB&#xff08;5~8&#xff09; 预分频&#xff1a; 输出极性和使能 CCER1配置PWMA的1~2&#xff0c;PWMB的5~6捕获比较输出 CCER2配…

Python3零基础教程之变量数据专题

在Python语言中&#xff0c;变量是用来存储数据的标识符。Python是一种动态类型语言&#xff0c;这意味着你不需要声明变量的类型。类型会在运行时自动确定&#xff0c;这使得Python在变量操作上非常灵活和强大。 以下是关于Python中变量和数据类型的详细介绍思维导图&#xff…

1907_Arm Cortex-M3的基本了解

1907_Arm Cortex-M3的基本了解 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) 我发现Arm Coretex-M3有一个专门的DataSheet&#xff0c;看起来这个的确是被当做了一个设计的产品来对待的。正好&#xff0c;基于这个文件来看看M3具备哪些基本的特性&…

系统集成Prometheus+Grafana

根据产品需求在自己的系统中添加一个系统监控的页面&#xff0c;其中有主机信息的显示&#xff0c;也有一些业务信息的显示。调研后的方案是 主机信息通过Prometheus采集和存储&#xff0c;业务信息通过自己系统的调度任务统计后存储在Mysql中&#xff0c;使用Grafana对接Prome…

xsslabs第五关

看一下源码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff01…

UWB定位系统源码

自主研发的一套UWB定位系统源码&#xff0c;技术架构&#xff1a;java spring boot vue mysql单体服务 硬件&#xff08;UWB定位基站、卡牌&#xff09; UWB定义&#xff1a; UWB(Ultra Wideband)是一种无载波通信技术&#xff0c;利用纳秒至微秒级的非正弦波窄脉冲传输数据。…

ssm703学生考勤管理系统的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1课题背…

[SUCTF 2019]EasyWeb --不会编程的崽

个人认为&#xff0c;这题还算有些东西。先来看源码 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if(!empty…

网络协议栈和os的关系(网络协议栈和计算机体系结构图相结合),用户如何从网络获取数据+本质,简述网络通信的本质

目录 网络协议栈和os的关系 思考联系 实际 用户从网络获取数据的过程 本质 如何获取 -- 系统调用 图示 不同的os 网络通信的本质 两台主机通信流程 网络协议栈和os的关系 思考联系 网络协议栈涵盖了硬件和软件,而os正是管理软硬件资源的中枢 os是计算机体系结构的一…

Centos 7 用户密码忘记解决办法

Centos 7 修改用户密码 重置密码 1、开机进入GRUB界面&#xff0c;在引导程序菜单上进行选择开机后进入以下界面&#xff0c;然后按Esc或者E键编辑选项&#xff1a; 2.用上下箭头翻到最后&#xff0c;编辑修改两处&#xff1a;ro改为rw,在LANGen_US.UFT-8后面添加init/bin/sh…

CleanMyMac X4.16.4介绍及下载安装图文详细步骤教程

一、简介 近年来&#xff0c;随着电脑使用的广泛&#xff0c;我们也越来越依赖电脑来完成日常工作、学习和娱乐。然而&#xff0c;使用电脑长时间后&#xff0c;我们会发现电脑运行缓慢&#xff0c;存储空间不足等问题。这时候&#xff0c;清理电脑就变得非常必要。 CleanMyMac…

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2&#xff0c;将元素分为d1个组&#xff0c;每组相邻量取元素距离为d1&#xff0c;在各组内直接进行插入排序&#xff1b;取第二个整数d2 d1/2&#xff0c; 重复上述分组排序过程&#xff0…

本地快速部署谷歌开放模型Gemma教程(基于WasmEdge)

本地快速部署谷歌开放模型Gemma教程&#xff08;基于WasmEdge&#xff09; 一、介绍 Gemma二、部署 Gemma2.1 部署工具2.1 部署步骤 三、构建超轻量级 AI 代理四、总结 一、介绍 Gemma Gemma是一系列轻量级、最先进的开放式模型&#xff0c;采用与创建Gemini模型相同的研究和技…

用node或者vscode开启一个简单的本地server服务器,加载html网页

使用Live Server 想要加载本地html页面可以快速能让它在你本地浏览器中打开&#xff0c;可以有好多种方式&#xff0c;如果你有使用vscode&#xff0c;可以安装一个插件&#xff1a;Live Server&#xff0c;然后直接在vscode中直接右键就可以开启这个服务&#xff1a; 安装好之…

Redis持久化+Redis内存管理和优化+Redis三大缓存问题

Redis持久化Redis内存管理和优化Redis三大缓存问题一、Redis高可用二、Redis持久化1、RDB持久化1.1 触发条件(1) 手动触发(2) 自动触发(3) 其他自动触发机制 1.2 执行流程1.3 启动时加载 2、AOF持久化2.1 开启AOF2.2 执行流程(1) 命令追加(append)(2) 文件写入(write)和文件同步…
最新文章