docker--基本操作

第 1 章 Docker基础

1.1 docker简介
在这一部分我们主要讲两个方面: docker是什么、docker特点

1.1.1 docker是什么

docker是什么?
docker的中文解释是码头工人。
官方解释:
Docker是一个开源的容器引擎,它基于LCX容器技术,使用Go语言开发。
源代码托管在Github上,并遵从Apache2.0协议。
Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker就是一种快速解决生产问题的一种技术手段,开发,运行和部署应用程序的开放管理平台。
开发人员能利用docker 开发和运行应用程序
运维人员能利用docker 部署和管理应用程序
Docker的生活场景对比
在这里插入图片描述
单独的理解一下容器:
在这里插入图片描述

Docker提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。
由于容器的隔离性和安全性,因此可以在一个主机(宿主机)上同时运行多个相互隔离的容器,互不干预

1.1.2为什么使用Docker

Docker使您能够将应用程序与基础架构分开,以便您可以快速交付软件。
借助Docker,您可以像管理应用程序一样管理基础架构。
通过利用Docker的方法快速进行运输,测试和部署代码,您可以显着缩短编写代码和在生产环境中运行代码之间
的延迟。
例如: 开发人员在本地编写代码,可以使用Docker同事进行共享,实现协同工作。
使用Docker开发完成程序,可以直接对应用程序执行自动和手动测试。
当开发人员发现错误或BUG时,可以直接在开发环境中修复后,并迅速将它们重新部署到测试环境进行测试和验
证。
利用Docker开发完成后,交付时,直接交付Docker,也就意味着交付完成。后续如果有提供修补程序或更新,需
要推送到生成环境运行起来,也是一样的简单。
Docker主要解决的问题:
保证程序运行环境的一致性;
降低配置开发环境、生产环境的复杂度和成本;
实现程序的快速部署和分发。

1.1.3Docker的架构与结构

架构图
在这里插入图片描述
Docker是采用了(c/s)架构模式的应用程序
Client dockerCLI :客户端docker命令行
REST API : 一套介于客户端与服务端的之间进行通信并指示其执行的接口
Server docker daemon:服务端dacker守护进程等待客户端发送命令来执行
Docker的四大核心技术
IMAGE-镜像
CONTAINER-容器
DATA VOLUMES-数据卷
NETWORK-网络
结构图
在这里插入图片描述

Docker客户端(Docker Client)

Docker客户端(Docker Client)是用户与Docker进行交互的最主要方式。当在终端输入docker命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client除了连接本地服务端,通过更改或指定
DOCKER_HOST连接远程服务端。

Docker服务端(Docker Server)

Docker Daemon其实就是Docker 的服务端。它负责监听Docker API请求(如Docker Client)并管理Docker对象
(Docker Objects),如镜像、容器、网络、数据卷等

Docker Registries

俗称Docker仓库,专门用于存储镜像的云服务环境.
Docker Hub就是一个公有的存放镜像的地方,类似Github存储代码文件。同样的也可以类似Github那样搭建私有的仓库。

Docker 对象(Docker Objects)

镜像:一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件
等。
容器:镜像被运行起来后的实例。
网络:外部或者容器间如何互相访问的网络方式,如host模式、bridge模式。
数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。

1.1.4官方资料:

Docker 官网:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
Docker 英文文档网址:https://docs.docker.com/
Docker 中文文档网址:http://docker-doc.readthedocs.io/zh_CN/latest/

1.1.4docker特点

三大理念:构建:龙珠里的胶囊,将你需要的场景构建好,装在一个小胶囊里运输:随身携带着房子、车子等,非常方便
运行:只需要你轻轻按一下胶囊,找个合适的地方一放,就ok了
优点:多:适用场景多
快:环境部署快、更新快
好:好多人在用
省:省钱省力省人工

缺点:太腻歪人:依赖操作系统
不善沟通:依赖网络
不善理财:银行U盾等场景不能用

1.2 docker快速入门

1.2.1docker历程:

自2013年出现以来,发展势头很猛,现在可说是风靡全球。
docker的第一版为0.1.0 发布于2013年03月23日
Docker2017年改版前的版本号是1.13.1发布于2017年02月08日
Docker从1.13.x版本开始,版本分为企业版EE和社区版CE,版本号也改为按照时间线来发布,比如17.03就是2017 年3月,有点类似于ubuntu的版本发布方式。企业版自然会提供一些额外的服务,当然肯定也是收费的。企业版说明https://blog.docker.com/2017/03/docker-enterprise-edition/社区版分为stable和edge两种发布方式。
stable版本是季度发布方式,比如17.03, 17.06, 17.09
edge版本是月份发布方式,比如17.03, 17.04…

在这里插入图片描述
注:
Stable:gives you reliable updates every quarter (稳定:给你可靠的每季度更新一次)
Edge:gives you new features every month
(优势:每个月给你新特性)

1.2.2 官方要求

为什么用ubuntu学docker
在这里插入图片描述
图片来源:https://docs.docker.com/engine/installation/#server docker要求的ubuntu环境
在这里插入图片描述
ubuntu下载地址:https://www.ubuntu.com/download/desktop ubuntu主机环境需求

#执行命令
$uname-a
$ls-l/sys/class/misc/device-mapper

在这里插入图片描述
1.2.3 部署docker 官网参考:
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#upgrade-docker-after-using-the-conv enience-script

安装步骤

#安装基本软件
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl softwareproperties-common lrzsz -y
#使用官方推荐源{不推荐}#
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable"
#使用阿里云的源{推荐}
$ sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo aptkey add -
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/dockerce/linux/ubuntu $(lsb_release -cs) stable"
#注:
#可以指定版本安装docker:
$ sudo apt-get install docker-ce=<VERSION> -
#安装docker
$ sudo apt-get install docker-ce -
#软件源升级
$ sudo apt-get update
y
y
#查看支持的docker版本
$ sudo apt-cache madison docker-ce
#测试docker
docker version

网卡区别:

安装前:只有ens33和lo网卡
在这里插入图片描述

1.2.4 docker加速器

在国内使用docker的官方镜像源,会因为网络的原因,造成无法下载,或者一直处于超时。所以我们使用
daocloud的方法进行加速配置。 加速器文档链接:http://guide.daocloud.io/dcs/daocloud-9153151.html
方法:
访问 https://dashboard.daocloud.io 网站,登录 daocloud 账户
在这里插入图片描述

#我们执行这条命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s
http://e5d212cc.m.daocloud.io
#修改daemon.json文件,增加
, "insecure-registries": []
#到大括号后
# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://e5d212cc.m.daocloud.io"], "insecure-registries": []}
#注意:
#docker cloud加速器的默认内容是少了一条配置,所以我们要编辑文件把后面的内容补全
#重启docker
systemctl restart docker

1.2.5 docker 其他简介

docker的基本命令格式:

#基本格式
systemctl [参数] docker
#参数详解:
start 开启服务
stop 关闭
restart 重启
status 状态

删除docker命令:

$ sudo apt-get purge docker-ce -y
$ sudo rm -rf /etc/docker
$ sudo rm -rf /var/lib/docker/

docker基本目录简介:

/etc/docker/ #docker的认证目录
/var/lib/docker/ #docker的应用目录

docker常见bug:
背景
因为使用的是sudo安装docker,所以会导致一个问题。以普通用户登录的状况下,在使用docker images时必须添
加sudo,那么如何让docker免sudo依然可用呢?
理清问题
当以普通用户身份去使用docker命令时,出现以下错误:

Got permission denied while trying to connect to the Docker daemon socket at
unix:///var/run/docker.sock: Post
http://%2Fvar%2Frun%2Fdocker.sock/v1.35/images/create?fromSrc=-&message=&repo=ubuntu-
16.04&tag=: dial unix /var/run/docker.sock: connect: permission denied

可以看都,最后告知我们时权限的问题。那么在linux文件权限有三个数据左右drwxrwxrwx,其中第一为d代表该
文件是一个文件夹前三位、中三位、后三位分别代表这属主权限、属组权限、其他人权限。
在这里插入图片描述

#如果还没有 docker group 就添加一个:
$sudo groupadd docker
#将用户加入该 group 内。然后退出并重新登录就生效啦。
$sudo gpasswd -a ${USER} docker
#重启 docker 服务
$systemctl restart docker
#切换当前会话到新 group 或者重启 X 会话
$newgrp - docker
#注意:最后一步是必须的,否则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,
#所以 docker images 执行时同样有错。
https://blog.csdn.net/u012590718/article/details/125632482?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169864069916800215056200%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169864069916800215056200&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-125632482-null-null.142^v96^control&utm_term=%E4%B9%8C%E7%8F%AD%E5%9B%BE%E5%AE%89%E8%A3%85docker&spm=1018.2226.3001.4187

第 2 章 Docker 核心技术

Docker的核心技术内容很多,我们学习则从以下四个方面来介绍Docker的核心技术 镜像、容器、数据、网络
2.1 docker镜像管理
2.1.1 镜像简介
Docker镜像是什么? 镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环
境变量和配置文件等。 通过镜像可以创建一个或多个容器。
2.1.2 搜索、查看、获取

搜索镜像

#作用
搜索Docker Hub(镜像仓库)上的镜像
#命令格式:
docker search [镜像名称]
#命令演示:
$ docker search ubuntu
#NAME:名称
#DESCRIPTION:基本功能描述
#STARS:下载次数
#OFFICIAL:官方
#AUTOMATED:自动的运行
chengpeng@chengpeng:/var/run$ docker search ubuntu
NAME                             DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   16527     [OK]       
websphere-liberty                WebSphere Liberty multi-architecture images …   297       [OK]       
open-liberty                     Open Liberty multi-architecture images based…   62        [OK]       
neurodebian                      NeuroDebian provides neuroscience research s…   105       [OK]       
ubuntu-debootstrap               DEPRECATED; use "ubuntu" instead                 52        [OK]       
ubuntu-upstart                   DEPRECATED, as is Upstart (find other proces…   115       [OK]       
ubuntu/nginx                     Nginx, a high-performance reverse proxy & we…   102                  
ubuntu/squid                     Squid is a caching proxy for the Web. Long-t…   67                   
ubuntu/cortex                    Cortex provides storage for Prometheus. Long…   4                    
ubuntu/apache2                   Apache, a secure & extensible open-source HT…   62                   
ubuntu/kafka                     Apache Kafka, a distributed event streaming …   35                   
ubuntu/prometheus                Prometheus is a systems and service monitori…   51                   
ubuntu/mysql                     MySQL open source fast, stable, multi-thread…   53                   
ubuntu/bind9                     BIND 9 is a very flexible, full-featured DNS…   63                   
ubuntu/zookeeper                 ZooKeeper maintains configuration informatio…   12                   
ubuntu/postgres                  PostgreSQL is an open source object-relation…   31                   
ubuntu/redis                     Redis, an open source key-value store. Long-…   19                   
ubuntu/grafana                   Grafana, a feature rich metrics dashboard &9                    
ubuntu/dotnet-aspnet             Chiselled Ubuntu runtime image for ASP.NET a…   13                   
ubuntu/memcached                 Memcached, in-memory keyvalue store for smal…   5                    
ubuntu/dotnet-deps               Chiselled Ubuntu for self-contained .NET & A…   11                   
ubuntu/prometheus-alertmanager   Alertmanager handles client alerts from Prom…   9                    
ubuntu/dotnet-runtime            Chiselled Ubuntu runtime image for .NET apps…   13                   
ubuntu/jre                       Distroless Java runtime based on Ubuntu. Lon…   8                    
ubuntu/cassandra                 Cassandra, an open source NoSQL distributed …   2                    
chengpeng@chengpeng:/var/run$ cd ~
chengpeng@chengpeng:~$ docker search nginx
NAME                               DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
nginx                              Official build of Nginx.                         19164     [OK]       
unit                               Official build of NGINX Unit: Universal Web …   15        [OK]       
nginxinc/nginx-unprivileged        Unprivileged NGINX Dockerfiles                   130                  
nginx/nginx-ingress                NGINX and  NGINX Plus Ingress Controllers fo…   83                   
nginx/nginx-prometheus-exporter    NGINX Prometheus Exporter for NGINX and NGIN…   33                   
nginxinc/nginx-s3-gateway          Authenticating and caching gateway based on …   2                    
nginx/unit                         This repository is retired, use the Docker o…   64                   
nginx/nginx-ingress-operator       NGINX Ingress Operator for NGINX and NGINX P…   1                    
nginxinc/amplify-agent             NGINX Amplify Agent docker repository            1                    
nginx/nginx-quic-qns               NGINX QUIC interop                               1                    
nginxinc/ingress-demo              Ingress Demo                                     4                    
nginxproxy/nginx-proxy             Automated Nginx reverse proxy for docker con…   115                  
nginxproxy/acme-companion          Automated ACME SSL certificate generation fo…   125                  
bitnami/nginx                      Bitnami nginx Docker Image                       176                  [OK]
bitnami/nginx-ingress-controller   Bitnami Docker Image for NGINX Ingress Contr…   30                   [OK]
ubuntu/nginx                       Nginx, a high-performance reverse proxy & we…   102                  
nginxinc/nginmesh_proxy_debug                                                       0                    
nginxproxy/docker-gen              Generate files from docker container meta-da…   12                   
kasmweb/nginx                      An Nginx image based off nginx:alpine and in…   6                    
nginxinc/mra-fakes3                                                                 0                    
rancher/nginx-ingress-controller                                                    11                   
nginxinc/ngx-rust-tool                                                              0                    
nginxinc/mra_python_base                                                            0                    
nginxinc/nginmesh_proxy_init  

获取镜像

#作用:
下载远程仓库(如Docker Hub)中的镜像
#命令格式:
docker pull [镜像名称]
#命令演示:
$ docker pull ubuntu
$ docker pull nginx
#注释:
#获取的镜像在哪里?
#/var/lib/docker 目录下
#由于权限的原因我们需要切换root用户
#那我们首先要重设置root用户的密码:
:~$ sudo passwd root
#这样就可以设置root用户的密码了。
#之后就可以自由的切换到root用户了
:~$ su
#输入root用户的密码即可。
#当然,如果想从root用户切换回一般用户,则可使用 su -val(一般用户名)
#而当你再次切回到root用户,则只需要键入exit,再次输入exit则回到最初的用户下
#操作下面的文件可以查看相关的镜像信息
:~$ vim /var/lib/docker/image/overlay2/repositories.json

查看镜像

#作用:
列出本地镜像
#命令格式:
docker images [镜像名称]
docker images ubuntu
docker image ls [镜像名称]
2.1.3 重命名、删除
镜像重命名
删除镜像
2.1.4 导出、导入
导出镜像
将已经下载好的镜像,导出到本地,以备后用。
#命令演示:
$ docker images
#镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,
默认使用latest标记信息
#docker images -a 列出所有的本地的images(包括已删除的镜像记录)
#REPOSITORY:镜像的名称
#TAG :镜像的版本标签
#IMAGE ID:镜像id
#CREATED:镜像是什么时候创建的
#SIZE:大小
chengpeng@chengpeng:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    e4c58958181a   3 weeks ago   77.8MB

2.1.3 重命名、删除

镜像重命名

#作用:
对本地镜像的NAME、TAG进行重命名,并新产生一个命名后镜像
#命令格式:
docker tag [老镜像名称]:[老镜像版本][新镜像名称]:[新镜像版本]
#命令演示:
$ docker tag nginx:latest panda-nginx:v1.0

删除镜像–可以删除一个或多个

#作用:
将本地的一个或多个镜像删除
#命令格式:
docker rmi [命令参数][镜像ID]
docker rmi [命令参数][镜像名称]:[镜像版本]
docker image rm [命令参数][镜像]
#命令演示:
$docker rmi 3fa822599e10
$docker rmi mysql:latest
#注意:
如果一个image_id存在多个名称,那么应该使用 名称:版本 的格式删除镜像
#命令参数(OPTIONS):
-f, --force 强制删除

2.1.4 导出、导入
导出镜像
将已经下载好的镜像,导出到本地,以备后用。

#作用:
将本地的一个或多个镜像打包保存成本地tar文件
#命令格式:
docker save [命令参数][导出镜像名称][本地镜像镜像]
#命令参数(OPTIONS):
-o, --output string 指定写入的文件名和路径
#导出镜像
:~$ docker save -o nginx.tar nginx

导入镜像

#作用:
将save命令打包的镜像导入本地镜像库中
#导入镜像命令格式:
$ docker load [命令参数][被导入镜像压缩文件的名称]
$ docker load < [被导入镜像压缩文件的名称]
$ docker load --input [被导入镜像压缩文件的名称]
#命令参数(OPTIONS):
-i, --input string 指定要打入的文件,如没有指定,默认是STDIN
#为了更好的演示效果,我们先将nginx的镜像删除掉
docker rmi nginx:v1.0
docker rmi nginx
#导入镜像文件:
$ docker load < nginx.tar
#注意:
如果发现导入的时候没有权限需要使用chmod命令修改镜像文件的权限
chengpeng@chengpeng:~$ docker rmi 593aee2afb64 e4c58958181a
Untagged: nginx:latest
Untagged: nginx@sha256:add4792d930c25dd2abf2ef9ea79de578097a1c175a16ab25814332fe33622de
Deleted: sha256:593aee2afb642798b83a85306d2625fd7f089c0a1242c7e75a237846d80aa2a0
Deleted: sha256:5f40d2c2af6bd6c289f284b2ffb1022db6984edf7005ac791c3723730dd40111
Deleted: sha256:bd85a340ea268d71b49c16a693f1764267228a5787fb0da2b81dc6c19fa9f97f
Deleted: sha256:89fafeeb9db96ca37f3214c0d14ce160ce82041b284ecf3a26641d3b3b5359e5
Deleted: sha256:ec22d9ca60728c69acca7909d96922dfe5ceb4665ecd6c91b3282f18c3a58424
Deleted: sha256:3745a2d825305d88cd6b4aed9b5b2de8eb2a36d237dd471368d18cf5d96e907f
Deleted: sha256:87d5589860cd08d504e32e6e17498af935f95dca535bbb5439ea50049047dfb4
Deleted: sha256:cb4596cc145400fb1f2aa56d41516b39a366ecdee7bf3f9191116444aacd8c90
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:2b7412e6465c3c7fc5bb21d3e6f1917c167358449fecac8176c6e496e5c1f05f
Deleted: sha256:e4c58958181a5925816faa528ce959e487632f4cfd192f8132f71b32df2744b4
Deleted: sha256:256d88da41857db513b95b50ba9a9b28491b58c954e25477d5dad8abb465430b
chengpeng@chengpeng:~$ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
chengpeng@chengpeng:~$ docker load < ubuntu.tar 
256d88da4185: Loading layer [==================================================>]  80.35MB/80.35MB
Loaded image: ubuntu:latest
chengpeng@chengpeng:~$ docker load --input nginx-panda.tar 
cb4596cc1454: Loading layer [==================================================>]  77.87MB/77.87MB
4ccbaf6751da: Loading layer [==================================================>]  113.1MB/113.1MB
f4e84f2b0154: Loading layer [==================================================>]  3.584kB/3.584kB
572e6b1b9ddf: Loading layer [==================================================>]  4.608kB/4.608kB
9c7a17c7c18b: Loading layer [==================================================>]   2.56kB/2.56kB
a7d081791a97: Loading layer [==================================================>]   5.12kB/5.12kB
97c766ccce63: Loading layer [==================================================>]  7.168kB/7.168kB
Loaded image: nginx:latest
chengpeng@chengpeng:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    593aee2afb64   5 days ago    187MB
ubuntu       latest    e4c58958181a   3 weeks ago   77.8MB

2.1.5 历史、创建

查看镜像历史

#作用:
查看本地一个镜像的历史(历史分层)信息
#查看镜像命令格式:
docker history [镜像名称]:[镜像版本]
docker history [镜像ID]
#我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker
history这条命令来获取我们想要的信息
$ docker history sswang-nginx:v1.0
#IMAGE:编号
#CREATED:创建的
#CREATED BY :基于那些命令创建的
#SIZE:大小
#COMMENT:评论
chengpeng@chengpeng:~$ docker history 593aee2afb64
IMAGE          CREATED       CREATED BY                                       SIZE      COMMENT
593aee2afb64   5 days ago    /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B        
<missing>      5 days ago    /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT            0B        
<missing>      5 days ago    /bin/sh -c #(nop)  EXPOSE 80                     0B        
<missing>      5 days ago    /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B        
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:9e3b2b63db9f8fc7…   4.62kB    
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:57846632accc8975…   3.02kB    
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:3b1b9915b7dd898a…   298B      
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:caec368f5a54f70a…   2.12kB    
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:01e75c6dd0ce317d…   1.62kB    
<missing>      5 days ago    /bin/sh -c set -x     && groupadd --system -…   112MB     
<missing>      5 days ago    /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bookworm    0B        
<missing>      5 days ago    /bin/sh -c #(nop)  ENV NJS_VERSION=0.8.2         0B        
<missing>      5 days ago    /bin/sh -c #(nop)  ENV NGINX_VERSION=1.25.3      0B        
<missing>      2 weeks ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B        
<missing>      2 weeks ago   /bin/sh -c #(nop)  CMD ["bash"]                  0B        
<missing>      2 weeks ago   /bin/sh -c #(nop) ADD file:55ad846fa191e603f…   74.8MB    
chengpeng@chengpeng:~$ docker history nginx:latest 
IMAGE          CREATED       CREATED BY                                       SIZE      COMMENT
593aee2afb64   5 days ago    /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B        
<missing>      5 days ago    /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT            0B        
<missing>      5 days ago    /bin/sh -c #(nop)  EXPOSE 80                     0B        
<missing>      5 days ago    /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B        
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:9e3b2b63db9f8fc7…   4.62kB    
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:57846632accc8975…   3.02kB    
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:3b1b9915b7dd898a…   298B      
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:caec368f5a54f70a…   2.12kB    
<missing>      5 days ago    /bin/sh -c #(nop) COPY file:01e75c6dd0ce317d…   1.62kB    
<missing>      5 days ago    /bin/sh -c set -x     && groupadd --system -…   112MB     
<missing>      5 days ago    /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bookworm    0B        
<missing>      5 days ago    /bin/sh -c #(nop)  ENV NJS_VERSION=0.8.2         0B        
<missing>      5 days ago    /bin/sh -c #(nop)  ENV NGINX_VERSION=1.25.3      0B        
<missing>      2 weeks ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B        
<missing>      2 weeks ago   /bin/sh -c #(nop)  CMD ["bash"]                  0B        
<missing>      2 weeks ago   /bin/sh -c #(nop) ADD file:55ad846fa191e603f…   74.8MB    
chengpeng@chengpeng:~$ 

镜像详细信息

#作用:
查看本地一个或多个镜像的详细信息
#命令格式:
$ docker image inspect [命令参数] [镜像名称]:[镜像版本]
$ docker inspect [命令参数] [镜像ID]
#查看镜像详细信息:
$ docker inspect nginx-->可以省略image
chengpeng@chengpeng:~$ docker inspect nginx:latest 
[
    {
        "Id": "sha256:593aee2afb642798b83a85306d2625fd7f089c0a1242c7e75a237846d80aa2a0",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "",
        "Created": "2023-10-25T01:21:47.343274012Z",
        "Container": "1e4063a23e5d6d56cbf5478ff7227b8c6940152770a0770585c3ae9480478b66",
        "ContainerConfig": {
            "Hostname": "1e4063a23e5d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.25.3",
                "NJS_VERSION=0.8.2",
                "PKG_RELEASE=1~bookworm"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "Image": "sha256:714c3cd63577a5ad14ad0b2a8fa67aef4f6ac055dec3e1f03a8f7e5d2f43b0b3",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "DockerVersion": "20.10.23",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.25.3",
                "NJS_VERSION=0.8.2",
                "PKG_RELEASE=1~bookworm"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "sha256:714c3cd63577a5ad14ad0b2a8fa67aef4f6ac055dec3e1f03a8f7e5d2f43b0b3",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 186779297,
        "VirtualSize": 186779297,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/9eb59efbda01990dd4b19604dc997dec5ab768659f3825d65deb064ec3295ee2/diff:/var/lib/docker/overlay2/00203ed850e6be3627df8c20e99af49e7f391a6230380832971944439fbe5be8/diff:/var/lib/docker/overlay2/948ea7e9017427233069c4c62a1af00f8f2672647c70e2a4cbe5d7eeaa9ff14e/diff:/var/lib/docker/overlay2/d4222ef1a966c4d60a2f0c0bc7706411d4bc548a97b7eff8544ab97ff86b3651/diff:/var/lib/docker/overlay2/77a7bdf40270b0486062046ae1451766fed5d395ee4de609eeaa32c9b1993b7d/diff:/var/lib/docker/overlay2/38b6ef20d10404d1a51cbf06546a7e76cd3e546535702e1c4663926d04e34681/diff",
                "MergedDir": "/var/lib/docker/overlay2/69b3ffc978a1a1bafff6f18eb31f3c5c1fb021c0e7b0c60868c24e544512e7cb/merged",
                "UpperDir": "/var/lib/docker/overlay2/69b3ffc978a1a1bafff6f18eb31f3c5c1fb021c0e7b0c60868c24e544512e7cb/diff",
                "WorkDir": "/var/lib/docker/overlay2/69b3ffc978a1a1bafff6f18eb31f3c5c1fb021c0e7b0c60868c24e544512e7cb/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:cb4596cc145400fb1f2aa56d41516b39a366ecdee7bf3f9191116444aacd8c90",
                "sha256:4ccbaf6751daab588a8caf94f48006143fc46f8e7e29c355d00d3dedf5ada092",
                "sha256:f4e84f2b0154b1e343a5e4c0dbce081694cccd34d073e3ff400f762aff8d8165",
                "sha256:572e6b1b9ddfc87e7a80a05c50c256c668e03a4e314b88f80911266f323a9c75",
                "sha256:9c7a17c7c18bca96c3d82b861b4bd3fe123b65011f52927b1a22edf0ce397149",
                "sha256:a7d081791a97ca4d50c840ce5f48a0b052319cf3e133dc5a687e5b4c19fdfb38",
                "sha256:97c766ccce63373a637872224ddeecc835835f26ae54ae9283ec8f679b06e8c9"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

根据模板创建镜像

#登录系统模板镜像网站:
#https://download.openvz.org/template/precreated/
#找到一个镜像模板进行下载,比如说ubuntu-16.04-x86_64.tar.gz,地址为:
#https://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz
#命令格式:
cat 模板文件名.tar | docker import - [自定义镜像名]
#演示效果:
$ cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu-mini
chengpeng@chengpeng:~$ cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu-mini
sha256:44117582c84e414a25feb3c6454e363195c370b705b11ca6fb581757073e7d7a
chengpeng@chengpeng:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu-mini   latest    44117582c84e   8 seconds ago   505MB
nginx         latest    593aee2afb64   6 days ago      187MB
ubuntu        latest    e4c58958181a   3 weeks ago     77.8MB
没有任何操作记录
chengpeng@chengpeng:~$ docker history 44117582c84e
IMAGE          CREATED              CREATED BY   SIZE      COMMENT
44117582c84e   About a minute ago                505MB     Imported from -

在这里插入图片描述

2.2 容器管理

docker容器技术指Docker是一个由GO语言写的程序运行的“容器”(Linux containers, LXCs)
containers的中文解释是集装箱。
Docker则实现了一种应用程序级别的隔离,它改变我们基本的开发、操作单元,由直接操作虚拟主机(VM),转换
到操作程序运行的“容器”上来。

2.2.1 容器简介

容器是什么?
容器(Container):容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何
地方以相同的方式运行
•Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。
•容器具备一定的生命周期。
•另外,可以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。
我们就可以理解容器就是被封装起来的进程操作,只不过现在的进程可以简单也可以复杂,复杂的话可以运行1个操作
系统.简单的话可以运行1个回显字符串.
容器与虚拟机的相同点
•容器和虚拟机一样,都会对物理硬件资源进行共享使用。
•容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
•容器中或虚拟机中都可以安装各种应用,如redis、mysql、nginx等。也就是说,在容器中的操作,如同在一个虚
拟机(操作系统)中操作一样。
•同虚拟机一样,容器创建后,会存储在宿主机上:linux上位于/var/lib/docker/containers下
容器与虚拟机的不同点
注意:容器并不是虚拟机,但它们有很多相似的地方
•虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运
行在宿主机的内核上,其本质上以一系列进程的结合。

•容器是轻量级的,虚拟机是重量级的。
首先容器不需要额外的资源来管理,虚拟机额外更多的性能消耗;
其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么
方便了。
•也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。

2.2.2 查看、创建、启动

查看容器

#作用
显示docker容器列表
#命令格式:
docker ps
#命令演示:
$ docker ps
#CONTAINER ID 容器ID
#IMAGE 基于那个镜像
#COMMAND 运行镜像使用了哪些命令?
#CREATED多久前创建时间
#STATUS 开启还是关闭
#PORTS端口号
#NAMES容器名称默认是随机的
#注意:
管理docker容器可以通过名称,也可以通过ID
ps是显示正在运行的容器, -a是显示所有运行过的容器,包括已经不运行的容器

创建待启动容器

#作用:
利用镜像创建出一个Created 状态的待启动容器
#命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create [参数命令] 依赖镜像 [容器内命令] [命令参数]
#命令参数(OPTIONS):查看更多
-t, --tty 分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开-->标准输入打开
--name 为容器起名,如果没有指定将会随机产生一个名称
#命令参数(COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
#创建容器(附上ls命令和a参数)
docker create -it --name ubuntu-1 ubuntu ls -a

只是创建,并没有执行

chengpeng@chengpeng:~$ docker create -it --name panda01-ubuntu ubuntu ls -al
c9efeb810bc10b58f268f804afa65039b000271838960e1b4663a114ff72309d
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND    CREATED          STATUS    PORTS     NAMES
c9efeb810bc1   ubuntu    "ls -al"   13 seconds ago   Created             panda01-ubuntu
chengpeng@chengpeng:~$ 

启动容器

启动容器有三种方式
1、启动待启动或已关闭容器
2、基于镜像新建一个容器并启动
3、守护进程方式启动docker
启动容器

#作用:
将一个或多个处于创建状态或关闭状态的容器启动起来
#命令格式:
docker start [容器名称][容器ID]
#命令参数(OPTIONS):
-a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上-->标准出/标准错误
-i, --interactive 将当前shell的 STDIN连接到容器上
#启动上面创建的容器
docker start -a ubuntu-1
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND    CREATED          STATUS    PORTS     NAMES
c9efeb810bc1   ubuntu    "ls -al"   13 seconds ago   Created             panda01-ubuntu
chengpeng@chengpeng:~$ docker start -a ubuntu
Error response from daemon: No such container: ubuntu
chengpeng@chengpeng:~$ docker start -a c9efeb810bc1 
total 56
drwxr-xr-x   1 root root 4096 Oct 31 17:22 .
drwxr-xr-x   1 root root 4096 Oct 31 17:22 ..
-rwxr-xr-x   1 root root    0 Oct 31 17:22 .dockerenv
lrwxrwxrwx   1 root root    7 Oct  4 02:08 bin -> usr/bin
drwxr-xr-x   2 root root 4096 Apr 18  2022 boot
drwxr-xr-x   5 root root  360 Oct 31 17:29 dev
drwxr-xr-x   1 root root 4096 Oct 31 17:22 etc
drwxr-xr-x   2 root root 4096 Apr 18  2022 home
lrwxrwxrwx   1 root root    7 Oct  4 02:08 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Oct  4 02:08 lib32 -> usr/lib32
lrwxrwxrwx   1 root root    9 Oct  4 02:08 lib64 -> usr/lib64
lrwxrwxrwx   1 root root   10 Oct  4 02:08 libx32 -> usr/libx32
drwxr-xr-x   2 root root 4096 Oct  4 02:08 media
drwxr-xr-x   2 root root 4096 Oct  4 02:08 mnt
drwxr-xr-x   2 root root 4096 Oct  4 02:08 opt
dr-xr-xr-x 267 root root    0 Oct 31 17:29 proc
drwx------   2 root root 4096 Oct  4 02:12 root
drwxr-xr-x   5 root root 4096 Oct  4 02:12 run
lrwxrwxrwx   1 root root    8 Oct  4 02:08 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Oct  4 02:08 srv
dr-xr-xr-x  13 root root    0 Oct 31 17:29 sys
drwxrwxrwt   2 root root 4096 Oct  4 02:12 tmp
drwxr-xr-x  14 root root 4096 Oct  4 02:08 usr
drwxr-xr-x  11 root root 4096 Oct  4 02:12 var

创建新容器并启动

#作用:
利用镜像创建并启动一个容器
#命令格式:
docker run [命令参数] [镜像名称][执行的命令]
命令参数(OPTIONS):
-t, --tty 分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开
--name 为容器起名,如果没有指定将会随机产生一个名称
-d, --detach 在后台运行容器并打印出容器ID
--rm 当容器退出运行后,自动删除容器
#启动一个镜像输出内容并删除容器 /bin/echo-->回显
$ docker run --rm --name nginx1 nginx /bin/echo "hello docker"
#注意:
docker run 其实 是两个命令的集合体 docker create + docker start
chengpeng@chengpeng:~$ docker run --rm --name nginx-1 nginx /bin/echo echo "helloworld"
echo helloworld
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND    CREATED          STATUS                      PORTS     NAMES
c9efeb810bc1   ubuntu    "ls -al"   24 minutes ago   Exited (0) 17 minutes ago             panda01-ubuntu

守护进程方式启动容器<常用的方式>—>永久启动

更多的时候,需要让Docker容器在后台以守护形式运行。此时可以通过添加-d参数来实现

#命令格式:
docker run -d [image_name] command ...
#守护进程方式启动容器:
:~$ docker run -d nginx
chengpeng@chengpeng:~$ docker run -d nginx
85b37d430e2b7369caedc8d8f7e8e0ab16422c2c22c6b2e16683b0c8db238ae9
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS                          PORTS     NAMES
85b37d430e2b   nginx     "/docker-entrypoint.…"   8 seconds ago        Up 7 seconds                    80/tcp    bold_kilby
059ddc8b516d   nginx     "/docker-entrypoint.…"   About a minute ago   Exited (0) About a minute ago             nginx-1
c9efeb810bc1   ubuntu    "ls -al"                  35 minutes ago       Exited (0) 28 minutes ago                 panda01-ubuntu
chengpeng@itcast:/var/lib/docker/containers# ls
059ddc8b516d30766e6d6e2d1b2a41cbc8f29ffcedd0edb89d2280a1f8c0d927  85b37d430e2b7369caedc8d8f7e8e0ab16422c2c22c6b2e16683b0c8db238ae9  c9efeb810bc10b58f268f804afa65039b000271838960e1b4663a114ff72309d

2.2.3暂停与取消暂停与重启

容器暂停

#作用:
暂停一个或多个处于运行状态的容器
#命令格式:
docker pause [容器名称][容器ID]
#暂停容器
docker pause a229eabf1f32
chengpeng@chengpeng:~$ docker pause 85b37d430e2b
85b37d430e2b
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                      PORTS     NAMES
85b37d430e2b   nginx     "/docker-entrypoint.…"   27 minutes ago      Up 27 minutes (Paused)      80/tcp    bold_kilby
059ddc8b516d   nginx     "/docker-entrypoint.…"   28 minutes ago      Exited (0) 28 minutes ago             nginx-1
c9efeb810bc1   ubuntu    "ls -al"                  About an hour ago   Exited (0) 55 minutes ago             panda01-ubuntu

容器取消暂停

#作用:
取消一个或多个处于暂停状态的容器,恢复运行
#命令格式:
docker unpause [容器名称][容器ID]
#恢复容器
docker unpause a229eabf1f32
chengpeng@chengpeng:~$ docker unpause 85b37d430e2b
85b37d430e2b
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                      PORTS     NAMES
85b37d430e2b   nginx     "/docker-entrypoint.…"   28 minutes ago      Up 28 minutes               80/tcp    bold_kilby
059ddc8b516d   nginx     "/docker-entrypoint.…"   29 minutes ago      Exited (0) 29 minutes ago             nginx-1
c9efeb810bc1   ubuntu    "ls -al"                  About an hour ago   Exited (0) 56 minutes ago             panda01-ubuntu

重启

#作用:
重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器
该命令相当于stop和start命令的结合
#命令格式:
docker restart [容器名称][容器ID]
#命令参数(OPTIONS):
-t, --time int 重启前,等待的时间,单位秒(默认 10s)
#恢复容器
docker restart -t 20 a229eabf1f32

看不见效果—>重启

chengpeng@chengpeng:~$ docker restart -t 20 85b37d430e2b
85b37d430e2b
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                      PORTS     NAMES
85b37d430e2b   nginx     "/docker-entrypoint.…"   38 minutes ago      Up 14 seconds               80/tcp    bold_kilby
059ddc8b516d   nginx     "/docker-entrypoint.…"   39 minutes ago      Exited (0) 39 minutes ago             nginx-1
c9efeb810bc1   ubuntu    "ls -al"                  About an hour ago   Exited (0) 2 minutes ago              panda01-ubuntu

2.2.4 关闭、终止、删除

关闭容器
在生产中,我们会以为临时情况,要关闭某些容器,我们使用 stop 命令来关闭某个容器

#作用:
延迟关闭一个或多个处于暂停状态或者运行状态的容器
#命令格式:
docker stop [容器名称][容器ID]
#关闭容器:
$ docker stop 8005c40a1d16
chengpeng@chengpeng:~$ docker stop bold_kilby
bold_kilby
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                         PORTS     NAMES
85b37d430e2b   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (0) 8 seconds ago                 bold_kilby
059ddc8b516d   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (0) About an hour ago             nginx-1
c9efeb810bc1   ubuntu    "ls -al"                  2 hours ago         Exited (0) 41 minutes ago                panda01-ubuntu
chengpeng@chengpeng:~$ 

终止容器

#作用:
强制并立即关闭一个或多个处于暂停状态或者运行状态的容器
#命令格式:
docker kill [容器名称][容器ID]
#终止容器
$ docker kill 8005c40a1d16
chengpeng@chengpeng:~$ docker kill bold_kilby
bold_kilby
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                         PORTS     NAMES
85b37d430e2b   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (137) 2 seconds ago               bold_kilby
059ddc8b516d   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (0) About an hour ago             nginx-1
c9efeb810bc1   ubuntu    "ls -al"                  2 hours ago         Exited (0) 48 minutes ago                panda01-ubuntu

删除容器
删除容器有三种方法: 正常删除 – 删除已关闭的 强制删除 – 删除正在运行的 强制批量删除 – 删除全部的容器
正常删除容器–>不能删除正在运行的容器

#作用:
删除一个或者多个容器
#命令格式:
$ docker rm [容器名称][容器ID]
#删除已关闭的容器:
$ docker rm 1a5f6a0c9443
Error response from daemon: You cannot remove a running container
c7f5e7fe5aca00e0cb987d486dab3502ac93d7180016cfae9ddcc64e56149fc9. Stop the container
before attempting removal or force remove
错误响应守护进程:你不能删除一个容器
c7f5e7fe5aca00e0cb987d486dab3502ac93d7180016cfae9ddcc64e56149fc9运行。在尝试拆卸或强制拆
卸之前,先停止容器。
chengpeng@chengpeng:~$ docker rm  bold_kilby
Error response from daemon: You cannot remove a running container 85b37d430e2b7369caedc8d8f7e8e0ab16422c2c22c6b2e16683b0c8db238ae9. Stop the container before attempting removal or force remove
chengpeng@chengpeng:~$ docker rm c9efeb810bc1
c9efeb810bc1
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                         PORTS     NAMES
85b37d430e2b   nginx     "/docker-entrypoint.…"   About an hour ago   Up About a minute              80/tcp    bold_kilby
059ddc8b516d   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (0) About an hour ago             nginx-1
chengpeng@chengpeng:~$ 

强制删除运行容器

#作用:
强制删除一个或者多个容器
#命令格式:
docker rm -f [容器名称][容器ID]
#删除正在运行的容器
$ docker rm -f 8005c40a1d16
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                         PORTS     NAMES
85b37d430e2b   nginx     "/docker-entrypoint.…"   About an hour ago   Up About a minute              80/tcp    bold_kilby
059ddc8b516d   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (0) About an hour ago             nginx-1
chengpeng@chengpeng:~$ docker rm -f 85b37d430e2b 
85b37d430e2b
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS                   PORTS     NAMES
059ddc8b516d   nginx     "/docker-entrypoint.…"   2 hours ago   Exited (0) 2 hours ago             nginx-1

拓展批量关闭容器

#作用:
批量强制删除一个或者多个容器
#命令格式:
$ docker rm -f $(docker ps -a -q)
-q:只拿id这一行
#按照执行顺序$(), 获取到现在容器的id然后进行删除
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                   PORTS     NAMES
f64123db1adf   nginx     "/docker-entrypoint.…"   6 seconds ago    Up 5 seconds             80/tcp    magical_curran
a6477d5d2ec7   nginx     "/docker-entrypoint.…"   7 seconds ago    Up 7 seconds             80/tcp    wizardly_lichterman
f39c0b852dd2   nginx     "/docker-entrypoint.…"   9 seconds ago    Up 8 seconds             80/tcp    optimistic_saha
3dec6ba9d06c   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds             80/tcp    infallible_khorana
32beaf63b5a4   nginx     "/docker-entrypoint.…"   15 seconds ago   Up 14 seconds            80/tcp    quirky_lalande
059ddc8b516d   nginx     "/docker-entrypoint.…"   2 hours ago      Exited (0) 2 hours ago             nginx-1
chengpeng@chengpeng:~$ docker rm -f $(docker ps -a -q)
f64123db1adf
a6477d5d2ec7
f39c0b852dd2
3dec6ba9d06c
32beaf63b5a4
059ddc8b516d
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
chengpeng@chengpeng:~$ 

2.2.5 进入、退出

进入容器我们学习三种方法:
1、创建容器的同时进入容器 2、手工方式进入容器 3、生产方式进入容器
创建并进入容器

#命令格式:
docker run --name [container_name] -it [docker_image] /bin/bash
#命令演示:
$ docker run -it --name panda-nginx nginx /bin/bash
#进入容器后
root@7c5a24a68f96:/# echo "hello world"
hello world
root@7c5a24a68f96:/# exit
exit
#docker 容器启动命令参数详解:
#--name:给容器定义一个名称
#-i:则让容器的标准输入保持打开。
#-t:让docker分配一个伪终端,并绑定到容器的标准输入上
#/bin/bash:执行一个命令

退出容器:

#方法一:
exit
#方法二:
Ctrl + D
chengpeng@chengpeng:~$ docker run -it --name panda-nginx nginx /bin/bash
root@f4e9887f4e08:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib32  lib64  libx32  media	mnt  opt  proc	root  run  sbin  srv  sys  tmp	usr  var
root@f4e9887f4e08:/# ls -al
total 64
drwxr-xr-x   1 root root 4096 Oct 31 19:40 .
drwxr-xr-x   1 root root 4096 Oct 31 19:40 ..
-rwxr-xr-x   1 root root    0 Oct 31 19:40 .dockerenv
lrwxrwxrwx   1 root root    7 Oct  9 00:00 bin -> usr/bin
drwxr-xr-x   2 root root 4096 Sep 29 20:04 boot
drwxr-xr-x   5 root root  360 Oct 31 19:40 dev
drwxr-xr-x   1 root root 4096 Oct 25 01:21 docker-entrypoint.d
-rwxrwxr-x   1 root root 1620 Oct 25 01:21 docker-entrypoint.sh
drwxr-xr-x   1 root root 4096 Oct 31 19:40 etc
drwxr-xr-x   2 root root 4096 Sep 29 20:04 home
lrwxrwxrwx   1 root root    7 Oct  9 00:00 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Oct  9 00:00 lib32 -> usr/lib32
lrwxrwxrwx   1 root root    9 Oct  9 00:00 lib64 -> usr/lib64
lrwxrwxrwx   1 root root   10 Oct  9 00:00 libx32 -> usr/libx32
drwxr-xr-x   2 root root 4096 Oct  9 00:00 media
drwxr-xr-x   2 root root 4096 Oct  9 00:00 mnt
drwxr-xr-x   2 root root 4096 Oct  9 00:00 opt
dr-xr-xr-x 267 root root    0 Oct 31 19:40 proc
drwx------   2 root root 4096 Oct  9 00:00 root
drwxr-xr-x   3 root root 4096 Oct  9 00:00 run
lrwxrwxrwx   1 root root    8 Oct  9 00:00 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Oct  9 00:00 srv
dr-xr-xr-x  13 root root    0 Oct 31 17:29 sys
drwxrwxrwt   1 root root 4096 Oct 25 01:21 tmp
drwxr-xr-x   1 root root 4096 Oct  9 00:00 usr
drwxr-xr-x   1 root root 4096 Oct  9 00:00 var
root@f4e9887f4e08:/# echo "hello golang"
hello golang
root@f4e9887f4e08:/# exit
exit
chengpeng@chengpeng:~$ 

手工方式进入容器

#命令格式:
docker exec -it 容器id /bin/bash
#效果演示:
$ docker exec -it d74fff341687 /bin/bash
chengpeng@chengpeng:~$ docker run -it -d --name panda-nginx1 nginx /bin/bash
2080b5ed2f08219a6083ab75d909cd68384e57072c093c266d1a4e802c9709e0
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS                     PORTS     NAMES
2080b5ed2f08   nginx     "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds               80/tcp    panda-nginx1
f4e9887f4e08   nginx     "/docker-entrypoint.…"   6 minutes ago   Exited (0) 5 minutes ago             panda-nginx
itcast@itcast:~$ docker exec -it panda-nginx1 /bin/bash
root@2080b5ed2f08:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib32  lib64  libx32  media	mnt  opt  proc	root  run  sbin  srv  sys  tmp	usr  var
root@2080b5ed2f08:/# mkdir hello world
root@2080b5ed2f08:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	hello  home  lib  lib32  lib64	libx32	media  mnt  opt  proc  root  run  sbin	srv  sys  tmp  usr  var  world
root@2080b5ed2f08:/# 
exit
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                      PORTS     NAMES
2080b5ed2f08   nginx     "/docker-entrypoint.…"   11 minutes ago   Up 11 minutes               80/tcp    panda-nginx1
f4e9887f4e08   nginx     "/docker-entrypoint.…"   18 minutes ago   Exited (0) 16 minutes ago             panda-nginx
chengpeng@chengpeng:~$ 

生产方式进入容器
我们生产中常用的进入容器方法是使用脚本,脚本内容如下

#!/bin/bash
#定义进入仓库函数
docker_in(){
NAME_ID=$1
PID=$(docker inspect --format {{.State.Pid}} $NAME_ID)
nsenter --target $PID --mount --uts --ipc --net --pid
}
docker_in $1

直接执行的话是没有执行权限的所以需要赋值权限

#赋权执行
$ chmod +x docker_in.sh
#进入指定的容器,并测试
$ ./docker_in.sh b3fbcba852fd

注意:

当拷贝到linux下的时候会出现

-bash: ./docker_in.sh: /bin/bash^M: 解释器错误: 没有那个文件或目录
这个问题大多数是因为你的脚本文件在windows下编辑过。windows下,每一行的结尾是\n\r,而在linux下
文件的结尾是\n,那么你在windows下编辑过的文件在linux下打开看的时候每一行的结尾就会多出来一个字
符\r,用cat -A docker_in.sh时你可以看到这个\r字符被显示为^M,这时候只需要删除这个字符就可以了。
可以使用命令 sed -i 's/\r$//' docker_in.sh

2.2.6 基于容器创建镜像

方式一:—>内部创建

#命令格式:
docker commit -m '改动信息' -a "作者信息" [container_id][new_image:tag]
#命令演示:
#进入一个容器,创建文件后并退出:
$ ./docker_in.sh d74fff341687
$ mkdir /hello
$ mkdir /world
$ ls
$ exit
#创建一个镜像:
$ docker commit -m 'mkdir /hello /world ' -a "panda" d74fff341687 nginx:v0.2
#查看镜像:
$ docker images
#启动一个容器
$ docker run -itd nginx:v0.2 /bin/bash
#进入容器进行查看
$ ./docker_in.sh ae63ab299a84
$ ls
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                      PORTS     NAMES
2080b5ed2f08   nginx     "/docker-entrypoint.…"   33 minutes ago   Up 33 minutes               80/tcp    panda-nginx1
f4e9887f4e08   nginx     "/docker-entrypoint.…"   39 minutes ago   Exited (0) 37 minutes ago             panda-nginx
chengpeng@chengpeng:~$ docker exec -it 2080b5ed2f08 /bin/bash
root@2080b5ed2f08:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	hello  home  lib  lib32  lib64	libx32	media  mnt  opt  proc  root  run  sbin	srv  sys  tmp  usr  var  world
root@2080b5ed2f08:/# mkdir golang beego
root@2080b5ed2f08:/# ls
beego  bin  boot  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  golang  hello  home  lib  lib32	lib64  libx32  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var	world
root@2080b5ed2f08:/# exit
exit
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                      PORTS     NAMES
2080b5ed2f08   nginx     "/docker-entrypoint.…"   42 minutes ago   Up 42 minutes               80/tcp    panda-nginx1
f4e9887f4e08   nginx     "/docker-entrypoint.…"   49 minutes ago   Exited (0) 47 minutes ago             panda-nginx
chengpeng@chengpeng:~$ docker commit -m "mkdir hello world golang beego" -a "chengpeng" 2080b5ed2f08 panda-nginx1108:v1.0
sha256:c654adf64b78f4f7b47c92a95f6b7fa3a7b991eeac7fde141e8bf28947f304ef
chengpeng@chengpeng:~$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
panda-nginx1108   v1.0      c654adf64b78   11 seconds ago   187MB
ubuntu-mini       latest    44117582c84e   19 hours ago     505MB
nginx             latest    593aee2afb64   6 days ago       187MB
ubuntu            latest    e4c58958181a   3 weeks ago      77.8MB
chengpeng@chengpeng:~$ docker run -d c654adf64b78
bc58c240aca1f578427773419784f2085dcbf5fde2cf377fd10c06d79e3fb4e8
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
bc58c240aca1   c654adf64b78   "/docker-entrypoint.…"   17 seconds ago   Exited (0) 16 seconds ago             zen_margulis
2080b5ed2f08   nginx          "/docker-entrypoint.…"   46 minutes ago   Up 46 minutes               80/tcp    panda-nginx1
f4e9887f4e08   nginx          "/docker-entrypoint.…"   53 minutes ago   Exited (0) 51 minutes ago             panda-nginx
chengpeng@chengpeng:~$ 

方式二:

#命令格式:
docker export [容器id] > 模板文件名.tar
#命令演示:
#创建镜像:
$ docker export ae63ab299a84 > nginx.tar
#导入镜像:
$ cat nginx.tar | docker import - panda-test
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS                         PORTS     NAMES
bc58c240aca1   c654adf64b78   "/docker-entrypoint.…"   8 minutes ago       Exited (0) 8 minutes ago                 zen_margulis
2080b5ed2f08   nginx          "/docker-entrypoint.…"   55 minutes ago      Up 55 minutes                  80/tcp    panda-nginx1
f4e9887f4e08   nginx          "/docker-entrypoint.…"   About an hour ago   Exited (0) About an hour ago             panda-nginx
chengpeng@chengpeng:~$ docker export 2080b5ed2f08 > panda-nginx1657.tar
chengpeng@chengpeng:~$ ls
app_private_key.pem  ,bashrc       examples.desktop  go              nginx-panda.tar      snap   test2                       ubuntu.tar                         vmware-tools-distrib  公共的  视频  文档  音乐
app_public_key.pem   docker_in.sh  git-openssl       GolandProjects  panda-nginx1657.tar  test1  ubuntu-16.04-x86_64.tar.gz  VMwareTools-10.0.6-3595377.tar.gz  workspace             模板    图片  下载  桌面
chengpeng@chengpeng:~$ cat panda-nginx1657.tar | docker import  - panda-nginx1657
sha256:62e2a6334363a45e6f95d632c20d3b111f450b71bffe775593f0b6edd24c63de
chengpeng@chengpeng:~$ docker im
image   images  import  
chengpeng@chengpeng:~$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
panda-nginx1657   latest    62e2a6334363   15 seconds ago   185MB
panda-nginx1108   v1.0      c654adf64b78   19 minutes ago   187MB
ubuntu-mini       latest    44117582c84e   20 hours ago     505MB
nginx             latest    593aee2afb64   6 days ago       187MB
ubuntu            latest    e4c58958181a   3 weeks ago      77.8MB
chengpeng@chengpeng:~$ 

导出(export)导入(import)与保存(save)加载(load)的恩怨情仇

import与load的区别:
import可以重新指定镜像的名字,docker load不可以
export 与 保存 save 的区别:
1、export导出的镜像文件大小,小于 save保存的镜像。
2、export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史。
chengpeng@chengpeng:~$ docker history panda-nginx1657
IMAGE          CREATED          CREATED BY   SIZE      COMMENT
62e2a6334363   12 minutes ago                185MB     Imported from -

2.2.7 日志、信息、端口、重命名

查看容器运行日志

#命令格式:
docker logs [容器id]
#命令效果:
$ docker logs 7c5a24a68f96

查看容器详细信息

#命令格式:
docker inspect [容器id]
#命令效果:
查看容器全部信息:
$ docker inspect 930f29ccdf8a
查看容器网络信息:
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
930f29ccdf8a

查看容器端口信息

#命令格式:
docker port [容器id]
#命令效果:
$ docker port 930f29ccdf8a
#没有效果没有和宿主机关联

容器重命名

#作用:
修改容器的名称
#命令格式:
docker rename [容器id][容器名称] [容器新名称]
#命令效果:
$ docker rename 930f29ccdf8a u1

在这里插入图片描述

2.3 数据管理

生产环境使用Docker的过程中,往往需要对数据进行持久化保存,或者需要更多容器之间进行数据共享,那我们
需要怎么要的操作呢?
答案就是:数据卷(Data Volumes)和数据卷容器(Data Volume Containers)

2.3.1 数据卷简介

什么是数据卷?
就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储
数据卷(Data Volumes):容器内数据直接映射到本地主机环境
数据卷特性
1、数据卷可以在容器之间共享和重用,本地与容器间传递数据更高效;
2、对数据卷的修改会立马有效,容器内部与本地目录均可;
3、对数据卷的更新,不会影响镜像,对数据与应用进行了解耦操作;
4、卷会一直存在,直到没有容器使用。
docker 数据卷命令详解

:~$ docker run --help
-v, --volume list Bind mount a volume (default [])
挂载一个数据卷,默认为空

我们可以使用命令 docker run 用来创建容器,可以在使用docker run 命令时添加 -v 参数,就可以创建并挂载一个
到多个数据卷到当前运行的容器中。 -v 参数的作用是将宿主机的一个目录作为容器的数据卷挂载到docker容器
中,使宿主机和容器之间可以共享一个 目录,如果本地路径不存在,Docker也会自动创建—>但是宿主机就不会映射了。

2.3.2 数据卷实践—>主机和容器共享

关于数据卷的管理我们从两个方面来说: 1、目录 2、普通文件
数据卷实践 之 目录

#命令格式:
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录][镜像名称] [命令(可选)]
#命令演示:
#创建测试文件:
$ echo "file1" > tmp/file1.txt
#启动一个容器,挂载数据卷:
$ docker run -itd --name test1 -v /home/chengpeng/tmp/:/test1/ nginx
#注意宿主机目录需要绝对路径
#测试效果
$ docker exec -it a53c61c77 /bin/bash
root@a53c61c77bde:/# cat /test1/file1.txt
file1
chengpeng@chengpeng:~$ docker run -itd --name test1 -v /home/chengpeng/tmp/:/tmp-text/ nginx
5fe23d16ec59ed29a16267a0f32e1754303d1c48c0c202cb8b06cfd0b04fd904
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS                     PORTS     NAMES
5fe23d16ec59   nginx          "/docker-entrypoint.…"   About a minute ago   Up About a minute          80/tcp    test1
f9f147bcf0b0   nginx          "/docker-entrypoint.…"   3 minutes ago        Exited (0) 3 minutes ago             tmp-nginx
bc58c240aca1   c654adf64b78   "/docker-entrypoint.…"   3 hours ago          Exited (0) 3 hours ago               panda-nginx2
2080b5ed2f08   nginx          "/docker-entrypoint.…"   4 hours ago          Up 4 hours                 80/tcp    panda-nginx1
f4e9887f4e08   nginx          "/docker-entrypoint.…"   4 hours ago          Exited (0) 4 hours ago               panda-nginx
chengpeng@chengpeng:~$ cd tmp/
chengpeng@chengpeng:~/tmp$ ls
chengpeng@chengpeng:~/tmp$ cd /home/chengpeng/tmp/
chengpeng@chengpeng:~/tmp$ ls
chengpeng@chengpeng:~/tmp$ docker exec -it 5fe23d16ec59 /bin/bash
root@5fe23d16ec59:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib32  lib64  libx32  media	mnt  opt  proc	root  run  sbin  srv  sys  tmp	tmp-text  usr  var
root@5fe23d16ec59:/# cd tmp-text/
root@5fe23d16ec59:/tmp-text# ls
root@5fe23d16ec59:/tmp-text# mkdir hello
root@5fe23d16ec59:/tmp-text# ls
root@5fe23d16ec59:/tmp-text# ls   
world
root@5fe23d16ec59:/tmp-text# 

第二个窗口

root@itcast:/home/chengpeng# cd tmp/
root@itcast:/home/chengpeng/tmp# ls
root@itcast:/home/chengpeng/tmp# ls
hello
root@itcast:/home/chengpeng/tmp# rm -rf hello/
root@itcast:/home/chengpeng/tmp# mkdir world
root@itcast:/home/chengpeng/tmp#

数据卷实践 之 文件{不推荐}

#命令格式:
docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件][镜像名称] [命令(可选)]
#命令演示:
#创建测试文件
$ echo "file1" > /tmp/file1.txt
#启动一个容器,挂载数据卷
$ docker run -itd --name test2 -v /home/chengpeng/tmp/file1.txt:/nihao/nihao.sh nginx
#测试效果
:~$ docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh
file1
chengpeng@chengpeng:~$ docker run -itd --name tmp-txt -v /home/chengpeng/tmp/hello.go:/nihao/nihao.sh nginx
ded5648fc3203f12427546c02863289597ff32d5e64d03a7a066c9bf1741f294
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
ded5648fc320   nginx          "/docker-entrypoint.…"   8 seconds ago    Up 7 seconds                80/tcp    tmp-txt
5fe23d16ec59   nginx          "/docker-entrypoint.…"   12 minutes ago   Up 12 minutes               80/tcp    test1
f9f147bcf0b0   nginx          "/docker-entrypoint.…"   15 minutes ago   Exited (0) 14 minutes ago             tmp-nginx
bc58c240aca1   c654adf64b78   "/docker-entrypoint.…"   3 hours ago      Exited (0) 3 hours ago                panda-nginx2
2080b5ed2f08   nginx          "/docker-entrypoint.…"   4 hours ago      Up 4 hours                  80/tcp    panda-nginx1
f4e9887f4e08   nginx          "/docker-entrypoint.…"   4 hours ago      Exited (0) 4 hours ago                panda-nginx
chengpeng@chengpeng:~$ docker exec -it ded5648fc320 /bin/bash
root@ded5648fc320:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib32  lib64  libx32  media	mnt  nihao  opt  proc  root  run  sbin	srv  sys  tmp  usr  var
root@ded5648fc320:/# cd nihao/
root@ded5648fc320:/nihao# ls
nihao.sh
root@ded5648fc320:/nihao# cat nihao.sh 
1111111111111111111111111111111111111111111111111
root@ded5648fc320:/nihao# 

注意:

1、Docker挂载数据卷的默认读写权限(rw),用户可以通过ro设置为只读
格式:[宿主机文件]:[容器文件]:ro
2、如果直接挂载一个文件到容器,使用文件工具进行编辑,可能会造成文件的改变,从Docker1.1.0起,这会导致
报错误信息。所以推荐的方式是直接挂在文件所在的目录。

2.3.3 数据卷容器简介—>多个容器共享

什么是数据卷容器? 需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器
也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
数据卷容器(Data Volume Containers):使用特定容器维护数据卷
简单点:数据卷容器就是为其他容器提供数据交互存储的容器
docker 数据卷命令详解

:~$ docker run --help
。。。
-v, --volumes-from list Mount volumes from the specified container(s) (default[])
#从指定的容器挂载卷,默认为空

数据卷容器操作流程
如果使用数据卷容器,在多个容器间共享数据,并永久保存这些数据,需要有一个规范的流程才能做得到:
1、创建数据卷容器 2、其他容器挂载数据卷容器
注意: 数据卷容器自身并不需要启动,但是启动的时候依然可以进行数据卷容器的工作。

2.3.4 数据卷容器实践

数据卷容器实践包括两部分:创建数据卷容器和使用数据卷容器
创建一个数据卷容器

#命令格式:
docker create -v [容器数据卷目录] --name [容器名字][镜像名称] [命令(可选)]
#执行效果
$ docker create -v /data --name v1-test1 nginx
chengpeng@chengpeng:~$ docker create -v /data-tmp --name v-tmp nginx
8498798a1df0ef96a160afe9a48a202759775feb9cd93d74c2c2e47dcab11d09
chengpeng@chengpeng:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
8498798a1df0   nginx          "/docker-entrypoint.…"   13 seconds ago   Created                               v-tmp
ded5648fc320   nginx          "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes               80/tcp    tmp-txt
5fe23d16ec59   nginx          "/docker-entrypoint.…"   27 minutes ago   Up 27 minutes               80/tcp    test1
f9f147bcf0b0   nginx          "/docker-entrypoint.…"   30 minutes ago   Exited (0) 29 minutes ago             tmp-nginx
bc58c240aca1   c654adf64b78   "/docker-entrypoint.…"   3 hours ago      Exited (0) 3 hours ago                panda-nginx2
2080b5ed2f08   nginx          "/docker-entrypoint.…"   4 hours ago      Up 4 hours                  80/tcp    panda-nginx1
f4e9887f4e08   nginx          "/docker-entrypoint.…"   4 hours ago      Exited (0) 4 hours ago                panda-nginx
chengpeng@chengpeng:~$ 

创建两个容器,同时挂载数据卷容器

#命令格式:
docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字][镜像名称] [命令(可
选)]
#执行效果:
#创建 vc-test1 容器:
docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash
#创建 vc-test2 容器:
docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash

确认卷容器共享

#进入vc-test1,操作数据卷容器:
:~$ docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt
root@c408f4f14786:/# exit
#进入vc-test2,确认数据卷:
:~$ docker exec -it vc-test2 /bin/bash
root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt
root@7448eee82ab0:/# ls /data/
v-test1.txt
root@7448eee82ab0:/# exit
#回到vc-test1进行验证
:~$ docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
v-test1.txt v-test2.txt
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2

第一个窗口

chengpeng@chengpeng:~$ docker run --volumes-from 8498798a1df0 -itd --name tmp01 nginx
4c2576bed7aab869699e3c7ba9d951fd4049f2e724bf0d21b24cc24ec0417696
itcast@itcast:~$ docker run --volumes-from 8498798a1df0 -itd --name tmp02 nginx
961f508facbfb6f99d476a29f768a715d2371721f2069044543876b4d620ff71
chengpeng@chengpeng:~$ docker exec -it 4c2576bed7aa /bin/bash
root@4c2576bed7aa:/# ls
bin  boot  data-tmp  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home	lib  lib32  lib64  libx32  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@4c2576bed7aa:/# cd data-tmp/
root@4c2576bed7aa:/data-tmp# ls
root@4c2576bed7aa:/data-tmp# mkdir hello
root@4c2576bed7aa:/data-tmp# ls
root@4c2576bed7aa:/data-tmp# ls
world
root@4c2576bed7aa:/data-tmp# 

第二个窗口

root@itcast:~# docker exec -it 961f508facbf /bin/bash
root@961f508facbf:/# ls
bin  boot  data-tmp  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home	lib  lib32  lib64  libx32  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@961f508facbf:/# cd data-tmp/
root@961f508facbf:/data-tmp# ls
root@961f508facbf:/data-tmp# ls
hello
root@961f508facbf:/data-tmp# rm -rf hello/
root@961f508facbf:/data-tmp# ls
root@961f508facbf:/data-tmp# mkdir world
root@961f508facbf:/data-tmp# ls
world
root@961f508facbf:/data-tmp# 

2.3.5 数据备份原理

为什么需要数据备份和恢复? 工作中很多的容器的数据需要查看,所有需要备份将数据很轻松的拿到本地目录。
原理图:
在这里插入图片描述
数据备份方案: 1 创建一个挂载数据卷容器的容器
2 挂载宿主机本地目录作为备份数据卷
3 将数据卷容器的内容备份到宿主机本地目录挂载的数据卷中
4 完成备份操作后销毁刚创建的容器

2.3.6 数据备份实践

在2.3.4的数据卷容器基础上做数据的备份

#命令格式:
$ docker run --rm --volumes-from [数据卷容器id/name] -v [宿主机目录]:[容器目录][镜像名称]
[备份命令]
#命令演示:
#创建备份目录:
$ mkdir /backup/
#创建备份的容器:
$ docker run --rm --volumes-from 60205766d61a -v /home/chengpeng/backup/:/backup/
nginx tar zcPf /backup/data.tar.gz /data
#验证操作:
$ ls /backup
$ zcat /backup/data.tar.gz

注释: -P:使用原文件的原来属性(属性不会依据使用者而变),恢复字段到它们的原始方式,忽略现有的用户权
限屏蔽位(umask)。 加了-p之后,tar进行解压后,生成的文件的权限,是直接取自tar包里面文件的权限(不会再
使用该用户的umask值进行运算),那么不加-p参数,将还要再减去umask的值(位运算的减),但是如果使用
root用户进行操作,加不加-p参数都一样。

chengpeng@chengpeng:~/backup$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS                   PORTS     NAMES
961f508facbf   nginx          "/docker-entrypoint.…"   55 minutes ago      Up 55 minutes            80/tcp    tmp02
4c2576bed7aa   nginx          "/docker-entrypoint.…"   55 minutes ago      Up 55 minutes            80/tcp    tmp01
8498798a1df0   nginx          "/docker-entrypoint.…"   About an hour ago   Created                            v-tmp
ded5648fc320   nginx          "/docker-entrypoint.…"   About an hour ago   Up About an hour         80/tcp    tmp-txt
5fe23d16ec59   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours               80/tcp    test1
f9f147bcf0b0   nginx          "/docker-entrypoint.…"   2 hours ago         Exited (0) 2 hours ago             tmp-nginx
bc58c240aca1   c654adf64b78   "/docker-entrypoint.…"   5 hours ago         Exited (0) 5 hours ago             panda-nginx2
2080b5ed2f08   nginx          "/docker-entrypoint.…"   5 hours ago         Up 5 hours               80/tcp    panda-nginx1
f4e9887f4e08   nginx          "/docker-entrypoint.…"   5 hours ago         Exited (0) 5 hours ago             panda-nginx
chengpeng@chengpeng:~/backup$ docker exec -it tmp01 /bin/bash
root@4c2576bed7aa:/# ls
bin  boot  data-tmp  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home	lib  lib32  lib64  libx32  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@4c2576bed7aa:/# cd data-tmp/
root@4c2576bed7aa:/data-tmp# ls
world
root@4c2576bed7aa:/data-tmp# mkdir hello adada
root@4c2576bed7aa:/data-tmp# mkdir golang beego
root@4c2576bed7aa:/data-tmp# ls
adada  beego  golang  hello  world
root@4c2576bed7aa:/data-tmp# exit
exit
chengpeng@chengpeng:~/backup$ docker exec -it tmp02 /bin/bash
root@961f508facbf:/# ls
bin  boot  data-tmp  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home	lib  lib32  lib64  libx32  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@961f508facbf:/# cd data-tmp/
root@961f508facbf:/data-tmp# ls
adada  beego  golang  hello  world
root@961f508facbf:/data-tmp# exit
exit
chengpeng@chengpeng:~/backup$ docker run --rm --volumes-from v-tmp -v /home/chengpeng/backup/:/backup/ nginx tar -zcPf /backup/data.tar.gz /data-tmp
chengpeng@chengpeng:~/backup$ ls
data.tar.gz
chengpeng@chengpeng:~/backup$ 
chengpeng@chengpeng:~/backup$ tar -zxvf data.tar.gz 
tar: 从成员名中删除开头的“/”
/data-tmp/
/data-tmp/beego/
/data-tmp/adada/
/data-tmp/golang/
/data-tmp/hello/
/data-tmp/world/
chengpeng@chengpeng:~/backup$ ls
data.tar.gz  data-tmp
chengpeng@chengpeng:~/backup$ cd data-tmp/
chengpeng@chengpeng:~/backup/data-tmp$ ls
adada  beego  golang  hello  world
chengpeng@chengpeng:~/backup/data-tmp$ 

2.3.7 数据还原原理

原理图:
数据恢复方案
在这里插入图片描述
1、创建一个新的数据卷容器(或删除原数据卷容器的内容)
2、创建一个新容器,挂载数据卷容器,同时挂载本地的备份目录作为数据卷
3、将要恢复的数据解压到容器中
4、完成还原操作后销毁刚创建的容器

2.3.8 数据还原实践

#命令格式:
docker run --rm -itd --volumes-from [数据要到恢复的容器] -v [宿主机备份目录]:[容器备份目录]
[镜像名称] [解压命令]
#命令实践:
#启动数据卷容器:
$ docker start c408f4f14786
#删除源容器内容:
$ docker exec -it vc-test1 bash
root@c408f4f14786:/# rm -rf /data/*
#恢复数据:
docker run --rm --volumes-from v-test -v /home/chengpeng/backup/:/backup/ nginx tar
xPf /backup/data.tar.gz -C /data
#验证:
:~$ docker exec -it vc-test1/bin/bash
root@c408f4f14786:/# ls /data/data/
v-test1.txt v-test2.txt
#新建新的数据卷容器:
:~$ docker create -v /newdata --name v-test2 nginx
#简历新的容器挂载数据卷容器
:~$ docker run --volumes-from a7e9a33f3acb -tid --name vc-test3 nginx /bin/bash
#恢复数据:
docker run --rm --volumes-from v-test2 -v /home/chengpeng/backup/:/backup/ nginx tar
xPf /backup/data.tar.gz -C /newdata
#验证:
:~$ docker exec -it vc-test3 /bin/bash
root@c408f4f14786:/# ls /newdata
v-test1.txt v-test2.txt

注意: 解压的时候,如果使用目录的话,一定要在解压的时候使用 -C 制定挂载的数据卷容器,不然的话容器数据
是无法恢复的,因为容器中默认的backup目录不是数据卷,即使解压后,也看不到文件。
数据是最宝贵的资源,docker在设计上考虑到了这点,并且为数据的操作提供了充分的支持。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于宝塔面板提示“upgrade your ACME client to support TLSv1.2 or better”的解决办法

今天续期SSL证书的时候提示“upgrade your ACME client to support TLSv1.2 or better”&#xff0c;这一般是旧系统情况下TLS版本过低&#xff1a;acme.sh版本低于2.8所引起的&#xff0c;也就是提示&#xff1a;升级你的系统至 TLS 1.2 协议或更高版本。 但是国内服务器无法…

Web3公链之Cosmos生态的项目Celestia

文章目录 Web3公链之Cosmos生态的项目&#xff1a;模块化区块链Celestia什么是CelestiaCelestia网络架构数据可用性问题有哪些可用的解决方案&#xff1f; 发展历史运行节点参考 Web3公链之Cosmos生态的项目&#xff1a;模块化区块链Celestia 什么是Celestia 官网&#xff1a…

计算机网络与技术——数据链路层

&#x1f60a;计算机网络与技术——数据链路层 &#x1f680;前言☃️基本概念&#x1f94f;封装成帧&#x1f94f;透明传输&#x1f94f;差错检测 ☃️点对点协议PPP&#x1f94f;PPP协议的特点&#x1f94f;PPP协议的帧格式&#x1f50d;PPP异步传输时透明传输&#xff08;字…

的修工单管理系统好用吗?工单系统应该怎么选?

在当今的数字化时代&#xff0c;企业运营效率的高低往往取决于其内部管理工具的先进性和实用性。工单管理系统作为企业运营中的重要工具&#xff0c;其作用日益凸显。市场上存在许多工单管理系统&#xff0c;但“的修”以其独特的产品差异化和优势&#xff0c;在竞争中独树一帜…

东初版 java代码混淆 java加密class Java混淆实际方案

作为资深的开发专家&#xff0c;我很高兴与您分享有关Java混淆的实际方案和案例。Java混淆是一种重要的安全措施&#xff0c;用于保护您的代码免受恶意分析和反编译的威胁。在本文中&#xff0c;我将介绍Java混淆的基本原理、常用工具&#xff0c;以及一个简单的案例来演示如何…

c++从入门到放弃,小白踩坑记录1

c从入门到放弃,小白踩坑记录1 错误问题描述 没有与这些操作数匹配的运算符操作数类型为std::basic_ostream <char,std::char traits <char > > < < <unknown-type > 错误代码 #include<iostream> int main(void) {std::cout << "…

今日头条小程序源码系统 带完整搭建教程

随着小程序的发展&#xff0c;越来越多的企业和开发者开始关注小程序的开发。今天源码小编给大家分享一款今日头条小程序源码系统&#xff0c;并附带完整的搭建教程。 今日头条小程序源码系统是一款基于PHPMySQL开发组合开发的小程序框架&#xff0c;具有丰富的组件库和插件生…

ASO优化之如何制作Google Play的长短描述

应用的描述以及标题和图标是元数据中最关键的元素&#xff0c;可以影响用户是否决定下载我们的应用程序。简短描述的长度限制为80个字符&#xff0c;它提供了更多的有关应用背景信息的机会。 1、简短描述帮助用户快速了解我们应用。 确保内容丰富的同时&#xff0c;保持简洁和…

科研迷雾:读研以来,我发现的科研界“怪象”

1 引言 随着读论文和做实验的增多&#xff0c;我发现了sci的很多猫腻经不起细细推敲&#xff0c;原来科研并不如我想象的神圣&#xff0c;还不如工业界来的实在&#xff0c;因为在工业界做项目出现问题&#xff0c;客户是验收不了不给付钱的。所以论文只是一个玩具。 2 常见的…

ue5 右击.uproject generator vs project file 错误

出现如下错误 Unable to find valid 14.31.31103 C toolchain for VisualStudio2022 x64 就算你升级了你的 vs installer 也不好使 那是因为 在C:\Users\{YourUserName}\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml 这个缓存配置文件中写死了 14…

armbian 安裝配置教程

1、安装贝锐蒲公英 下载安装包 cd /usr/local/share mkdir pgyvpn wget https://pgy.oray.com/softwares/58/download/1839/PgyVisitor_Raspberry_2.4.0.52291_arm64.deb安装 dpkg -i PgyVisitor_Raspberry_2.4.0.52291_arm64.deb 输入pgyvisitor login/pgyvisitor login -…

广告行业中那些趣事系列65:使用chatgpt编写基金定投程序

导读&#xff1a;本文是“数据拾光者”专栏的第六十五篇文章&#xff0c;这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇介绍了prompt生成器和使用chatgpt来编写一个基金定投程序&#xff0c;对于希望使用chatgpt提升工作效率&#xff0c;尤其是对投资基金感兴趣…

php得到两个数组之间的差集、并集、交集方法

1、差集&#xff1a; array_diff()函数用于返回在第一个数组中存在&#xff0c;但在其他数组中不存在的值。 $array1 [1, 2, 3, 4, 5]; $array2 [4, 5, 6, 7, 8]; $diff array_diff($array1, $array2); print_r($diff); 输出&#xff1a;Array ( [0] > 1 [1] > 2 [2]…

保护生产中 Node.js 应用程序安全的 15 项最佳实践

在后端开发方面&#xff0c;Node.js 是开发人员最喜欢的技术之一。它的受欢迎程度不断上升&#xff0c;现已成为在线攻击的主要目标之一。这就是为什么保护 Node.js 免受漏洞和威胁至关重要。 在本指南中&#xff0c;您将看到为生产设计安全 Node.js 应用程序架构的 15 种最佳…

打造美团外卖新体验,HarmonyOS SDK持续赋能开发者共赢鸿蒙生态

从今年8月起&#xff0c;所有升级到HarmonyOS 4的手机用户在美团外卖下单后&#xff0c;可通过屏幕上的一个“小窗口”&#xff0c;随时追踪到“出餐、取餐、送达”等订单状态。这个能让用户实时获悉订单进度的神奇“小窗口”&#xff0c;就是实况窗功能。 实况窗&#xff1a;简…

Intel oneAPI笔记--oneAPI简介、SYCL编程简介

oneAPI简介 Intel oneAPI是Intel提供的统一编程模型和软件开发框架。 它旨在简化可充分利用英特尔各种硬件架构&#xff08;包括 CPU、GPU 和 FPGA&#xff09;的应用程序的开发 oneAPI一个重要的特性是开放性&#xff0c;支持多种类型的架构和不同的硬件供应商&#xff0c;是…

QML 创建 Web 混合应用

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 随着互联网的快速发展,Web 应用在各个领域中变得越来越流行。为了满足用户对多样化功能的需求,我们经常需要将 Web 技术和原生应用相结合,来创建混合应用程序。 混合应用程序:是一种应用程序开发方法,它…

Microsoft 365 管理自动化

Microsoft 365 服务被大多数组织广泛使用&#xff0c;每天生成的数据量巨大。解决 Microsoft 365 中的问题可能非常困难&#xff0c;并且使用多个管理中心来保护组织变得复杂。本机控制台还缺少某些批量管理任务、全面的审计报告和基于角色的精细访问控制。 Microsoft 360 管理…

42 深度学习(六):调参|保存模型以及再次调用或训练

文章目录 卷积神经网络调参optimizer 优化器SGDmomentumAdaGradRMSPropadam学习率自适应经验之谈 激活函数SigmoidTanhReLULeaky-ReLU指数线性单元(ELU)Maxout&#xff08;基本不用&#xff09;经验之谈 初始化全部为 0判断初始化好不好批归一化&#xff08;BN&#xff09; 数据…

android 8.1 disable unsupported sensor

如果device不支持某种sensor,可以在android/frameworks/base/core/java/android/hardware/SystemSensorManager.java里将其disabled掉。以disable proximity sensor为例。 public SystemSensorManager(Context context, Looper mainLooper) {synchronized(sLock) {if (!sNativ…
最新文章