docker之容器管理、仓库管理,数据管理

一.容器管理

1.用本地镜像(类似于vm的iso文件)创建一个容器(类似vm虚拟机):

创建centos6的容器:

docker create -it centos6 bash #docker images中有centos6的镜像文件

我之前也写到过另一种创建容器的方式:

docker run -itd centos6 bash

这两种方式的区别在于:前者是创建了镜像,但是还没有启动;后者是创建了镜像还启动了。

启动镜像centos6镜像:

  • 先查看一下还没有启动的镜像(我自己创建了两个)

在这里插入图片描述

  • 启动镜像:
[root@ligen ~]# docker start dff  # container id
dff
[root@ligen ~]# docker start b4
b4

解释一下-i,-t,-d的作用:

  • docker run -it centos6 bash //不加参数-d,当使用命令exit或者ctrl d退出的时候,这个容器也会停止。
  • docker -d 容器 //容器可以在后台运行
  • docker run -d centos6 bash -c “echo 123” //这样可以在后台执行命令

给容器自定义名字:

docker run --name web1 -itd  centos6 bash
[root@ligen ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a1933b5a5d9b        centos6             "bash"              10 seconds ago      Up 9 seconds                            web1

查看docker历史运行信息:

docker logs 容器id
docker logs 36109cc9c 
123

还有一种进入后台docker的命令:

docker attach dff #但是这种命令,当使用exit退出的时候,容器也会退出

导出容器:

docker export dff6a144fd47 > centos6.tar

恢复:

cat centos6.tar |docker import - lll

二.仓库管理:

需求分析:
之前当我们下载镜像的时候,利用pull从官网下载来镜像,但是假如我们自己做了一个镜像向分享给其他人,是不是要先上传官网,然后可以从其他地方下载。或者本地先生成文件,在拷贝到U盘里,在传给其他人。
有没有简单的方法,让别人从远程pull我的镜像呢,而又不用上传官网呢?

私有仓库:
docker除了公共仓库,也有私有仓库(容器registry),可以满足这种需求。

先说一下docker重启之后,所有容器都会stop状态,这里随便写一个脚本,可以一键start或者stop:

vim /usr/local/sbin/docker_start.sh
#!/bin/bash
   read -p "input(start|stop|):" act
   case $act in
   start)
       docker_id=`docker ps -a |awk '{print $1}' |grep -v CONTAINER`
       for f in $docker_id
       do
           docker start $f
       done
      ;;
  stop)
     docker_stop=`docker ps |awk '{print $1}'|grep -v CONTAINER`
     for f in $docker_stop
     do
         docker stop $f
     done
     ;;
  esac

建立私有仓库:

  • pull registry镜像:
    pull之前,最好配置好之前写过的加速,要不然会很慢。
docker pull registry
  • 既然要远程连接,那必须要ip地址对吧,docker是服务器上的一个程序,ip地址可以是服务器的。但是端口呢,怎么访问容器里面的服务呢,比如说容器里面搭建了一个nginx,端口80,但是这个端口是容器里面的端口,别的主机怎么可以越过服务器直接访问容器端口呢。这里需要做一个端口映射,容器里面的端口映射到服务器里面的端口:
docker run -d -p 5000:5000 registry #端口可以自己定义

右边是服务器的端口,右边是registry的端口
查看一下服务器5000端口是不是通的,可以telnet一下:

telnet 127.0.0.1 5000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

没问题

仓库算是有了,但是里面有没有东西呢,查看一下:

curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}  #没有东西
  • 添加镜像:
    1.先给镜像打个标签(比如说centos6),需要加一个特殊标识:服务器ip和端口
docker tag centos6 106.13.219.104:5000/centos6
docker images
106.13.219.104:5000/centos6   latest              c7ada98e5536        18 hours ago        553MB

更改配置文件,指定私有仓库:

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

重启docker,记得start 容器。
上传镜像:

docker push 106.13.219.104:5000/centos6

查看私有仓库镜像:

curl 127.0.0.1:5000/v2/_catalog

下载镜像:

  • 在本机上:
docker pull 106.13.219.104:5000/centos6
  • 在另一台机器上:
    首先安装好docker,增加私有仓库:
vim /etc/docker/daemon.json
{ "insecure-registries":["106.13.219.104:5000"] }

可以直接pull:

docker pull 106.13.219.104:5000/centos6

三.数据管理:

在容器里面操作,肯定会生成一些数据和文件,那么这些数据存在了哪里,如果把容器删除,这些数据也会删除。
所以可以把服务器的目录挂在到容器里面去(比如/data目录,可以用-v参数:

docker run -itd -v /data/:/data centos6 bash //前面是服务器的/data目录,后面是容器的

进入容器查看/data目录:

docker exec -it 998ebf bash
[root@998ebf7cccc5 /]# ls /data
backup     log    mysql.bak  mysql_c  redis2
db_backup  mysql  mysql_bak  redis    wwwroot

会发现和服务器的/data目录是一样的。
如果在容器里面做更改,它就会存储到服务器的/data/目录下。

挂载数据卷:
其实-v参数除了挂载目录的功能之外,还有一种挂载数据卷的功能,让容器里面的一个目录共享出来,可以让其他机器挂载:

docker run -itd --volumes-from agitated_goldwasser ubuntu bash  #把agitated_goldwasser共享给了ubuntu

–volumes-from:指定要共享容器的name,docker ps 看最右侧,如果不指定它会自动生成。

定义数据卷服务:
有时候需要多个容器共享数据,类似NFS,所以可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。

首先建立数据卷容器:
docker run -itd -v /data/ -name agitated_goldwasser centos bash

让其他容器挂载该数据卷:

docker run -itd --volumes-from agitated_goldwasser ubuntu bash
发布了108 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37369726/article/details/102995735