2.docker容器管理、仓库管理、数据管理、数据卷备份恢复

Docker容器管理

  • 创建容器:docker create  -it  centos6   bash //这样可以创建一个容器,但该容器并没有启动,docker ps也看不到需要docker ps -a才能看到

[root@awei-01 ~]# docker create -it centos6 bash
55a10d72564eecca7e11d9ed1d5950109e972a51a2c717102e7eca5a5d52f6df
[root@awei-01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@awei-01 ~]# docker ps -a                                                        ##必须加上“-a”选项在能看到,因为他并没有启动
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS    PORTS     NAMES
55a10d72564e   centos6   "bash"    11 seconds ago   Created             elated_kepler
[root@awei-01 ~]# docker exec -it 55a10d72564e bash                                   ##没有启动所以进不去
Error response from daemon: Container 55a10d72564eecca7e11d9ed1d5950109e972a51a2c717102e7eca5a5d52f6df is not running

  • 启动容器:docker start   container_id   //启动容器后,可以使用 docker ps  查看到,有start 就有stop,和restart

[root@awei-01 ~]# docker start 55a10d72564e
55a10d72564e
[root@awei-01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS          PORTS     NAMES
55a10d72564e   centos6   "bash"    About a minute ago   Up 11 seconds             elated_kepler

 ps:之前我们使用的docker run 相当于先create再start

  • 进入容器并且不再后台运行:docker run -it centos bash

这个你在直接退出容器的话docker ps 是查看不到的 因为没加d选项 他不会在后台运行,ctrl+d退出就是直接退出来了,这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl d 退出该bash,当退出后这个容器也会停止。

  • 后台运行容器:docker run -d   加上“-d”选项可以让容器在后台运行

     也可以脚本死循环(用的很少):docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"

  • 自定义名字启动容器:docker run --name 自定义name -itd 要启动的镜像 bash //

[root@awei-01 ~]# docker run --name awei -itd centos6 bash
d8ba554eae2df6254945e3ce21b09d9f252fba98fba13872ea31c69240ae364c
[root@awei-01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
d8ba554eae2d   centos6   "bash"    12 seconds ago   Up 12 seconds             awei
55a10d72564e   centos6   "bash"    22 minutes ago   Up 20 minutes             elated_kepler

   可以直接名字进入容器

[root@awei-01 ~]# docker exec -it awei bash
[root@d8ba554eae2d /]#
  • 启动容器并执行命令:docker run --rm -it centos bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出

  • 查看容器日志:docker logs container_id 可以获取到容器的运行历史信息,用法如下 

docker attach 可以进入一个后台运行的容器,比如

docker attach  container_id    //但是attach命令不算好用,比如我们想要退出终端,就得exit了,这样容器也就退出了,还有一种方法

  • 进入容器

docker exec -it container_id  bash  //可以临时打开一个虚拟终端,并且exit后,容器依然运行着

  • 删除容器

docker rm  container_id  //container_id是ps的时候查看到的,这样就可以把container删除,如果是运行的容器,可以加-f

  • 导出容器

docker  export  container_id  > file.tar  // 导出容器,可以迁移到其他机器上,需要导入

  • 导入容器

cat file.tar |docker import - aming_test   //这样会生成aming_test的镜像


Docker仓库管理

因为不管你是pull镜像还是push上传镜像都是到了官方的公有仓库,为了隐私我们可以创建一个自己的私有仓库

创建私有仓库方法:

  • 下载registry 镜像:docker pull registry   //registy为docker官方提供的一个镜像,可以运行出一个容器,我们可以用它来创建本地的docker私有仓库。

  • 启动registry镜像为容器:docker run -d -p 5000:5000 registry   //-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口

[root@localhost ~]# docker run -d -p 5000:5000 registry
WARNING: IPv4 forwarding is disabled. Networking will not work.
b31501bfcb453be61b2d0da0589d9c0fbc36c4a954967deeb86d112552bc99c2
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                    NAMES
b31501bfcb45   registry   "/entrypoint.sh /etc…"   40 seconds ago   Up 19 seconds   0.0.0.0:5000->5000/tcp   gifted_bhabha
  • 访问仓库:curl 127.0.0.1:5000/v2/_catalog //这个仓库暂时是空的,需要上传镜像

[root@localhost ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}

镜像上传到私有仓库方法:

  • 首先先给你要上传的镜像打一个标签

格式:docker tag 要打标签的镜像名 宿主机IP:宿主机端口/标签名

docker tag centos6 192.168.238.128:5000/centos6 //标记一下tag,必须要带有私有仓库的ip:port

  • 把标记的镜像给推送到私有仓库

docker push 192.168.238.128:5000/centos6

此时并不会成功,报错(因为他默认要使用https的地址)

[root@localhost ~]# docker push 192.168.238.128:5000/centos6
Using default tag: latest
The push refers to repository [192.168.238.128:5000/centos6]
Get https://192.168.238.128:5000/v2/: http: server gave HTTP response to HTTPS client

更改配置文件,vi /etc/docker/daemon.json//更改为以下参数(私有仓库的地址,因为他默认使用的是https但是我们就想使用http)

{ "insecure-registries":["192.168.18.128:5000"] }

重启docker:systemctl restart docker

启动registry:docker start  registry的id 

再次push

docker push 192.168.238.128:5000/centos

[root@localhost ~]# docker push 192.168.238.128:5000/centos6
Using default tag: latest
The push refers to repository [192.168.238.128:5000/centos6]
0a2f11f7b1ef: Pushed 
latest: digest: sha256:aaa6c8af8eaa472d66066727f791c89fc3adff67495c5ae67b79fc7d0ec79bd8 size: 529

curl 127.0.0.1:5001/v2/_catalog //可以查看到推送上来的镜像

[root@localhost ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos6"]}
  • 其他主机下载使用私有仓库方法

在其他主机上也可以下载你刚上传到自己仓库的镜像,首先服务器得有docker的程序,然后docker pull 组宿主机ip:端口/镜像名就可以

配置一下 /etc/docker/daemon.json配置文件的ip地址,配置成仓库服务器的,然后就可以pull了


Docker数据管理

因为你的容器是由镜像开启的,当你在容器里有新的数据写入或者更新新的数据之后,你把这个镜像删除或者关闭数据也就随之删除了,这就有一定的风险

解决办法:可以把宿主机的一个目录挂载到容器里,然后等你在写数据的时候他就会写入到宿主机的磁盘上

  • 挂载本地的目录到容器里

docker run -tid -v /data/:/data centos bash //-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建

  • 挂载数据卷

其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为relaxed_franklin,这个名字可以使用命令 docker ps  看最右侧一列

我们开启一个新的镜像,并指定一个之前可共享的容器:

docker run -itd --volumes-from 共享容器名 要启动的容器名 bash

--volumes-from:指定共享的容器名,其实就是一个数据卷容器 relaxed_franklin:容器名 aming123:新开启的容器叫什么

这样,我们使用aming123镜像创建了新的容器,并且使用了 relaxed_franklin  容器的数据卷

  •  创建数据卷容器

有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。

首先建立数据卷容器

-v选项:共享目录

docker run -itd -v /data/ --name testvol centos  bash  //注意这里的/data/是容器的/data目录,并非本地的/data/目录。这样加-v选项意思就是把容器的data目录共享出来 

然后让其他容器挂载该数据卷

docker run -itd  --volumes-from testvol aming123 bash

小结:-v选项的两种用法

第一种是挂载映射的作用:-v /data/:/data 把宿主机的data目录挂载到容器里的data目录上

第二种是把容器的某个盘共享出来:-v /data/ 把容器的data目录共享出来当数据卷使用

分享的目录是什么,那挂载的目录就是什么,我分享的是data目录,如果我其中一个容器是data,另一个想是home怎么办,做软连接

软连接:ln -s /data/ /home/


Docker数据卷的备份与恢复

适用于数据卷容器没有映射宿主机目录的情况下

备份

创建目录:mkdir /data/backup (宿主机)

docker run --volumes-from testvol -v  /data/backup/:/backup centos tar cvf  /backup/data.tar /data/

说明:首先我们需要使用testvol数据卷新开一个容器,同时我们还需要把本地的/vol_data_backup/目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件,我们就可以直接在/data/backup/目录中看到了。 然后再把/data/目录下面的文件打包到成data.tar文件放到/backup目录下面。

恢复

思路: 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把tar包解包。

新建数据卷容器:docker run -itd -v /data/ --name testvol2 centos bash

挂载数据卷新建容器,并解包:docker run --volumes-from testvol2  -v /data/backup/:/backup centos tar xf /backup/data.tar

image.png

1机器共享出/data/目录

2机器在开启的时候使用1镜像创建了新的容器,挂载了1机器的数据卷那么2机器上也会有1机器上共享出来的/data/目录

2机器在自己挂在一个目录(/backup)到宿主机上的一个目录(/data/backup/)

然后2机器把之前/data/目录的数据拷贝到/backup/下,/backup/自然也会映射到宿主机的/data/backup/


猜你喜欢

转载自blog.51cto.com/12922638/2591043