第 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在设计上考虑到了这点,并且为数据的操作提供了充分的支持。