docker操作

发布时间:2017-04-16 00:09:13 阅读:1163次
https://blog.csdn.net/a19891024/article/details/68946065

复制文件

从主机复制到容器sudo docker cp host_path containerID:container_path

从容器复制到主机sudo docker cp containerID:container_path host_path

docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)

docker tag ca1b6b825289 registry.cn-hangzhou.aliyuncs.com/xxxxxxx:v1.0

docker安装 centos亲测可行
https://blog.csdn.net/kdchxue/article/details/50902580
[root@localhost ~]# yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
https://blog.csdn.net/qq_37791764/article/details/79127689
[root@192 src]# yum update -y device-mapper-libs

docker cp

https://www.centos.bz/2017/08/docker-nginx-php-fpm/

在容器中是没有vim命令的,所以不能在容器中直接修改配置文件。所以我们必须通过变通的方式去解决这个问题,否则只能在每个容器中安装vim。首先登录到对应的容器中,查看配置信息路径,这在之后修改时会用到。

docker exec -it myNginx /bin/bash

  • -i : –interactive,交互模式。
  • -t : –tty,开启一个伪终端。
  • /bin/bash : 必须写,否则会报错。这是开始伪终端时,进入bash界面,也就是命令行界面。
  • 查看对应的配置文件位置
/etc/nginx/conf.d/default.conf

  • 退出命令行,不要使用exit,因为exit会让容器停止。这里使用ctrl + p + q来退出容器。
  • 使用专用的复制命令将配置文件复制到宿主机,然后在宿主机进行编辑(这就是变通的方法)
docker cp myNginx:/etc/nginx/conf.d/default.conf ./default.conf

docker操作正在运行的容器

https://www.cnblogs.com/xhyan/p/6593075.html

$ sudo docker ps  

$ sudo docker exec -it 775c7c9ee1e1 /bin/bash

docker lnmp

http://blog.csdn.net/qq_28602957/article/details/53727865

docker web

https://www.cnblogs.com/kevingrace/p/6867820.html

docker镜像导入导出

http://blog.csdn.net/a906998248/article/details/46236687

docker save 9610cfc68e8d > /home/myubuntu-save-1204.tar  

docker load -i quay.io-calico-node-1.tar

重命名镜像

http://blog.csdn.net/a19891024/article/details/68946065

docker tag ca1b6b825289 registry.cn-hangzhou.aliyuncs.com/xxxxxxx:v1.0

centos安装

http://www.linuxidc.com/Linux/2015-01/111091.htm

https://www.2cto.com/net/201612/573947.html

[root@localhost ~]# rpm -ivh http://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
warning: /var/tmp/rpm-tmp.JN76fI: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
  1:epel-release          ########################################### [100%]
[root@localhost ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

[root@localhost ~]# 

yum -y install docker-io

yum install device-mapper-event-libs

启动并设置开机自动启动

[root@localhost ~]# service docker start
Starting cgconfig service:                                [确定]
Starting docker:                                      [确定]


在Docker中重新启动已经停止的容器

http://www.68idc.cn/help/jiabenmake/qita/20141229151137.html

修改镜像名称

https://segmentfault.com/q/1010000002479274

常用管理命令

https://segmentfault.com/a/1190000000759971

保存对容器的修改

http://www.docker.org.cn/book/docker/docer-save-changes-10.html

https://help.aliyun.com/knowledge_detail/38049.html

http://www.bubuko.com/infodetail-591081.html

http://blog.csdn.net/socho/article/details/51999744

http://blog.sina.com.cn/s/blog_8e032fb90102xuon.html

http://blog.shiqichan.com/Deploying-Nginx-with-Docker/

http://www.linuxidc.com/Linux/2015-09/123519.htm

http://www.runoob.com/docker/docker-install-nginx.html

在宿主机执行

pkill docker

iptables -t nat -F

service docker restart

Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。

譬如我要启动一个CentOS容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:

# docker run -it -v /test:/soft centos /bin/bash

这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

貌似简单,其实不然,下面我们来验证一下:

一、容器目录不可以为相对路径

[root@localhost ~]# docker run -it -v /test:soft centos /bin/bash

invalid value "/test:soft" for flag -v: soft is not an absolute path

See 'docker run --help'.

直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。

二、宿主机目录如果不存在,则会自动生成

如果宿主机中存在/test目录,首先删除它

[root@localhost ~]# rm -rf /test

[root@localhost ~]# ls /

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

启动容器

[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash

[root@a487a3ca7997 /]# ls

bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  soft  srv  sys  tmp  usr  var

查看宿主机,发现新增了一个/test目录

[root@localhost ~]# ls /

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var

三、宿主机的目录如果为相对路径呢?

这次,我们换个目录名test1试试

# docker run -it -v test1:/soft centos /bin/bash

再到宿主机上查看是否新增了一个/test1目录,结果没有,是不是因为我用的是相对路径,所以生成的test1目录在当前目录下,结果发现还是没有。那容器内的/soft目录挂载到哪里去了?通过docker inspect命令,查看容器“Mounts”那一部分,我们可以得到这个问题的答案。

    "Mounts": [

        {

            "Name": "test1",

            "Source": "/var/lib/docker/volumes/test1/_data",

            "Destination": "/soft",

            "Driver": "local",

            "Mode": "z",

            "RW": true

        }

    ],

 可以看出,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录

原来,所谓的相对路径指的是/var/lib/docker/volumes/,与宿主机的当前目录无关。

一、镜像相关

1.1 列出本机所有镜像

docker images

后面的操作,都以ubuntu做为练习的目标。

另外:如果某些镜像文件不想要了,可以用下面的命令删除

1.2 删除镜像

docker rmi 镜像Id(即:1.1图中的IMAGE ID)

有时候删除会失败,比如:有一个容器正在使用该镜像文件。这时可以加参数-f 强制删除,如果不清楚每个命令可以加哪些参数,可以用

docker 命令 --help

查看帮助,比如:

?  bin  docker rmi --help
Usage:	docker rmi [OPTIONS] IMAGE [IMAGE...]
Remove one or more images
  -f, --force=false    Force removal of the image
  --help=false         Print usage
  --no-prune=false     Do not delete untagged parents

二、容器相关

2.1 最基本的启动

docker run -it ubuntu

参数-it的含义,可以用docker run --help查看,就不展开了

2.2 启动后执行命令

docker run -it ubuntu echo ‘hello world‘

2.3 启动时指定容器名称

docker run -it --name ‘myubuntu‘ ubuntu

容器名称是一个很有意思的东东,后面马上会讲到。上面的命令运行完以后,先用exit退出,以便后面学习其它命令。

2.4 查看最近运行过的所有容器

docker ps -a

从图上可以看出,如果启动时未显示指定容器名称,docker会自动生成一个好玩的名称,命令的风格大致是:什么样的_谁谁,比如图中的insane_lamarr,字面的意思为"疯狂的拉马尔",从这些细节可以感受到,docker的创造者们都是一帮很爱玩的家伙。

除了容器名称,还有二列非常重要:CONTAINER ID及STATUS,其中STATUS中以Up开头的,表示容器正在运行,而CONTAINER ID在很多场景中都会用到(比如:删除容器)
另外,对于同一个镜像(比如ubuntu),默认不指定容器名称的话,每次容器启动docker都会生成一个唯一的名称,这个有点象OOP编程,镜像相当于Class类定义,是一个只读的模板,而容器则是类的运行实例,java中每次new出来的实例,其hashcode必然不同,所以每次启动的docker容器,名称也不一样,只不过与OOP不同的是,OOP中实例消亡了,所有关联的信息全清掉了,而docker容器就算停止掉,docker仍会记住其最后的运行状态。

可以做一个小试验,刚才我们已经创建了一个名为myubuntu的容器:

docker run -it --name ‘myubuntu‘ ubuntu

这一行命令再次运行的话,就会报错:

Error response from daemon: Conflict. The name "myubuntu" is already in use by container d1c261ad0b1e. You have to remove (or rename) that container to be able to reuse that name.

大意是容器名称mybutun已经被另一个容器(ID为d1c261ad0b1e)占用了,要么把原来的容器删除,要么换个名字。

这其中的设计思想,可以仔细琢磨一二,想想也十分合理:类比一下,我们写代码时,同一个类new出多个实例,每个实例都会有自己不同的应用场景,比如:同样是一个Order实例,可以用在订单创建的业务场景中,也可以用在订单查询的返回结果中...,docker的镜像也是如此,同样一个ubuntu镜像文件,有人用它创建容器是为了安装nginx当成web server,有人用它创建容器是为了学习hadoop...,为了能以一种友好的方式来区分,所以名字不能冲突,然后,同一个名字的容器,今天安装了软件A,玩事儿后将它关闭,明天可能会继续在这个容器上折腾其它事情,所以每次容器停止,不可能象OOP中的实例一样,彻底丢弃实例的所有信息,否则明天就没办法接着玩了。

2.5 停止运行中的容器

docker stop 容器名称

2.6 删除容器

docker rm 容器ID

如果容器处于运行状态,上面的操作会失败,可以加-f参数强制删除

2.7 在已运行的容器中,直接执行命令

docker exec 容器名称 命令

例如:

docker exec myubuntu apg-get update

2.8 附加到已经运行的容器

docker attach 容器名称

注:该命令运行后,mac上屏幕没任何输出,还以为卡死了,这是假象,直接继续输入命令,比如pwd之类的就能看到结果了.

attach这个命令不太好用,进入终端后,没办法退出而不停止容器,要退出只能输入exit,但这样就将容器停止了,另外一个缺点是,如果多个容器同时attach到相同的容器,在一个窗口中操作的结果,会同步显示到所有窗口。

建议用下面的命令代替:

docker exec -it 容器名称 sh

当然进入容器还有其它一些办法,比如网络端口22映射本机某个端口,容器里启动ssh服务,然后ssh连接进入,或者用nsenter结合进程id进入,但个人觉得这些方法操作都太复杂,远不如上面这行命令简单

2.9 保存对容器所做的修改

在容器上做了一堆操作后,比如在ubuntu的基础上安装了一些软件、部署了一些应用之类,希望分发到其它机器,最简单的办法就是把容器重新生成一个新镜像,然后其它人直接docker pull你的新镜像就可以了。

docker commit -a 作者名字 -m 提交原因 -p 容器ID 镜像名称:版本号

比如:

docker commit -a 'yjmyzz' -m 'test commit' -p d1c261ad0b1e name

提交完成后,可以

docker images 查看
从图中可以看出,在ubuntu原来的基础上,生成一个名为yjmyzz/ubuntu的新镜像,然后用新镜像创建容器试试看

docker run -it --name ‘myubuntu2‘ yjmyzz/ubuntu:V2

 三、卷(volumn)相关 

我们平时在使用电脑的过程中,会经常通过usb插入一些外部存储设备,比如:u盘之类,插好后,就能象常规硬盘目录一样访问外部存储设备。卷(volume)的意思其实跟这个差不多,可以把host机上的某个目录"插入"到容器中,然后容器中就能直接访问host机上的文件了,即使容器删除掉,卷里的数据仍然可能持久保存。

3.1 创建卷

docker run -it -v /Users/yjmyzz/docker_volumn:/opt/webapp  --name ‘myubuntu‘ ubuntu

这个命令略长,但并不复杂,跟前面提到的启动容器相比,只是多了一个-v /Users/yjmyzz/docker_volumn:/opt/webapp的部分,意思就是将本机/Users/yjmyzz/docker_volumn这个目录映射到容器中的/opt/webapp,启动成功后,我们进入容器验证一下:

可以尝试在host本机修改下/Users/yjmyzz/docker_volumn/index.html这个文件,然后在容器中cat看下内容,应该马上就能看到最新的内容。

此外,还可以用命令

docker inspect myubuntu

查看此时容器的所有状态,会看到一段长长的json输出,类似下面这样:

我们在docker中起了一个centos的最小系统,登录到此系统[root@f41d95a52943 /]后,查看下其ip地址,发现没有ifconfig命令,使用 yum install net-tools 安装后
查看刚运行过的容器









[root@201 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4e108c90fa11        centos "/bin/bash" 2 minutes ago Up 2 minutes                                  ecstatic_franklin 
[root@201 ~]# docker start 4e108c90fa11 4e108c90fa11
然后连上去
[root@201 ~]# docker exec -it 4e108c90fa11 /bin/bash 安装net-tools包
[root@4e108c90fa11 /]# yum install net-tools -y 退出,在宿主机上提交评论
[root@201 ~]# docker commit -m="add net-tools packages,nclude ifconfig command" 4e108c90fa11 129d59168480299c786d0585e9eb74fdbde3dcd00ee2cd2815d11b7749e53ac7

如有问题,可以QQ搜索群1028468525加入群聊,欢迎一起研究技术

支付宝 微信

有疑问联系站长,请联系QQ:QQ咨询
下一篇:python redis

转载请注明:docker操作 出自老鄢博客 | 欢迎分享