Docker 基础入门

Docker 基础入门

前言

在云计算和微服务架构日益盛行的今天,软件开发与部署的效率和灵活性成为了企业竞争力的关键因素之一。Docker,作为一种开源的容器化平台,凭借其轻量级、可移植性和易于管理的特性,迅速成为现代软件开发和运维领域的宠儿。本文主要总结一些 Docker 的基本概念、核心优势、应用场景以及记录如何使用 Docker 来优化软件开发与部署流程。

基本概念

Docker是一种开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何支持 Docker 的平台上。这个容器包含了应用运行所需的所有组件,如代码、运行时库、系统工具和配置文件等,确保了应用在不同环境中的一致性和可靠性。

  • 镜像(Image):Docker 镜像是一个只读模板,包含了创建 Docker 容器所需的指令集。它类似于一个轻量级的、独立的操作系统环境。
  • 容器(Container):容器是镜像的运行实例。通过运行镜像,可以创建一个或多个容器,每个容器都是相互隔离的,但共享同一个操作系统的内核。
  • 仓库(Registry):Docker 仓库用于存储和分发 Docker 镜像。Docker Hub是最知名的公共仓库之一,用户也可以搭建私有仓库来存储敏感或专有镜像。

核心优势

  • 环境一致性:Docker 容器确保了开发、测试和生产环境的一致性,减少了 “在我机器上就能跑” 的问题。
  • 资源隔离:容器之间彼此隔离,提高了系统的安全性和稳定性,即使一个容器出现问题,也不会影响到其他容器或宿主机。
  • 高效利用资源:相比虚拟机,Docker 容器更加轻量级,因为它们共享宿主机的操作系统内核,启动速度更快,资源占用更少。
  • 易于部署和扩展:通过 Docker Compose 和 Kubernetes 等工具,可以轻松实现应用的编排、部署和自动扩展。
  • 跨平台兼容性:Docker 容器可以在任何支持 Docker 的操作系统上运行,无论是 Windows、Linux 还是 macOS,极大地提高了应用的可移植性。

应用场景

  • 微服务架构:Docker 是实现微服务架构的理想工具,每个微服务可以作为一个独立的容器运行,便于管理和扩展。
  • 持续集成/持续部署(CI/CD):Docker 简化了构建、测试和部署流程,使得自动化部署成为可能,加速了软件交付周期。
  • 大数据处理:Docker 容器可以用于部署大数据处理框架,如Hadoop、Spark等,提高数据处理效率和灵活性。
  • 开发环境管理:开发者可以使用 Docker 快速搭建开发环境,确保团队成员使用相同的环境配置,减少环境差异带来的问题。
  • 边缘计算和物联网:Docker的轻量级和跨平台特性使其成为边缘计算和物联网设备部署的理想选择。

如何使用 Docker

安装Docker

sudo apt-get update
​
#移除老版本的docker
sudo apt-get remove docker docker-engine docker.io containerd runc
​
#安装HTTPS相关包
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
​
#添加Docker的官方GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
​
#验证指纹
sudo apt-key fingerprint 0EBFCD88
​
#设置稳定版repo
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"#安装Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
​
#验证安装成功
sudo docker run hello-world

设置非root账户去管理Docker

sudo groupadd docker
sudo usermod -aG docker $USER  #$USER替换为ubuntu当前用户名
newgrp docker#验证非root账户运行docker hello-world容器
docker run hello-world

Docker 的基础操作

我们通过一个实例来熟悉下 docker 的基础操作。

镜像操作:

  • 拉取镜像,比如说 Ubuntu 22.04 镜像:
    docker pull ubuntu:22.04
    
  • 通过 docker images 我们可以看到当前docker 的所有镜像,包括我们刚拉取的 ubuntu:22.04
    docker images 
    
  • 通过 docker run 创建并启动一个新的 Ubuntu 22.04 容器实例,并以交互模式运行,分配一个伪终端。
    docker run -it ubuntu:22.04 /bin/bash
    
  • Docker 容器默认有一定的资源限制(如CPU、内存等)。如果需要,也可以通过 docker run 命令的参数来调整这些限制。
    # 限制容器最多使用0.5个CPU核心
    docker run --cpus=0.5 ...# 查看内存大小
    free -h # 限制容器最多使用512MB的内存
    docker run --memory=512m ...# 设置容器最多使用1GB的虚拟内存(内存+交换空间)总量,--memory-swap的值必须大于--memory的值
    docker run --memory=512m --memory-swap=1g ...
    

容器操作:

  • 查看所有容器
    docker ps -a
    
  • 将本机上的目录 lorawan/yocto_ws 复制到容器 <container_id> 根目录下的 lorawan 目录。(更好的方法是使用卷)
    docker cp lorawan/yocto_ws <container_id>:/lorawan/
    
  • 根据 container_id 进入特定容器
    docker exec -it <container_name_or_id> /bin/bash
    
  • 退出容器,直接在容器内执行 exit
    exit 
    

注意不要与 docker run 混淆,docker run 是根据镜像创建一个新的容器,每个容器之间的修改是独立的;通过 docker exec 可以进入已存在的容器去继续修改。

管理容器

Docker提供了一系列命令来管理容器,如查看容器列表(docker ps)、停止容器(docker stop)、删除容器(docker rm)等。

  • 持久化存储:如果编译生成的文件需要在容器外部访问或持久化存储,可以使用 Docker 的卷(Volume)功能。
  • docker stats,查看所有正在运行的容器的CPU和内存使用情况的实时更新。输出将包括容器的ID、名称、CPU使用率、内存使用量、内存限制、内存使用率、网络I/O、磁盘I/O以及进程数等信息。
  • docker ps,查看正在运行的容器,使用
  • docker stop ,停止容器
  • docker rm ,删除容器
  • docker images,查看本地镜像

使用 Docker Compose

  • Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,通过编写 docker-compose.yml 文件,可以方便地管理多个容器的启动、停止和连接。一个简单的 docker-compose.yml 定义是这样的:

    version: '3.0'   # 使用适当的 Compose 文件格式版本  services:  dev:  image: yocto_chirpstack:1.0.0	# 替换为你的镜像名称 volumes:  - ~/.ssh:/home/syrius/.ssh	# 挂载卷到容器内路径- ~/.gitconfig:/home/syrius/.gitconfig
    
    • ~/.ssh:/home/syrius/.ssh:这个卷将主机上的 ~/.ssh 目录挂载到容器内的 /home/syrius/.ssh 目录。这允许容器访问主机的 SSH 密钥,以便容器可以执行需要 SSH 认证的操作(例如,从私有 Git 仓库拉取代码)。
    • ~/.gitconfig:/home/syrius/.gitconfig:这个卷将主机上的 ~/.gitconfig 文件挂载到容器内的 /home/syrius/.gitconfig 文件。这允许容器使用主机的 Git 配置,包括用户名和电子邮件地址等身份信息。
  • 执行特定的服务(在这个例子中是 dev 服务),启动一个 Bash shell,并且该服务容器在命令执行完毕后会被自动删除(由于 --rm 选项)。

    docker-compose -f docker-compose.yaml run --rm dev
    

Docker 如何保存对容器/镜像的修改

  • docker images 查看要修改的镜像。
    在这里插入图片描述
  • docker run -it ubuntu:22.04/bin/bash 以交互式方式启动镜像。
  • 进入容器后,修改镜像,比如修改镜像中已经部署的代码或者安装新的软件或包等。
  • 修改完成之后,键入exit, 退出当前交互式容器。
  • docker ps -a 查看所有容器。
  • docker commit <container_id> test:v1.0 保存对镜像容器的修改,新的镜像名称为 test,版本为 v1.0.0。
    在这里插入图片描述
  • 停止并删除相关容器(如果镜像正在被容器使用):
    • 使用 docker stop <container_id>来停止容器。
    • 使用 docker rm <container_id>来删除容器。
  • 删除镜像,镜像删除前需要先删除镜像的容器:
    • 使用 docker rmi <image_id> 或 docker image rm <image_id> 来删除镜像。
    • 也可以通过镜像名称来删除,例如docker rmi ubuntu:22.04(如果这是你要删除的镜像)。

构建镜像

创建 Dockerfile

Dockerfile 是一个文本文件,包含了构建 Docker 镜像所需的所有指令。通过编写 Dockerfile,可以定义镜像的基础镜像、需要安装的包、执行的命令等。比如说在基础 ubuntu22.04 镜像系统上搭建基于 yocto 的 lorawan chirpstack 协议栈的编译环境,Dockerfile 可以这么写:

# 使用官方的 Ubuntu 22.04 镜像作为基础镜像 
FROM ubuntu:22.04  # 设置用户名全局变量
ENV USER_NAME=ubuntu# 定义时区为亚洲上海
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone# 安装一些必要软件
RUN apt-get update && \  apt-get install -y sudo gawk wget git diffstat unzip texinfo gcc build-essential chrpath \socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping \python3-git python3-jinja2 python3-subunit zstd liblz4-tool file locales libacl1 && \locale-gen en_US.UTF-8 && \pip3 install west # 创建一个新用户,并且配置所有 sudo 操作都不需要密码  
RUN useradd -m -s /bin/bash ${USER_NAME} && echo 'syrius    ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers# 复制文件到镜像中(这个操作是以 root 用户身份执行的) 
COPY build/downloads /home/${USER_NAME}/lorawan/build/downloads# 修改目录用户组权限,要在 USER ${USER_NAME} 之前,否则无权限
RUN chown -R ${USER_NAME}:${USER_NAME} /home/${USER_NAME}/lorawan# 设置后续指令的执行用户为 ubuntu
USER ${USER_NAME}  # 设置工作目录(这个目录将属于 root 用户,因为 COPY 指令是在 USER 指令之前执行的
WORKDIR /home/${USER_NAME}  
  • COPY 指令不受 USER 指令的直接影响。在 Dockerfile 中,COPY 指令用于将文件或目录从构建上下文(通常是 Dockerfile 所在的目录及其子目录)复制到镜像中指定的路径。这个操作是在 Docker 引擎构建镜像时执行的,而且默认是以 root 用户的身份执行的,无论 USER 指令是否已经在 Dockerfile 中出现。
  • USER 指令用于设置后续指令(以及容器启动时默认的用户)的执行用户。这意味着,在 USER 指令之后的 RUN、CMD、ENTRYPOINT 等指令将以指定的用户身份执行。如果 USER 指令之后没有更多的指令,那么它主要影响的是容器启动时的默认用户。

使用 docker build 命令根据当前目录下的 Dockerfile 构建镜像。

docker build -t chirpstack:1.0.0 .

在这里插入图片描述

镜像上传

要将 Docker 镜像上传到 Docker Hub 的指定仓库,我们需要按照以下步骤操作:

  • 登录到 Docker Hub,输入 Docker Hub 用户名和密码
    在这里插入图片描述

当前中国境内已经无法直接访问 Docker Hub 了,所以这里可能会登录超时。需要配置 docker 代理1才行。

  • 标记(Tag)镜像:

    • 在上传镜像之前,需要给镜像打上一个标签(Tag),这个标签包括要上传到的 Docker Hub 用户名(或组织名)和仓库名,以及一个可选的标签(通常是版本号,如 latest)。
      docker tag [本地镜像名]:[本地标签] [dockerhub用户名]/[仓库名]:[标签]# 例如,如果有一个名为 my-app 的镜像,并且你想将它上传到名为 my-repo 的仓库中,标签为 latest
      docker tag my-app:latest my-dockerhub-username/my-repo:latest
      
  • 推送(Push)镜像,使用 docker push 命令将标记好的镜像推送到 Docker Hub。

    docker push [dockerhub用户名]/[仓库名]:[标签]# 继续上面的例子:
    docker push my-dockerhub-username/my-repo:latest
    
  • 验证上传:推送完成后,可以登录到 Docker Hub,并导航到仓库页面,确认镜像是否已成功上传。

以上步骤假设我们已经有一个 Docker Hub 账户,并且已经创建了一个仓库(虽然 Docker Hub 允许我们在推送镜像时自动创建仓库,但手动创建仓库可以提前设置好仓库的可见性和描述等信息)。

在这里插入图片描述

扩展

将 Docker 镜像推送到亚马逊 ECR 私有存储库

# 使用 AWS CLI 获取登录凭证
aws ecr get-login-password --region cn-northwest-1 | docker login --username AWS --password-stdin 633349536424.dkr.ecr.cn-northwest-1.amazonaws.com.cn# 列出 cn-northwest-1 区域下的所有 ECR 仓库
aws ecr describe-repositories --region cn-northwest-1# 列出 cn-northwest-1 区域下的所有 ECR 仓库的名称
aws ecr describe-repositories --region cn-northwest-1 | jq -r '.repositories[].repositoryName'# 查看是否存在 embedded/yocto 仓库
aws ecr describe-repositories --region cn-northwest-1 | jq -r '.repositories[].repositoryName' | grep "embedded/yocto"# 标记并推送镜像
# 633349536424.dkr.ecr.cn-northwest-1.amazonaws.com.cn 是远程镜像仓库的地址,这个地址指向AWS Elastic Container Registry(ECR)在中国(宁夏)区域(cn-northwest-1)的一个特定仓库。
# embedded/yocto 是远程仓库中的路径和仓库名称,用于组织和管理不同项目或团队的镜像。
docker tag chenqinhu/yocto:latest 633349536424.dkr.ecr.cn-northwest-1.amazonaws.com.cn/embedded/yocto:chirpstack-1.0.0
docker push 633349536424.dkr.ecr.cn-northwest-1.amazonaws.com.cn/embedded/yocto:chirpstack-1.0.0

配置 docker 代理

  • 移除 Docker 守护进程配置文件,或配置文件里的代理配置(如果有的话),因为这里的配置会覆盖下面的配置。

    sudo rm /etc/docker/daemon.json
    
  • 创建配置文件

    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
    
  • 添加配置

    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:1080"
    Environment="HTTPS_PROXY=http://127.0.0.1:1080"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp,"
    
    • IP 和端口需要根据自己的代理修改,比如我是在 wsl2 上的 ubuntu 使用的 docker,我的代理 IP和端口可以在 windows ,<控制面板> <网络和 Internet> <Internet 选项> <连接> <局域网设置> 里看到。
      在这里插入图片描述
    • 我们可以简单使用 curl -x 127.0.0.1:10809 www.google.com 来验证 wsl 里的 ubuntu 代理是走通的,不要使用 ping,ping 不通过代理。
  • 重启容器

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  • 查看代理是否生效
    在这里插入图片描述
    在这里插入图片描述

  • dockerhub 登录成功,说明 docker 的代理起作用了。


  1. ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt QWidget详解

一、概述 QWidget是容器组件&#xff0c;继承自QObject类和QPaintDevice类。能够绘制自己和处理用户输入&#xff0c;是QT中所有窗口组件类的父类&#xff0c;是所有窗口组件的抽象&#xff0c;每个窗口组件都是一个QWidget&#xff0c;QWidget类对象常用作父组件或顶级组件使…

小新学习K8s第一天之K8s基础概念

目录 一、Kubernetes&#xff08;K8s&#xff09;概述 1.1、什么是K8s 1.2、K8s的作用 1.3、K8s的功能 二、K8s的特性 2.1、弹性伸缩 2.2、自我修复 2.3、服务发现和负载均衡 2.4、自动发布&#xff08;默认滚动发布模式&#xff09;和回滚 2.5、集中化配置管理和密钥…

信发软件之电脑版拖动——未来之窗行业应用跨平台架构

一、电脑版拖动 二、电脑版随意移动函数 var _movefalse;//移动标记 var _x,_y;//鼠标离控件左上角的相对位置 $("#"宿主id).click(function(){ }).mousedown(function(e){ _movetrue; _xe.pageX-parseInt($("#"宿主id).css("left")); _ye…

【Python爬虫实战】多进程结合 BeautifulSoup 与 Scrapy 构建爬虫项目

#1024程序员节&#xff5c;征文# &#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 前言 在大数据时代&#xff0c;爬虫技术是获取和处理网络数据的利器。面对需要处理大…

报表工具怎么选?山海鲸VS帆软,哪个更适合你?

概述 在国产报表软件市场中&#xff0c;山海鲸报表和帆软这两款工具都占有一席之地&#xff0c;许多企业在选择报表工具时常常在它们之间徘徊。然而&#xff0c;随着企业对数据分析需求的不断增长和复杂化&#xff0c;如何选取一款高效、易用且性价比高的报表工具&#xff0c;…

Linux笔记之文件查找和搜索命令which,find,locate,whereis总结

Linux笔记之文件查找和搜索命令which,find,locate,whereis总结 code review! 文章目录 Linux笔记之文件查找和搜索命令which,find,locate,whereis总结1.对比2.whereis 和 which 命令区别3.locate 和 find 命令区别 1.对比 命令功能说明备注which常用于查找可直接执行的命令。…

【状态机DP】【记忆化搜索1:1翻译递归空间优化】力扣2771. 构造最长非递减子数组

给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;长度均为 n 。 让我们定义另一个下标从 0 开始、长度为 n 的整数数组&#xff0c;nums3 。对于范围 [0, n - 1] 的每个下标 i &#xff0c;你可以将 nums1[i] 或 nums2[i] 的值赋给 nums3[i] 。 你的任务是使用最…

【MySQL】表的增删改查(CRUD)

目录 1.前言 2.增加&#xff08;Create&#xff09; 3.查询&#xff08;Retrieve&#xff09; 3.1全列查询 3.2指定列查询 3.3查询字段为表达式 3.4别名 3.5去重&#xff1a;DISTINCT 3.6排序&#xff1a;ORDER BY 3.7条件查询&#xff1a;WHERE 3.8分页查询&#x…

【LLM之Agent】《Tool Learning with Large Language Models: A Survey》论文阅读笔记

概述 背景信息 近年来&#xff0c;基于大型语言模型&#xff08;LLMs&#xff09;的工具学习成为增强LLMs应对复杂任务能力的有力范式。尽管这一领域快速发展&#xff0c;现有文献的碎片化以及缺乏系统组织&#xff0c;给新入门者带来了阻碍。因此&#xff0c;本论文旨在对现…

stable-zero123模型构建指南

一、介绍 stabilityai出品&#xff0c;能够对有简单背景的物体进行三维视角图片的生成&#xff0c;简单来说也就是通过调整变换观察的视角生成对应视角的图片。 本项目通过comfyui实现。 二、容器构建说明 1. 部署ComfyUI &#xff08;1&#xff09;使用命令克隆ComfyUI g…

【设计模式系列】命令模式

目录 一、什么是命令模式 二、命令模式的角色 三、命令模式的典型应用场景 四、命令模式在Runnable中的应用 一、什么是命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将一个请求或简单操作封装为一个对象。这个模式提供了一种…

Axure垂直菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure垂直菜单展开与折叠 主要内容&#xff1a;垂直菜单单击实现展开/折叠&#xff0c;点击各菜单项显示选中效果 应用场景&#xff1a;后台菜单设…

Python 应用可观测重磅上线:解决 LLM 应用落地的“最后一公里”问题

作者&#xff1a;彦鸿 背景 随着 LLM&#xff08;大语言模型&#xff09;技术的不断成熟和应用场景的不断拓展&#xff0c;越来越多的企业开始将 LLM 技术纳入自己的产品和服务中。LLM 在自然语言处理方面表现出令人印象深刻的能力。然而&#xff0c;其内部机制仍然不明确&am…

Apache Seata 新版本集成了 RocketMQ 事务消息

大家好&#xff0c;我是君哥。 Apache Seata 是一款高性能、简单易用的分布式事务中间件&#xff0c;它包含 AT、TCC、SAGA 和 XA 四种模式。 在最近发布的新版本中&#xff0c;Apache Seata 引入了 RocketMQ 中间件&#xff0c;并且跟 RocketMQ 的事务消息配合使用。今天我们…

界面控件DevExtreme中文教程 - 如何与Amazon S3和Azure Blob存储集成?

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

顺序表(一)(数据结构)

一. 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列 。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;是人为想象出来的数…

1024程序员节 | QT进阶学习——如何通过QT连接云服务器的MySQL数据库并进行数据库操作 和 数据表的增删改查

目录 引出连接本地MySQL1.首先下载MySQL的ODBC驱动2.启动运行&#xff0c;创建用户数据源补充&#xff1a;ANSI 版和 Unicode 版 3.qt代码连接 如何连接华为云服务器中的MySQL1.在Centos中安装Linux版本的ODBC驱动2.在ODBC连接管理器中建立和华为云的链接3.qt代码通过ODBC连接华…

【微软商店平台】如何将exe打包上传微软商店

打开微软合作者中心&#xff1a;https://partner.microsoft.com/en-us/dashboard/home点击App and Games板块可以创建项目。 3. 重新生成包含私钥的自签名证书 运行以下命令&#xff0c;确保生成的证书包含私钥&#xff1a; New-SelfSignedCertificate -Type CodeSigning -Su…

【Java设计模式】1-15章

第1章 内容介绍 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 1.1.2 设计模式的重要性 1.2 课程亮点和授课方式 第2章 设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 ①单一职责原则 方案1 package com.atguigu.principle.singleresponsibili…

【Nuvoton干货分享】开发应用篇 4 -- 8bit MCU Flash 操作

我们在进行实际开发设计中&#xff0c;难免需要进行数据存储&#xff0c;早期很多都是外接EEPROM来进行设计&#xff0c;但是需要增加成本。其实芯片内部的Flash也是可以当成数据存储空间的。本章节主要介绍新唐的8位机如何进行常量数据的存储操作。 一、存储空间划分 我这边…