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