新建启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用的参数:
--name:为容器指定一个名称-d:后台运行容器并返回容器ID,也即启动守护式容器-i:以交互模式(interactive)运行容器,通常与-t同时使用-t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)-e:为容器添加环境变量-P:随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口-p:指定端口映射
-p指定端口映射的几种不同形式:
-p hostPort:containerPort:端口映射,例如-p 8080:80-p ip:hostPort:containerPort:配置监听地址,例如-p 10.0.0.1:8080:80-p ip::containerPort:随机分配端口,例如-p 10.0.0.1::80-p hostPort1:containerPort1 -p hostPort2:containerPort2:指定多个端口映射,例如-p 8080:80 -p 8888:3306启动交互式容器
·以交互式的方式运行centos
# -i 交互模式# -t 分配一个伪输入终端tty# centos 镜像名称# /bin/bash(或者bash) shell交互的接口docker run -it centos /bin/bash
现在我在centos里面运行了一个centos容器。你会发现红圈的地方变了,我现在进入到容器里面了。在这个容器里面我可以执行一些linux的命令,但是命令肯定没有linux系统的全面。它和外部的linux是隔离的。
退出交互式容器
方法一:
# 在交互shell中exit即可退回宿主机exit
方式一退出后容器会停止。
方式二:
使用快捷键ctrl+P+Q
方式二退出后容器仍在运行启动守护式容器
大部分情况下,我们系统docker容器服务时在后台运行的,可以通过
-d指定容器的后台运行模式:docker run -d 容器名
注意事项:
如果使用docker run -d centos尝试启动守护式的centos,会发现容器启动后就自动退出了。
因为Docker容器如果在后台运行,就必须要有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(例如top、tail),就会自动退出。列出正在运行的容器
docker ps [OPTIONS]
常用参数:
-a:列出当前所有正在运行的容器+历史上运行过的容器-l:显示最近创建的容器-n:显示最近n个创建的容器-q:静默模式,只显示容器编号容器的启动停止操作
启动已经停止的容器
docker start 容器ID
重启容器
docker restart 容器ID
停止容器
docker stop 容器ID
强制停止容器
docker kill 容器ID
删除容器
删除已经停止的容器:docker rm 容器ID
删除容器是
docker rm,删除镜像是docker rmi,注意区分。
强制删除正在运行的容器:
docker rm -f 容器ID
一次删除多个容器实例:
docker rm -f $(docker ps -a -q)# 或者docker ps -a -q | xargs docker rm
查看容器日志
docker logs 容器ID
查看容器内运行的进程
docker top 容器ID
查看容器的元数据/详细信息
docker inspect 容器ID
进入当前正在运行的容器
进入正在i云习惯你的容器,并以命令行进行交互:
docker exec -it 容器ID shell交互的接口

重新进入:
docker attach 容器ID
docker exec 和 docker attach 区别:
attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器的停止exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器的停止
如果有多个终端,都对同一个容器执行了 docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。
文件拷贝
容器内文件拷贝到宿主机:
docker cp 容器ID:容器内路径 目的主机路径
宿主机中文件拷贝到容器中:
docker cp 主机路径 容器ID:容器内路径
将容器生成新的镜像commit
如何提交一个自己的镜像
docker 启动一个镜像容器后, 可以在里面执行一些命令操作,然后使用
docker commit将新的这个容器快照生成一个镜像。
docker commit -m="提交信息的描述" -a="提交的作者" 容器id 目标镜像名[:TAG]
举例:
比如tomcat镜像是被阉割的,默认部署了tomcat后访问出现404,没有webapps。
我们自己把这些弄好了之后,把我们弄好后的tomcat容器做成一个新的镜像。
提交到我们本地的镜像仓库中。
[root@izj6cev682kqg86i4ogj8rz ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4a76a3c72b23 tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:3355->8080/tcp tomcat0208e8a0cbc58e centos "/bin/bash" 9 hours ago Up 9 hours gracious_chaum[root@izj6cev682kqg86i4ogj8rz ~]# docker commit -a="liyadong" -m="add webapps application" 4a76a3c72b23 tomcat03:1.0sha256:4942ab828f724aa87e872b47d7fb7d1f00d8a4307a2bed7eb42000393507098b[root@izj6cev682kqg86i4ogj8rz ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtomcat03 1.0 4942ab828f72 17 seconds ago 684MBnginx latest 605c77e624dd 5 months ago 141MBtomcat 9.0 b8e65a4d736d 5 months ago 680MBtomcat latest fb5657adc892 5 months ago 680MBmysql latest 3218b38490ce 5 months ago 516MBhello-world latest feb5d9fea6a5 8 months ago 13.3kBcentos latest 5d0da3dc9764 8 months ago 231MB[root@izj6cev682kqg86i4ogj8rz ~]#
和git的commit操作很像。
从docker中央仓库拉的tomcat是镜像层,只读的,我们运行这个tomcat后会给这个镜像层上面再加一层容器层,我们做的任何操作都是在容器层里面做的。
我们又commit把这个 改动过的容器层+原始的镜像层打包提交成一个新的镜像到本地的镜像仓库,给它取个名字叫tomcat03。
然后我们运行tomcat03这个镜像,又在这个上面加一层容器层,当然这个tomcat03就是镜像层,只读。
部署项目的时候往往要部署各种各样的运行环境,一套下来可能安装五六个东西。每台服务器都这么搞肯定挺麻烦的。
我们用docker把运行环境部署好了,然后commit提交成一个镜像,之后每台服务器直接拉这个镜像,拉下来就可以直接用。省去了自己慢慢安装运行环境的步骤。
