Docker快速入门

Docker快速入门

首发于知乎:https://zhuanlan.zhihu.com/p/665607671

Docker快速入门

前言

Docker是什么?

Docker是一种开源的容器化平台,用于构建、部署和运行应用程序。它通过使用容器来实现应用程序的隔离和封装,使得应用程序可以在不同的计算环境中以一致的方式运行。

容器是一种轻量级的虚拟化技术,它可以将应用程序及其所有依赖项打包到一个独立的、可移植的容器中。这个容器包含了应用程序所需的所有文件、库、环境变量和配置信息。与传统的虚拟机不同,容器不需要运行完整的操作系统,而是共享主机操作系统的内核,因此它们更加轻量级和高效。

为什么要用Docker?

Docker提供了一个简单而强大的命令行工具和API,使得用户可以轻松地创建、启动、停止和管理容器。它还提供了一个容器镜像的机制,允许用户将容器打包成可重复部署的组件。这些容器镜像可以通过Docker Hub等容器注册中心进行共享和分发,从而加速开发和部署过程。

  • 比如说,你是一个懒狗,可以找别人配好的镜像拉下来直接使用。

  • 比如说, 你有一个小团体,需要共同开发一个项目,你们可以使用Docker,一个人构建完了镜像,其他人就免去了配环境的痛苦。

  • 再比如说,你有好多台机器去跑深度学习,每台机器一个个配置conda也太痛苦了,你可以找一个pytorch的基础镜像,把conda环境用docker配好,这样所有的机器上的conda环境都在docker里,拉一下就行了。

  • 再再比如说,你是一个后端程序员,你可以在本地写好你的程序后,用docker把你的服务打包到服务器上。

等等等。。。。。。。

Docker 的容器(Container),镜像(Image)是什么关系?

  • 镜像(Image):是一个只读的静态文件,通常包含了操作系统、应用程序、库、环境变量等一系列配置和依赖。**镜像是创建容器的基础,而且每个容器都必须从一个镜像创建。**镜像可以通过Dockerfile文件或者从Docker Hub等镜像仓库中获取。

  • 容器(Container):是从镜像创建的运行环境的实例。它是可以启动、停止、删除、暂停和重启的。容器可以看做是一个轻量级的虚拟机,它在自己的文件系统中运行,并且拥有自己的网络、进程空间等资源。不同的容器可以共享同一个镜像,但是它们拥有自己的文件系统和运行环境,互相之间是隔离的。

简而言之,Docker容器是从Docker镜像创建的运行实例。当我们启动一个Docker容器时,它会在容器内部创建一个文件系统,然后在该文件系统中运行进程。容器隔离了进程空间和网络资源,每个容器互相独立,保证了容器间的应用程序互相之间没有影响。

通过Docker Hub使用别人的镜像开始

要使用Docker Hub上别人的镜像,可以按照以下步骤进行操作:

  1. 在Docker Hub上搜索所需的镜像。可以在Docker Hub网站(https://hub.docker.com)上使用搜索框来查找特定的镜像,也可以使用docker search命令在命令行中进行搜索。
  2. 选择合适的镜像。浏览搜索结果并找到满足你需求的镜像。通常,镜像名称和标签(tag)的组合用于标识特定版本的镜像。选择适当的标签,可以是最新版本或特定的版本号。
  3. 下载镜像。使用docker pull命令下载所需的镜像。
  4. 运行容器。使用docker run命令来创建并运行一个容器实例。指定下载的镜像名称和其他必要的选项。
  5. 根据需要进行配置。根据你的应用程序需求,可以使用适当的docker run命令选项来配置容器。

在镜像基础上构建容器

创建并运行一个容器实例

docker rundocker run命令用于创建并运行一个新的Docker容器。它的主要作用是在容器中启动一个新的应用程序实例。当你运行docker run命令时,Docker会执行以下操作:

  • 创建一个新的容器实例。
  • 基于指定的镜像构建容器的文件系统。
  • 在容器内运行指定的命令或应用程序。

例如,以下命令将创建一个名为my-container的新容器,并在其中运行my-image镜像的默认命令:

docker run --name my-container my-image
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

这只是一个最简单的实例, 通常来说运行容器的时候还要加上一些其他的指令。

docker run 比较重要的命令有:

-d, --detach:在后台运行容器,并释放终端。

-v,–volume把工作目录挂在的docker下,实现宿主机和容器的文件同步。

-p, --publish:将容器内部的端口映射到主机的端口。

-it:交互式终端,可以让用户和容器内部进行交互。

–name:为容器指定一个名称。

–rm:退出容器时立即删除容器。

更复杂的例子:

docker run --gpus all -it -v /home/yanglibing/:/home/yanglibing/ -v /home/public/:/home/public/ finglm5:v1.0 bash
  • docker run:运行Docker容器
  • --gpus all:指定使用所有GPU资源
  • -it:分配一个虚拟终端并运行交互式命令行,以便查看运行中的进程,并能够与容器进行交互
  • -v /home/yanglibing/:/home/yanglibing/:将主机目录 /home/yanglibing/ 挂载到容器的 /home/yanglibing/ 目录下
  • -v /home/public/:/home/public/:将主机目录 /home/public/ 挂载到容器的 /home/public/ 目录下
  • finglm5:v1.0:指定使用的Docker镜像名称及版本号
  • bash:在容器中运行Bash shell命令行。

image-20231107135401890

容器内部执行

使用docker exec命令,你可以在运行中的Docker容器内部执行任意的命令。

当你运行docker exec命令时,Docker会执行以下操作:

  • 在指定的容器内部执行指定的命令。
  • 可以使用交互模式(-it选项)或后台模式(默认)运行命令。
  • 不会创建新的容器实例,而是在已存在的容器中添加新的执行环境。

如果你有一个名为my-container的容器,并且想要在其中执行ls命令来列出容器内的文件和目录,你可以运行以下命令:

docker exec my-container ls

你还可以使用-it选项以交互模式运行命令,就像在终端中一样。例如:

docker exec -it my-container bash

这将在my-container容器内部启动一个交互式的Bash会话。

举个栗子

我要用hexo来部署博客,但是我懒得配置环境,那么我就可以选择Docker免去安装环节。

docker pull spurin/hexo

https://hub.docker.com/r/spurin/hexo

这是一个别人已经发布的docker image,我把它拉下来。

使用docker create命令创建Docker容器:

docker create --name=hexo-blog\
-e HEXO_SERVER_PORT=4000 \
-e GIT_USER="Your Name" \
-e GIT_EMAIL="your.email@domain.tld" \
-v /blog/domain.com:/app \
-p 4000:4000 \
spurin/hex

其中,

--name=hexo-blog:通过--name选项指定了容器的名称。容器名称用于唯一标识容器实例。

-p 4000:4000:通过-p选项将主机的端口4000映射到容器的端口4000。这样,可以通过主机的4000端口访问容器内运行的应用程序。

-v /blog/domain.com:/app:通过-v选项将主机上的目录/blog/domain.com挂载到容器内的/app目录。这意味着主机上的/blog/domain.com目录中的文件将在容器内的/app目录中可见和可访问。

-e HEXO_SERVER_PORT=4000:通过-e选项设置了环境变量HEXO_SERVER_PORT的值为4000。这个环境变量能在容器内的应用程序中使用。

Docker,启动!!!!:

docker start hexo-blog

image-20230929224627495

可以看到启动后的docker里面有了个linux一样的目录,app目录下把本地的文件夹挂载进了容器里面。

可以通过docker正常使用hexo了。

image-20230929224928569

进入

docker exec -it hexo-blog bash

通过容器执行内部命令

docker exec -it hexo-blog hexo g 
  • docker exec:这是Docker命令的一部分,用于在运行中的容器内部执行命令。
  • -it:这是docker exec命令的选项之一,用于以交互模式运行命令并分配一个伪终端(pseudo-TTY)。这使得在容器内部执行命令时可以进行交互式的输入和输出。
  • hexo-blog:这是容器的名称或容器ID。通过指定容器名称或ID,docker exec命令可以确定要在哪个容器内部执行命令。
  • hexo g:这是要在容器内部执行的命令。在这个例子中,hexo g是一个命令行命令,它将在容器内部运行Hexo命令行工具的generate命令(简写为g)。这里可以是任意在容器中能使用的命令

Docker的常用命令

  1. 镜像相关命令:
    • docker images:列出本地所有的镜像。
    • docker pull <镜像名>:从容器注册中心(如Docker Hub)下载指定的镜像。
    • docker push <镜像名>:将本地的镜像推送到容器注册中心。
    • docker rmi <镜像名>:删除指定的镜像。
  2. 容器相关命令:
    • docker ps:列出当前正在运行的容器。
    • docker ps -a:列出所有的容器,包括停止运行的容器。
    • docker run <镜像名>:创建并运行一个新容器。
    • docker start <容器ID或名称>:启动一个已经创建的容器。
    • docker stop <容器ID或名称>:停止一个正在运行的容器。
    • docker rm <容器ID或名称>:删除一个已经停止的容器。
    • docker exec -it <容器ID或名称> <命令>:在运行的容器中执行指定命令。
  3. 日志和查看命令:
    • docker logs <容器ID或名称>:查看容器的日志输出。
    • docker inspect <容器ID或名称>:查看容器的详细信息,包括IP地址、端口映射等。
    • docker stats:实时显示运行容器的资源使用情况。
  4. 构建和管理镜像命令:
    • docker build -t <镜像名> <Dockerfile路径>:根据Dockerfile构建一个新的镜像。
    • docker tag <现有镜像名> <新镜像名>:为现有镜像添加一个标签。
    • docker commit <容器ID或名称> <新镜像名>:根据容器创建一个新的镜像。

可以使用docker --help命令查看完整的Docker命令列表和帮助信息。

构建自己的Docker 镜像

Dockerfile

构建Docker镜像的主要步骤是编写一个称为Dockerfile的文本文件,并使用Docker命令来执行构建过程。

Dockerfile是一个文本文件,其中包含了一组用于创建Docker镜像的指令。通过Dockerfile文件,可以指定该镜像的基础镜像、运行的命令和环境变量、需要暴露的端口和数据卷等等。使用Dockerfile可以方便地、可重复地生成Docker镜像,并且可以通过版本控制系统进行管理。

下面是一个简单的Docker镜像构建的示例流程:

  1. 创建一个空目录,作为构建上下文(build context)。
  2. 在该目录下创建一个名为Dockerfile的文本文件。
  3. 使用文本编辑器打开Dockerfile文件,并按照以下格式编写构建指令:
# 基础镜像
FROM <基础镜像>

# 设置工作目录
WORKDIR /app

# 复制应用程序文件到容器中
COPY <本地文件路径> <容器目标路径>

# 安装应用程序依赖
RUN <命令>

# 暴露容器端口
EXPOSE <端口号>

# 定义容器启动时执行的命令
CMD <命令>

在上述Dockerfile中,你需要替换以下内容:

  • <基础镜像>:选择适合你应用程序的基础镜像,例如ubuntu:latestnode:14
  • <本地文件路径>:指定本地应用程序文件的路径。这可以是单个文件或整个目录。
  • <容器目标路径>:指定将文件复制到容器中的目标路径。
  • <命令>:在构建过程中需要执行的命令,例如安装软件包、运行脚本等。
  • <端口号>:将容器内的端口映射到主机上的端口,以便访问应用程序。
  1. 保存并关闭Dockerfile文件。
  2. 在终端中,使用cd命令切换到包含Dockerfile的目录。
  3. 执行以下命令来构建Docker镜像:
docker build -t <镜像名> .

在上述命令中,你需要替换<镜像名>为你想要给镜像命名的名称,可以是任何合法的名称。.表示构建上下文的路径,这里指的是当前目录。

  1. Docker将根据Dockerfile中的指令执行构建过程,并下载所需的基础镜像、复制文件、执行命令等。构建过程可能需要一些时间,具体取决于镜像大小和指令复杂性。
  2. 构建完成后,可以使用docker images命令查看已构建的镜像列表,找到刚才构建的镜像。

举个栗子

FROM nvcr.io/nvidia/pytorch:20.12-py3 #基础镜像
# 如有安装其他软件的需求
#RUN apt-get update && apt-get install curl

# 复制代码到镜像仓库
COPY training /training

# 指定工作目录
WORKDIR /training

# 如果安装其他python包的情况
RUN pip3 install -r requirements.txt --index-url=http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com

# 容器启动运行命令
CMD ["bash", "run.sh"]

保存容器为镜像

在容器中对于基础的镜像做了一些修改,比如说你用pip,apt等更新了容器中的环境,但一旦这个容器销毁了就这些更改就不复存在了,需要使用 docker commit 命令将容器保存成镜像文件,步骤如下:

  1. 先列出你运行的容器的 ID:docker ps

  2. 然后用 docker commit 命令将它保存成镜像文件,示例:

    docker commit <容器ID> <镜像仓库>:<镜像标签>
    

    其中,容器 ID 可以是部分ID用于识别一个唯一的容器名称。例如:docker commit a29f87bf82ac my-image:v1.0

  3. 镜像保存完成后,可以使用 docker images 确认该镜像已被保存下来。

注意:使用 docker commit 命令创建的镜像可能包含敏感数据,强烈建议保存之前删除不必要的文件和信息。

image-20231107133525967

image-20231107142221522

之后你就可以在更新后的镜像上构建新的容器。

通过Docker Hub在不同的电脑同步镜像

要在不同的计算机之间同步 Docker 镜像,你可以使用 Docker Hub 进行操作。

  1. 创建 Docker Hub 账户:如果你还没有 Docker Hub 账户,首先需要在 Docker Hub 网站(https://hub.docker.com/)上创建一个账户。

  2. 在本地计算机上登录到 Docker Hub:使用 Docker 客户端登录到 Docker Hub。在终端或命令提示符中运行以下命令:

    docker login
    输入你的 Docker Hub 用户名和密码进行登录。
    
  3. 推送镜像到 Docker Hub:在本地计算机上构建或获取你想要同步的 Docker 镜像。确保这些镜像已经被正确地打标签,以便能够识别它们。然后,使用以下命令将镜像推送到 Docker Hub:

    docker push <镜像名称>`<镜像名称>` 替换为你要推送的镜像的名称。
    

    image-20231107231820222

  4. 在另一台计算机上拉取镜像:在你想要同步镜像的另一台计算机上,使用以下命令从 Docker Hub 拉取镜像:

    docker pull <镜像名称>`<镜像名称>` 替换为你要拉取的镜像的名称。
    

需要注意镜像名称是有要求的!!!!

  • 镜像名称由三部分组成:你的用户名,仓库名称和标签。仓库名称和标签使用冒号(:)分隔。例如:repository:tag。用户名用于标识镜像的来源或归属。
  • 仓库名称可以包含小写字母、数字、下划线(_)、句点(.)和连字符(-)。它们可以是一个或多个单词的组合。仓库名称通常是用来标识镜像的来源或归属。
  • 标签是可选的,并且用于识别具体的镜像版本或变体。标签可以是任何字符串,但推荐使用字母、数字和连字符。常见的标签包括版本号、日期或者特定的描述性信息。
  • 镜像名称必须是唯一的。每个镜像在 Docker Hub 上都必须有一个独特的名称。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值