前端开发Docker了解

1,docker简介

docker主要解决了最初软件开发环境配置的困难,完善了虚拟机部署的资源占用多,启动慢等缺点,保证了一致的运行环境,可以更轻松的维护和扩展。docker在linux容器的基础上进行了进一步的封装,提供更简单易用的接口

把自己的应用放入容器,应用在docker的虚拟容器里运行,就像在真实的物理机上运行一样,容器还可以进行版本管理、复制、分享、修改等,像管理普通的代码一样简单

2,docker三大核心与生命周期

镜像(Image)

docker镜像一个特殊的文件系统。主要作用是提供容器运行时需要的程序、库、资源、配置参数等。

docker镜像的最大特征是分层存储(即它并不是由一个文件组成,而是由多层文件联合组成)

镜像分为基础镜像(各大厂商提供的,例如ubuntu、node镜像等)和个人镜像(由个人开发者构建上传)。

容器(Container)

容器是基于镜像创建的镜像和容器类似于js中的类和对象(镜像是静态定义,容器是镜像运行时的实体)。

容器既然是基于镜像创建的,那么容器也是分层存储的。每一个容器都是以一个镜像为基础层,在其上创建一个当前容器的存储层,即容器存储层。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失因此容器不应该向其存储层内写入任何数据

容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository)

docker仓库是集中存放镜像的地址。类似于npm包和npm仓库的关系。可以将本地的容器发布到一个镜像仓库中,给其他服务器使用。

每个镜像仓库可以包含多个不同版本的标签(Tag);每个标签对应一个镜像。

我们从镜像仓库中获取镜像是通过<仓库名>:<标签> 来指定版本的镜像(eg:ubuntu18.04)

3,使用镜像

3.1 常用命令

  • 镜像搜索 - docker search 名称

        描述:从dockerHub搜索镜像( 在docker Hub上有大量的镜像可以使用,类似于npm仓库)

  • 拉取镜像 - docker pull [选项] [registry地址[:端口号]/]仓库名[:标签]默地址为docker.io

        描述:从dockerHub上拉取镜像使用

        示例:docker pull ubuntu:18.04

                   docker pull docker.io/library/node:18-alpine

  • 列出镜像 - docker image ls [ 名称筛选 ](可以在ls后面加上名称进行筛选)

        描述:列出本机所有镜像

  • 删除本地镜像 - docker image [选项] rm <镜像ID/长ID/名称/描述> [<镜像2>......]

        描述:可以通过镜像的ID、长ID、名称等进行定位并删除镜像,也可以批量删除镜像

3.2 构建镜像

理解:我们除了可以使用官方镜像,还构建自己的镜像,通常都是在其他的镜像基础上进行构建,例如node、nginx等。

可以到官网理解镜像的构成原理,然后发现构建镜像其实是通过一条条指令构建出来的。因此构建镜像可以新建一个Dockerfile文件来编写指令完成。

构建流程:

1,创建Dockerfile文件:

mkdir mynginx #创建一个目录
cd mynginx/ #进入新建的目录跟文件夹
touch Dockerfile #创建文件

2,Dockerfile文件内容:

FROM nginx
RUN echo '<h1>Hello, This is My Nginx</h1>' > /usr/share/nginx/html/index.html

  指令说明:

  FROM:基于哪个基础镜像进行定制

  RUN:执行命令行的命令(注意:每一个RUN都会新建一层然后执行命令,因此一个Dockerfile文件尽量使用一次RUN指令

3,构建镜像:

docker build [选项] <上下文路径/URL/->

docker build -t mynginx:v3 .

  描述:最后的点即为上下文路径。

  注意:这个上下文路径并不是Dockerfile所在的路径,而是Dockerfile中指令工作的目录。(例如Dockerfile文件中经常能见到拷贝代码到镜像中“COPY ./package.json /app/”这种命令,他复制的是上下文路径下的package.json文件)

3.3 Dockfile常用指令

  • COPY [--chown=<user>:<group>] <源路径>... <目标路径> - 复制目录
  • ADD [--chown=<user>:<group>] <源路径>... <目标路径> - 更高级的复制目录(源路径是可以是URL和压缩包)

 源路径是URL,ADD会自动下载文件到目标目录;如果源路径是压缩文件,则复制并解压缩

  • CMD <命令> 或者 CMD ["可执行文件", "参数1", "参数2"...] - 容器启动
  • ENTRYPOINT:这个指令用法与CMD一样。

 区别是,当一个文件指定了ENTRYPOINT,则CMD的含义就会发生变化,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令

 应用场景:例如在启动前需要启动一些其他文件

  • ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... - 设置环境变量
  • VOLUME ["<路径1>", "<路径2>"...] - 定义匿名卷
  • EXPOSE <端口1> [<端口2>...] - 声明容器运行时提供的端口
  • WORKDIR <工作目录路径> - 改变后面命令的工作目录(目录没有则创建)
  • USER <用户名>[:<用户组>] - 改变后面命令的用户,影响后面RUN命令(必须是已有的用户)
  • ONBUILD<其他指令> - 特殊指令,放到其他指令之前。后面跟的指令在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
  • LABEL <key>=<value> <key>=<value>... ... - 给镜像以键值对的形式添加一些元数据
  • SHELL ["executable", "parameters"] - 指定RUN、ENTRYPOINT、CMD指令的shell(Linux 中默认为 ["/bin/sh", "-c"]

示例

#基础镜像
FROM alpine:3.4

#复制目录
COPY --chown=55:mygroup files* /mydir/

#复制压缩包并解压
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /mydir/

#运行指定的文件命令
ENTRYPOINT ["docker-entrypoint.sh"]

#定义匿名卷到/data目录
VOLUME /data

#声明端口6379
EXPOSE 6379

#切换用户root
USER root

#切换工作目录/app
WORKDIR /app

#设置环境变量
ENV NODE_VERSION 7.2.0
ENV VERSION=1.0 DEBUG=on

#下一级镜像构建时复制package.json到app目录,同事执行npm install
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]

#添加元数据
LABEL APP_CON app-config

#指定shell命令并运行shell一行指令
SHELL ["/bin/sh", "-c"]
RUN lll; ls

#启动命令
CMD [ "npm", "start" ]
CMD [ "redis-server" ]

4,操作容器

4.1 查看容器

  • 查看正在运行的容器 - docker ps
  • 查看所有容器 - docker ps -a

4.2 启动容器

4.2.1 新建一个容器并启动

docker run [选项] 镜像名称 [命令] [参数...]

选项列表:

  • -d:容器守护态运行(即容器在后台运行
  • -t:为容器分配一个伪输入终端,通常与-i同时使用(退出终端使用exit命令或者ctrl+d
  • -i:以交互模式运行容器(就是允许用户交互),通常与-t同时使用
  • --name:为容器指定一个名称(默认是随机名称)
  • -P:随机端口映射
  • -p:指定端口映射
  • -e:设置环境变量
  • --rm:退出容器后删除该容器
  • ... ...

命令常用

  • /bin/bash:启动容器后立即执行的命令

示例

#启动ubuntu容器,并立即关闭
docker run ubuntu:18.04 /bin/bash

#启动ubuntu容器,并输出Hello world,然后终止容器
docker run ubuntu:18.04 /bin/echo 'Hello world'

#启动ubuntu容器,并允许用户进行交互
docker run -it ubuntu:18.04

#启动ubuntu容器,并且在后台一直运行
docker run -d ubuntu

4.2.2 启动停止状态的容器

docker [ container ] start 容器ID/名称

4.3.3 重启容器

docker [ container ]  restart 容器ID/名称

4.3 终止容器

docker [ container ]  stop 容器ID/名称

对于不会终止的容器,需要使用:docker [ container ]  kill 容器ID/名称

Tips(终止容器后的确定操作)

(1)运行docker ps,确定该容器不在查询结果列表中

(2)运行docker ps a,确定该容器可以查询到,并且STATUS值为Exited

示例

$ docker ps -a
CONTAINER ID  IMAGE         COMMAND      CREATED      STATUS               
af3e13b5d2r3  ubuntu:18.04  "/bin/bash"  1 hours ago  Exited (0) 2 minutes ago

4.4 进入容器

说明:由于在使用 -d 参数时,容器启动后会进入后台,因此某些时候需要进入容器进行操作。

方式:

(1)docker exec [选项] 容器ID/名称 [命令] 建议使用。因为从这个容器退出,容器不会停止

(2)docker attach - 不建议使用。因为从这个容器中退出,会导致容器停止

说明

  • 如果选项参数只用了 -i ,则因为没有分配伪终端,界面没有我们熟悉的Linux命令提示符,但是执行命令仍然可以看到运行结果。
  • 如果用了-i和-t,才能看到我们常见的Linux命令提示符(通常搭配-i和-t一起使用

示例

$ docker ps -a
CONTAINER ID  IMAGE         COMMAND      CREATED      STATUS               
af3e13b5d2r3  ubuntu:18.04  "/bin/bash"  18 hours ago  Up 17 seconds

#进入容器,只使用参数-i
$ docker exec -i af3e13b5d2r3 bash
ls
bin
boot
dev
etc
home
lib
pwd
/

#进入容器,同时使用参数-i和-t
$ docker exec -it af3e13b5d2r3 bash
root@af3e13b5d2r3:/# exit

4.5 查看容器日志

docker logs [选项] 容器ID/名称

选项列表

  • -f 实时跟踪日志输出
  • -t : 给日志加上时间戳显示
  • --tail :仅列出最新N条容器日志
  • --since :显示某个开始时间的所有日志

示例

# 查看后台运行的日志
docker logs af3e13b5d2r

# 实时监控(类似tail -f)
docker logs -f af3e13b5d2r

# 获取最后10行
docker logs --tail 10 af3e13b5d2r

# 实时查看最近的日志
docker logs --tail 0 -f af3e13b5d2r

# 加上时间戳
docker logs -t af3e13b5d2r

4.6 删除容器

删除一个终止状态的容器:docker [ container ]  rm 容器ID/名称

删除一个运行状态的容器(加一个-f参数):docker [ container ]  rm -f 容器ID/名称

4.7 容器的数据管理

因容器中是随用随删,并不会保存数据记录。因此对于容器中使用mysql这种需要数据持久化的,则需要容器的数据管理。有数据卷挂载主机目录两种方式。

数据卷:是一个可以提供一个或者多个容器使用的特殊目录,他提供了很多有用的特性。

创建数据卷:docker volumn create

列出所有数据卷:docker volumn ls

挂载主机目录:挂载到本地的一个绝对路径下,需要注意的是挂载的目录下有程序运行需要的文件,例如nginx容器在本地目录/home/nginx下要有index.html文件。

示例:$ docker run -d -P --name web --mount source=/home/nginx,target=/usr/share/nginx/html nginx

5,访问仓库

访问docker官方维护的公共仓库,可以先在https://hub.docker.com免费注册一个 Docker 账号,然后通过docker login登录命令,docker logout退出命令,并通过docker search来查找镜像。

6,更多

更详细的API与教程可参考:

前言 - Docker — 从入门到实践icon-default.png?t=N7T8https://yeasy.gitbook.io/docker_practice/

通过docker完整的部署一个vue工程,可参考:

[手把手系列之]Docker 部署 vue 项目 - 掘金Docker 作为轻量级虚拟化技术,拥有持续集成、版本控制、可移植性、隔离性和安全性等优势。本文使用Docker来部署一个vue的前端应用,并尽可能详尽的介绍了实现思路和具体步骤,以方便有类似需要的同学参考。 /api/json 接口 404,当然此时这个接口还不存在,暂时写到…icon-default.png?t=N7T8https://juejin.cn/post/6844903837774397447

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

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

相关文章

模板 BIEE(三)如何直接查看表示层列获取的sql语句

举例 想查看如下数据 SELECT 0 s_0, “Financials - AR Overview”.“Facts - AR Turnover”.“Days Sales Outstanding” s_1 FROM “Financials - AR Overview” web查看结果 日志内容如何查看请见《模板 BIEE&#xff08;二&#xff09;》 如下是不勾选高速缓存的结果&am…

研发日记,Matlab/Simulink避坑指南(一)——Data Store Memory模块执行时序Bug

文章目录 背景 问题 排查 解决 总结 背景 在一个嵌入式软件项目中&#xff0c;客户要求高度可控的时序流&#xff0c;我使用一个全局工步&#xff0c;对整个软件进行控制调度。由于子任务比较多&#xff0c;分门别类放在几个嵌套的子系统中&#xff0c;不能使用Goto模块引…

Python 面向对象之单例模式

【一】单例模式概念 单例模式是一种设计模式&#xff0c;其核心思想是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。单例模式通常用于管理共享的资源&#xff0c;例如配置信息、数据库连接、线程池等。关键点在于如何判断这个类是否已经实例化 通过模块导入&…

机器人制作开源方案 | 乒乓球自动拾取机器人

作者&#xff1a;刘众森、王森、王绘东、崔岳震、宋维鑫 单位&#xff1a;山东农业工程学院 指导老师&#xff1a;潘莹月、廖希杰 1. 场景调研 我们小组选择项目的任务方向乒乓球的捡取与存放&#xff0c;针对此问题我们研发了一款乒乓球自动拾取机器人。众所周知&#xff0…

[算法与数据结构][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量&#xff08;单例中会使用&#xff09;3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

查看Linux磁盘空间

(1)、该命令会列出当前系统所有挂载的文件系统以及它们的使用情况&#xff0c;包括总容量、已用空间、可用空间、使用百分比等信息 df -h如果查看某一个文件夹的,可以 df -h folderName (2)、计算指定目录下所有文件和子目录所占用的磁盘空间大小&#xff0c;并以人类可读的格…

自动化创建ETX用户帐号

在芯片设计行业&#xff0c;ETX是常见的远程访问环境。用户在通过ETX访问远程环境前必须首先加入ETX系统&#xff0c;然后通过profile分配相关的环境的访问权限。 通常这些操作在ETX WEB页面手工操作&#xff0c;如果我们期望实现用户帐号注册全自动化&#xff0c;就需要将以上…

Deepin操作系统SSH开启与配置文件修改,结合内网穿透实现公网远程连接

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

基于Vue组合式API的实用工具集

简介 今天,给大家分享一个很实用的工具库 VueUse,它是基于 Vue Composition Api,也就是组合式API。支持在Vue2和Vue3项目中进行使用,据说是目前世界上Star最高的同类型库之一。 图片 官方地址:https://vueuse.org/ 中文地址:https://www.vueusejs.com/ github:https…

SD-WAN对企业网络升级的价值

在当今数字化飞速发展的时代&#xff0c;企业对网络的依赖越来越深&#xff0c;如何在确保IT正常运行的同时降低成本成为企业CIO和业务经理共同关注的焦点。SD-WAN的出现为企业组网带来了崭新的可能性&#xff0c;成为降低开支、提高效率和改善用户体验的重要工具。 企业在数字…

代码随想录-刷题第五十三天

1143. 最长公共子序列 题目链接&#xff1a;1143. 最长公共子序列 思路&#xff1a;动态规划五步曲&#xff1a; dp[i][j]&#xff1a;长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列的长度为dp[i][j]。 递推公式&#xff1a; 主要是两种情…

Java学习,一文掌握Java之SpringBoot框架学习文集(6)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

C语言可变参数输入

本博文源于笔者正在学习的可变参数输入&#xff0c;可变参数是c语言函数中的一部分&#xff0c;下面本文就以一个很小的demo演示可变参数的编写 问题来源 想要用可变参数进行多个整数相加 方法源码 #include<stdio.h> #include<stdlib.h> #include<stdarg.h…

10个提高 Python Web 开发效率的VS Code插件

VS Code具有灵活、便捷和丰富的可用插件库&#xff0c;是Web开发人员中非常受欢迎的代码编辑器。 本文介绍10个VS Code插件&#xff0c;它们可以提高你作为Web开发人员的工作效率。 1. Live Preview Live Preview插件支持在VS Code的小型浏览器中查看网站。因此&#xff0c;无…

【NI-DAQmx入门】LabVIEW中DAQmx同步

1.同步解释 1.1 同步基础概念 触发器&#xff1a;触发器是控制采集的命令。您可以使用触发器来启动、停止或暂停采集。触发信号可以源自软件或硬件源。 时钟&#xff1a;时钟是用于对数据采集计时的周期性数字信号。根据具体情况&#xff0c;您可以使用时钟信号直接控制数据采…

百度面经整理(2024最新)

百度 面经1 shiro的组件分布式一致性算法zookeeper那些能参与投票&#xff0c;leader能投票吗&#xff1f;netty零拷贝实现volatile&#xff0c;如何感知到变量变化的redis高可用http如何跨域&#xff1f;tcp如何长链接。http如何操作浏览器缓存。用过消息队列吗&#xff1f;…

vue前端开发自学demo-input标签数据双向绑定

vue前端开发自学demo-input标签数据双向绑定&#xff01;今天为大家 展示的内容是&#xff0c;前端开发常见的&#xff0c;form表单里面的&#xff0c;一些输入数据的元素&#xff0c;动态绑定数据的案例。比如input,以及checkbox的状态绑定案例。 首先&#xff0c;老规矩&…

Unity WebView 中文输入支持

使用版本&#xff1a;Vuplex 3D WebView for Windows v4.4&#xff1b; 测试环境&#xff1a;unity editor 2020.3.40f1c1、Windows&#xff1b; 1、打开脚本CanvasWebVie!wPrefab 2、找到_initCanvasPrefab方法&#xff0c;约略在459行附近 3、添加一行代码&#xff1a; …

大创项目推荐 深度学习手势检测与识别算法 - opencv python

文章目录 0 前言1 实现效果2 技术原理2.1 手部检测2.1.1 基于肤色空间的手势检测方法2.1.2 基于运动的手势检测方法2.1.3 基于边缘的手势检测方法2.1.4 基于模板的手势检测方法2.1.5 基于机器学习的手势检测方法 3 手部识别3.1 SSD网络3.2 数据集3.3 最终改进的网络结构 4 最后…

设计模式-策略模式+单例模式+工厂模式 减少 if else

目录 一. 需求一. 区分entity二. 接口三. 邮件发送类四. 邮件发送的聚合工厂类五. 模拟邮件发送 一. 需求 根据前台传入的code&#xff0c;后台发送不同平台的邮件&#xff0c;发送QQ邮件&#xff0c;163邮件&#xff0c;Gmail邮件等。 一. 区分entity public class MailKbn…