天天看点

docker 基本操作Ⅱ(关于镜像操作)

1 通过模板创建镜像

- 导入镜像基本操作

<code>https:</code><code>//openvz</code><code>.org</code><code>/Download/template/precreated</code> <code>在这个网址里面下载对应的模板</code>

<code>[root@chy src]</code><code># wget http://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz //下载centos7的模板</code>

<code>[root@chy src]</code><code># cat centos-7-x86_64-minimal.tar.gz |docker import - centos7 //导入镜像</code>

<code>sha256:3e6c83d2f3749ae4cde27673354cab305bfdc360e40d10d072f6a7dfd3edcdca</code>

<code>[root@chy src]</code><code># docker images //查看已经导入的镜像</code>

<code>REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</code>

<code>centos7             latest              3e6c83d2f374        2 minutes ago       435MB</code>

<code>centos_with_net     latest              87dde0ff7187        21 hours ago        277MB</code>

<code>centos              latest              d123f4e55e12        10 days ago         197MB</code>

<code>[root@chy src]</code><code># docker run -itd centos7 bash//将镜像启动centos7的容器</code>

<code>67c68340c58643e4e085dc04fe7552bad4ff6c41c612c26e9ce99e63b4872317</code>

<code>[root@chy src]</code><code># docker exec -it 67c68340c5 bash //进入到centos7的容器里</code>

<code>[root@67c68340c586 /]</code><code># cat /etc/issue //查看版本</code>

<code>[root@67c68340c586 /]</code><code># uname -a //查看内核(这个内核与宿主机的内核是一致的,如果我的镜像的模板是centos6的,我的宿主机是centos7的那我最后在docker镜像里查看的内核也就是centos7的。</code>

<code>Linux 67c68340c586 3.10.0-514.el7.x86_64 </code><code>#1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux</code>

- 导出/恢复镜像基本操作

<code>[root@chy ~]</code><code># docker save -o centos7-daochu.tar centos7// -o 后面跟的是centos7-daochu(导出后的文件名)centos7这个是要导出的镜像名</code>

<code>[root@chy ~]</code><code># docker rm -f 67c68340c586//删除运行的容器</code>

<code>67c68340c586</code>

<code>[root@chy ~]</code><code># docker rmi 3e6c83d2f374 删除镜像</code>

<code>Untagged: centos7:latest</code>

<code>Deleted: sha256:3e6c83d2f3749ae4cde27673354cab305bfdc360e40d10d072f6a7dfd3edcdca</code>

<code>Deleted: sha256:788edba9eaa8ade63d8ba9d5747281c5da2b34b12a6c80f4dffd8ad9e05f68c1</code>

<code>[root@chy ~]</code><code># docker images //查看没有镜像</code>

<code>centos_with_net     latest              87dde0ff7187        22 hours ago        277MB</code>

<code>[root@chy ~]</code><code># docker load --input centos7-daochu.tar //恢复镜像(恢复镜像还有一个命令是docker load &lt; centos7-daochu</code>

<code>788edba9eaa8: Loading layer [==================================================&gt;]  446.1MB</code><code>/446</code><code>.1MB</code>

<code>Loaded image: centos7:latest</code>

<code>[root@chy ~]</code><code># docker images //查看已经恢复成功</code>

<code>centos7             latest              3e6c83d2f374        38 minutes ago      435MB</code>

导出镜像还有一个命令是如下

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

<code>cat</code> <code>file</code><code>.</code><code>tar</code> <code>|docker </code><code>import</code> <code>- aming_test  </code><code>//</code><code>这样会生成aming_test的镜像(导入镜像)</code>

2 容器管理

<code>[root@chy ~]</code><code># docker create -it centos7 bash //创建容器但是容器没有启动</code>

<code>[root@chy ~]</code><code># docker start 438606c //启动容器</code>

<code>438606c</code>

<code>[root@chy src]</code><code># docker run -itd centos7 //这个也是启动容器之不多这个是create与start融为一体了</code>

<code>[root@chy ~]</code><code># docker run -itd --name centos6 centos_with_net bash // --name 给容器自定义名字</code>

<code>46fe5b5e5d2768727e8256e79ba6a3b3255394bda5398ec4011526fec8437dbc</code>

<code>[root@chy ~]</code><code># docker ps //查看定义的名称centos6,这个在进入容器的时候就可以直接跟名字不用给它的id了</code>

<code>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES</code>

<code>46fe5b5e5d27        centos_with_net     </code><code>"bash"</code>              <code>7 seconds ago       Up 5 seconds                            centos6</code>

<code>[root@chy ~]</code><code># docker run --rm -it centos_with_net  bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出</code>

<code>[root@chy ~]</code><code># docker logs 34effba //获取到容器的运行历史信息</code>

<code>111</code>

<code>[root@chy ~]</code><code># docker exec -it 34effba bash //可以临时打开一个虚拟终端,并且exit后,容器依然运行着</code>

<code>[root@chy ~]</code><code># docker rm 34effba//删除容器,如果要删除的是一个运行的容器需要加-m 后面在跟container_id,(container_id是ps的时候查看到的)</code>

<code>34effba</code>

<code>[root@chy ~]</code><code># docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) //启动所有的容器命令</code>

<code>46fe5b5e5d27</code>

<code>438606c2d465</code>

<code>[root@chy ~]</code><code># docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2) //删除所有的容器命令</code>

<code>docker rmi $(docker images | </code><code>awk</code> <code>'{print $3}'</code> <code>|</code><code>tail</code> <code>-n +2) </code><code>//</code><code>删除所有的镜像</code>

3 仓库管理

- 创建私有仓库

<code>[root@chy ~]</code><code># docker pull registry //下载registry 镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库</code>

<code>[root@chy ~]</code><code>#  docker run -d -p 5000:5000 registry //以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口</code>

- 将镜像上传到私有仓库

<code>[root@chy ~]</code><code># docker tag centos7 192.168.212.10:5000/centos7 //标记一下tag,必须要带有私有仓库的ip:port</code>

<code>[root@chy ~]</code><code># docker images</code>

<code>REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE</code>

<code>192.168.212.10:5000</code><code>/centos7</code>   <code>latest              3e6c83d2f374        2 hours ago         435MB</code>

<code>centos7                       latest              3e6c83d2f374        2 hours ago         435MB</code>

<code>centos_with_net               latest              87dde0ff7187        24 hours ago        277MB</code>

<code>registry                      latest              a07e3f32a779        10 days ago         33.3MB</code>

<code>centos                        latest              d123f4e55e12        10 days ago         197MB</code>

<code>[root@chy ~]</code><code># docker push 192.168.212.10:5000/centos7 //上传时报了如下的错误</code>

<code>The push refers to a repository [192.168.212.10:5000</code><code>/centos7</code><code>]</code>

<code>Get https:</code><code>//192</code><code>.168.212.10:5000</code><code>/v2/</code><code>: http: server gave HTTP response to HTTPS client</code>

<code>解决方法如下:</code>

<code>[root@chy ~]</code><code># vi /etc/docker/daemon.json //更改配置文件</code>

<code>{ </code><code>"insecure-registries"</code><code>:[</code><code>"192.168.212.10:5000"</code><code>] }</code>

<code>如上指定一个私有仓库的地址,这个地址是宿主机的地址</code>

<code>[root@chy ~]</code><code># systemctl restart docker //重启服务</code>

<code>[root@chy ~]</code><code># docker start ef587be45616 //启动私有仓库的容器</code>

<code>ef587be45616</code>

<code>[root@chy ~]</code><code># docker push 192.168.212.10:5000/centos7 //上传镜像到私有仓库</code>

<code>788edba9eaa8: Pushed </code>

<code>latest: digest: sha256:d57bd79f46a10c520a62814d33a13c7c4c2b10ac143650effc9c8e35b2094565 size: 529</code>

<code>[root@chy ~]</code><code># curl 127.0.0.1:5000/v2/_catalog //查看到推送上来的镜像</code>

<code>{</code><code>"repositories"</code><code>:[</code><code>"centos7"</code><code>]}</code>

- 怎么下载私有仓库的镜像

<code>[root@chy ~]</code><code># docker pull 192.168.212.10:5000/centos7 //直接docker pull即可,这里的ip一定要是私有仓库的地址</code>

如果在其它机器下载私有仓库切记不要忘记指定私有仓库地址的ip。([root@chy ~]# vi /etc/docker/daemon.json //更改配置文件

{ "insecure-registries":["192.168.212.10:5000"] })

 4 数据管理

- 容器是由镜像启动的,这时如果将容器关闭或者是删除那容器里面的数据去哪了呢?这时数据也会一并的消除,这样肯定是不符合我们的要求的,所以呢想到了一个方法就是将宿主机的一个目录挂载到容器中,这时容器里产生的数据都会在宿主机的目录中显示。下面就是如何将容器中的数据搞到容器中

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

<code>[root@chy ~]</code><code># docker run -tid -v /data/:/data centos7 bash ////-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建</code>

<code>bc7f95597ceb71a3ebfcb5f4955d171b69f740c9598396eae1234966d68d1f81</code>

<code>[root@chy ~]</code><code># ls -l /data/ 查看宿主机/data目录</code>

<code>总用量 16</code>

<code>drwxr-xr-x 3 root   root   4096 9月   2 18:38 backup</code>

<code>drwxr-xr-x 3 root   root   4096 10月 27 06:15 gitroot</code>

<code>drwxr-xr-x 9 mysql1 mysql1 4096 11月 14 22:47 mariadb</code>

<code>drwxr-xr-x 5 root   root   4096 8月   5 04:40 wwwroot</code>

<code>[root@chy ~]</code><code># docker exec -it bc7f9559 bash</code>

<code>[root@bc7f95597ceb /]</code><code># mkdir /data/123 之后在容器中创建一个目录</code>

<code>[root@bc7f95597ceb /]</code><code># exit</code>

<code>[root@chy ~]</code><code># ls /data/ 在宿主机可以查看到在容器中创建的目录</code>

<code>123/       backup/    gitroot/   .htpasswd  mariadb/   wwwroot/</code>

- 挂载数据卷

<code>[root@chy ~]</code><code># docker ps //这里需要先查看容器的名字centos7的为sharp_kepler(查看names下面的名字)</code>

<code>CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES</code>

<code>bc7f95597ceb        centos7             </code><code>"bash"</code>                   <code>8 minutes ago       Up 8 minutes                                 sharp_kepler</code>

<code>ef587be45616        registry            </code><code>"/entrypoint.sh /e..."</code>   <code>About an hour ago   Up About an hour    0.0.0.0:5000-&gt;5000</code><code>/tcp</code>   <code>elastic_varahamihira</code>

<code>[root@chy ~]</code><code># docker run -itd --volumes-from sharp_kepler  centos7  bash //--volumes-from后面跟容器的names的名字,之后在跟一个镜像名</code>

<code>12204913c07468253f58a52c52e328ff5cdb1d01866ae55e86d7c9f088a0bf2f</code>

- 定义数据卷容器

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

<code>[root@chy ~]</code><code># docker run -itd -v /data/ --name testvol centos bash </code>

<code>这里的-</code><code>v</code><code>是有两层含义的第一层含义是: 冒号是用来交互宿主机与容器的目录的映射,第二层含义是作为数据卷容器就是不加冒号的写法,第二层的含义是用来共享一个目录,所以-</code><code>v</code> <code>/data</code><code>的目录为共享目录</code>

<code>然后让其他容器挂载该数据卷</code>

<code> </code><code>docker run -itd --volumes-from testvol aming123 </code><code>bash</code>

docker 基本操作Ⅱ(关于镜像操作)

     本文转自我不是瘦子51CTO博客,原文链接:http://blog.51cto.com/chy940405/1981804,如需转载请自行联系原作者