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

安装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.mfbz.cn/a/884012.html

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

相关文章

Python实战:爬取网页图片

文章目录 一、实战概述二、图片网站三、爬取图片1、编写程序,实现功能2、运行程序,查看结果 四、实战小结 一、实战概述 在本实战项目中,我们编写了一个Python程序,用于从指定的图片网站(https://pic.netbian.com/4kf…

低代码平台推荐与对比,国内外哪家更胜一筹?

低代码开发通过图形界面简化开发,提升速度与协作,降低成本。国内外平台如ZohoCreator、OutSystems等各具特色,支持快速开发、集成与数据安全。企业可试用后按需选择,降低决策成本。 一、低代码是什么? 低代码开发是一…

EasyExcel将数据库里面的数据生成excel文件

EasyExcel官方文档 1.在model模块导入依赖 <!-- 生成报表--> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> </dependency> 2.修饰实体类 package…

【JAVA报错已解决】 Java.lang.ArrayIndexOutOfBoundsException

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

养猫久了才发现,宠物空气净化器才是真正除猫毛的神器

相信每个打工人都在期待这个国庆小长假吧&#xff0c;终于等到了&#xff01;这次我要把属于我的都夺回来&#xff01;刚好工资到手、小长假我有&#xff0c;只想往家里一躺什么也不想&#xff0c;唯一最想做的就是要在这个节假日里好好的陪一下我家猫咪&#xff0c;还有就是买…

数据结构:链表算法题

目录 题1.删除链表中的某个元素val题目表述&#xff1a;思路1:在源链表中进行删除更改思路2:创建一个新链表 题2:反转一个链表问题描述&#xff1a;思路1:在源链表内部进行操作思路2:创建一个新链表 题3:寻找链表中间位置题目描述:思路1:思路2:快慢指针 题1.删除链表中的某个元…

QT 获取视频帧Opencv获取清晰度

先展示结果&#xff1a; 1.获取摄像头的分辨率 mResSize.clear();mResSize camera_->supportedViewfinderResolutions();ui->comboBox_resulation->clear();int i0;foreach (QSize msize, mResSize) {qDebug()<<msize;ui->comboBox_resulation->addItem(…

【CSS|第2期】探索HTML与CSS中的文档流:从自然流到高级布局技巧

日期&#xff1a;2024年9月9日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉在这里插入代码片得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对…

深度学习(三)——Springer特刊推荐

特刊征稿 01 期刊名称&#xff1a; MOBILE NETWORKS & APPLICATIONS 特刊名称&#xff1a;Resource Efficient Deep Learning for Computer Vision Applications 截止时间&#xff1a; 开放提交&#xff1a;2023年12月13日 提交截止日期&#xff1a;2024年10月30日 目标…

CANopen开源库canfestival的移植

本文记录将CANopen开源库CANfestival移植到GD32F470单片机的过程。CANopen协议理解请参考博客&#xff1a;CANopen协议的理解-CSDN博客 CANfestival开源库下载链接 CSDN链接&#xff1a; https://download.csdn.net/download/heqiunong/89774627 官网链接&#xff1a;https:/…

无人便利店无人超市云值守收银系统源码

随着人力成本越来越高&#xff0c;很多门店越来想做无人值守模式&#xff0c;尤其是晚上休息时间等想让云值守客服来看店。自然要求收银系统需要可以在【有收银员值守】和【无收银员值守】两种模式灵活切换。 1. 有收银员值守模式 白天有收银员在店&#xff0c;收银员可以协助…

OJ在线评测系统 代码沙箱优化模版方法模式 使用与有规范的流程 并且执行流程可以复用

代码沙箱优化模版方法模式 上次我们代码沙箱的docker实现和原生实现 我们可以使用模版方法设计模式去优化我们的代码 我们原生的java实现代码沙箱和docker实现代码沙箱是有更多重复点的 比如说把文件 收集文件 进行校验 我们要用模版方法设计模式 定义一套通用的执行流程 让…

MySQL 之索引详解

想象一下&#xff0c;你正在图书馆寻找一本关于 MySQL 索引的书。图书馆里有成千上万本书&#xff0c;但没有目录。你只能一排一排、一本一本地找&#xff0c;直到找到你想要的书。这将会花费大量的时间&#xff01;数据库索引就像图书馆的目录一样&#xff0c;可以帮助数据库系…

raylib实现生产者消费者模型增加缓冲提高帧率

原来增加了四叉树导致帧率下降 后来学了生产者消费者模型&#xff0c;尝试追加缓冲池&#xff0c;剥离主函数查找需要更新的数据 帧率上升稳定到60帧 多了10 帧 中间工程主要是探索数据结构体怎么安排 // 参考自 https://zhuanlan.zhihu.com/p/693482704 #include <stdio.…

Linux之我不会

一、常用命令 1.系统管理 1.1 systemctl start | stop | restart | status 服务名 案例实操 1 查看防火墙状态 systemctl status firewalld2 停止防火墙服务 systemctl stop firewalld3 启动防火墙服务 systemctl start firewalld4 重启防火墙服务 systemctl restart f…

Type-C接口相关知识:【总结大全】

Type-c现在非常通用了&#xff0c;所以了解Type-c也变得十分有必要了&#xff0c;还是秉承了解就要了解清楚的原则&#xff0c;我们深入的看看Type-c接口。 Type-c主要是取代上一代Micro usb接口&#xff0c;那么Type-c有什么优点呢&#xff1f; 正反可插&#xff0c;使用时不…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer&#xff0c;是一种实时…

Xcode报错:The request was denied by service delegate (SBMainWorkspace)

Xcode报错&#xff1a;The request was denied by service delegate (SBMainWorkspace) 造成的原因: &#xff08;1&#xff09;新的M2芯片的Mac电脑 (2) 此电脑首次安装启动Xcode的应用程序 (3&#xff09;此电脑未安装Rosetta 解决方法: &#xff08;1&#xff09;打开终端…

传奇GEE引擎版本如何封挂?GEE引擎设置简单的封挂脚本教程

网关参数设置gee引擎封挂脚本 1、打开M2-选项-参数设置-游戏速度 把所有的设置限速关闭 2、打开M2-选项-客户端设置-内挂控制-速度控制&#xff1a;移动速度 攻击速度 魔法速度 设置好参数&#xff0c;一旦设置不要修改 否则封挂网关参数需重新设置 打开M2-选项-功能设置-…

计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…