夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术文档

  • GitHub技巧

  • 博客搭建

  • Ajax

  • Vite

  • Vitest

  • Nuxt

  • UI库文章

  • Docker

    • 基础
      • Docker 架构
        • Docker 资源
        • 镜像加速源
      • 对镜像的基础操作
        • 获取当时所有镜像(docker images)
        • 拉取镜像(docker pull)
        • 删除镜像(docker rmi)
        • 加载镜像(docker run)
      • 与容器进行交互
        • 查看容器(docker ps)
        • 启动和关闭容器
        • 操作后台容器
        • 删除容器(docker rm)
        • 容器制作成镜像
  • 技术
  • Docker
夜猫子
2023-04-06
目录

基础

还不错的教程 Docker 快速入门 (opens new window),查漏补缺推荐 Docker — 从入门到实践 (opens new window)

# Docker 架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

Docker 面向对象
容器(软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器) 对象
镜像(可以理解为软件安装包,可以方便的进行传播和安装) 类

img

概念 说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com (opens new window)) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

# Docker 资源

  • Docker 官方主页: https://www.docker.com (opens new window)
  • Docker 官方博客: https://blog.docker.com/
  • Docker 官方文档: https://docs.docker.com/
  • Docker Store: https://store.docker.com (opens new window)
  • Docker Cloud: https://cloud.docker.com (opens new window)
  • Docker Hub: https://hub.docker.com (opens new window)
  • Docker 的源代码仓库: https://github.com/moby/moby
  • Docker 发布版本历史: https://docs.docker.com/release-notes/
  • Docker 常见问题: https://docs.docker.com/engine/faq/
  • Docker 远端应用 API: https://docs.docker.com/develop/sdk/

# 镜像加速源

镜像加速器 镜像加速器地址
Docker 中国官方镜像 https://registry.docker-cn.com
DaoCloud 镜像站 http://f1361db2.m.daocloud.io
Azure 中国镜像 https://dockerhub.azk8s.cn
科大镜像站 https://docker.mirrors.ustc.edu.cn
阿里云 https://ud6340vz.mirror.aliyuncs.com
七牛云 https://reg-mirror.qiniu.com
网易云 https://hub-mirror.c.163.com
腾讯云 https://mirror.ccs.tencentyun.com
"registry-mirrors": ["https://registry.docker-cn.com"]
1

1.png

# 对镜像的基础操作

# 获取当时所有镜像(docker images)

docker image ls
# 或者
docker images
1
2
3
标签 含义
REPOSITORY 镜像所在的仓库名称
TAG 镜像标签
IMAGEID 镜像ID
CREATED 镜像的创建日期(不是获取该镜像的日期)
SIZE 镜像大小

# 拉取镜像(docker pull)

除了使用官方的镜像外,我们还可以在仓库中申请一个自己的账号,保存自己制作的进行,或者拉去使用他人的镜像。

# 官方镜像
docker image pull 镜像名称 
# 或简写为 
docker pull 镜像名称
# 比如
docker pull ubuntu
docker pull ubuntu:16.04

# 个人镜像
docker pull 仓库名称/镜像名称
docker pull xunmi/django

# 第三方仓库拉去
docker pull 第三方仓库地址/仓库名称/镜像名称
docker pull hub.c.163.com/library/mysql:latest
(默认仓库名为library,所有从官方获取镜像相当于`sudo docker image pull library/镜像名称`)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 删除镜像(docker rmi)

docker image rm 镜像名或镜像ID 或 docker rmi 镜像名或镜像ID
docker image rm hello-world
docker rmi 9e64176cd8a2
1
2
3

几条删除命令的区别

  • docker rm: 删除一个或多个 容器
  • docker rmi: 删除一个或多个 镜像
  • docker prune: 用来删除不再使用的 docker 对象

# 加载镜像(docker run)

因为镜像只是一个只读类型的文件,而我们的环境不可能只是一个这样的文件,所以我们需要把这个镜像加载成我们的环境,也就是让他变成容器。

docker run [可选参数] 镜像名 [向启动容器中传入的命令]	
1
常用可选参数 作用
-i 表示以《交互模式》运行容器。
-d 会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name 为创建的容器命名。(默认会随机给名字,不支持中文字符!!!)
-v 表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p 表示端口映射,即宿主机端口:容器中端口。 比如:-p 8080:80 就是将容器中的80端口,映射到主机中的8080端口
–network=host 表示将主机的网络环境映射到容器中,使容器的网络与主机相同。每个 Docker 容器都有自己的网络连接空间连接到虚拟 LAN。使用此命令则会让容器和主机共享一个网络空间。

可以启动一个系统docker run -i -d -t --name=kali-test kalilinux/kali-rolling(这里我使用linux的一个发行版kali作为介绍) 或可以简写为docker run -idt --name=kali-test kalilinux/kali-rolling

笔记

PS: 如果加载一个我们没有的镜像,docker会自动从官方仓库中进行拉去。

或者我们可以启动一个网站docker run -dp 8080:80 --name docker-test docker/getting-started

如果你没有下载docker/getting-started的进行,这里会自动帮你下载。

# 与容器进行交互

上面我们成功将镜像变成了容器,但上述的命令中我们都加入了-d,让容器在后台运行了。下面我们就来讲如何和正在运行的容器进行交互。

# 查看容器(docker ps)

查看容器主要会用到ps命令

# 查看当前所有正在运行的容器
docker ps
# 查看当前所有的容器
docker ps -a
# 使用过滤器(除了name外,常用的还可以指定id:id= 、所有停止的容器:status=exited,正在运行的容器:status=running 等)
docker ps -f name=指定的名字
# 显示2个上次创建的容器(2可以改变)
docker ps -n 2
# 显示最新创建的容器(包括所有状态)
docker ps -l
# 仅显示ip
docker ps -q
 # 显示容器大小
docker ps -s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
标签 含义
CONTAINER ID 镜像ID
IMAGE 创建容器的镜像名称
COMMAND 默认启动命令(启动时会自动执行)
CREATED 创建容器的日期
STATUS 当前的状态(启动了多久,多久之前退出等)
PORTS 映射的端口
NAMES 容器的名称
SIZE 容器大小(使用-s命令参数时才能看到)

# 启动和关闭容器

# 停止容器
docker container stop 容器名或容器id
# 或可简写为
docker stop 容器名或容器id

# 强制关闭容器
docker container kill 容器名或容器id
# 或可简写为
docker kill 容器名或容器id

# 启动容器
docker container start 容器名或容器id
# 或可简写为
docker start 容器名或容器id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • 如果我们成功启动或者关闭一个容器的话,会返回容器名或者容器id
  • stop和kill的区别: stop是比较优雅的关掉一个容器,类似我们正常退出一个软件,而kill是当一个进程出现意外无法正常关闭的时候,我们强行进行关闭,有点像我们使用任务管理器进行结束进程操作

# 操作后台容器

首先我们确保我们要进入的容器是开启状态的,使用docker ps -a查看其中的STATUS属性是否是Up开头,如果不是先照着上面启动容器的方法开启容器 我们开启容器后,如果需要在容器内执行命令,可以将后台切换到前台,也可能使用docker命令将我们需要执行的命令传入。 操作方法有很多种,这里我们介绍一些比较常用的方法

# 如果我只需要执行简单的一两条命令可以使用docker exec
# 执行单条命令 (-i: 启动并且保留交互式命令行; -t:作用是分配一个虚拟的终端; docker run )
docker exec -it 容器名或容器id 执行的命令
# 比如
docker exec -it kali-test whoami
# 用这种方法,我们还可以启动命令行,根据Linux的特性,系统程序会在/bin中,linux中常用的Shell有多个,其中大部分用的Linux默认的为bash
# 所以我们启动命令可以自行如下命令(除了/bin/bash外,linux一般还会带/bin/sh、/bin/rbash、/bin/dash等,具体区别可以自行百度)
docker exec -it 容器名或容器id /bin/bash
# 比如
docker exec -it kali-test /bin/bash
# 除了exec外还有attach可以使用,但它有个弊端,多终端启动attach后,都会会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
docker attach 容器名或容器id
# 比如
docker attach kali-test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
exec可选参数 作用
-d 会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
-e 设置环境变量
-i 表示以《交互模式》运行容器。
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-u 设置用户名和UID。
-w 设置容器内的工作目录。

# 删除容器(docker rm)

如我我们需要删除一个容器,首先需要确保这个容器已经停止了,因为正在运行的容器是无法直接删除。 我们可以运行一下docker ps -a,如果发现没有停止,可以使用docker stop停止(STATUS下已Exited开头则是停止的)

# 使用rm删除容器
docker rm 容器名或容器id
# 列如
docker rm docker-test
1
2
3
4

# 容器制作成镜像

我们为什么要把容器制作成镜像?

  • 镜像可以看作为是一种备份,如果我们后期环境出现了问题,可以还原到早期镜像。
  • 镜像便于传播,可以让自己的其他设备或他人的重复利用变得更加简单容易。
# 将容器制作成镜像
docker commit 容器名 镜像名
# 镜像打包备份(打包备份的文件会自动存放在当前命令行的路径下,如果想让保存的文件可以打开,可以加.tar后缀)
docker save -o 保存的文件名 镜像名
# 镜像解压
docker load -i 文件路径/备份文件
1
2
3
4
5
6

我们将打包备份的镜像可以通过网络发送到其他设备上,使用docker镜像解压即可直接使用你的环境。

编辑 (opens new window)
上次更新: 2023/8/22 19:22:36
antDesignVue

← antDesignVue

最近更新
01
IoC 解决了什么痛点问题?
03-10
02
如何调试 Nest 项目
03-10
03
Provider注入对象
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式