[TOC]
容器是独立运行的一个或一组应用。Docker容器通过Docker镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
>[info] 以下命令的容器名称都可以换成容器的id
## 操作
# 创建一个叫mycon的容器并传入参数php:5.6-fpm
docker create --name mycon php:5.6-fpm
# 如果镜像中没有cmd,报Error response from daemon: No command specified
docker create ubuntu-ssh-20190622:ansible /bin/bash
# 创建并运行ubuntu:15.10,输出 "Hello world"
docker run ubuntu:15.10 /bin/echo "Hello world"
# 创建容器,并进入容器,如果不指定name就会自己创建一个临时name
# 非bash,sh。就是直接执行后退出
docker run -i -t ubuntu:18.10(镜像名) /bin/bash
# 加上d的话就创建运行后就直接退出
docker run -itd ubuntu:18.10
# 在容器mycon中开启一个交互模式的终端
docker exec -i -t mycon /bin/bash
# 在容器mycon中以交互模式执行容器内/data/test.sh脚本
docker exec -it mycon /bin/sh /data/test.sh
# 退出容器
快捷键:Ctrl+P+Q
exit;
# 停止容器运行,发送信号SIGTERM
docker stop mycon
# 启动一个停止状态的容器
docker start mycon
# 重启一个容器
docker restart mycon
# 删除一个容器
doecker rm mycon
# 阻塞到一个容器,直到容器停止运行
docker wait mycon
# 暂停容器中所有的进程
docker pause mycon
# 恢复容器中所有的进程。
docker unpause mycon
# 找到目标容器的pid,然后用nsenter进入
# 老版本的docker是没有exec命令的
docker inspect -f {{.State.Pid}} 44fc0f0582d9
nsenter --target 998 --mount --uts --ipc --net --pid
# 发送信号给容器,默认SIGKILL
docker kill -s KILL mycon (-s表示向容器发送一个信号)
## 信息
# 显示状态为运行(Up)的容器
docker ps
-a :显示所有的容器,包括未运行的。例如:docker ps -a
# 深入容器内部获取容器所有信息,例如:docker inspect mycon
docker inspect
-f :指定返回值的模板文件。例如:docker inspect -f '{{.NetworkSettings.IPAddress}}' mycon (获取正在运行的容器mycon的 IP)
-s :显示总的文件大小。
--type :为指定类型返回JSON。
# 查看容器的日志(stdout/stderr)
docker logs
-f : 跟踪日志输出,例如:docker logs -f mycon(查看容器mycon的日志输出,容器必须是启动状态)
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志,例如:docker logs --since="2017-05-01" --tail=10 mycon(查看容器mycon从2017年5月1日后的最新10条日志。)
# 得到docker服务器的实时的事件
docker events
-f :根据条件过滤事件;例如:docker events -f "image"="mysql:5.6" --since="1466302400" (显示docker 镜像为mysql:5.6 这个时间戳对应的日期之后的相关事件。)
--since :从指定的时间戳后显示所有事件;例如:docker events --since="1466302400" (显示docker 在这个时间戳对应的日期之后的所有事件。)
--until :流水时间显示到指定的时间为止;
# 显示容器的端口映射,例如:docker port mycon
docker port
# 显示容器的进程信息,支持ps参数。例如docker top mycon
docker top
# 显示容器文件系统的前后变化, 检查容器里文件结构的更改。例如:docker diff mycon
docker diff
## 数据卷与数据卷容器
删除容器后数据还存在
# 数据卷的创建与查看
# 默认是创建在宿主机的/var/lib/docker/volumes/上
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
# 数据卷挂载
docker run -itd --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -itd --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
# 数据卷指定挂载目录 /home/docker/wwwroot
# -v方式的可以自动创建目录, --mount方式的不可以
docker run -itd --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -itd --name=nginx-test --mount type=bind src=/home/docker/wwwroot,dst=/usr/share/nginx/html nginx
docker run -itd --name=nginx-test -v /home/docker/wwwroot:/usr/share/nginx/html nginx
如果容器之间需要共享一些持续更新的数据
# 创建挂载卷容器 src:数据卷(必须要把名称写全) dst=把数据卷挂载到容器中的什么地方
docker run -itd --name nginx-data --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
# 新的容器关联数据卷容器
docker run -itd --volumes-from nginx-data --name nginx-1 nginx
docker run -itd --volumes-from nginx-data --name nginx-2 nginx
# 三个容器的数据卷通用
## 导出导入
# 从容器里向外拷贝文件或目录
docker cp
-L :保持源目标中的链接
docker cp /www/test mycon:/www/ # 将主机/www/test目录拷贝到容器mycon的/www目录下
docker cp /www/test mycon:/www # 将主机/www/test目录拷贝到容器mycon中,目录重命名为www
docker cp mycon:/www /tmp/test # 将容器mycon中的/www目录拷贝到主机的/tmp/test目录中
# 将容器整个文件系统导出为一个tar包,不带layers、tag等信息
# 导出容器必须要先停止容器
docker export
-o :将输入内容写到文件。例如:docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2 #将id为a404c6c174a2的容器按日期保存为tar文件。
# docker import <文件路径> <容器名>
docker import ./ubuntu1810.tar ubuntu1810:tag
>[info] 注意,docker import导入容器进去是成为一个新的镜像,要通过`docker images`来查看,相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。