前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker容器虚拟化(二)—容器管理、仓库管理、数据管理

Docker容器虚拟化(二)—容器管理、仓库管理、数据管理

作者头像
阿dai学长
发布2019-04-03 10:34:57
7860
发布2019-04-03 10:34:57
举报
文章被收录于专栏:阿dai_linux阿dai_linux阿dai_linux

Docker 容器管理

启动一个容器:
[root@study ~]# docker run -it centos-7-x86_64-minimal /bin/bash

创建一个容器但不启动:
[root@study ~]# docker create -it centos
##在此只能使用docker自带镜像

查看容器内核版本:
[root@5bfbfae5c6a6 /]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)

激活一个已经存在的容器:
[root@study ~]# docker start 5bfbfae5c6a6
##有start 就有stop,和restart

让镜像在后台启动:
[root@study ~]# docker run -itd centos-7-x86_64-minimal /bin/bash

进入运行中的docker容器:
[root@study ~]# docker exec  -it 2f35054abd5e /bin/bash
或:
[root@study ~]# docker attach 2f35054abd5e
##注:使用attach进入终端再退出后会终止当前镜像,而使用则exec不会。

启动容器的同时运行命令:
[root@study ~]# docker run -d adai:part2  bash -c "while :; do echo "123";sleep 1 ;done"

[root@study ~]# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS              PORTS               NAMES
2804754d7fcb        adai:part2                "bash -c 'while :; do"   About a minute ago   Up About a minute                       reverent_babbage

查看某容器的日志:
[root@study ~]# docker logs 2804754d7fcb

停止一个镜像:
[root@study ~]# docker stop 2804754d7fcb

指定docker容器运行时的名称:
[root@study ~]# docker run -itd --name test adai:part2 bash
[root@study ~]# docker ps 
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES
48097e8bfd93        adai:part2                "bash"              32 seconds ago      Up 29 seconds                           test

删除docker容器:
[root@study ~]# docker rm 48097e8bfd93
Error response from daemon: You cannot remove a running container 48097e8bfd93ec6bb0a69632be332f1a61bd2aaeb8180f113182a2c452a51828. Stop the container before attempting removal or use -f
[root@study ~]# docker stop  48097e8bfd93
48097e8bfd93
[root@study ~]# docker rm 48097e8bfd93
48097e8bfd93
##即,删除一个容器前需要先停止该容器运行;如果要强行删除一个正在运行的容器需要加-f选项。

使容器退出时直接从容器执行列表删除:
[root@study ~]# docker run --rm -it adai:part2 bash -c "sleep 30"
##--rm和-d不能同时使用
[root@study ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e523a18c4268        centos              "/bin/bash"         15 hours ago        Up 3 hours                              hopeful_galileo
##无运行记录

容器迁移

导出容器:
[root@study ~]# docker export e523a18c4268 > adai_centos.tar
[root@study ~]# du -sh adai_centos.tar 
248M	adai_centos.tar

导入容器:
[root@study ~]# cat adai_centos.tar |docker import - adai_test
[root@study ~]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
adai_test                 latest              f89ac65eb9b3        57 seconds ago      250.6 MB
##恢复后会生成一个新的镜像

[root@study ~]# docker run -itd adai_test:latest bash
[root@study ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d6d0bf2ceea2        adai_test:latest    "bash"              5 seconds ago       Up 3 seconds                            lonely_kare

Docker仓库管理

下载registry镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库。

[root@study ~]# docker pull registry

[root@study ~]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
centos-7-x86_64-minimal   latest              e21aadc0e309        2 hours ago         434.5 MB
docker.io/registry        latest              28525f9a6e46        3 weeks ago         33.19 MB
docker.io/centos          latest              196e0ce0c9fb        3 weeks ago         196.6 MB

[root@study ~]# docker run -d -p 5000:5000 registry
##以registry进行启动容器,监听5000端口
##-p:表示做一个端口映射,左边是母机端口,右边是容器端口

[root@study ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ab90f97da4fc        registry            "/entrypoint.sh /etc/"   5 seconds ago       Up 4 seconds        0.0.0.0:5000->5000/tcp   jovial_keller

可以使用curl访问:
[root@study ~]# curl 127.0.0.1:5000 -I
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Thu, 12 Oct 2017 07:32:16 GMT
Content-Type: text/plain; charset=utf-8

登录容器时报错:

[root@study ~]# docker exec -it ab9 /bin/bash
rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"exec: \\\"/entrypoint.sh/etc/\\\": stat /entrypoint.sh/etc/: not a directory\"\n"

经排查得知原因:容器中没有bash,所以执行sh就可以了,如下:

[root@study ~]# docker exec -it ab9 /bin/sh
/ #

登录成功!然后看一下该容器根目录下的文件:

/ # ls
bin            entrypoint.sh  home           linuxrc        mnt            root           sbin           sys            usr
dev            etc            lib            media          proc           run            srv            tmp            var

发现启动脚本—entrypoint.sh:
/ # vi entrypoint.sh
#!/bin/sh                         set -e                            case "$1" in                      
    *.yaml|*.yml) set -- registry serve "$@" ;;                 
    serve|garbage-collect|help|-*) set -- registry "$@" ;;       
esac                              
exec "$@"

即,“#!/bin/sh”!

上传镜像到私有仓库

registry库的IP:172.17.0.2

准备一个镜像(实验用):
[root@study ~]# docker  pull busybox
[root@study ~]# docker images
docker.io/busybox         latest              54511612f1c4        4 weeks ago         1.129 MB

上传之前需要对镜像打上标记:
[root@study ~]# docker tag busybox 192.168.8.139:5000/busybox
##标记内容必须带有私有仓库的ip:port(母机的IP和port)

上传镜像:
[root@study ~]# docker push 192.168.8.139:5000/busybox

提示:

The push refers to a repository [192.168.8.139:5000/busybox]
Get https://192.168.8.139:5000/v1/_ping: http: server gave HTTP response to HTTPS client

这个问题可能是由于客户端采用https,docker registry未采用https服务所致。但发现docker1.12.3版本并无此文件,根据网上创建此文件,并填入相应内容,重启docker无效果,仍然报此错误。解决方法如下:

编辑”/etc/docker/“目录下”daemon.json“文件:
[root@study ~]# vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.8.139:5000"] }
##宿主机IP和对应端口

保存退出后,重启docker。

重启docker服务:
[root@study ~]# systemctl restart docker.service

启动registry容器:
[root@study ~]# docker start ab90f97da4fc

推送:
[root@study ~]# docker push 192.168.8.139:5000/busybox
The push refers to a repository [192.168.8.139:5000/busybox]
6a749002dd6a: Pushed 

查看私有仓库有哪些文件:
[root@study ~]# curl http://192.168.8.139:5000/v2/_catalog
{"repositories":["busybox"]}

docker数据管理

如果只把数据存储到docker容器中,只有保存镜像的时候才能将数据保存起来,否则数据会随着容器的停止/删除而丢失,为了防止容器中的数据丢失使用如下方法:将母机中的目录挂载到容器中,这样一来,容器中的数据就会保存在母机对应的目录中,不会因为你容器的关闭和删除而丢失。

挂载本地目录到容器

挂载本地目录到容器:
[root@study ~]# mkdir /data/docker
[root@study ~]# docker run -itd -v /data/docker/:/data1/ centos bash
##-v:指定挂载目录
##/data/docker/:为母机中的目录
##/data1/:为docker容器中的目录

准备一个测试文件:
[root@study ~]# touch /data/docker/1.txt
[root@study ~]# echo "test.test.test">/data/docker/1.txt

进入容器:
[root@study ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e76358f5a80a        centos              "bash"                   4 minutes ago       Up 4 minutes                                 amazing_hypatia
ab90f97da4fc        registry            "/entrypoint.sh /etc/"   19 hours ago        Up 15 minutes       0.0.0.0:5000->5000/tcp   jovial_keller
[root@study ~]# docker exec -it e76358f5a80a bash
[root@e76358f5a80a /]# ls data1/
1.txt
[root@e76358f5a80a /]# cat data1/1.txt 
test.test.test
[root@e76358f5a80a /]# touch /data1/2.txt
[root@e76358f5a80a /]# exit
[root@study ~]# ls /data/docker/
1.txt  2.txt
##挂载成功,此时再停止或删除该容器相应的数据不会丢失。  

挂载数据卷

挂载目录的时候,可以指定容器name,如果不指定就随机定义了。可以使用命令docker ps查看最右侧一列,使用该name实现数据卷的挂载。

启动容器并挂载目录:
[root@study ~]# docker run -itd -v /data/docker/:/data1/ centos bash
f73da2b9f4bbf010310f17c9d702b33225dc8caaf213ac483c52bef6f6d3a14e
[root@study ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
f73da2b9f4bb        centos              "bash"                   5 seconds ago       Up 3 seconds                                 condescending_dijkstra

再启动一个容器,同时挂载数据卷:
[root@study ~]# docker run -itd --volumes-from condescending_dijkstra centos-7-x86_64-minimal bash
##--volumes-from:挂载目录的来源

[root@study ~]# docker exec -it 9c5 bash
[root@9c572d68135c /]# ls data1/
1.txt  2.txt
[root@9c572d68135c /]# touch data1/3.txt
[root@9c572d68135c /]# exit
[root@study ~]# ls /data/docker/
1.txt  2.txt  3.txt
[root@study ~]# docker exec -it f73 bash
[root@f73da2b9f4bb /]# ls data1/ 
1.txt  2.txt  3.txt

所谓挂载数据卷,即多个docker容器使用同一个母机中的挂载目录,该方法便于web容器的数据共享,实现web容器的负载均衡。

定义数据卷容器

定义数据卷容器,顾名思义把容器作为数据卷来使用(即,使一个容器扮演母机中“/data/docker/"目录的角色)。有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。

建立数据卷容器:
[root@study ~]# docker run -itd -v /data/docker/ --name centos_testv centos  bash
##-v:指定挂载目录(/data/docker/为本地目录)
##--name:指定容器名称

查看容器信息:
[root@study ~]# docker exec -it centos_testv bash
[root@906c82f62c28 /]# ls data/
docker
[root@906c82f62c28 /]# ls /data/docker/
##该容器中的/data/docker/和母机中的/data/docker/没关系

该数据卷容器的作用是使其他容器来共享数据,数据卷容器中的数据无法直接存储到母机。

挂载数据卷
[root@study ~]# docker run -itd --volumes-from centos_testv centos bash
70e19ec88a71……

[root@study ~]# docker exec -it 70e bash
[root@70e19ec88a71 /]# ls /data/
docker
[root@70e19ec88a71 /]# ls /data/docker/
[root@70e19ec88a71 /]# touch /data/docker/test.txt

切换至数据卷容器:
[root@study ~]# docker exec -it centos_testv bash
[root@906c82f62c28 /]# ls /data/docker/
test.txt

[root@study ~]# docker run -itd --volumes-from centos_testv --name=test centos bash
[root@study ~]# docker exec -it test bash
[root@d32900e0f13b /]# ls /data/docker/
test.txt

即,挂载成功。

数据卷的备份与恢复

备份
[root@study ~]# mkdir /data/vol_data_backup

新建容器并挂载数据卷和本地目录:
[root@study ~]# docker run -itd --volumes-from centos_testv -v /data/vol_data_backup/:/backup centos bash
b75ef953654be82f8eabbfde3d218f57f537d21fe51655a14f6b5f650cac6363

[root@study ~]# docker exec -it b75e bash

本地挂载:
[root@b75ef953654b /]# ls /backup/

数据卷挂载:
[root@b75ef953654b /]# ls /data/docker/
test.txt  test1.txt

打包数据卷目录/data/docker/:
[root@b75ef953654b /]# tar cvf /backup/docker.tar /data/docker/ 
tar: Removing leading `/' from member names
/data/docker/
/data/docker/test.txt
/data/docker/test1.txt

退出容器,查看本地挂载目录:
[root@study ~]# ls /data/vol_data_backup/
docker.tar

说明: 在此新建的该容器功能类似于“跳板机”,即,将该容器同时挂载到数据卷容器和本地目录,然后在该“跳板机”容器中打包数据卷容器中的数据放到本地目录中,以达到备份的目的。

恢复
新建数据卷容器:
[root@study ~]# docker run -itd -v /data/docker2  --name centos_testv2 centos bash

挂载数据卷,新建容器并解包:
[root@study ~]# docker run -itd --volumes-from centos_testv2 --name=newdocker -v /data/vol_data_backup/:/backup centos tar xvf /backup/docker.tar

[root@06a271b128bb /]# ls /data/  
docker  docker2
[root@06a271b128bb /]# ls /data/docker/
test.txt  test1.txt

至此,恢复工作完成,之后只需要把其他容器挂载到这个新的物理卷就可以了。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017/10/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker 容器管理
    • 容器迁移
    • Docker仓库管理
      • 上传镜像到私有仓库
      • docker数据管理
        • 挂载本地目录到容器
          • 挂载数据卷
            • 定义数据卷容器
              • 建立数据卷容器:
              • 挂载数据卷
            • 数据卷的备份与恢复
              • 备份
              • 恢复
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档