新建启动容器
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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a76a3c72b23 tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:3355->8080/tcp tomcat02
08e8a0cbc58e centos "/bin/bash" 9 hours ago Up 9 hours gracious_chaum
[root@izj6cev682kqg86i4ogj8rz ~]# docker commit -a="liyadong" -m="add webapps application" 4a76a3c72b23 tomcat03:1.0
sha256:4942ab828f724aa87e872b47d7fb7d1f00d8a4307a2bed7eb42000393507098b
[root@izj6cev682kqg86i4ogj8rz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat03 1.0 4942ab828f72 17 seconds ago 684MB
nginx latest 605c77e624dd 5 months ago 141MB
tomcat 9.0 b8e65a4d736d 5 months ago 680MB
tomcat latest fb5657adc892 5 months ago 680MB
mysql latest 3218b38490ce 5 months ago 516MB
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
centos latest 5d0da3dc9764 8 months ago 231MB
[root@izj6cev682kqg86i4ogj8rz ~]#
和git的commit操作很像。
从docker中央仓库拉的tomcat是镜像层,只读的,我们运行这个tomcat后会给这个镜像层上面再加一层容器层,我们做的任何操作都是在容器层里面做的。
我们又commit把这个 改动过的容器层+原始的镜像层打包提交成一个新的镜像到本地的镜像仓库,给它取个名字叫tomcat03。
然后我们运行tomcat03这个镜像,又在这个上面加一层容器层,当然这个tomcat03就是镜像层,只读。
部署项目的时候往往要部署各种各样的运行环境,一套下来可能安装五六个东西。每台服务器都这么搞肯定挺麻烦的。
我们用docker把运行环境部署好了,然后commit提交成一个镜像,之后每台服务器直接拉这个镜像,拉下来就可以直接用。省去了自己慢慢安装运行环境的步骤。