当前位置: 首页 > news >正文

Windows Docker笔记-在容器中运行项目

在文章《Windows Docker笔记-Docker容器操作》中,已经成功创建了容器,也就是建好了工厂,接下来就应该要安装流水线设备,即运行项目达到生产的目的。

在Ubuntu容器中新建项目

这里要新建一个简单的C++项目,步骤如下:

1. 安装g++编译环境,

    1. 使用 docker start myUbuntu:启动myUbuntu容器
    1. 使用 docker ps -a:查看容器运行状态
    1. 使用 docker exec -it myUbuntu /bin/bash:进入容器终端
    1. 使用 apt-get update:更新软件包索引
    1. 使用 apt-get install g++:安装g++软件包
    1. 使用 g++ --version:查看安装的g++版本
D:\本周未完成工作\docker>docker start myUbuntu
myUbuntuD:\本周未完成工作\docker>docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED        STATUS         PORTS     NAMES
da3b54c08bd5   ubuntu:latest   "/bin/bash"   18 hours ago   Up 3 seconds             myUbuntuD:\本周未完成工作\docker>docker exec -it myUbuntu /bin/bash
root@da3b54c08bd5:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
>>>>>>>>>>>>>[此处省略部分过程代码]<<<<<<<<<<<<<<
Fetched 28.1 MB in 19s (1487 kB/s)
Reading package lists... Done
root@da3b54c08bd5:/# apt-get install g++
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
>>>>>>>>>>>>>[此处省略部分过程代码]<<<<<<<<<<<<<<
The following NEW packages will be upgraded:g++ g++-13 g++-13-x86-64-linux-gnu g++-x86-64-linux-gnu gcc libstdc++-13-dev
0 upgraded, 6 newly installed, 0 to remove and 12 not upgraded.
Need to get 14.6 MB of archives.
After this operation, 56.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
>>>>>>>>>>>>>[此处省略部分过程代码]<<<<<<<<<<<<<<
Setting up gcc (4:13.2.0-7ubuntu1) ...
Setting up libstdc++-13-dev:amd64 (13.3.0-6ubuntu2~24.04) ...
Setting up g++-13-x86-64-linux-gnu (13.3.0-6ubuntu2~24.04) ...
Setting up g++-x86-64-linux-gnu (4:13.2.0-7ubuntu1) ...
Setting up g++-13 (13.3.0-6ubuntu2~24.04) ...
Setting up g++ (4:13.2.0-7ubuntu1) ...
update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/c++.1.gz because associated file /usr/share/man/man1/g++.1.gz (of link group c++) doesn't exist
root@da3b54c08bd5:/# g++ --version
g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.root@da3b54c08bd5:/#

到这里 g++ 编译环境就安装好了。

2. 安装vim

vim用来编辑代码文件使用。

root@da3b54c08bd5:/# apt-get install vim
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
>>>>>>>>>>>>>[此处省略部分过程代码]<<<<<<<<<<<<<<
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vim (vim) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vimdiff (vimdiff) in auto mode
Processing triggers for libc-bin (2.39-0ubuntu8.4) ...
root@da3b54c08bd5:/#vim --version
VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Jan 16 2025 20:13:18)
Included patches: 1-16, 647, 678, 697
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
>>>>>>>>>>>>>[此处省略部分过程代码]<<<<<<<<<<<<<<

到这里 vim 编辑工具就安装好了。

3. 新建项目

这里的项目,直接使用文章《CMake项目中神器:CMakeLists.txt》中的第一个项目代码,如下图所示。

#include <iostream>int Func_Add(int num1, int num2)
{int nSum = num1 + num2;return nSum;
}int main()
{int numSum = Func_Add(2, 3);std::cout << "2 + 3 = " << numSum << std::endl;return 0;
}

步骤如下:

    1. 在/home/目录下新建test目录
    1. 在test目录中使用vim main.cpp:新建main.cpp文件
    1. 将上述代码编辑到main.cpp中
    1. 保存并退出文件
root@da3b54c08bd5:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@da3b54c08bd5:/# cd /home/
root@da3b54c08bd5:/home# ls
ubuntu
root@da3b54c08bd5:/home# mkdir test
root@da3b54c08bd5:/home# cd test/
root@da3b54c08bd5:/home/test# vim main.cpp
root@da3b54c08bd5:/home/test# cat main.cpp
#include <iostream>int Func_Add(int num1, int num2)
{int nSum = num1 + num2;return nSum;
}int main()
{int numSum = Func_Add(2, 3);std::cout << "2 + 3 = " << numSum << std::endl;return 0;
}
root@da3b54c08bd5:/home/test#

4. 编译项目并运行

    1. 使用g++命令编译项目文件
    1. 使用./可执行文件名 运行文件
root@da3b54c08bd5:/home/test# g++ -o main main.cpp
root@da3b54c08bd5:/home/test# ls
main  main.cpp
root@da3b54c08bd5:/home/test# ./main
2 + 3 = 5
root@da3b54c08bd5:/home/test#

代码此时已经正常运行了。运行的程序就相当于流水线设备,运行结果,就相当于到生产的玩具。

上述项目只是一个简单的例子,你可以把这个Ubuntu的容器当成一个Linux的开发环境来使用,在里面编译你实际的项目代码,然后运行。比使用虚拟机要好很多。非常的Nice

使用外部现有程序放到容器中运行

类比一下,上面的容器中新建项目运行相当于,工厂自己生产流水线设备,自给自足。另外一种情况是直接购买流水线设备,安装到工厂后直接运行。这种就相当于,将外部已经编译好的程序放到容器中运行一样。显然,docker也提供了这种方法,方便运维,这样容器就只提供运行环境就好,就不用提供编译开发环境,轻量了很多。

注意:以下操作需要先使用 e x i t 命令退出容器,在容器外部操作。 \color{red}{注意:以下操作需要先使用exit命令退出容器,在容器外部操作。} 注意:以下操作需要先使用exit命令退出容器,在容器外部操作。

这里文件演示,需要将上述生成的可执行文件 main 先保存到本地磁盘,然后删除到容器中的项目,在将本地可执行文件 main 导入容器中运行。

1. docker cp 命令说明

命令:docker cp 是 Docker 的一个命令,用于在容器和主机之间复制文件或文件夹。它类似于 Linux 的 cp 命令,但专门用于操作 Docker 容器中的文件。
格式:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

  • CONTAINER:SRC_PATH:容器内的源文件路径。
  • DEST_PATH:主机上的目标路径。
  • SRC_PATH:主机上的源文件路径。
  • CONTAINER:DEST_PATH:容器内的目标路径。

常见用法

  1. 从容器复制文件到主机
    将容器中的文件复制到主机的指定路径:
    命令:docker cp <container_id>:/path/to/source/file /path/to/destination/on/host
    案例:docker cp my_container:/app/config.txt /home/user/config_backup.txt
  2. 从主机复制文件到容器
    将主机上的文件复制到容器的指定路径:
    命令:docker cp /path/to/source/file <container_id>:/path/to/destination/in/container
    案例:docker cp /home/user/new_config.txt my_container:/app/config.txt

1. 将编译好的可执行文件 main 保存到本地磁盘中

命令:docker cp myUbuntu:/home/test/main ./ # ./表示本地当前目录

root@da3b54c08bd5:/home/test# exit
exitD:\本周未完成工作\docker>docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED        STATUS       PORTS     NAMES
da3b54c08bd5   ubuntu:latest   "/bin/bash"   20 hours ago   Up 2 hours             myUbuntuD:\本周未完成工作\docker>docker cp myUbuntu:/home/test/main ./
Successfully copied 18.4kB to D:\本周未完成工作\docker\.\D:\本周未完成工作\docker>dir驱动器 D 中的卷是 Data卷的序列号是 F6F0-A014D:\本周未完成工作\docker 的目录2025/02/07  15:39    <DIR>          .
2025/02/07  15:39    <DIR>          ..
2025/02/07  10:54            16,584 main
2025/01/20  17:34        75,203,584 ubuntu.tar2 个文件     75,220,168 字节2 个目录 382,717,251,584 可用字节D:\本周未完成工作\docker>

上述,退出容器后,使用docker cp 将容器中的main可执行文件保存到了本地目录:D:\本周未完成工作\docker 下面。

2. 清理容器中的项目相关文件

D:\本周未完成工作\docker>docker exec -it myUbuntu /bin/bash
root@da3b54c08bd5:/# cd /home/test/
root@da3b54c08bd5:/home/test# rm -rf *
root@da3b54c08bd5:/home/test# ls
root@da3b54c08bd5:/home/test#

3. 将本地编译好的可执行文件 main 导入容器中运行

命令:docker cp ./main myUbuntu:/home/test/

root@da3b54c08bd5:/home/test# exit
exitD:\本周未完成工作\docker>docker cp ./main myUbuntu:/home/test/
Successfully copied 18.4kB to myUbuntu:/home/test/D:\本周未完成工作\docker>docker exec -it myUbuntu /bin/bash
root@da3b54c08bd5:/# cd /home/test/
root@da3b54c08bd5:/home/test# ls
main
root@da3b54c08bd5:/home/test# ./main
2 + 3 = 5
root@da3b54c08bd5:/home/test#

可以看到,容器中有了运行环境,直接使用外部导入的程序,就可以运行了。

如果,项目较大,需要的以来很多,可以导入程序后,运行调试,根据报错信息安装依赖包即可。


上一章:Windows Docker笔记-Docker容器操作
下一章:Windows Docker笔记-制作、加载镜像

相关文章:

Windows Docker笔记-在容器中运行项目

在文章《Windows Docker笔记-Docker容器操作》中&#xff0c;已经成功创建了容器&#xff0c;也就是建好了工厂&#xff0c;接下来就应该要安装流水线设备&#xff0c;即运行项目达到生产的目的。 在Ubuntu容器中新建项目 这里要新建一个简单的C项目&#xff0c;步骤如下&…...

postgreSQL16.6源码安装

1.获取源码 从PostgreSQL: File Browser获取tar.bz2或者tar.gz源码 2.解压 tar xf postgresql-version.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# tar xf postgresql-16.6.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# ll 总计 24324 drwxr-xr-x 12 ro…...

寒假2.5

题解 web:[网鼎杯 2020 朱雀组]phpweb 打开网址&#xff0c;一直在刷新&#xff0c;并有一段警告 翻译一下 查看源码 每隔五秒钟将会提交一次form1&#xff0c;index.php用post方式提交了两个参数func和p&#xff0c;func的值为date&#xff0c;p的值为Y-m-d h:i:s a 执行fu…...

定期删除一周前的数据,日志表的表空间会增长吗?

即使定期删除一周前的数据&#xff0c;日志表的表空间仍可能持续增长。原因如下&#xff1a; 删除操作不释放空间&#xff1a;DELETE 操作只会标记数据为删除状态&#xff0c;并不会立即释放空间。这些空间可以被后续的 INSERT 操作重用&#xff0c;但不会自动缩减表的总大小。…...

yum 安装mysql

sudo yum install mysql-server sudo systemctl start mysqld sudo systemctl enable mysqld 获取临时 root 密码并登录 MySQL 安装完成后&#xff0c;MySQL 会生成一个临时的 root 密码。你可以通过查看日志文件来找到这个密码&#xff1a; sudo grep ‘temporary password’…...

Servlet笔记(下)

HttpServletRequest对象相关API 获取请求行信息相关(方式,请求的url,协议及版本) | API | 功能解释 | | ----------------------------- | ------------------------------ | | StringBuffer getRequestURL(); | 获取客户端…...

Windows 中学习Docker环境准备3、在Ubuntu中安装Docker

Windows 中学习Docker环境准备1、Win11安装Docker Desktop Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu Windows 中学习Docker环境准备3、在Ubuntu中安装Docker 需要更多Docker学习视频和资料&#xff0c;请文末联系 步骤 1&#xff1a;更新系统并安装依赖…...

【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)

1. 安装必要的依赖 以 CentOS 7 系统为例&#xff0c;安装必要的依赖包&#xff1a; sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…...

Unity DoTween使用文档

DoTween 使用文档 DoTween 是 Unity 中非常流行的动画补间插件。它通过链式调用方式&#xff0c;让开发者可以快速创建平滑、自然的动画效果。本文将介绍 DoTween 的基础用法、缓动曲线原理&#xff08;包含常见缓动曲线的数学公式与参数说明&#xff09;、案例演示以及一些常…...

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

背景需求&#xff1a; 2024年1月13日&#xff0c;快要放寒假了&#xff0c;组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整&#xff0c;你自己看批注。” “还有你这个教案部分的模版有问题&#xff0c;太小&#xff08;窄&#xff09;了。考虑…...

组合总和II(力扣40)

这道题的难点就在于题目所给的集合中有重复的数字&#xff0c;我们需要进行去重操作。首先明确去重指的是去重哪一部分。注意并不是对递归的集合去重&#xff0c;而是对当前集合的遍历进行去重。这么说可能有点抽象&#xff0c;举个例子&#xff1a;假设集合为1,1,2,3,4&#x…...

基于HTML生成网页有什么优势

在互联网时代&#xff0c;网页是人们获取信息、交流互动的重要窗口&#xff0c;而基于HTML生成网页&#xff0c;是搭建网络大厦的关键。HTML语法简洁直观&#xff0c;标签和属性语义明确&#xff0c;新手也能迅速上手&#xff0c;创建包含基础元素的网页&#xff0c;极大降低了…...

php 接入扣子的 token获取

本身逻辑只是个api&#xff0c;但是官方不提供php的sdk 扎心了老铁&#xff0c;这下php 狗都不用了&#xff0c;主要麻烦的是如何获取access_token&#xff0c;代码如下 protected function get_jwt(): string{$header [alg > RS256,typ > JWT,kid > $this->kid];…...

Redis02 - 持久化

Redis持久化 文章目录 Redis持久化一&#xff1a;持久化简介1&#xff1a;Redis为什么要进行持久化2&#xff1a;Redis持久化的方式 二&#xff1a;RDB持久化介绍1&#xff1a;手动触发RDB2&#xff1a;自动触发RDB3&#xff1a;redis.conf中进行RDB的配置4&#xff1a;RDB优缺…...

【力扣】240.搜索二维矩阵 II

题目 我的代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for(int i0;i<matrix.size();i){for(int j0;j<matrix[0].size();j){if(targetmatrix[i][j]){return true;}else if(target<matrix[i][j]){brea…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇&#xff1a;《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…...

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

随着开源 LLM 的发展&#xff0c;越来越多的模型变得专业化&#xff0c;“代码”LLM 变得非常流行。这些 LLM 旨在比其 “常识” 对应物更小&#xff0c;但旨在超越更大的通用模型的编码性能。 这些模型以极低的成本提供大型模型的功能&#xff0c;进一步使本地 LLM 空间民主化…...

11.kafka开启jmx

方式一: 1.进入/opt/kafka_2.13-3.3.2/bin目录 命令: cd /opt/kafka_2.13-3.3.2/bin [root@rhel77 ~]# cd /opt/kafka_2.13-3.3.2/bin [root@rhel77 bin]# pwd /opt/kafka_2.13-3.3.2/bin [root@rhel77 bin]# 2.备份kafka-run-class.sh 命令: cp kafka-run-class.sh …...

基于钉钉API的连接器实现:企业数据集成与自动化管理

文章目录 概要背景与需求钉钉API概述连接器实现小结 概要 在当今数字化时代&#xff0c;企业面临着海量数据的管理与整合挑战。钉钉作为国内广泛使用的办公协作平台&#xff0c;提供了丰富的API接口&#xff0c;支持企业进行数据集成与自动化管理。本文将介绍如何通过钉钉API实…...

JAVA 二维列表的基础操作与异常

在Java中创建二维 ArrayList&#xff08;即嵌套列表&#xff09;的方法有多种&#xff0c;下面我将详细介绍常用的几种方式&#xff0c;并分析它们的区别和适用场景。 1. 使用嵌套 ArrayList 创建二维列表 方法一&#xff1a;直接嵌套 ArrayList 这是最常用的方法&#xff0c…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

AT模式下的全局锁冲突如何解决?

一、全局锁冲突解决方案 1. 业务层重试机制&#xff08;推荐方案&#xff09; Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减&#xff08;自动加全…...

HTML版英语学习系统

HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具&#xff0c;使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章&#xff0c;系统朗读帮助练习听力和发音&#xff0c;适合跟读练习&#xff0c;模仿学习&#xff1b;实时词典查询 - 双…...