Docker-(二).使用操作
https://www.cnblogs.com/kevingrace/p/6238195.html#undefined
docker的三个组件:镜像、容器、仓库;
容器是隔离的,虚拟机是彻底的资源隔离;
仓库是集中式机构,将镜像都存放进去;只要能访问仓库,就可以下载镜像建立容器;
docker目前的问题:如果docker挂了 那上面的容器停了 那上面的服务就会有问题;
生产中:分层设计,更新推送是增量的
系统环境------运行环境------应用环境
一.镜像操作
1.查看docker信息
docker info
2.搜索镜像
docker search centos
docker search lamp -f stars=10 (显示星际10以上的)
3.下载镜像/上传镜像
docker pull nickistre/centos-lamp
docker push 名称:标签
4.显示当前镜像
docker images
5.查看镜像信息
docker inspect ID
6.添加标签
docker tag nickistre/centos-lamp:latest centos:lamp
7.导出/导入
docker save -o centos.tar centos
docker load < 存出的文件
docker load -input centos.tar
8.删除镜像
(有容器的时候,不能删除镜像)
docker rmi 名称/镜像ID (以ID号删除,会删除同一个ID下全部的镜像)
-f (强制删除)
二.容器操作
1.创建容器
docker create -it nickistre/centos-lamp /bin/bash (默认没有运行)
docker ps (查看正在运行的容器)
2.启动容器
docker start 容器的ID/名称
3.创建并启动容器
等同于先执行docker create命令,再执行docker start命令。需要注意只要后面的命令运行结束,容器就会停止。
docker run centos(镜像名称)/bin/echo 'Hello world'
docker run -d nginx (在后台运行镜像并获取容器的id)
4.启动并进入容器
docker run --name 镜像名称 -it centos /bin/bash -c ls
-t 分配一个终端
-i 标准输出打开
-it 进入容器的交互模式
5.获取容器的PID
docker inspect -f '{{.State.Pid}}' 容器ID/名称
6.进入容器
docker exec –it 容器ID/名称 /bin/bash
nsenter -t 容器的PID -m -u -i -n -p (yum install -y util-linux)
注:先获取容器PID,在通过nsenter进入。exit不会退出docker,只是退出nsenter这个bash
docker attach 进入正在运行的docker(不推荐,退出后容器关闭)
7。直接向容器使用命令
docker exec 容器ID/名称 whoami
8.删除容器
docker stop ID
docker rm ID
docker run --rm centos /bin/echo "Hello word" (启动到停止之后删除)
杀死所有正在运行的容器
docker kill $(docker ps -a -q)
删除所有已经停止的容器
docker rm $(docker ps -a -q)
删除所有未打 dangling 标签的镜像
docker rmi $(docker images -q -f dangling=true)
删除所有镜像
docker rmi $(docker images -q)
强制删除镜像名称中包含“doss-api”的镜像
docker rmi --force $(docker images | grep doss-api | awk '{print $3}')
9.暂停运行容器
docker pasuse 容器的ID
10.继续运行容器
docker unpause 容器的ID
11.容器导出容器文件
docker export 容器的ID/名称 > centos.tar (无论容器是否在运行中都可以)
12.将容器文件生成镜像
cat 容器文件.tar|docker import - 生成的镜像名称:标签
三.网络通信
指定映射: docker run -d -p 81:80 --name mynginx nginx
随机端口: docker run -P --name mynginx nginx
查看端口: docker port b84c2b614702
四.数据卷管理
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。
在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:
(1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)
(2)bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式)
但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
(3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)
五.Volume的基本使用
1.创建自定义容器卷
docker volume create nginx-vol
2.查看所有容器卷
docker volume ls
3.查看容器卷信息
docker volume inspect nginx-vol
获取正在运行的容器的IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx-web
4.创建容器并指定数据卷(容器挂载到宿主机内)
docker run -d -it --name=edc-nginx -p 8800:80 -v nginx-vol:/usr/share/nginx/html nginx
其中,-v代表挂载数据卷,这里使用自定数据卷nginx-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。
进入数据卷,可以看到,我们可以访问到容器里面的内容
,由此可知,volume帮我们做的类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。
这时,如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉。
六.Bind Mounts的基本使用(宿主机挂载到容器内)
1.创建容器并挂载指定目录
docker run -d -p 81:80 --name nginx-web -v /apps/nginx/www:/usr/share/nginx/html -v /apps/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /apps/nginx/logs:/var/log/nginx nginx
这里指定了将宿主机上的 /app/wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。
与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容
(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。
但是,我们可以将宿主机上的文件随时挂载到容器中:
2.验证绑定
docker inspect nginx-web
3.需要手动创建logs,conf,html等文件
4.实例:启动nginx容器并挂载到指定目录
docker run -d -p 8081:80 --name nginx-web nginx
cd /apps/nginx/
docker cp 8e7daa15a780:/usr/share/nginx/html /apps/nginx/www
mkdir conf logs
touch conf/nginx.conf
docker run -d -p 81:80 --name nginx-web -v /apps/nginx/www:/usr/share/nginx/html -v /apps/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /apps/nginx/logs:/var/log/nginx nginx
5.直接挂载其他容器的数据卷
docker run -t -i --rm --volumes-from nginx-web --name nginx-test /bin/bash nginx
七.备份数据卷
先创建一个容器,并挂载要备份的容器数据卷,再挂载数据卷(pwd):/backup目录到容器/bakcup,在容器中执行备份/data目录到/backup,也就是备份到宿主机$(pwd):/backup目录
1.备份单个数据卷
[root@iZ2ze4so7qtj41e2osvhbaZ apps]# docker run --rm --volumes-from nginx-test -v $(pwd):/backup nginx tar cvf /backup/test.tar /var/log/nginx
tar: Removing leading '/' from member names
/var/log/nginx/
/var/log/nginx/myharbor-access.log
/var/log/nginx/nginx.pid
/var/log/nginx/error.log
/var/log/nginx/myharbor-error.log
备份nginx-test容器中/var/log/nginx/下的文件,并保存到本地的test.tar
2.备份多个数据卷
[root@iZ2ze4so7qtj41e2osvhbaZ apps]# docker run --rm --volumes-from nginx-test -v $(pwd):/backup nginx tar cvf /backup/test.tar /var/log/nginx /usr/share/nginx/html
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
/var/log/nginx/
/var/log/nginx/myharbor-access.log
/var/log/nginx/nginx.pid
/var/log/nginx/error.log
/var/log/nginx/myharbor-error.log
/usr/share/nginx/html/
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/test.html
/usr/share/nginx/html/index.html
八.恢复或迁移数据卷
可以恢复给同一个容器或者另外的容器,新建容器并解压备份文件到新的容器数据卷
$ docker run --rm --volumes-from test -v $(pwd):/backup nginx tar xvf /backup/test.tar -C /
注意-C后面的路径,这个路径表示将数据恢复到容器里的路径。命令中用"/",即表示将backup.tar中的数据解压到容器的/路径下。后面跟什么路径,就解压到这个路径下。因此这里用"/"
1.恢复数据给同一个容器
删除原容器的/var/log/nginx/和/usr/share/nginx/html/下的数据
[root@iZ2ze4so7qtj41e2osvhbaZ apps]# docker run --rm --volumes-from nginx-test -v $(pwd):/backup nginx tar xvf /backup/test.tar -C /
var/log/nginx/
var/log/nginx/myharbor-access.log
var/log/nginx/nginx.pid
var/log/nginx/error.log
var/log/nginx/myharbor-error.log
usr/share/nginx/html/
usr/share/nginx/html/50x.html
usr/share/nginx/html/test.html
usr/share/nginx/html/index.html
2.恢复数据给另外的容器,新建容器并解压备份文件到新的容器数据卷
注意:新容器创建时挂载的数据卷路径最好是和之前备份的数据卷路径一致
[root@iZ2ze4so7qtj41e2osvhbaZ apps]# docker run -t -i -v /usr/share/nginx/html -v /var/log/nginx --name test nginx /bin/bash
root@048efe5ea529:/#
root@048efe5ea529:/# cd /usr/share/nginx/html
root@048efe5ea529:/usr/share/nginx/html# cd /var/log/nginx
root@048efe5ea529:/var/log/nginx# ls
access.log error.log
root@048efe5ea529:/var/log/nginx#
恢复数据之后
[root@iZ2ze4so7qtj41e2osvhbaZ apps]# docker run --rm --volumes-from test -v $(pwd):/backup nginx tar xvf /backup/test.tar -C /
var/log/nginx/
var/log/nginx/myharbor-access.log
var/log/nginx/nginx.pid
var/log/nginx/error.log
var/log/nginx/myharbor-error.log
usr/share/nginx/html/
usr/share/nginx/html/50x.html
usr/share/nginx/html/test.html
usr/share/nginx/html/index.html
[root@iZ2ze4so7qtj41e2osvhbaZ apps]#
3.如果新容器创建时挂载的数据卷目录跟之前备份的路径不一致
[root@localhost ~]# docker run -t -i -v /var/huihui --name huihui docker.io/centos /bin/bash
[root@9bad9b3bde71 /]# ls /var/huihui/
[root@9bad9b3bde71 /]#
如果解压时-C后面跟的路径不是容器挂载的容器,那么数据恢复不了,如下
[root@localhost ~]# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var/volume1/
var/volume1/test1
var/volume2/
var/volume2/test2
发现容器内数据没有恢复
[root@9bad9b3bde71 /]# ls /var/huihui/
[root@9bad9b3bde71 /]#
但是如果解压时-C后面跟的是容器挂载的路径,数据就能正常恢复
[root@localhost ~]# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /var/huihui
var/volume1/
var/volume1/test1
var/volume2/
var/volume2/test2
九.删除数据卷
Volume 只有在下列情况下才能被删除:
1)docker rm -v删除容器时添加了-v选项
2)docker run --rm运行容器时添加了--rm选项
可以使用 docker rm -v 命令在删除容器时删除该容器的卷。示例如下:
[root@localhost volumes]# docker run -d -P --name huihui -v /www docker.io/centos
69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69
[root@localhost volumes]# docker volume ls
DRIVER VOLUME NAME
local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local 97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b
local data_volume
[root@localhost volumes]# docker rm -vf huihui
huihui
[root@localhost volumes]# docker volume ls
DRIVER VOLUME NAME
local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local data_volume