100.用模板创建镜像 容器、仓库、数据管理

25.5 通过模板创建镜像

25.6 容器管理

25.7 仓库管理

25.8 数据管理

 

 

 

25.5 通过模板创建镜像

 

 

 

1.首先去下载一个模板

http://openvz.org/Download/templates/precreated //下载速度不快,阿铭下载了一个centos6的模板centos-6-x86-minimal.tar.gz

#模板去openvz官方下载

2.导入该镜像的命令为:

cat centos-6-x86-minimal.tar.gz|docker import - centos6 #后面为镜像的名字

3.docker images查看导入的镜像

4.把现有镜像,导出为一个文件:

docker save -o aming-centos.tar aming #(要导出的文件名:镜像名)

我们还可以用该文件恢复本地镜像:

docker load --input aming-centos.tar 或者

docker load < aming-centos.tar

docker push image_name //可以把自己的镜像传到dockerhub官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧

导出用的是docker import #(import/export为一对)

导入用的是save/load(一对)

 

 

实例:

[root@axinlinux-01 ~]# wget http://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz

#也可以右键 复制链接地址,在linux下wget下载。但是比较慢,还是在网页下载的

[root@axinlinux-01 ~]# rm -f centos-6-x86-minimal.tar.gz #删掉即可,我们在网页下载

[root@axinlinux-01 ~]# rz #用rz将包传到linux上

[root@axinlinux-01 ~]# du -sh centos-6-x86-minimal.tar.gz

201M centos-6-x86-minimal.tar.gz

[root@axinlinux-01 ~]# cat centos-6-x86-minimal.tar.gz|docker import - centos6

sha256:f55de466c591f88f7bb0f56072649e7fef9637be205ea9d92cec33a7d7c885c1

[root@axinlinux-01 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos6 latest f55de466c591 46 seconds ago 512MB

[root@axinlinux-01 ~]# docker run -itd centos6 bash

da08a3171ff47dcdc1b9e0b33de4100bd2bb5b4bdd604be8aad415f2ada36175

[root@axinlinux-01 ~]# docker exec -it da08a3171ff47dcdc1 bash

[root@da08a3171ff4 /]# cat /etc/issue #看一下版本

CentOS release 6.8 (Final)

Kernel \r on an \m

[root@da08a3171ff4 /]# ifconfig #看一下网卡

[root@da08a3171ff4 /]# uname -a #查看内核

Linux da08a3171ff4 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux #跟宿主机是一个内核。因为是基于linux内核的,原因就在这。虽然版本是6.8,但是内核也是3.10。也就是无论下载什么版本,他都是跟宿主机一个内核

[root@axinlinux-01 ~]# docker save -o centos7_with_nettool.tar centos_with_net #将centos_with_net镜像导出为centos7_with_nettool.tar

[root@axinlinux-01 ~]# docker rmi 9fe62e7d7355 #删除这个镜像,

Error response from daemon: conflict: unable to delete 9fe62e7d7355 (cannot be forced) - image is being used by running container 18389142fbb7

[root@axinlinux-01 ~]# docker load < centos7_with_nettool.tar #删完之后我们在导入

[root@axinlinux-01 ~]# docker images #查看一下就又回来了

centos_with_net latest 9fe62e7d7355 24 hours ago 272MB

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

25.6 容器管理

 

 

 

1.docker create  -it  centos6  bash //这样可以创建一个容器,但该容器并没有启动

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

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

3.docker run -it centos bash  

这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl d 退出该bash,当退出后这个容器也会停止。

docker run -d  可以让容器在后台运行

比如:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"

#以后启动容器就docker run -itd

4.docker run --name web -itd centos bash // --name 给容器自定义名字

5.docker run --rm -it centos bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出

6.docker logs 可以获取到容器的运行历史信息,用法如下

docker logs  container_id  

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

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

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

8.docker rm  container_id  //container_id是ps的时候查看到的,这样就可以把container删除,如果是运行的容器,可以加-f #rmi为删除一个镜像

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

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

 

 

 

实例:

1.

[root@axinlinux-01 ~]# docker create -it centos6 bash

fe427a3a44a66485e56cb3732ed7cc906c666bbc61b88d4642607a1302a842e2

[root@axinlinux-01 ~]# docker ps #直接ps是看不到的,因为只能查看开启的容器

[root@axinlinux-01 ~]# docker ps -a #加上-a才能看到

2.

[root@axinlinux-01 ~]# docker start fe427a3a44a6

fe427a3a44a6

[root@axinlinux-01 ~]# docker ps -a #查看就启动了

4.

[root@axinlinux-01 ~]# docker run -itd --name centos_111 centos #把要启动的容器放在后面,--name后面跟的是自定义的名字

5ca226fcd5983793ac0bb67c8a3a8ef31ff9ee07371626b5f2a22c57eb1d999b

[root@axinlinux-01 ~]# docker ps #这样就可以看到自定义的名字了

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

5ca226fcd598 centos "/bin/bash" 5 seconds ago Up 4 seconds centos_111

[root@axinlinux-01 ~]# docker exec -it centos_111 bash #然后我们进的时候就直接加自定义的名字就可以了

5.

[root@axinlinux-01 ~]# docker run --rm -it centos bash -c "sleep 30" #运行30秒后退出,并删除这个容器

[root@axinlinux-01 ~]# docker ps -a #查看没有这个容器

6.

[root@axinlinux-01 ~]# docker run -itd centos bash -c "echo niubi" #在这个容器里,输出一些信息

fd7f170bb4d49a5702245f47a0ad62bcfdeb08fae7b4e7759776e28be2502f1c

[root@axinlinux-01 ~]# docker logs fd7f170b #logs后面跟这个id,就会有信息出来

niubi

8.

[root@axinlinux-01 ~]# docker ps -a #查看一下,有很多容器

[root@axinlinux-01 ~]# docker rm fd7f170bb4d4 #我们删除一些exit状态的容器

fd7f170bb4d4

[root@axinlinux-01 ~]# docker rm 5ca226fcd598 #如果我们删除一些正在运行的容器,就会报错

Error response from daemon: You cannot remove a running container 5ca226fcd5983793ac0bb67c8a3a8ef31ff9ee07371626b5f2a22c57eb1d999b. Stop the container before attempting removal or force remove

[root@axinlinux-01 ~]# docker rm -f 5ca226fcd598 #加-f就可以删除了

5ca226fcd598

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

25.7 仓库管理

 

 

 

搞一个私有的docker仓库

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

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

3.curl 127.0.0.1:5000/v2/_catalog //可以访问它 #目前是空的,需要上传一个镜像到这个仓库

4.下面我们来把其中一个镜像上传到私有仓库

docker tag aming_test  192.168.208.128:5000/centos //先标记一下tag,必须要带有私有仓库的ip:port

docker push 192.168.208.128:5000/centos //把标记的镜像给推送到私有仓库

此时并不会成功,Get https://172.7.15.113:5000/v2/: http: server gave HTTP response to HTTPS client(意思就是要使用https的地址)

5.更改配置文件,vi /etc/docker/daemon.json//更改为 (指定私有仓库的地址)

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

6.systemctl restart docker

7.docker ps -a //查看容器已经关闭,还需要启动

docker start id //这里的id为registry容器id

8.再次push

docker push 172.7.15.113:5000/centos

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

从私有仓库里,把镜像拉下来:

vi /etc/docker/daemon.json #因为不可能只为本机做服务,还需要在其他机器上配置这个文件,指定他的ip(还有启动docker)

docker pull 192.168.208.128:5000/centos #直接pull就可以了

 

实例:

[root@axinlinux-01 ~]# docker pull registry #下载registry镜像

[root@axinlinux-01 ~]# docker run -d -p 5000:5000 registry

0ed5a339318ff8c08261d18c20f786729e01fb7d37652abaaf7b77eb6cee54b8

#-p映射端口,左边是宿主机的端口,右边是容器的端口。假如容器里有个nginx,别人没法直接去访问这个nginx,需要跟宿主机做一个端口映射。就是说你容器监听了5000端口,到了外面宿主机也得监听5000端口,当然也可以写成其他,比如5001

[root@axinlinux-01 ~]# docker ps

[root@axinlinux-01 ~]# telnet 127.0.0.1 5000 #我们可以测试一下看5000端口是不是通的

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

^]

telnet> quit

Connection closed.

[root@axinlinux-01 ~]# curl 127.0.0.1:5000/v2/_catalog #现在这里面暂时是空的,我们需要在这里面把镜像传上去

{"repositories":[]}

[root@axinlinux-01 ~]# docker tag centos 192.168.208.128:5000/centos #打个标签。写上宿主机的ip,如果别人也想访问的时候,只能通过这个ip提供服务。比如,内网环境里有很多个机器安装了docker,上面也都有一些镜像,那想把这些镜像搞到这个仓库里来,就得通过这个ip去访问

[root@axinlinux-01 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

192.168.208.128:5000/centos latest 1e1148e4cc2c 9 days ago 202MB

[root@axinlinux-01 ~]# docker push 192.168.208.128:5000/centos6 #这时候就可以推上去了,但是会有报错。因为要使用https 的地址

The push refers to repository [192.168.208.128:5000/centos6]

Get https://192.168.208.128:5000/v2/: http: server gave HTTP response to HTTPS client

[root@axinlinux-01 ~]# vi /etc/docker/daemon.json #修改这个配置文件,把之前的配置删掉,加入这一行。!!还可以这样写,这样两行的配置都有了!!

{

"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"],

"insecure-registries":["192.168.208.128:5000"]

}

[root@axinlinux-01 ~]# systemctl restart docker #不要忘记重启

[root@axinlinux-01 ~]# docker push 192.168.208.128:5000/centos6 #然后再推,又报错。因为我们没有开启repository的容器

The push refers to repository [192.168.208.128:5000/centos6]

An image does not exist locally with the tag: 192.168.208.128:5000/centos6

[root@axinlinux-01 ~]# docker ps -a #看一下registry的id

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

d1c6af5bd98d registry "/entrypoint.sh /etc…" 3 minutes ago Up 3 minutes 0.0.0.0:5000->5000/tcp modest_pasteur

[root@axinlinux-01 ~]# docker start d1c6af5bd98d #然后开启这个容器

[root@axinlinux-01 ~]# docker push 192.168.208.128:5000/centos #再推

[root@axinlinux-01 ~]# curl 127.0.0.1:5000/v2/_catalog #查看有无推上去的镜像

{"repositories":["centos"]}

还可以再推一个ubuntu

[root@axinlinux-01 ~]# docker tag ubuntu 192.168.208.128:5000/ubuntu #先打标签

[root@axinlinux-01 ~]# docker ps -a

d1c6af5bd98d registry "/entrypoint.sh /etc…" 22 minutes ago Exited (2) 2 minutes ago modest_pasteur

[root@axinlinux-01 ~]# docker start d1c6af5bd98d #检查registry的容器有没有开启

[root@axinlinux-01 ~]# docker push 192.168.208.128:5000/ubuntu #然后直接推就可以了

[root@axinlinux-01 ~]# curl 127.0.0.1:5000/v2/_catalog

{"repositories":["centos","ubuntu"]}

从私有仓库里,把镜像拉下来:

[root@axinlinux-02 ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo

[root@axinlinux-02 ~]# yum install lszrz #以上安装docker最新版本

[root@axinlinux-02 ~]# rz #之前下载过docker的依赖,现在直接传到linux上就可以了

[root@axinlinux-02 ~]# yum install docker-ce #安装docker

[root@axinlinux-02 ~]# vim /etc/docker/daemon.json #配置文件,指定ip及加速器

[root@axinlinux-02 ~]# systemctl start docker #开启docker

[root@axinlinux-02 ~]# docker pull 192.168.208.128:5000/ubuntu #直接拉就可以了

[root@axinlinux-02 ~]# docker pull ubuntu #不加ip就是直接下载官方的Ubuntu镜像

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

25.8 数据管理

 

 

 

容器是由镜像启动的。容器里面产生的新的数据,存储到了那里。我们再把容器关闭或删除,那么更改的一些新的数据就会一并消除。这也就以为着你的数据有一定的风险。

所以会有一个办法,就会把宿主机的目录挂载到容器里去。比如搞一个data目录,容器产生的新的数据全部写到data目录下(也就是宿主机的磁盘上)。这样即使你的容器停止或是销毁,数据还是都存在的

1. 挂载本地的目录到容器里

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

2. 挂载数据卷

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

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

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

3. 定义数据卷容器

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

首先建立数据卷容器

docker run -itd -v /data/ --name testvol(容器的名字) centos  bash  //注意这里的/data/是容器的/data目录,并非本地的/data/目录。 #也就是分享容器这个目录,让其他容器可以去挂载。和上面的加冒号挂载不太一样,那个是指定一个容器挂载。

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

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

#如果共享的目录是data,而这边挂载的确实home,可以做软连接

 

 

 

实例:

[root@axinlinux-01 docker]# docker run -itd -v /data/:/data centos_with_net bash

9cf09cd1eec89c54868435cb1ab3996462c47c3c212cf2047ae3d9fa8daa0fdf

[root@axinlinux-01 docker]# docker exec -it 9cf09cd1 bash

[root@9cf09cd1eec8 /]# ls -l /data #两边数据对比是一样的

[root@axinlinux-01 docker]# ls -l /data

[root@axinlinux-01 docker]# docker exec -it 9cf09cd1 bash

[root@9cf09cd1eec8 /]# mkdir /data/123 #在容器做一个变更

[root@9cf09cd1eec8 /]# exit

[root@axinlinux-01 docker]# ls /data #退出来,在宿主机上也有同样的

123 aming_linux ftp gitroot mariadb mongodb mysql redis redis2 redis_data svnroot wwwroot

root@axinlinux-01 docker]# docker run -itd --volumes-from sleepy_engelbart centos bash

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3866149/blog/3054543

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值