1

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

菜问
625 声望132 粉丝

10年后端开发,常用编程语言PHP,java,golang,python。