Python3 - 深入学习Docker容器管理

Posted 韩俊强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 - 深入学习Docker容器管理相关的知识,希望对你有一定的参考价值。

文章目录


学习目标:

本篇博文意在学习Docker原理, 深入理解docker容器管理, 镜像管理, 学会自定义镜像Dockerfile, 以及部署项目全流程, 灵活掌握Dockerfile关键字; 目标人群适合有一定的Python基础和Linux基础的人群。

篇幅较长, 大约需要10分钟, 实践大约需要4h, 大家根据自己的需要来学习~

声明: 本篇博文为作者原创, 未经作者允许请勿转载!

一、Docker简介

1.1 为什么选择docker?

1.1.1 docker更高效的利用系统资源

容器不需要进行硬件虚拟化以及进行一个完整操作系统的额外开销, docker对系统资源的利用率更高, 无论是应用执行, 文件存储, 还是在内存消耗等方面, 都比传统的虚拟机更高效。因为一个同样配置的主机, 可以运行处更多数量的容器实例。

1.1.2 更快的启动时间

传统的虚拟机启动时间长, docker容器则是直接运行在宿主机的内核上, 无需启动一个完整的操作系统, 因此可以达到秒级启动, 大大解决开发, 测试, 部署的时间。

1.1.3 持续交付和部署

对于开发和运维人员, 最关心的环境部署迁移别处的问题, 利用docker可以定制镜像, 以达到持续集成, 持续交付和部署。通过Dockerfile来进行镜像构建, 系统集成测试, 运维进行环境部署。且Dockerfile可以使镜像构建透明化, 方便技术团队快速理解运行环境部署的流程。

1.1.4 更轻松的迁移

Docker可以在很多平台上运行, 无论是物理机, 虚拟机, 云服务器等环境, 运行结果都是一致的。用于可以轻松将一个平台的应用, 迁移到另外一个平台, 而不用担心环境的变化, 导致程序无法运行。

1.2 Docker能做什么?

  • 可以把应用程序及运行依赖环境打包成镜像, 作为交付介质, 在各环境中部署
  • 可以将镜像(image)启动成为容器(container), 并且提供多容器的生命周期进行管理(启、停、删)
  • container容器之间相互隔离, 且每个容器可以设置资源限额
  • 提供轻量级虚拟化功能, 容器就是在宿主机中的一个个虚拟的空间, 彼此相互隔离, 完全独立

1.3 Docker最核心的组件

  • image镜像, 构建容器 (我们将程序运行所需的环境, 打包为镜像文件)

  • Container, 容器 (你的应用程序, 就跑在容器中)

  • 镜像仓库 (保存镜像文件, 提供上传, 下载镜像) 作用好比github

  • Dockerfile, 将你部署项目的操作,写成一个部署脚本, 这就是dockerfile, 且该脚本还能构建出镜像文件

    • FROM 定义基础镜像
    • MAINTAINER 作者
    • RUN 运行Linux命令
    • ADD 添加文件/目录
    • ENV 环境变量
    • CMD 运行进程

    创建容器的过程

    • 获取镜像, 如: docker pull centos, 从镜像仓库拉取
    • 使用镜像创建容器
    • 分配文件系统, 挂载一个读写层, 在读写层加载镜像
    • 分配网络/网桥接口, 创建一个网络接口, 让容器和宿主机通信
    • 容器获取IP地址
    • 执行容器命令, 如: /bin/bash
    • 反馈容器启动结果

二、Docker安装部署

提前准备好一个宿主机(VMware去创建一个linux机器, 然后安装docker去使用)

2.1 基础环境配置

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum clean all

yum makecache

yum install -y bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix htop iftop iotop unzip telnet sl psmisc nethogs glances bc ntpdate openldap-devel

2.2 安装docker

2.2.1 docker必须安装在centos7平台, 内核不低于3.10

uname -r # 3.10.0-1160.59.1.el7.x86_64

sudo yum -y upgrade  # 更新yum源

2.2.2 开启linux内核的流量转发

# 写入
cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward=1
EOF

2.2.3 重新加载内核参数

modprobe br_netfilter # 如果下面的命令报错, 先执行此条命令
sysctl -p /etc/sysctl.d/docker.conf

要保持本地软件源较新, 可以用阿里云yum源更新软件

2.2.4 安装docker-ce社区版

利用yum快速安装docker

# 提前配置yum仓库
# 1.阿里云自带仓库 2.阿里云提供的docker专属repo仓库

curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

## 更新yum缓存并重新缓存
yum clean all && makecache

## 查看源中可用版本
sudo yum list docker-ce --showduplicates | sort -r

## 如果需要安装旧版本
sudo yum install -y docker-ce-18.09.9

## yum 安装
sudo yum install docker-ce-20.10.6 -y

## 查看docker版本
rpm -qa | grep docker

## 如果要卸载
sudo yum remove docker-xxxx-centos.x86_64
 
[harry@iZ8vbbip4bxxx60rxxuZ ~]$ rpm -qa | grep docker
docker-scan-plugin-0.17.0-3.el7.x86_64
docker-ce-cli-20.10.14-3.el7.x86_64
docker-ce-20.10.6-3.el7.x86_64
docker-ce-rootless-extras-20.10.14-3.el7.x86_64

## 尝试启动docker

2.2.5 镜像加速器

使用docker受邀操作就是获取镜像文件, 默认下载是从Docker Hub下载, 网速很慢, 国内很多云服务商都提供了加速器服务, 阿里云加速器, Daocloud加速器, 灵雀云加速器等。

### 检查是否有这个文件, 没有就创建一个
### vim /etc/docker/daemon.json
### 写入

  "registry-mirrors": [
    "https://8xpk5wnt.mirror.aliyuncs.com"
  ]


### 启动docker
systemctl daemon-reload
systemctl enable docker
systemctl restart docker

### 查看docker是否正确安装

[harry@iZ8xxx4bq97z0o60rq3uZ ~]$ sudo docker version
[sudo] password for harry: 
Client: Docker Engine - Community
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 24 01:49:57 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.6
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       8728dd2
  Built:            Fri Apr  9 22:43:57 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.11
  GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
[harry@iZ8vbbipxxx0o60rq3uZ ~]$ 

三、启动第一个docker容器

3.1 docker流程示意图

# 1.获取镜像
# 2.运行镜像, 生成容器, 你想要的容器, 就运行在容器中

以往需求: nginx web服务器, 运行出一个80端口的网站

# 在宿主机上, 运行nginx
1.开启服务器
2.在服务器上安装好运行nginx所需的依赖关系
3.安装nginx yum install nginx -y
4.修改nginx配置文件
5.启动nginx
6.客户端去访问nginx

比较耗时~~

如果让你用docker运行nginx, 该怎么玩?

3.2 Docker运行nginx

1.获取镜像, 获取是从你配置好的docker镜像中, 去拉取nginx镜像
# 先搜索一下, 镜像文件, 是否存在
docker search nginx
# 拉取, 下载镜像
docker pull nginx
# 查看本地的docker镜像都有哪些
[harry@iZ8vbbxxxz0o60rq3uZ ~]$ sudo docker image ls -a
REPOSITORY       TAG         IMAGE ID       CREATED        SIZE
jupyter-centos   1.0         2aeba7cbf80d   2 days ago     658MB
star7th/showdoc  latest      e06fda0e7caa   9 days ago     589MB
nginx            latest      605c77e624dd   2 months ago   141MB

# 删除镜像的命令
sudo docker rmi 镜像id

# 运行该nginx镜像, 运行出具体的容器, 然后这个容器中就跑着一个nginx服务了
# 运行镜像的命令, 参数如下
docker run 参数   镜像的名字/id

# -d 后台运行容器
# -p 80:80 端口映射, 宿主机端口:容器内端口, 访问宿主机端口也就访问到容器内的端口
sudo docker run -d -p 80:80 nginx

# 查看端口
 netstat -tunlp

# 运行结果如下, docker run命令, 会返回一个容器id
[harry@iZ8vbbxxx60rq3uZ ~]$ sudo docker run -d -p 80:80 nginx
c526cbb32432532be79218480fba837a0e88a2e9756de510fa19b10e3236500f

# 此时可以访问宿主机的80端口, 查看到容器内的80端口的应用是什么了
# 查看正在运行的容器
sudo docker ps

[harry@iZ8vbbip4bq97z0o60rq3uZ ~]$ sudo docker ps
CONTAINER ID   IMAGE    COMMAND     CREATED      STATUS   PORTS          NAMES
c526cbb32432   nginx   "/dock"   18 seconds ago   Up 12 seconds 80/tcp, 0.0.0.0:80->80/tcp, :::80->80/tcp    mystifying_ganguly

# 可以尝试停止容器
sudo docker stop 容器id
# 停止具体的容器进程
sudo docker stop c526cbb32432

[harry@iZ8vbbixxx7z0o60rq3uZ ~]$ sudo docker stop c526cbb32432
c526cbb32432

# [harry@iZ8vxxxz0o60rq3uZ ~]$ sudo docker start 3599e7f5d321
3599e7f5d321

3.3 端口映射示意图

四、docker生命周期

学习docker的核心要素、搞明白、镜像image、容器!

4.1 详细图解:

五、彻底学明白, docker镜像的原理

5.1 分层拉取镜像

我们在获取redis镜像的时候, 发现是下载了多行信息, 最终又得到了一个完整的镜像文件

[harry@iZ8vbbip4bq97z0o60rq3uZ ~]$ sudo docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

5.2 利用docker获取不同发行版镜像

快速实践, 使用docker, 来切换不同的发行版, 内核使用的都是宿主机的内核:

# 查看系统的两大部分 宿主机Centos内核+上层发行版
[harry@iZ8vbxxxx60rq3uZ ~]$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[harry@iZ8vxxx7z0o60rq3uZ ~]$ 
[harry@iZ8vxxx4z0o60rq3uZ ~]$ uname -r
3.10.0-1160.59.1.el7.x86_64
# 利用docker获取不同发行版镜像
docker pull centos:7.8.2003

docker pull ubuntu

# 确认当前的宿主机发行版
[harry@iZ8xxx7z0o60rq3uZ ~]$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

# 运行centos7.8.2003发行版
# 运行容器, 且进入容器内
# 参数 解释 
# -i 交互式命令操作 
# -t 开启一个终端 
# afb6fca791e0 镜像的id
# bash bash解释器
[harry@iZ8vbbip4bq97z0o60rq3uZ ~]$ docker run -it afb6fca791e0 bash
root@0o60rq3uZ: /#
root@0o60rq3uZ: /# cat /etc/redhat-release 
CentOS Linux release 7.8.2003 (Core)

# 想玩玩Ubuntu
# 直接去获取Ubuntu镜像即可
[harry@iZ8vbbxxx0o60rq3uZ ~]$ sudo docker run -it ubuntu bash
root@wqdf24s1e212131: /#
root@wqdf24s1e212131: /#
# 查看容器内的发行版
root@wqdf24s1e212131: /# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.4
DISTRIB.CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"

图解以上操作:

总结:

1.一个完整的系统, 是由linux的内容+发行版, 才组成了一个可以使用的完整的系统

2.利用docker容器, 可以获取不同的发型版镜像, 然后基于该镜像, 运行出各种容器去使用

5.3 docker具体解决了什么问题

一个工程师, 写代码, mysql, etcd, redis, elk 等等…在机器上, 直接安装了这些工具, win mac

5.4 理解什么是docker镜像

docker images搜索地址: https://hub.docker.com/_/centos?tab=tags&page=1&ordering=last_updated

1、一个完整的docker镜像可以创建出docker容器的运行, 例如一个centos:7.8.2003镜像文件, 我们获取的是centos7这个版本, 这个镜像文件是不包含linux内核的

[harry@iZ8xxxz0o60rq3uZ ~]$ sudo docker images
REPOSITORY     TAG       IMAGE ID       CREATED        SIZE
nginx          latest    605c77e624dd   3 months ago   141MB
redis          latest    7614ae9453d1   3 months ago   113MB
centos         7         eeb6ee3f44bd   6 months ago   204MB

docker的架构, 镜像就是一个 [发行版] 的作用, 你需要准备好一个linux内核, 然后上层使用不同的 [发行版] 就好了, 这样你就可以自由的使用各种版本系统, 兼容多种环境。

5.5 Docker 镜像的原理学习(一)

图解注释:

5.6 Docker 镜像原理学习(二)

# 进入到正在运行的容器内(nginx), 命令是 docker exec
[harry@iZ8vbbixxxx0o60rq3uZ ~]$ sudo docker exec -it 3599e7f5d321 bash
root@3599e7f5d321:/# 

root@3599e7f5d321:/# cat /etc/os-release  
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@3599e7f5d321:/# 

5.7 Docker为什么分层镜像

镜像分享一大好处就是共享资源, 例如有多个镜像都来自于同一个base镜像, 那么在docker host只需要存储一份base镜像。

内存里也只需要加载一份host, 即可为多个容器服务。

即使多个容器共享一个base镜像, 某个容器修改了base镜像的内容, 例如修改/etc/下配置文件, 其他容器的/etc/下内容是不会被修改的, 修改动作只限制在某个容器内, 这就是容器的写入时复制性特性(Copy-on-write)。

5.8 可写的容器层

当容器启动后, 一个新的可写层被加载到镜像的顶部, 这一层通常被称为容器层, 容器层下的都称为镜像层。

所有容器的修改动作, 都只会发生在容器层里, 只有容器层是可写的, 其余镜像层都是只读的。

文件操作说明
添加文件在容器中创建文件时, 新文件被添加到容器层中。
读取文件在容器中读取某个文件时, Docker会从上往下依次在各镜像层中查找此文件。一旦找到, 立即将其复制到容器层, 然后打开并读入内存。
修改文件在容器中修改已存在的文件时, Docker会从上往下依次在各个镜像层中查找此文件。一旦找到, 立即将其复制到容器层, 然后修改之。
删除文件在容器中删除文件时, Docker也是从上往下依次在镜像层中查找此文件。找到后, 会在容器层中记录下删除操作。(只是记录删除操作)

只有当需要修改时才赋值一份数据, 这种特性被称作Copy-on-Write。可见, 容器层保存的镜像变化的部分, 不会对镜像本身进行任何修改。

这样就解释了我们前面提出的问题: 镜像层记录对镜像的修改, 所有镜像层都是只读的, 不会被容器修改, 所以镜像可以被多个容器共享。

六、Docker镜像的实际使用学习

日常开发中, 需要安装很多第三方工具, 比如etcd, kafka等

开发机器: mac, windows, 我又不想搞乱当前机器的环境

mac装一个nginx, 二进制安装, 编译安装, brew install nginx…

1.下载安装docker工具

2.获取该软件的docker镜像(你以后想要用的各种工具, 基本上都能够搜索到合适的镜像去用)

nginx镜像docker pull nginx

3.运行该镜像, 然后就启动了一个容器, 这个nginx服务就运行在容器中

4.停止容器, 删除该镜像, ok, 你的电脑上, 就好像没有使用过nginx一样

类似沙箱一样的环境

基于镜像的增、删、改、查维护

6.1 获取镜像

6.1.1 从dockerhub获取镜像

6.1.2 本地镜像导出、导入

6.1.3 从私有部署获取镜像

# 1.获取镜像, 镜像与欧冠仓库, 好比yum源一样
# 默认的docker仓库, dockerhub, 有大量的优质镜像, 以及用户自己上传的镜像, centos容器中安装 vim nginx ... 提交为镜像, 上传到dockerhub

docker search 镜像名:tag  # tag就是具体的标题版本

docker search centos

# 查看本地的镜像文件有哪些
[harry@iZ8vbbbq97z0o60rq3uZ ~]$ sudo docker images
[harry@iZ8vbbbq97z0o60rq3uZ ~]$ sudo docker image ls

# 下载docker镜像
docker pull centos  # 默认的是 centos:latest
docker pull centos:7.8.2003

# 查看docker镜像的存储路径
Docker Root Dir: /var/lib/docker

[harry@iZ7z0o60rq3uZ ~]$ sudo ls /var/lib/docker/image/overlay2/imagedb/content/sha256/ -l
total 44
-rw------- 1 root root  7656 Mar 29 20:40 605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
-rw------- 1 root root  7700 Mar 29 21:34 7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631
-rw------- 1 root root 23304 Mar 23 14:51 e06fda0e7caa83f226f077d7f2b6a419c1a03e91af31ee7fe23a6482534fe146
-rw------- 1 root root  2754 Mar 27 19:10 eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9

[harry@iZ8vo60rq3uZ ~]$ sudo cat /var/lib/docker/image/overlay2/imagedb/content/sha256/605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85

# 该文件作用是
记录 镜像 和 容器 的配置关系
# 使用不同的镜像, 生成容器
# -it 开启一个交互式的终端 --rm 容器退出时删除该容器
[harry@iZ897z0o60rq3uZ ~]$ sudo docker run -it --rm centos:7.8.2003 bash

[root@dc1ef93a01be /]# cat /etc/redhat-release 
CentOS Linux release 7.8.2003 (Core)

# 如何查看centos的标签信息
https://hub.docker.com/_/centos

6.2 查看镜像

[harry@iZ8vbq97z0o60rq3uZ ~]$ sudo docker images
REPOSITORY    TAG        IMAGE ID       CREATED         SIZE
star7th/showdoc  latest  e06fda0e7caa   9 days ago      589MB
nginx         latest     605c77e624dd   3 months ago    141MB
redis         latest     7614ae9453d1   3 months ago    113MB
centos        7          eeb6ee3f44bd   6 months ago    204MB
centos        7.8.2003   afb6fca791e0   23 months ago   203MB

# 查看具体的镜像
[harry@iZ97z0o60rq3uZ ~]$ sudo docker images nginx
[sudo] password for harry: 
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   3 months ago   141MB

# 可以指定具体tag
[harry@iZ8v0o60rq3uZ ~]$ sudo docker images centos:7.8.2003
REPOSITORY   TAG        IMAGE ID       CREATED         SIZE
centos       7.8.2003   afb6fca791e0   23 months ago   203MB

# 只列出镜像的id
-q --quiet  # 只列出id
[harry@iZ8v60rq3uZ ~]$ sudo docker images -q
e06fda0e7caa
e06fda0e7caa
605c77e624dd
7614ae9453d1
eeb6ee3f44bd
afb6fca791e0

# 格式化显示镜像
# 这是docker的模板语言,  --format
[harry@iZ8bq90rq3uZ ~]$ sudo docker images --format ".ID--.Repository"
e06fda0e7caa--star7th/showdoc
e06fda0e7caa--registry.cn-shenzhen.aliyuncs.com/star7th/showdoc
605c77e624dd--nginx
7614ae9453d1--redis
eeb6ee3f44bd--centos
afb6fca791e0--centos

# 以表格形式显示, 美化
sudo docker images --format "table.ID\\t.Repository\\t.Tag"
[harry@iZ8v60rq3uZ ~]$ sudo docker images --format "table.ID\\t.Repository\\t.Tag"
IMAGE ID       REPOSITORY                                          TAG
e06fda0e7caa   star7th/showdoc                                     latest
e06fda0e7caa   registry.cn-shenzhen.aliyuncs.com/star7th/showdoc   latest
605c77e624dd   nginx                                               latest
7614ae9453d1   redis                                               latest
eeb6ee3f44bd   centos                                              7
afb6fca791e0   centos                                              7.8.2003

# 搜索镜像
# docker search 镜像名
[harry@iZ87z0o60rq3uZ ~]$ sudo docker search centos
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                            The official build of CentOS.                   7082      [OK]       
centos/systemd                    systemd enabled base container.                 107                  [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   92            

6.3 删除镜像

[harry@iZ8vbbip4bq60rq3uZ ~]$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker version >= 1.12

  "registry-mirrors": ["http://f1361db2.m.daocloud.io"]

Success.
You need to restart docker to take effect: sudo systemctl restart docker 

[harry@iZ8vbbo60rq3uZ ~]$ sudo systemctl restart docker 

# 下载
docker pull hello-world

# 根据镜像的 id, 名字, 摘要
docker rmi hello-world
[harry@iZ8vb97z0o60rq3uZ ~]$ sudo docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359

# Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container e2970e766c01 is using its referenced image feb5d9fea6a5
如果出现这个错误, 则先执行下面的命令

# 删除容器记录
docker rm 容器id
[harry@iZ8vb7z0o60rq3uZ ~]$ sudo docker rm e2970e766c01

# 指定id的前三位即可
docker rmi d11

6.4 镜像管理

[harry@iZ8vbb0o60rq3uZ ~]$ sudo docker images -aq
e06fda0e7caa
e06fda0e7caa
605c77e624dd
7614ae9453d1
eeb6ee3f44bd
afb6fca791e0

# 批量删除镜像的用法, rm
# 批量删除镜像, 慎用
sudo docker rmi `docker images -aq`

# 批量删除容器
sudo docker rm `docker ps -aq`

# 导出镜像
# 比如默认运行的centos镜像, 不提供vim功能, 运行该容器后, 在容器内安装vim
# 然后提交该镜像, 再导出该镜像为压缩文件, 可以发给其他人用
# 放在容器管理篇学习
docker commit

# 导出镜像的命令
[root@iZ8vbb0rq3uZ ~]$ sudo docker image save centos:7.8.2003 > /opt/centos7.8.2003.tgz

# 导入镜像的命令
[root@iZ8v0o60rq3uZ ~]$ sudo docker image load -i /opt/centos7.8.2003.tgz
fb82b029bea0: Loading layer [==================================================>]  211.1MB/211.1MB
Loaded image: centos:7.8.2003

# 查看镜像详细信息
# 查看docker服务的信息
docker info
# 查看镜像详细信息
docker image inspect 镜像id
docker image inspect afb

七、Docker容器管理

docker run 等于创建+启动

docker run 镜像名, 如果镜像不存在本地, 则会在线去下载该镜像

**注意: 容器内的进程必须处于前台运行, 否则容器就会直接退出,**自己部署一个容器运行, 命令不得后台运行, 前台运行即可

如果容器内, 什么事儿也没做, 容器也会挂掉。 容器内, 必须有一个进程在前台进行

我们运行nginx基础镜像, 没有运行任何程序, 因此容器直接挂掉

# 运行容器的玩法
# 1.运行一个挂掉的容器 (从错误师范来学docker容器)
docker run centos:7.8.2003
这个写法, 会产生多个独立的容器记录, 且容器内没有程序在跑, 因此挂了
[harry@iZ8vz0o60rq3uZ ~]$ sudo docker run afb6fca791e0
[harry@iZ8vz0o60rq3uZ ~]$  sudo docker run afb6fca791e0
[harry@iZ8vz0o60rq3uZ 以上是关于Python3 - 深入学习Docker容器管理的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器的文件系统管理

Docker学习7-jenkins容器内安装python3

ASP.NET Core on K8S深入学习数据管理

docker学习之路 深入容器

jenkins学习4-进docker容器安装python3环境

jenkins学习4-进docker容器安装python3环境