乐趣区

docker专题2容器

[TOC]

容器是独立运行的一个或一组应用。Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。

[info] 以下命令的容器名称都可以换成容器的 id

操作


# 创建一个叫 mycon 的容器并传入参数 php:5.6-fpm
docker create --name mycon php:5.6-fpm

# 创建并运行 ubuntu:15.10,输出 "Hello world"
docker run ubuntu:15.10 /bin/echo "Hello world"

# 创建容器,并进入容器,如果不指定 name 就会自己创建一个临时 name
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

如果容器之间需要共享一些持续更新的数据

# 创建挂载卷容器
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 命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

退出移动版