超详细Docker的安装以及Docker部署C++

news2025/4/5 3:01:21

系列文章目录

        这学期,学校开了一门云计算大数据课程,老师要求从OpenStack、Hadoop、Docker等软件进行部署一个框架。

        我去从中选择了一个Docker,来对这个作业进行实现。以下就是我对这次作业的实现过程以及注意事项,还有犯的错误总结。


文章目录

  • 系列文章目录
  • 前言
  • 目录

    系列文章目录

    前言

    一、Docker介绍

    1.1引言

    1.2Docker的由来

    1.3docker的思想

    集装箱:

    标准化:

    隔离性:

    图解演示

    二、Docker的基本操作

    2.1安装Docker

            #1.下载关于Docker的依赖环境    

            #2.设置一个下载Docker的镜像源

            #3.安装Docker

            #4.启动Docker,并设置为开机自动启动、测试               

    2.2Docker的中央仓库

    #1.Docker官方的中央仓库

    #2.国内的镜像网站

    #3.私服

    2.3镜像的操作   

    #1.拉取镜像到本地

    #2.查看全部本地镜像

    #3.删除本地镜像

    #4.镜像的导入导出(不规范)

    #5.修改镜像名称

    2.4容器的操作

    #1.运行容器

    #2.查看正在运行的容器

    #3.查看容器的日志

    #4.进入到容器内部

    #5.删除容器(删除容器前,需要先停止容器)

    #6.启动容器

    三、Dockerfile

    3.1dockerfile-镜像原理

    3.2dockerfile-容器转为镜像

            #1.容器转换为镜像

            #2.dockerfile(常用)

    3.3dockerfile-概述及关键字

           #1.dockfile概念

    四、Dockerfile-案例-自定义centos

    4.1案例:需求

    4.2案例:实现步骤

    五、Docker部署C++程序

    #1.镜像选择

    #2.下载镜像到宿主机

             #3.使用gcc镜像制作我们自己的镜像

  • 总结

前言


一、Docker介绍

1.1引言

以下时Docker可以解决的问题:

        1.我本地运行没问题啊。

                环境不一致

        2. 哪个哥们又写死循环了,怎么这么卡

                在多用户的操作系统下,会相互影响

        3.淘宝在双11的时候,用户量暴增。

                运维成本过高的问题

        4.学习一门技术,学习成本过高

                关于安装软件成本过高

1.2Docker的由来

        一帮年轻人创业,创办了一家公司,2010年的时候专门做PASS平台,到了2013年的时候,像亚马逊、微软、Google都开始做PASS平台。2013年,将公司内的核心技术对外开源,核心技术就是Docker。

        到了2014年的时候,得到了C轮的融资,$4000W。

        到了2015年的时候,得到了D轮的融资,$9500W。

自此,他们全身贯注的维护Docker。

所罗门(docker)主要作者之一:

1.3docker的思想

集装箱:

        会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了。

标准化:

        1.运输的表转化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接派大海豚搬运这个集装箱就可以了。

        2.命令的标准化:Docker提供了一系列的命令,帮助我们去获取集装箱等等操作。

        3.提供了REST的API:衍生除了很多的图形化界面,Rancher。

隔离性:

        Docker在运行集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。

注册中心。(超级码头,上面放的就是集装箱)

镜像。(集装箱)

容器。(运行起来的镜像)

图解演示

将我的环境打包的集装箱运输到公共仓库:

 

假如别人需要使用我的环境,也可以通过docker从公共仓库运输我的环境打包的集装箱到别人的环境里面:

二、Docker的基本操作

2.1安装Docker

        #1.下载关于Docker的依赖环境    

yum -y install yum-utils device-mapper-persistent-data lvm2

安装完成:

     

        #2.设置一个下载Docker的镜像源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

设置完成:

       

 #注意这一点,如果不配置,默认去国外下载(速度会很慢,因为服务器在国外)

        #3.安装Docker

yum makacache fast
yum -y install docker-ce

安装完成

        #4.启动Docker,并设置为开机自动启动、测试               

# 启动Docker服务
   systemctl start docker
# 设置开机自动启动
    systemctl enable docker

启动成功:

测试:

docker run hello-world

拉取镜像,并且运行镜像成为一个容器(如果以上步骤没错,证明你也安装成功docker了)。

2.2Docker的中央仓库


#1.Docker官方的中央仓库

        这个仓库是镜像最全的,但是下载速度比较慢。

        网址:hub.docker.com

#2.国内的镜像网站

        网易蜂巢、daoCloud.......

        网易蜂巢:c.163.com/hub (需要登录,不推荐使用)

        daoCloud:hub.daocloud.io

        

#3.私服

        在公司内部会采用私服的方式拉取镜像(添加配置)
       

# 需要在 /etc/docker/daemon.json
     {
        "resistry-mirros": "https://registry.docker-cn.com"],
        "insecure-registries": ["ip:prot"]
     }
# 重启两个服务
        systemctl daemon-reload
        systemctl restart docker

       

2.3镜像的操作   

#1.拉取镜像到本地

docker pull 镜像名称 [:tag]

# 例子:(需要联网)
docker pull daocloud.io/library/tomcat:8.5.15-jre8

#2.查看全部本地镜像

docker images

#3.删除本地镜像

docker rmi 镜像的标识

#4.镜像的导入导出(不规范)

# 将本地的镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件

#5.修改镜像名称

docker tag 镜像id 新镜像名称:版本

2.4容器的操作

#1.运行容器

#简单操作
docker run 镜像的标识|镜像名称[:tag]

#常用的参数
docker run -d -p 宿主机端口: 容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d:代表后台运行容器
# -p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
# --name 容器名称:指定容器的名称

#2.查看正在运行的容器

docker ps [-qa]
# -a:查看全部的容器,包括没有运行
# -q:只查看容器得到标识

#3.查看容器的日志

docker logs -f 容器id
# -f:可以滚动查看日志的最后几行

#4.进入到容器内部

docker exec -it 容器id bash

#5.删除容器(删除容器前,需要先停止容器)

# 停止指定的容器
docker stop 容器id

#停止全部容器
docker stop $(docker ps -qa)

#删除指定容器
docker rm 容器id

#删除全部容器
docker rm $(docker ps -qa)

#6.启动容器

docker start 容器id

三、Dockerfile
 

思考:

1.Docker镜像本质是什么?

        是一个分层文件系统

2.Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的ios文件要几个G?

        Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层

3.Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?

        由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小500多MB

3.1dockerfile-镜像原理

        Docker镜像是由特殊的文件系统叠加而成

        最底端是bootfs,并使用宿主机的bootfs

        第二层是root文件系统rootfs,称为base image

        然后再往上可以叠加其他的镜像文件

        统一文件系统(Union File System) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

        一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像可以成为基础镜像。

        当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

        

3.2dockerfile-容器转为镜像

Docker 镜像如何制作?

        #1.容器转换为镜像

 docker commit 容器id 镜像名称:版本号
 docker save -o 压缩文件名称 镜像名称:版本号
 docker load -i 压缩文件名称

        #2.dockerfile(常用)

3.3dockerfile-概述及关键字

#1.dockfile概念

        1.dockerfile是一个文本文件

        2.包含了一条条的指令

        3.每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像

        4.对于开发人员:可以为开发团队提供一个完全一致的开发环境

        5.对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件

           构建一个新的镜像开始工作了

        6.对于运维人员:在部署时,可以实现应用的无缝移植

四、Dockerfile-案例-自定义centos

4.1案例:需求

        自定义centos7镜像。要求:

                1.默认登录路径为/usr

                2.可以使用vim

FROM centor:8

MAINTAINER lihao <lihao@qq.com>

RUN yum install -y vim

WORKDIR /usr

cmd /bin/bash

4.2案例:实现步骤

        1.定义父镜像:FROM centos:8

        2.自定义作者信息:MAINTAINER itheima <itheima@itcast.cn>

        3.执行安装vim命令:RUN yum install -y vim

        4.定义容器启动执行的命令:CMD/bin/bash

# 创建目录,方便管理dockfile文件

mkdir docker-files

# 创建centor_dockerfile,写dockerfile:

vim centos_dockerfile

# 用了上面命令会打开,紧接着输入一下命令:

FROM centor:8

MAINAINER haoli <haoli@aq.com>

RUN yum install -y vim

WORKDIR /usr

cmd /bin/bash

最后进行Esc,按:wq退出

# 通过dockerfile构建镜像文件:

docker build -f ./centos_dockerfile -t haoli:1 .

安装完成:

 # 完成后可以使用命令查看镜像:

docker images

#最后跑这个镜像:

docker run -it --name=c2 haoli_centos:1

# 使用命令查看

vim a.txt

五、Docker部署C++程序

 摘要:如何使用docker部署c/c++程序_docker c++_Coldestmonth的博客-CSDN博客

        在我们用Docker部署C++程序之前,让我们先来回顾一下Docker的知识:

这里简要说一下docker中镜像和容器的关系: 

Images (镜像)

        Docker镜像是一个只读模板,包含创建Docker容器的说明。Docker镜像可以运行Docker镜像中的程序。 

Container (容器)
        容器是镜像的可运行实例。镜像与容器类似与面向对象中类与对象的关系。可通过Docker API或者CLI命令起停,移动,删除等。

        明白了docker中镜像和容器的关系之后,我们想要把程序执行起来,其实就是将程序放在镜像中,通过镜像启动一个容器,在容器中执行我们的程序。

        那么我们运行一个c/c++程序到底该选择怎么样的镜像呢?其实也很简单,我们只要知道我们的程序如果不使用docker他是在什么系统或者说是环境中使用,那么我们就可以通过docker官方的仓库去下载这样的镜像来供我们创建包含我们程序的镜像了。

        我们现在有这样的一段代码,功能就是给一个叫t.txt的文件中写hello world!!!。下面我们就通过这个简单的代码来示范如果把一个c/c++程序放到docker镜像中制作一个新的镜像

将下面代码写入txt.c文件中,方面后面执行:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


int main()
{
	FILE* file = fopen("t.txt","w+");
	if (file == NULL)
	{
		return 0;
	}

	char buf[20]="hello world!!!\n";
	int len = strlen(buf);

	while(1)
	{
		fputs(buf,file);
		fflush(file);
	//	printf("%s",buf);
		sleep(1);
	}

	fclose(file);

	return 0;
}

#1.镜像选择

        c/c++程序我们都是直接运行在linux系统上,所以我们可以直接选择centos或者ubuntu镜像,在这里我们是要把.c文件编译成一个可执行程序,docker还有一个gcc或者g++的镜像,使用gcc或者g++镜像的话,我们就不需要在ubunt或者centos镜像中再安装gcc 、g++了。

        这里我们采用Centos 8.2

推荐三种镜像:

  1. gcc 或者g++
  2. ubuntu
  3. centos

#2.下载镜像到宿主机

# 查看版本
docker search gcc

下面是执行结果:

然后现在进行安装镜像gcc:

# 下载镜像
docker pull pcc

安装好后,我们使用命令查看已经下载对的镜像

#3.使用gcc镜像制作我们自己的镜像

        这个上面我有详细的例子,这里就不过多介绍,忘了的同学,可以往上看一看,复习一下。

在这里我们通过Dockerfile的方式创建自己的镜像:

使用命令写Dockfile:

vim DockerFile

下面是Dockerfile的内容:

FROM gcc:latest

RUN  mkdir /usr/src/myapp

COPY test.c /usr/src/myapp

WORKDIR /usr/src/myapp

RUN  gcc test.c 

CMD ["./a.out"]

最后使用命令来构建一个镜像:

docker build  -f ./Dockerfile -t mytest .

-f 指定Dockerfile文件路径
-t 设置新的镜像名称以及版本(要是没指定版本,为最新版)

这时候,我们可以执行命令查看是否创建了该镜像

docker images

# 我们从下面的截图中,可以看到已经创建好了容器mytest

 镜像制作好了之后,我们运行容器,通过一下命令

docker run -d mytest

进入到容器之后我们执行top命令,查看a.out

 查看当前目录发现已经生成了t.txt文件说明,a.tou程序执行正常:


总结

本来想把私有仓库进行一并写了,发现一发不可收拾,写太多了。哈哈哈

如果喜欢请三连关注哦!!!

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

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

相关文章

牛客网Verilog刷题——VL27

牛客网Verilog刷题——VL27 题目答案 题目 请编写一个序列检测模块&#xff0c;检测输入信号&#xff08;a&#xff09;是否满足011100序列&#xff0c; 要求以每六个输入为一组&#xff0c;不检测重复序列&#xff0c;例如第一位数据不符合&#xff0c;则不考虑后五位。一直到…

【C++】反向迭代器的设计

前言 STL中不少的容器需要有迭代器这样的设计&#xff0c;特别是正向迭代器&#xff0c;几乎每个容器都有自己的特定实现方式&#xff0c;有了正向迭代器之后&#xff0c;我们还要提供反向迭代器以供一些特殊的需求&#xff0c;但是许多容器的正向迭代器实现的方式不一样&#…

华东师范大学副校长周傲英:未来,中国需要什么样的数据库?

本文为华东师范大学副校长&#xff0c;CCF 会士周傲英教授在第一届 OceanBase 开发者大会带来的分享。欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 3 月 25 日&#xff0c;第一届 OceanBase 开发者大会在北京举行&#xff0c;华东师范大学副校…

AI智能智能课程第四讲 -数据库领域专家

使用chatGPT让你成为数据库领域专家 作业 现在要测试电商的下单功能&#xff1a;测试员张三在公司的电商平台上下了几个单&#xff0c;现在需要验证&#xff1a;张三这个客户下单的所有订单信息&#xff0c;包含订单编号&#xff0c;商品名称&#xff0c;商品价格&#xff0c;…

什么是gpt4-如何用上gpt-4

gpt4主要强化了哪些功能 OpenAI尚未公布GPT-4的详细信息&#xff0c;不过可以根据OpenAI前CEO Sam Altman在2020年所发表的一篇博客中提到的&#xff0c;GPT-4可能会具有更强大和智能的能力&#xff0c;包括更准确的理解和表达自然语言、更高效的记忆和推理、更全面的知识和视…

thinkphp:数值(保留小数点后N位,四舍五入,左侧补零,格式化货币,取整,生成随机数,数字与字母进行转换)

一、保留小数点后N位/类似四舍五入&#xff08;以保留小数点后三位为准&#xff09; number_format()函数&#xff1a;第一个参数为要格式化的数字&#xff0c;第二个参数为保留的小数位数 方法一&#xff1a; public function test() {$num 12.56789; // 待格式化的数字$r…

Maven配置阿里云仓库

Maven简介&#xff1a; Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性&#x…

QMS-云质说质量 - 11 我和我的客户投诉(3) - 明枪易躲 暗箭难防

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 君子思义 小人贪利 金庸老先生在《笑傲江湖》中写道&#xff0c;“只要有人的地方就有恩怨&#xff0c;有恩怨就会有江湖&#xff0c;人就是江湖。”这句话映射到现实社会中&#xff0c;就是“社会险恶&#xff0c;人心叵测…

链表(JS实现、LeetCode例题)

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 链表链表的分类创建链表LinkedList类的骨架 实现链表的方法push尾部添加元…

『网络基础 一 』

目录 网络发展 认识 “协议” 网络协议初始 协议分层 OSI七层模型 TCP/IP五层&#xff08;或四层&#xff09;模型 网络传输基本流程 ​编辑 协议报头 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址 网络发展 独立设计&#xff1a;计算机之间的相互独立…

Flink系列-10、Flink DataStream的Transformation

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录 官网所有的…

探析Android中的四类性能优化

作者&#xff1a;Yj家的孺子牛 流畅性优化 主线程模型 了解 Android 的流畅性优化之前&#xff0c;我们需要先了解Android的线程结构。在 Android 中&#xff0c;有一个主线程模型&#xff0c;其中所有的绘制以及交互都是在主线程中进行的&#xff0c;所以&#xff0c;当我们…

【LaTex】Elsevier投稿系统到底何时整顿?‘expl3.sty‘ aborted!

前言 两年前&#xff0c;我在投稿Elsevier旗下的Knoeldeg-based systems时就被这个投稿系统整得是头昏脑胀&#xff0c;直接肝爆。首先&#xff0c;第一次提交手稿时可以接受PDF&#xff0c;很方便。然而&#xff0c;后面大修时提交可编辑的源文件时给我狠狠的打脸了。记得当时…

快速入门量化交易

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 原作者&#xff1a;袁霄|慕课网讲师 近来“量化交易”这个词听得越来越频繁&#xff0c;多数人对量化交易的第一印象是“高大上的技术”…

堆的原理解析

看这篇文章需要对比较器有一定的了解&#xff0c;可以看我的这篇文章&#xff1a; 认识比较器_鱼跃鹰飞的博客-CSDN博客 堆的实际存储方式是数组&#xff0c;但是脑海中应该把他想象成一种树的结构 依次加入下标0-8的9个数&#xff08;添加过程中会不断的和父节点大小进行比…

舰船交流电网绝缘监测及故障定位的研究及产品选型

摘要&#xff1a;交流电网和电气设备的绝缘状况直接影响舰船电力系统安全&#xff0c;其绝缘电阻的下降是一个不可避免的过程&#xff0c;成为了电网安全的严重隐患。电气设备绝缘材料的劣化过程是不可逆的&#xff0c;对舰船交流电网进行绝缘在线监测及快速定位绝缘故障支路&a…

浅谈:JVM垃圾回收

一、四种类加载器(双亲委托/全盘委托机制) 1.启动类加载器: 加载 Java 核心类库,无法被 Java 程序直接引用。 2.扩展类加载器: 加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。 3.系统类加载器: 它根据 Java 应用的类…

seleniumUI自动化登录失败案例重新尝试WhileTrue

一个用户每次登录失败&#xff0c;失败N次&#xff0c;无法进入下一url时&#xff0c;怎样会重新尝试N次重新登录呢 &#xff1f; 我们可以使用wihile true判断&#xff0c;并使用currenturl判断&#xff0c;下面就介绍以下个人的方法 currenturlEGTconfigFile.driver.curren…

Opencv识别车牌

Opencv识别车牌 #encoding:utf8 import cv2 import numpy as np Min_Area 50 #定位车牌 def color_position(img,output_path): colors [#([26,43,46], [34,255,255]), # 黄色 ([100,43,46], [124,255,255]), # 蓝色 ([35, 43, 46], [77, 255, 255]) # 绿色 ] hsv cv2.cvtCo…

推荐 7 个超牛的 Spring Cloud 实战项目

个 把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务&#xff0c;这就是微服务架构的架构概念&#xff0c;通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 关于微服务相关的学习资料不多&#xff0c;而 GitHub 上的开源项目可以作为你微服务之旅…