docker 基本操作Ⅱ(关于镜像操作)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker 基本操作Ⅱ(关于镜像操作)相关的知识,希望对你有一定的参考价值。
1 通过模板创建镜像
- 导入镜像基本操作
https://openvz.org/Download/template/precreated 在这个网址里面下载对应的模板 [[email protected] src]# wget http://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz //下载centos7的模板 [[email protected] src]# cat centos-7-x86_64-minimal.tar.gz |docker import - centos7 //导入镜像 sha256:3e6c83d2f3749ae4cde27673354cab305bfdc360e40d10d072f6a7dfd3edcdca [[email protected] src]# docker images //查看已经导入的镜像 REPOSITORY TAG IMAGE ID CREATED SIZE centos7 latest 3e6c83d2f374 2 minutes ago 435MB centos_with_net latest 87dde0ff7187 21 hours ago 277MB centos latest d123f4e55e12 10 days ago 197MB [[email protected] src]# docker run -itd centos7 bash//将镜像启动centos7的容器 67c68340c58643e4e085dc04fe7552bad4ff6c41c612c26e9ce99e63b4872317 [[email protected] src]# docker exec -it 67c68340c5 bash //进入到centos7的容器里 [[email protected] /]# cat /etc/issue //查看版本 [[email protected] /]# uname -a //查看内核(这个内核与宿主机的内核是一致的,如果我的镜像的模板是centos6的,我的宿主机是centos7的那我最后在docker镜像里查看的内核也就是centos7的。 Linux 67c68340c586 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
- 导出/恢复镜像基本操作
[[email protected] ~]# docker save -o centos7-daochu centos7// -o 后面跟的是centos7-daochu(导出后的文件名)centos7这个是要导出的镜像名 [[email protected] ~]# docker rm -f 67c68340c586//删除运行的容器 67c68340c586 [[email protected] ~]# docker rmi 3e6c83d2f374 删除镜像 Untagged: centos7:latest Deleted: sha256:3e6c83d2f3749ae4cde27673354cab305bfdc360e40d10d072f6a7dfd3edcdca Deleted: sha256:788edba9eaa8ade63d8ba9d5747281c5da2b34b12a6c80f4dffd8ad9e05f68c1 [[email protected] ~]# docker images //查看没有镜像 REPOSITORY TAG IMAGE ID CREATED SIZE centos_with_net latest 87dde0ff7187 22 hours ago 277MB centos latest d123f4e55e12 10 days ago 197MB [[email protected] ~]# docker load --input centos7-daochu //恢复镜像(恢复镜像还有一个命令是docker load < centos7-daochu 788edba9eaa8: Loading layer [==================================================>] 446.1MB/446.1MB Loaded image: centos7:latest [[email protected] ~]# docker images //查看已经恢复成功 REPOSITORY TAG IMAGE ID CREATED SIZE centos7 latest 3e6c83d2f374 38 minutes ago 435MB centos_with_net latest 87dde0ff7187 22 hours ago 277MB centos latest d123f4e55e12 10 days ago 197MB
导入与导出镜像还有一个命令是如下
docker export container_id > file.tar // 导出容器,可以迁移到其他机器上,需要导入 cat file.tar |docker import - aming_test //这样会生成aming_test的镜像(导入镜像)
2 容器管理
[[email protected] ~]# docker create -it centos7 bash //创建容器但是容器没有启动 [[email protected] ~]# docker start 438606c //启动容器 438606c [[email protected] src]# docker run -itd centos7 //这个也是启动容器之不多这个是create与start融为一体了 [[email protected] ~]# docker run -itd --name centos6 centos_with_net bash // --name 给容器自定义名字 46fe5b5e5d2768727e8256e79ba6a3b3255394bda5398ec4011526fec8437dbc [[email protected] ~]# docker ps //查看定义的名称centos6,这个在进入容器的时候就可以直接跟名字不用给它的id了 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46fe5b5e5d27 centos_with_net "bash" 7 seconds ago Up 5 seconds centos6 [[email protected] ~]# docker run --rm -it centos_with_net bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出 [[email protected] ~]# docker logs 34effba //获取到容器的运行历史信息 111 [[email protected] ~]# docker exec -it 34effba bash //可以临时打开一个虚拟终端,并且exit后,容器依然运行着 [[email protected] ~]# docker rm 34effba//删除容器,如果要删除的是一个运行的容器需要加-m 后面在跟container_id,(container_id是ps的时候查看到的) 34effba [[email protected] ~]# docker start $(docker ps -a | awk ‘{ print $1}‘ | tail -n +2) //启动所有的容器命令 46fe5b5e5d27 438606c2d465 [[email protected] ~]# docker rm $(docker ps -a | awk ‘{ print $1}‘ | tail -n +2) //删除所有的容器命令 46fe5b5e5d27 438606c2d465 docker rmi $(docker images | awk ‘{print $3}‘ |tail -n +2) //删除所有的镜像
3 仓库管理
- 创建私有仓库
[[email protected] ~]# docker pull registry //下载registry 镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库 [[email protected] ~]# docker run -d -p 5000:5000 registry //以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口
- 将镜像上传到私有仓库
[[email protected] ~]# docker tag centos7 192.168.212.10:5000/centos7 //标记一下tag,必须要带有私有仓库的ip:port [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.212.10:5000/centos7 latest 3e6c83d2f374 2 hours ago 435MB centos7 latest 3e6c83d2f374 2 hours ago 435MB centos_with_net latest 87dde0ff7187 24 hours ago 277MB registry latest a07e3f32a779 10 days ago 33.3MB centos latest d123f4e55e12 10 days ago 197MB [[email protected] ~]# docker push 192.168.212.10:5000/centos7 //上传时报了如下的错误 The push refers to a repository [192.168.212.10:5000/centos7] Get https://192.168.212.10:5000/v2/: http: server gave HTTP response to HTTPS client 解决方法如下: [[email protected] ~]# vi /etc/docker/daemon.json //更改配置文件 { "insecure-registries":["192.168.212.10:5000"] } 如上指定一个私有仓库的地址,这个地址是宿主机的地址 [[email protected] ~]# systemctl restart docker //重启服务 [[email protected] ~]# docker start ef587be45616 //启动私有仓库的容器 ef587be45616 [[email protected] ~]# docker push 192.168.212.10:5000/centos7 //上传镜像到私有仓库 The push refers to a repository [192.168.212.10:5000/centos7] 788edba9eaa8: Pushed latest: digest: sha256:d57bd79f46a10c520a62814d33a13c7c4c2b10ac143650effc9c8e35b2094565 size: 529 [[email protected] ~]# curl 127.0.0.1:5000/v2/_catalog //查看到推送上来的镜像 {"repositories":["centos7"]}
- 怎么下载私有仓库的镜像
[[email protected] ~]# docker pull 192.168.212.10:5000/centos7 //直接docker pull即可,这里的ip一定要是私有仓库的地址
如果在其它机器下载私有仓库切记不要忘记指定私有仓库地址的ip。([[email protected] ~]# vi /etc/docker/daemon.json //更改配置文件
{ "insecure-registries":["192.168.212.10:5000"] })
4 数据管理
- 容器是由镜像启动的,这时如果将容器关闭或者是删除那容器里面的数据去哪了呢?这时数据也会一并的消除,这样肯定是不符合我们的要求的,所以呢想到了一个方法就是将宿主机的一个目录挂载到容器中,这时容器里产生的数据都会在宿主机的目录中显示。下面就是如何将容器中的数据搞到容器中
- 挂载本地的目录到容器里
[[email protected] ~]# docker run -tid -v /data/:/data centos7 bash ////-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建 bc7f95597ceb71a3ebfcb5f4955d171b69f740c9598396eae1234966d68d1f81 [[email protected] ~]# ls -l /data/ 查看宿主机/data目录 总用量 16 drwxr-xr-x 3 root root 4096 9月 2 18:38 backup drwxr-xr-x 3 root root 4096 10月 27 06:15 gitroot drwxr-xr-x 9 mysql1 mysql1 4096 11月 14 22:47 mariadb drwxr-xr-x 5 root root 4096 8月 5 04:40 wwwroot [[email protected] ~]# docker exec -it bc7f9559 bash [[email protected] /]# mkdir /data/123 之后在容器中创建一个目录 [[email protected] /]# exit [[email protected] ~]# ls /data/ 在宿主机可以查看到在容器中创建的目录 123/ backup/ gitroot/ .htpasswd mariadb/ wwwroot/
- 挂载数据卷
[[email protected] ~]# docker ps //这里需要先查看容器的名字centos7的为sharp_kepler CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc7f95597ceb centos7 "bash" 8 minutes ago Up 8 minutes sharp_kepler ef587be45616 registry "/entrypoint.sh /e..." About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp elastic_varahamihira [[email protected] ~]# docker run -itd --volumes-from sharp_kepler centos7 bash //--volumes-from后面跟容器的名字,之后在跟新的容器名 12204913c07468253f58a52c52e328ff5cdb1d01866ae55e86d7c9f088a0bf2f
- 定义数据卷容器
有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。
[[email protected] ~]# docker run -itd -v /data/ --name testvol centos bash 这里的-v是有两层含义的第一层含义是: 冒号是用来交互宿主机与容器的目录的映射,第二层含义是作为数据卷容器就是不加冒号的写法,第二层的含义是用来共享一个目录,所以-v /data的目录为共享目录 然后让其他容器挂载该数据卷 docker run -itd --volumes-from testvol aming123 bash
以上是关于docker 基本操作Ⅱ(关于镜像操作)的主要内容,如果未能解决你的问题,请参考以下文章