Docker 基础入门

news2024/11/29 12:34:51

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.coloradmin.cn/o/2222058.html

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

相关文章

pdf编辑软件有哪些?方便好用的pdf编辑软件分享

PDF文件因其跨平台、格式固定的特性&#xff0c;成为了工作、学习和生活中不可或缺的一部分。然而&#xff0c;随着需求的不断增加&#xff0c;仅仅阅读PDF文件已难以满足我们的需求&#xff0c;编辑、转换PDF文件成为了新的焦点&#xff0c;下面给大家分享几款方便好用的PDF编…

vue3处理货名的拼接

摘要&#xff1a; 货品的拼接规则是&#xff1a;【品牌】货名称/假如货品名称为空时&#xff0c;直接选择品牌为【品牌】赋值给货品&#xff0c;再选择品牌&#xff0c;会替换【品牌】&#xff1b;假如货名称为【品牌】名称&#xff0c;再选择品牌只会替换【品牌】&#xff0c;…

Windows系统PyCharm右键运行.sh文件

在参考了Windows系统下pycharm运行.sh文件&#xff0c;执行shell命令_shell在pycharm-CSDN博客 和深度学习&#xff1a;PyCharm中运行Bash脚本_pycharm bash-CSDN博客 配置了右键执行.sh文件之后&#xff0c;发现在Windows的PyCharm中直接右键运行sh文件&#xff0c;存在如下…

【算法】深入理解布隆过滤器

1. 什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&#xff0c;用于检测某个元素是否在一个集合中。与常见的数据结构如哈希表不同&#xff0c;布隆过滤器无法删除元素&#xff0c;并且会存在一定的误判率&…

【重学 MySQL】六十七、解锁检查约束,守护数据完整性

【重学 MySQL】六十七、解锁检查约束&#xff0c;守护数据完整性 检查约束的基本概念检查约束的语法检查约束的使用场景注意事项示例 在MySQL中&#xff0c;检查约束&#xff08;CHECK&#xff09;是一种用于确保表中数据满足特定条件的约束。 检查约束的基本概念 检查约束用…

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…

IPC 管道 Linux环境

管道通信的特点&#xff1a; 1. 单工通信---- 任何一个时刻只能发送方 向 接收方发送数据 2. 流式传输&#xff1a; 1> 先发送的数据先被接收&#xff0c;不能跳跃式接收 ----- 顺序发送顺序接收 2> 未被接收的数据仍然滞留在管道中&#xff0c;下一次可以继续接收后…

与ai一起作诗(《校园清廉韵》)

与ai对话犹如拷问自己的灵魂&#xff0c;与其说ai助力还不如说在和自己对话。 (笔记模板由python脚本于2024年10月19日 19:18:33创建&#xff0c;本篇笔记适合喜欢python和诗歌的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&…

免费开源Odoo软件如何实现电商仓库高效发货

世界排名第一的免费开源ERP软件Odoo&#xff0c;拥有非常强大的仓库管理WMS功能。本文以电商仓库发货管理为例&#xff0c;介绍电商订单的仓库发货作业的各种方法。电商订单仓库发货流程&#xff0c;通常分为三个步骤&#xff0c;即拣货、打包、发货。根据仓库日处理订单数量的…

【密码分析学 笔记】 3.3 飞去来器攻击及矩形攻击

3.3 飞去来器攻击及矩形攻击 飞去来器攻击&#xff1a; 轮数短但概率高的差分路线需要选择明文和密文 增强飞去来器攻击&#xff1a; 通过加大选择明文量来去掉选择密文的要求只选择明文 矩形攻击&#xff1a; 同时利用多条短轮路线提升区分器概率降低攻击复杂度 后续研…

【面试题】什么是SpringBoot以及SpringBoot的优缺点

什么是SpringBoot以及SpringBoot的优缺点 什么是SpringBoot SpringBoot是基于Spring的一个微框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 SpringBoot的优点 可以创建独立的Spring应用程序&#xff0c;并且基于其Maven或Gradle插件&#xff0c;可以创建可执…

SpringCloudAlibaba-Nacos

概述和版本说明 <spring.boot.version>3.2.0</spring.boot.version> <spring.cloud.version>2023.0.0</spring.cloud.version> <spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version>注册中心&#xff0c;配置中心及…

Docker 安装Postgres和PostGIS,并制作镜像

1. 查找postgres和postgis现有的镜像和版本号 镜像搜索网站&#xff1a;https://docker.aityp.com/ 测试使用的是postgres:15.4 和 postgis:15-3.4 2、镜像拉取 docker pull postgres:15.4docker pull postgis/postgis:15-3.4镜像下载完成&#xff0c;docker images 查看如…

【C++】拆分详解 - 模板

文章目录 一、泛型编程二、函数模板1. 概念2. 语法3. 函数模板的原理4. 函数模板的实例化5. 模板参数的匹配原则 三、类模板1. 语法2. 实例化 四、模板的特化1. 概念2. 函数模板特化3. 类模板特化3.1 全特化3.2 偏特化 / 半特化3.3 应用示例 4. 小结 五、模板的分离编译1. 分离…

秋招面试题记录_半结构化面试

c八股(可能问的多一点) 1.简单说说C11语法特性 答&#xff1a; 1.auto以及decltype自动类型推导&#xff0c;避免手动声明复杂类型&#xff0c;减少冗长代码提升了可读性和安全性。 2.智能指针 自动释放内存 (具体说说) 有shared和unique 差异主要体现在所有权、内存开销、…

微积分复习笔记 Calculus Volume 1 - 3.4 Derivatives as Rates of Change

3.4 Derivatives as Rates of Change - Calculus Volume 1 | OpenStax

京东 北京 java 中级: 哪些情况下的对象会被垃圾回收机制处理掉? 哪些对象可以被看做是 GC Roots 呢?对象不可达,一定会被垃圾收集器回收么?

我同学最近在面试java的岗位, 这是他遇到的某些关于java的JVM中垃圾回收相关的部分的问题, 他来问我, 我特以此文章来解答. 公司 京东 base 北京 面试时间 2024年10月23日16:00:00 他跟我说, 面试官一上来就问了一个关于JVM的问题, 直接就给他难住了, 问题是 : 哪些情况下…

数据结构《顺序表》

文章目录 前言一、什么是顺序表&#xff1f;1.1 顺序表的概念1.2 顺序表的建立 二、MyArrayList的实现三、顺序表的方法四、关于顺序表的例子总结 前言 提示&#xff1a;这里涉及到的ArrayList类是一个泛型类&#xff0c;同时后面的很多内容都会涉及到泛型&#xff0c;如果不了…

【蓝队技能】【内网隧道工具流量分析】FRPNPSreGeorgVenom

蓝队技能 FRP&NPS&reGeorg&Venom 蓝队技能总结前言一、FRP1.1 流量分析1.2 特征提取 二 NPS1.1 流量分析1.2 特征提取 三、reGeor1.1 特征提取 四、Venom1.1 特征提取 总结 前言 本文聚焦内网隧道代理技术&#xff0c;涵盖Frp、Nps、Neo-reGeorg及Venom等工具。这些…

潜水定位通信系统的功能和使用方法_鼎跃安全

潜水定位通信系统是保障潜水安全与作业高效的关键设备。它利用先进的声呐、无线电等技术&#xff0c;可精准定位潜水员位置。在水下能实现潜水员之间以及与水面的双向通信&#xff0c;确保信息及时传递。具备高可靠性和稳定性&#xff0c;即使在复杂水环境中也能正常运行。 一、…