Docker全家桶:从0到加载本地项目

news2024/9/28 4:32:11

安装docker,我们选择的是CentenOS 7。

目录

Docker安装

命令

命令别名

数据卷挂载

Dockerfile

容器网络互联


Docker安装

1. 先删除本机旧的或者残留的docker

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

2.安装依赖

sudo yum update -y && sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2

3.配置镜像源

到这一步需要注意了,以前使用的很多都是这个https://download.docker.com/linux/centos/docker-ce.repo,现在需要换成国内的,执行如下命令:

# 阿里源
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# or
# 清华源
yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

4.安装

yum install docker-ce docker-ce-cli containerd.io

5.验证docker

docker --version

6.启动并且设置开机自启动

systemctl start docker
systemctl enable --now docker

并且最好配置好镜像加速器,防止网络原因导致的加载缓慢。

{
  "registry-mirrors": [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
  ]
}

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。

类似于windows上的免安装软件,只需要有相关的文件就能够运行。并且修改了端口,可以直接再次运行一遍启动命令,同时开两个mysql。

docker配置完成了后,很方便的就能够把mysql安装好并且打开。

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

安装好mysql后,通过Navicat能够连接到这个位于我们云服务器上的数据库了。

命令

docker run命令中常见的参数:

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

  • docker run:创建并运行一个容器,-d是让容器在后台运行
  • --name mysql:给容器起名,名字唯一
  • -p 3306:3306 :设置端口映射
  • -e KEY=VALUE :设置环境变量
  • mysql:代表着镜像名称结构

常用命令:

  • docker官方维护了docker hub,镜像仓库。我们只需要通过 docker pull 命令就可以拉取到上面的所有仓库
  • 并且可以通过 docker push 命令上传本地的镜像
  • 除了镜像仓库,还可以用本地的文件,通过docker build来完成构建镜像
  • 本地镜像通过docker save 能够提取文件,方便转移
  • 别的文件通过 docker load 能够加载到本地镜像
  • docker images 列出本地的镜像
  • docker rmi 删除本地镜像
  • docker run 创建并且运行一个容器
  • docker stop 停止一个正在运行的容器
  • docker start 开始运行一个容器(但是不重新创建)
  • docker logs 获取容器的日志输出
  • docker exec 可以执行一些命令,来进入到容器的内部
  • docker ps 列出当前正在运行的容器
  • docker rm 删除一个或者多个容器

命令别名

很多时候,docker中原始的操作会比较复杂,我们可以通过设置这些命令的一些别名的方式来简化,以后用这些简化的别名就能够运行这些命令。

通过  vi ~/.bashhrc可以打开这个文件

数据卷挂载

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

以nginx为例,在容器内,如果要修改添加文件到conf目录和html目录下,是很麻烦的。我们通过数据卷挂载,把容器里面的目录映射到linux中真实的目录中,这样修改、添加文件就很方便快捷了。

此时,操作宿主机相关的目录就等于操作容器中的目录。

关于数据卷的命令:

在执行docker run命令时,使用    -v 数据卷:容器内目录    可以完成数据卷挂载

当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

也就是说,只有在创建容器的时候才能够挂载数据卷。

此时,容器就创建好了,数据卷也完成挂载。

本地目录挂载

使用  -v 数据卷:容器内目录  可以完成数据卷挂载。

通过  -v 本地目录:容器内目录 可以完成本地目录挂载。

本地目录必须以  ./   或者  /   开头,如果直接以 名称开头,会被识别为数据卷而非本地目录。

  • -v mysql:/var/lib/mysql 会被识别为一个数据卷叫做mysql
  • -v ./mysql:/var/lib/mysql  会被识别为当前目录下的mysql目录

为什么要用本地目录挂载而不是数据卷呢?大体上还是数据卷隐藏的比较深,不方便管理。并且本地目录挂载和docker没有关系,不会因为docker受到影响,性能很高。

假设我们有一个mysql容器,把数据都挂在到本地目录后,只需要把这些文件拷贝就能够万和城呢个数据库的迁移和复制,很方便。

Dockerfile

对于上述镜像,都是官网提供给我们,我们在docker hub里面自己拉取到。但是实际应用场景中,我们可能需要自己部署自己的java应用到镜像中。

部署一个Java应用的步骤:

  1. 准备一个Linux服务器
  2. Ja
  3. 安装JRE并配置环境变量
  4. 拷贝
  5. r包
  6. 运行Jar包

但是呢,Linux服务器还需要配置,JRE环境变量也需要重新配置。这样做还不如重新构建一个Java镜像:

  1. 准备一个Linux运行环境
  2. 安装JRE并配置环境变量
  3. 拷贝Jar包
  4. 编写运行脚本

并且docker镜像结构是一层一层(Layer)的,每次添加安装包、依赖、配置等等都会形成新的一层。如果在拉取docker hub上的镜像的时候,发现有一层或者几层,本地主机上已经有了,就不会下载已经有的重复的层了,而是会下载没有的层级。

FROM

说明:指定基础镜像。
示例:FROM centos:6
ENV

说明:设置环境变量,可在后续指令中使用。
示例:ENV key value
COPY

说明:将本地文件拷贝到镜像的指定目录。
示例:COPY ./jre11.tar.gz /tmp
RUN

说明:执行 Linux 的 shell 命令,通常是安装过程中的命令。
示例:RUN tar -zxvf /tmp/jre11.tar.gz && export PATH=/tmp/jre11:$PATH
EXPOSE

说明:指定容器运行时监听的端口,是给镜像使用者看的。
示例:EXPOSE 8080
ENTRYPOINT

说明:镜像中应用的启动命令,容器运行时调用。
示例:ENTRYPOINT java -jar xx.jar

这就是指定的一个ubuntu镜像的Dockerfile文件,Dockerfile 是一个文本文件,它包含了一系列的指令,这些指令用于指定如何构建一个 Docker 镜像。

# 指定基础镜像
FROM ubuntu:16.04

# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 拷贝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

# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]

但是我们需要的是一个java应用,很多java应用在jdk层面都是一样的,所以我们只需要在前几步用现成的就能够完成。

# 基础镜像
FROM openjdk:11.0-jre-buster

# 拷贝jar包
COPY docker-demo.jar /app.jar

# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

这个镜像帮我们把除了拷贝jar包之外的步骤都完成了。

当我们编写好了Dockerfile,用下面这个命令来构建镜像:

docker build -t myImage .
  • -t    这个选项用于给构建的镜像指定一个名称和标签(tag)。格式遵循 repository:tag 的格式。如果不指定标签,Docker 默认使用 latest 作为标签。

  •  .  这个点表示 Docker 应该在当前目录查找 Dockerfile 文件。如果 Dockerfile 位于当前执行命令的目录,就使用 . 作为参数。

加载自己项目的流程:

  1. 先把项目(docker-demo)、dockerfile和jdk.tar包导入linux中;
  2. 通过 docker load(本地镜像加载) 命令,加载jdk.tar包;
  3. 通过 docker build -t docker-demo(此处为自己取的名字) .
  4. 通过 docker run -d --name dd -p 端口号:端口号 docker-demo 命令,读取dockerfile文件,构建并且运行docker-demo

容器网络互联

默认情况下,宿主机内所有的容器都是通过bridge的方式连接在docker的一个虚拟网桥上的:

但是这种通过ip地址连接的方式并不是很好,如果被某个容器占用了,就需要重新分配并且解决冲突。更多情况下,会采用自定义网桥的方式,并且让需要的容器都加入到这个自定义网桥中。但是需要注意:如果容器加入了一个网桥后,是不能与处于另一个网桥的容器相互通信的,只有处在同一个网桥的情况下才能够进行容器间相互通信。

并且容器访问另一个容器用的可以是ip地址,也可以是容器名。不管ip地址怎么变化,容器名不变访问到的就是同一个容器。

并且容器默认构建的时候,会加入默认的bridge网桥。通过 --network  命令可以加入到其他网桥,这样的话就不会加入默认的bridge网桥了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android13 展锐平台拨号中视频彩铃界面方向未与设备方向一致

背景:拨号中视频彩铃界面方向未与设备方向一致,要求视频彩铃界面方向与设备方向一致,修改视频彩铃显示的地方; 如图所示: 修改: packages/services/Telecomm/src/com/android/server/telecom/VideoProvid…

【GUI设计】基于Matlab的图像特征提取GUI系统(9),matlab实现

博主简介:如需获取设计的完整源代码或者有matlab图像代码项目需求,可联系主页简介提供的方式或者文末的扫码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像特征提取GUI系统(9&a…

得物App荣获国家级奖项,正品保障引领潮流电商新风尚

近日,在2024年中国国际服务贸易交易会上,得物App凭借其在科技创新保障品质消费领域的突出成果,再次荣获国家级殊荣——“科技创新服务示范案例”。这是继上海市质量金奖之后,得物App获得的又一个“高含金量”奖项。 作为深受年轻人…

YOLOv8改进 - 注意力篇 - 引入(A2-Nets)Double Attention Networks注意力机制

一、本文介绍 作为入门性篇章,这里介绍了A2-Nets网络注意力在YOLOv8中的使用。包含A2-Nets原理分析,A2-Nets的代码、A2-Nets的使用方法、以及添加以后的yaml文件及运行记录。 二、A2-Nets原理分析 A2-Nets官方论文地址:A2-Nets文章 A2-Net…

美妆电商与AI知识库:构建智能化购物体验

在当今这个数字化时代,美妆电商行业正经历着前所未有的变革。随着人工智能(AI)技术的飞速发展,AI知识库在美妆电商领域的应用日益广泛,不仅重塑了传统的购物模式,还为消费者带来了前所未有的智能化购物体验…

手把手教你找到海外网红合作:海外红人营销渠道

在全球范围内,许多企业寻求与知名网红建立合作关系,以推广产品、共同创作内容或探索其他合作形式。以下是一些有效的方法来实现这一目标: 利用社交媒体平台:社交媒体是寻找海外网红的首选途径。平台如Instagram、YouTube和TikTok拥…

windows10使用bat脚本安装前后端环境之node环境设置

首先需要搞清楚node在本地是怎么安装配置、然后在根据如下步骤编写bat脚本: 思路 1.下载需要安装node版本zip格式包 2.配置环境变量 3.安装插件 可以根据自己需要来定义与配置(如下添加redis与node配置) bat脚本: echo off…

Node的安装和配置

1、安装Node 下载nodejs 链接:下载 | Node.js 中文网 官网下载最新版本:https://nodejs.org/en/download/ 一路点击Next,最后Finish。nodejs一般会下载在C盘里。 下载完成后,可以在cmd中查看安装的nodejs和npm版本,…

python单例和工厂模式

设计模式 设计模式是一种编程套路,可以极大的方便程序的开发 最常见、最经典的设计模式,就是学习的面向对象 除了面向对象之外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模式: 单例、工厂模式建造者…

2022年上真题(案例分析)

一、数据流图 1. E1:商户 E2:外卖平台 E3:用户 E4:支付系统 2. D1:商户用户信息表 D2:订单表 D3:餐品信息表 D4:评价表 3. 数据流名称 …

Linux设备驱动中的异步通知与异步I/O学习s

1、异步通知的概念和作用 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上”中断“的概念,比较准确的称谓是”信号驱动的异步I/O“。信号是在软件层次…

盘点2024年4款高效率的语音转文字工具。

语音转换文字软件真的是一种提高效率的神器,我在工作中常常因为手动记录太慢而选择录音。事后在形成记录,但效率比较低。自从知道有直接转换的工具之后,我有再多的录音都不怕了。如果大家也有跟我一样的工作时,可以试试使用这些语…

C++之STL—常用拷贝和替换算法

copy(iterator beg, iterator end, iterator dest); // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // dest 目标起始迭代器 replace(iterator beg, iterator end, oldvalue, newvalue); …

儿童手抄报模板-200个(家有神兽必备)

在这个充满色彩与想象的世界里,每一位小朋友都是一位小小艺术家和梦想家。作为家长或老师,我们总是希望能为他们的学习生活增添一抹亮色,激发他们的创造力与探索欲。今天,就为大家带来一份超级实用的资源——儿童手抄报模板-200个…

Spring:强制登陆与拦截器

1.只使用session验证 (1)第一步:用户登陆时存储session ApiOperation("用户登陆") PostMapping("/login") public AppResult login(HttpServletRequest request,RequestParam("username") ApiParam("用…

将上一篇的feign接口抽取到公共api模块(包含feign接口示例)

文章目录 一、准备二、主要工作三、建立dto类四、添加多个feign接口五、测试六、目录结构6.1 父工程service-demo6.2 order-service模块6.3 product-service模块6.4 sd-api模块 一、准备 将上一篇的目录结构改造一下: 修改包名使根路径分别为com.hdl.order和com.h…

微信支付:chooseWXPay:fail, the permission value is offline verifying

在开发公众号微信支付的时候,在微信开发者工具中使用 WeixinJSBridge 唤起 微信支付,页面上看到微信支付的loading一闪而过,但是没有出现微信支付的页面。控制台log显示错误信息:“chooseWXPay:fail, the permission value is off…

实验1 Python语言基础一

目录 实验1 Python语言基础一1、下载安装Python,贴出验证安装成功截图2、建立test.py文件,运行后贴出截图,思考if __name”__main__”的意思和作用3、分别运行下面两种代码,分析运行结果产生的原因。记牢python中重要语法“tab”的作用。6、编…

企业内训|大模型/智算行业发展机会深度剖析-某数据中心厂商

北京中嘉和信通信技术有限公司于8月29日举办了一场主题为“大模型/智算行业发展机会深度剖析”的企业内训。此次培训由TsingtaoAI公司负责人汶生主讲,针对当前大模型技术的发展现状、应用场景及未来趋势进行了全面分析和解读。 汶生老师在培训中深入剖析了大模型的…

京东商品详情API(item_get)性能优化策略:提升数据抓取效率

在电商领域,快速、准确地获取商品信息对于提升用户体验、优化库存管理和市场决策至关重要。京东商品详情API(item_get)作为京东开放平台提供的一项重要服务,允许开发者获取京东平台上商品的详细信息。然而,如何高效利用…