说在前面的话:docker 推荐单个容器只运行一个应用程序或进程,因为这样以后可以拓展形成分布式应用程序模型
不管是 win10 还是 linux,docker 的命令都是一样的,不过 linux 下要带上 sudo,因为 docker 是以 root 权限运行docker守护进程的
使用前
启动/停止运行 docker
linux:
start/stop docker # ubuntu
service docker start/restart/stop # centos
确保 docker 可以运行
sudo docker info
该命令打印出一大堆配置信息即说明 docker 正常运行了,信息包括所有容器和镜像的数量、docker的执行驱动和存储驱动、基本的配置等
容器(以 Ubuntu 镜像为例)
创建并运行容器(run)
sudo docker run -it ubuntu /bin/bash # 创建并运行一个随机命名的容器
sudo docker run -name xxx -it ubuntu /bin/bash # 创建并运行一个容器名为xxx的容器
补充解释:
使用 run 指令,创建并运行一个基于 Ubuntu 镜像的容器,如果本地没有该镜像,docker 会自动去 docker hub 下载
-it选项分别是:-i:开启容器的标准输入 STDIN,即键盘输入;-t:使新容器拥有一个 shell
/bin/bash 则告诉 docker 在新容器中要运行命令 /bin/bash
该命令创建运行的容器是一个精简版的 ubuntu 系统,拥有自己的网络、IP 地址、和宿主机通信的桥接网络接口等
创建容器(create)
sudo docker create -it 镜像名称 # 创建一个随机命名的容器
sudo docker create --name xxx -it 镜像名称 # 创建一个容器名为xxx的容器
创建一个可以自动重启的容器(–restart)
有什么用?当容器因为内部运行出错停止时可以重新启动,从而避免一些损失
sudo docker run --restart=always --name xxx -d ubuntu ...
还可以设置自动重启的上限次数:
--restart=on-failure:5
退出正在当前窗口运行的容器
exit
查看当前系统的所有容器
sudo docker ps -a
查看当前运行的容器
sudo docker ps
查看最后一个运行的容器(不管是否正在运行)
sudo docker ps -l
查看一个容器的详细信息
sudo docker inspect 容器名或ID
删除容器
sudo docker rm 容器名称或 ID
目前没有一键删除所有容器的功能,但我们可以这样:
sudo docker rm `sudo docker ps -a -q`
但 windows 中不是用这个命令批量删除
启动/重启/停止一个已存在的容器
sudo docker start/restart/stop 容器名或 ID
但是,这样启动的容器只是在后台运行,并没有进入 shell 界面,这时我们可以用附着到容器的命令:
sudo docker attach 容器名或 ID
注意!
如果想要在容器退出后使用 start 命令启动,则只有守护式容器可以长时间运行,而普通的容器则会在启动后马上停止运行。
解决方法为:在创建这些普通容器时使用 -dit 选项:
sudo docker run -dit --name xxxx ubuntu
守护式容器(即无交互式会话)
创建长期在后台运行的容器
sudo docker run --name xxx -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done;"
解释:
-d:detached 的意思,指示放在后台运行
/bin/sh -c:让 bash 将后面的一个字符串作为完整的命令来执行
“while true; do echo hello world; sleep 1; done;”:每隔一秒在容器内部的 shell 窗口输出 hello world
可以通过附着到容器查看,也可以通过 docker log 查看
查看守护式容器干了些什么
获取守护式容器的日志(仅获取当前已输出的日志)
sudo docker logs 容器名或 ID
跟踪守护式容器的日志(实时显示)
sudo docker logs -f 容器名或 ID
按 ctrl+c 退出
-t 选项可以打印时间
查看容器内部正在运行的进程(top)
sudo docker top 容器名或 ID
输出样例:
PID USER TIME COMMAND
2710 root 0:00 /bin/sh -c while true; do echo hello world; sleep 1; done;
3167 root 0:00 sleep 1
在容器内部运行进程(exec)
sudo docker exec -d 容器名或ID touch xxx_file
解释:
在xxx容器中创建一个文件
这有什么用呢?用处可大了,比如上面例子中遇到的守护式容器想要进行交互,但没有界面怎么办?这时就可以用上在容器内运行bash进程的命令了:
sudo docker exec -it 容器名或ID /bin/bash
导入导出容器(export/import)
指把一个已创建的容器导出到一个文件中
导出:
sudo docker export 容器名或ID > xxx.tar
导入为一个镜像:
sudo docker import xxx.tar 镜像名