容器声明周期管理

创建容器并运行 run

docker run [OPTIONS] image [command] [ARG]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • —name=”nginx-lb”: 为容器指定一个名称;
  • —dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • —dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h “mars”: 指定容器的hostname;
  • -e username=”ritchie”: 设置环境变量;
  • —env-file=[]: 从指定文件读入环境变量;
  • —cpuset=”0-2” or —cpuset=”0,1,2”: 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • —net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • —link=[]: 添加链接到另一个容器;
  • —expose=[]: 开放一个端口或一组端口;
  • —volume , -v: 绑定一个卷
# 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
$ docke run -d --name munginx nginx:latest

# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 8080 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /etc/data。
$ docker run -d -p 8080:80 -v /data:/etc/data --name mynginx nginx:latest

# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
$ docker run -it nginx:latest /bin/bash

启停命令 start/stop/restart/kill

# 启动容器
$ docker start [容器名/容器ID]
# 停止容器
$ docker stop [容器名/容器ID]
# 重启容器
$ docker restart [容器名/容器ID]
# 杀掉一个运行中的容器
$ docker kill [容器名/容器ID]

删除容器 rm

docker rm [OPTIONS] [容器名/容器ID]

OPTIONS说明:

  • -f :通过 SIGKILL 信号强制删除一个运行中的容器。
  • -l :移除容器间的网络连接,而非容器本身。
  • -v :删除与容器关联的卷。
# 强制删除容器 db01、db02
$ docker rm -f db01 db02

# 移除容器 nginx01 对容器 db01 的连接,连接名 db:
$ docker rm -l db 

# 删除容器 nginx01, 并删除容器挂载的数据卷
$ docker rm -v nginx01

# 删除所有已经停止的容器:
$ docker rm $(docker ps -a -q)

暂停/恢复 pause/unpause

# 暂停容器db01
$ docker pause db01
# 恢复容器db01
$ docker unpause db01

创建容器但不运行 create

docker create [OPTIONS]

options同run命令

在容器中执行命令 exec

docker exec [OPTIONS]

OPTIONS说明:

  • -d :分离模式: 在后台运行
  • -i :即使没有附加也保持STDIN 打开
  • -t :分配一个伪终端
# 在容器 mynginx 中开启一个交互模式的终端:
$ docker exec -it  mynginx /bin/bash
# 在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本
$ docker exec -it mynginx /bin/sh /root/runoob.sh

容器操作

容器列表 ps

docker ps [OPTIONS]

OPTIONS说明:

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • —format :指定返回值的模板文件。
  • -l :显示最近创建的容器。
  • -n :列出最近创建的n个容器。
  • —no-trunc :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。
CONTAINER ID   IMAGE          COMMAND                ...  PORTS                    NAMES
09b93464c2f7   nginx:latest   "nginx -g 'daemon off" ...  80/tcp, 443/tcp          myrunoob
96f7f14e99ab   mysql:5.6      "docker-entrypoint.sh" ...  0.0.0.0:3306->3306/tcp   mymysql

输出详情介绍:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称。

例:

# 根据标签过滤
$ docker ps --filter "label=color"
$ docker ps --filter "label=color=blue"
# 根据名称过滤
$ docker ps --filter"name=test-nginx"
# 根据状态过滤
$ docker ps -a --filter 'exited=0'
$ docker ps --filter status=running
$ docker ps --filter status=paused
# 根据镜像过滤
$ docker ps --filter ancestor=nginx
$ docker ps --filter ancestor=d0e008c6cf02
# 根据启动顺序过滤
$ docker ps -f before=9c3527ed70ce
$ docker ps -f since=6e63f6ff38b0

获取容器日志 logs

docker logs [OPTIONS] [容器名/容器ID]

OPTIONS说明:

  • -f : 跟踪日志输出
  • —since :显示某个开始时间的所有日志
  • -t : 显示时间戳
  • —tail :仅列出最新N条容器日志
# 查看容器mynginx从2016年7月1日后的最新10条日志。
docker logs --since="2016-07-01" --tail=10 mynginx

从服务器获取实时事件 events

docker events [OPTIONS]

OPTIONS说明:

  • -f :根据条件过滤事件;
  • —since :从指定的时间戳后显示所有事件;
  • —until :流水时间显示到指定的时间为止;
# 显示docker 镜像为mysql:5.6 2016年7月1日后的相关事件。
docker events -f "image"="mysql:5.6" --since="1467302400"

查看容器中运行的进程信息 top

docker top [OPTIONS] [容器名/容器ID]

# 查询所有容器的进程信息
for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done

注:如果指定的时间是到秒级的,需要将时间转成时间戳。如果时间为日期的话,可以直接使用,如—since=”2016-07-01”。

查看容器端口 port

docker port [容器名/容器ID]

获取容器元数据 inspect

docker inspect [OPTIONS] [容器名/容器ID]

OPTIONS说明:

  • -f :指定返回值的模板文件。
  • -s :显示总的文件大小。
  • —type :为指定类型返回JSON。

镜像仓库

登录指定Doker hub

# 登陆到Docker Hub
docker login -u 用户名 -p 密码
# 登出Docker Hub
docker logout

从镜像仓库中拉取或者更新指定镜像 pull

从Docker Hub查找镜像 search

本地镜像管理

列出本地镜像 images

# 查询本地所有镜像
sudo docker images
# 查询本地镜像中所有gitlab的镜像列表
sudo docker images gitlab

移除本地镜像 rmi

# 移除指定镜像
docker rmi [ 镜像名 或 镜像ID ]

# 删除所有未被 tag 标记和未被容器使用的镜像
docker image prune
# 删除所有未被容器使用的镜像:
docker image prune -a
# 删除所有停止运行的容器:
docker container prune

镜像标记 tag

# 将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。
docker tag ubuntu:15.10 runoob/ubuntu:v3

历史命令 history

docker history [镜像名]

归档命令 save

docker save -o [归档文件] [镜像名]
# 将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3

加载归档镜像 load

docker load --input my_ubuntu_v3.tar

从归档文件中创建镜像 import

# 从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为runoob/ubuntu:v4
docker import  my_ubuntu_v3.tar runoob/ubuntu:v4

Docker状态

显示 Docker 系统信息,包括镜像和容器数。 info

docker版本信息 version

时间同步

解决方案

1、利用Dockerfile创建镜像时。在Dockerfile中加入

ENV TIME_ZONE=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone

2、容器创建时。加入时区挂载选项:-v /etc/localtime:/etc/localtime。实例:

docker run -d -p 6379:6379 -v /etc/localtime:/etc/localtime —name test-redis redis

3、容器已启动时。

docker exec -it container /bin/bash // 进入交互模式,container为容器ID或名称,下同

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

docker restart container // 重启容器

docker exec container date -R // 查看时区