Docker实践:使用Docker搭建个人开发环境(极简版)

2023-07-23 12:44:55

说明

本文是在服务器已经配置好 Docker 相关环境的情况下,简要介绍了在服务器上如何构建 Docker 镜像来搭建个人开发环境,因此本文不涉及 Docker 的安装、维护以及各种细节,若要详细了解,请查看文章最后的 相关资料 一节。

教程

以下所有操作均在同一文件夹(例如 /media/username/Docker 文件夹)内进行。,请在自己的目录下新建一个 Docker 文件夹

1. 编写 Dockerfile

新建 Dockerfile 文件:

  • FROM 后跟需要使用的基础镜像,你的镜像会在此基础上构建,可以省去很多配环境的步骤,例如使用NVIDIA官方提供的cuda镜像,可以省去手动配cuda环境的步骤: nvidia/cuda:12.2.0-devel-ubuntu22.04更多版本nvidia/cuda
  • RUN /bin/bash -c 后面的双引号中,添加你在配环境过程中需要执行的命令,不用写出所有的命令,进入容器后还可以继续配环境。
FROM registry.cn-hangzhou.aliyuncs.com/2h1c_aliyun/accelerate:nvidia_cuda_12.2.0-devel-ubuntu22.04

# 每一个RUN命令都会在镜像中构建一个“层”
# 从DEBIAN_FRONTEND开始往下的都是安装命令,仅为示例,非必须
RUN /bin/bash -c "sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list \ 
    && sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list \ 
    && apt update && apt upgrade -y"
RUN /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt install tzdata git openssh-server vim zsh \ 
    make sudo net-tools inetutils-ping \ 
    language-pack-zh* -y"

Dockerfile 所在文件夹下,执行构建命令:

docker build -t=zhaoliangcheng_image:latest .
  • zhaoliangcheng_image 替换成你为新镜像起的名字
  • latest是版本/标签名称,同样可以改为自定义的名称

2. 编写 docker-compose.yml

新建 docker-compose.yml 文件:

  • 所有写着自定义名称的,都可以用相同的名称,注意不能与他人的重复,最好命名为username_xxx,即用户名_英文字符串
version: '3.8'
name: 自定义名称
services:
  自定义名称:
    init: true
    container_name: 自定义名称
    network_mode: "host"
    privileged: true
    image: Dockerbuild构建出的镜像
    command: tail -f /dev/null
    volumes:
      - "/tmp/.X11-unix:/tmp/.X11-unix:rw"
      - "/dev:/dev:rw"
      - "./ENVIRONMENTS:/root/ENVIRONMENTS:rw"
      - "./SHARE:/root/SHARE:rw"
    working_dir: /root
    environment:
      - DISPLAY=$DISPLAY
      - LC_ALL=C.UTF-8
      - NVIDIA_DRIVER_CAPABILITIES=all
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [compute,graphics,video,utility,display]

例如:

version: '3.8'
name: zhaoliangcheng_container
services:
  zhaoliangcheng_container:
    init: true
    container_name: zhaoliangcheng_container
    network_mode: "host"
    privileged: true
    image: zhaoliangcheng_image:latest
    command: tail -f /dev/null
    volumes:
      - "/tmp/.X11-unix:/tmp/.X11-unix:rw"
      - "/dev:/dev:rw"
      - "./ENVIRONMENTS:/root/ENVIRONMENTS:rw"
      - "./SHARE:/root/SHARE:rw"
    working_dir: /root
    environment:
      - DISPLAY=$DISPLAY
      - LC_ALL=C.UTF-8
      - NVIDIA_DRIVER_CAPABILITIES=all
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [compute,graphics,video,utility,display]

3. 使用容器

所有要保存的数据例如代码、模型等,放在 /root/SHARE/root/ENVIRONMENTS

创建容器

创建容器就好比创建一个虚拟机,只需运行一次创建命令即可。

docker compose up -d

如果修改docker-compose.yml ,那么想要让修改生效,就需要重新执行这条命令,但这会让原容器被删除,因此需要保存好数据

启动容器

当容器创建成功后,以后每次启动容器,都只需执行这条命令:

docker start 容器名称

其中,容器名称是你在 docker-compose.ymlcontainer_name 一项中所填写的自定义名称

进入容器

命令行
docker exec -it 容器名称 bash
VSCode

在扩展中安装Remote插件,安装好后在左侧的远程资源管理器中先连接到服务器,然后在新打开的VSCode窗口中,选择 开发容器 ,右键选择 附加到容器 即可连接

4. 关闭容器

docker stop 容器名称

5. 备份容器

通过备份容器,可以:

  • 在容器环境损坏时快速恢复环境
  • 在服务器与个人电脑间迁移环境

备份容器分为导出导入两个步骤:

  • 导出是将容器导出为 *.tar 文件
  • 导入是将 *.tar 文件中的内容导入成镜像,通过镜像就可以创建容器了

导出

  1. 关闭容器
docker stop 容器名称
  1. 执行导出命令
docker export -o=文件名称.tar 容器名称

导入

  1. 执行导入命令
docker import 文件名称.tar 镜像名称:版本号
  1. 查看系统中所有的镜像
docker images -a

6. 重置容器

如果环境损坏,可以重置容器,恢复环境到某个版本。

重置容器有删除重新创建两个步骤:

  1. 删除容器(注意将需要保存的数据移动到 /root/SHARE/root/ENVIRONMENTS 中)
docker compose down
  1. 重新创建容器
    修改 docker-compose.ymlimage 中的 镜像名称:版本号 ,Docker 就会使用image中的镜像新建一个容器,并且 /root/SHARE/root/ENVIRONMENTS 中的数据不会丢失
docker compose up -d

相关资料

文章合集

详细了解本文

在个人电脑上安装 Docker

容器使用 NVIDIA 显卡

托管镜像

运行GUI程序

更多推荐

【九章斩题录】Leetcode:判定字符是否唯一(C/C++)

精品题解🔥《九章斩题录》👈猛戳订阅面试题01.01.判定字符是否唯一✅模板:C语言classSolution{public:boolisUnique(stringastr){}};💭思考:《程序员面试金典》里的题,这题和剑指Offer的"数组中重复的数字"几乎一模一样啊,只是重复的数字变成了重复的字符,判断"重复

【python爬虫】—星巴克产品

文章目录需求爬取星巴克产品以及图片,星巴克菜单python爬虫爬取结果需求爬取星巴克产品以及图片,星巴克菜单网页分析:首先,需要分析星巴克官方网站的结构,了解菜单栏的位置、布局以及菜单项的标签或类名等信息。发送HTTP请求:使用Python的requests模块发送HTTPGET请求,获取星巴克网页的HTML内容。解析

爬虫异常处理技巧分享

在进行爬虫数据采集的过程中,我们常常会遇到网络波动和自动化验证等异常情况。这些问题可能导致爬虫运行中断或被识别为机器请求而受到限制。本文将分享一些实用的爬虫异常处理技巧,帮助您规避网络波动和自动化验证,提高数据采集的稳定性和成功率。一、处理网络波动1.设置重试机制:当爬取过程中遇到网络错误或超时,在合理的时间范围内进行

爬虫入门基础-Selenium反爬

在网络时代,爬虫作为一种强大的数据采集工具,被广泛应用于各行各业。然而,许多网站为了防止被恶意爬取数据,采取了各种反爬虫机制。为了能够成功地绕过这些机制,Selenium成为了爬虫领域的一把利器。本文将为你介绍爬虫入门基础,并重点探讨如何使用Selenium应对反爬虫的挑战。一、爬虫入门基础1、定义:爬虫是一种模拟浏览

minikube搭建k8s

环境:centos7,docker18minikube搭建k8s说明minikube是最接近原生kubernetes的本地单机版集群,支持大部分kubernetes功能,用于学习和开发k8s。支持Linux、Windows、Mac官网安装文档安装前提一台物理机或者虚拟机,物理机CPU大于2核vcpu、2G内存、20G磁

Java堆(Java Heap)

对于Java应用程序来说,Java堆(JavaHeap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。在《Java虚拟机规范》中对Java堆的描述是:“所有的对象实例以及数组都应

ZMQ协议

一、ZMQ特点普通的socket是端对端的关系,ZMQ是N:M的关系,socket的连接需要显式地建立连接,销毁连接,选择协议(TCP/UDP)和错误处理,ZMQ屏蔽了这些细节,像是一个封装了的socket库,让网络编程变得更简单。ZMQ不光用于主机与主机之间的socket通信,还可以是线程和进程之间的通信。ZMQ提供

Zookeeper集群 + Kafka集群

ZookeeperZookeeper概述Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目Zookeeper工作机制Zookeeper从设计模式角度来理解:是一个,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zo

Vue路由与nodes的环境配置

一,Vue路由什么是Vue路由?Vue路由是Vue.js的一部分,是一个官方的Vue.js插件,用于管理单页面应用程序的路由。它允许您在应用程序中使用URL路径和参数来管理不同的页面视图,而无需刷新页面。使用Vue路由,您可以轻松地设置和管理客户端路由,包括嵌套和动态路由。它还提供了一些高级功能,例如路由守卫,用于在页

leetcode646. 最长数对链(java)

最长数对链题目描述贪心解法二动态规划dp题目描述难度-中等leetcode646.最长数对链(java)给你一个由n个数对组成的数对数组pairs,其中pairs[i]=[lefti,righti]且lefti<righti。现在,我们定义一种跟随关系,当且仅当b<c时,数对p2=[c,d]才可以跟在p1=[a,b]后

HTML 学习笔记(基础)

它是超文本标记语言,由一大堆约定俗成的标签组成,而其标签里一般又有一些属性值可以设置。W3C标准:网页主要三大部分结构:HTML表现:CSS行为:JavaScript<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewpor

热文推荐