Docker常用命令

Docker常用命令

Docker镜像命令

  • docker images
    • 查看所有的images
  • docker images|grep voyage|grep none|awk '{print $3 }'|xargs docker rmi
    • 删除所有指定标签的images
  • docker pull-v
    • 例如docker pull 10.37.210.125:5001/contiv/netplugin:1.2.0_6.3, 会默认加https:// 使用安全链接下载镜像
    • 如果想使用http:// 非安全的链接下载镜像,需要修改docker 配置/etc/docker/daemon.json,如下:
    {
  "storage-driver": "devicemapper",
  "storage-opts": [
    "dm.basesize=20G"
  ],
  "insecure-registries": ["10.37.210.125:5001", "10.37.218.29:5000"]
}
  • docker save

    • 把本机镜像拷贝出来成一个文件,例如 docker save pause:3.0 -o myimage.rar
  • docker load

    • 加载指定镜像,例如:docker load -i golang-1.2.0.tar
  • docker tag

    • 给docker镜像添加一个新的tag, 例如: docker tag 10.37.1.2:5001:5001/contiv:0.1 tag 10.37.1.2:5001:5001/net:0.1
  • docker build

    • 构建镜像到指定位置.eg: docker build -t 10.37.1.2:5001/contiv/netplugin:sj-001 ./ -f Dockerfile
    • 如果是基于某个原始镜像进行编译,那么编译的环境必须有该镜像即先要docker pull下基础镜像再进行编译
  • docker push

    • 推送镜像或者repository到镜像仓库. eg: docker push 10.37.210.125:5001/contiv/netplugin:test-001
    • 注意,这里要先登录仓库:docker login 10.37.210.125:5001
  • docker rmi xxx

    • 删除某个镜像
  • docker history xxx

    • 递归地输出指定镜像的历史镜像
  • docker export

    • 创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容.(expoxt后 的容器再import到Docker中,通过docker images –tree命令只能看到一个镜像;而save后的镜像则不同,它能够看到这个镜像的历史镜像)

Docker 生命周期管理命令

  • docker run

    • docker run -d busybox:glibc sleep 100
      用镜像busybox:glibc运行一个新的容器;-d表示在后台运行;因为该镜像没有持续的进程,如果不加sleep 100会马上退出。如果容器脚本有命令参数,那么也需要加上,例如:
      docker run iperf:3.0 -s
    • docker run -d --network host busybox:glibc sleep 100
      这里指定容器使用的网络模式是host,默认为docker0 bridge模式。另外还可以是none,或者container模式.
    • docker run --net=host -v /home/config.properties:/usr/local/config/config.properties 192.168.0.1:5000/library/123:456
      这里指定容器使用的网络模式是host,并挂载本地主机文件/home/config.properties到容器内部,容器内部的文件为/usr/local/config/config.properties.如果指定只读,可以加上ro, 这样写 -v host-dir:container-dir:ro
    • docker run --net=host -e MYSQL_ROOT_PASSWORD="123456" mysql:latest
      这里指定容器运行时的环境变量MYSQL_ROOT_PASSWORD为"123456"
    • docker run --name tomcat --cpus 1 -m 512M -e JAVA_OPTS='-Xmx512m -Xms512m' -p 8080:8080 -itd feisky/tomcat:8
    • docker run -it --cpus=2 --memory="100m" ubuntu:latest /bin/bash
      这里运行新容器,名为tomcat,指定资源、环境变量、端口映射和镜像
    • docker run --name test --rm -i -t --privileged -v /etc:/etc:ro -e PASSWORD="123456" 192.168.0.1:5000/library/busybox:v1.0 sleep 20
      以特权模式运行容器
  • docker stop
    停止退出一个正在运行的容器

  • docker rm -f tomcat
    删除旧容器

  • docker start
    启动一个或多个已经停止的容器

  • docker restart
    重启一个或多个容器

  • docker restart
    重启容器内的某个进程

  • docker pause/unpause
    暂停一个容器中的所有进程,该容器不能执行exec 命令, 也不能rm 被删除

Docker Debug命令

  • docker inspect

    • 查看容器的详细信息,包含启动脚本和环境变量
    • 进入容器和网络的netns命名空间的方法
      1. docker ps 查看容器的id
      2. docker inspect -f '{{.State.Pid}}' <容器id> //获取容器进程号
      3. ln -s /proc/<容器进程号>/ns/net /var/run/netns/<容器id> //将进程网络命名空间恢复到主机目录, 如果/var/run/netns目录不存在,以root用户手动创建目录即可。
      4. 执行ip netns 命令即可看到容器的网络命名空间
      5. nsenter -t <容器进程号> -n -F -- ip a //到容器命名空间中执行命令ip a
    • 查看容器状态或者推出原因: docker inspect f2ddeebb133a -f '{{json .State}}' | jq
  • docker logs

    • docker logs
    • docker logs -f 查看实时log
  • docker ps --no-trunc

    • 可查看完成容器ID
  • docker exec

    • 在docker容器内部执行IP命令: docker exec -ti 12345678 ip
    • 根据独一无二的容器名,在该容器内部执行bash命令:
      docker exec -it `docker ps |grep docker-unique-name|awk '{print $1}'|awk FNR==1` bash
  • docker network 容器网络相关命令

    • docker network prune 删除不被容器使用的所有网络资源,例如端口。容器删除后,端口仍被占用需要用这个命令回收
  • docker stats
    实时显示容器资源消耗,包括CPU,MEM,netIO, BlockIO

Docker 容器使用资源查看

  • docker stats docker-ID

Docker-compose

docker-compose 是一种单引擎模式(Single-Engine Mode)进行多容器应用的部署和管理,需要安装工具docker-compose,并编辑一个yaml文件(定义了多个容器资源),常用命令如下:

  • docker-compose up -d; docker-compose -f xx.yaml -d 启动服务
  • docker-compose down 停止服务并删除containers, networks, images, and volumes
  • docker-compose ps 列出所有容器
  • docker-compose logs 查看服务日志
  • docker-compose start 启动服务
  • docker-compose stop 停止服务
    如下所示,是一个mysql容器的docker-compose文件,使用它可以创建一个名为 mysql 的服务:
version: "2.1" #Docker Compose 文件的版本声明。请确保你的Docker Compose工具支持该版本。
services:

  mysql:
    image: registry.fit2cloud.com/fit2cloud3/mysql:5.7.25 # 指定容器使用的镜像
    container_name: mysql    # 指定容器的名称
    ports:
      - 3306:3306   # 将主机的3306端口映射到容器的3306端口
    healthcheck:   # 为 mysql 服务添加的健康检查配置,这将确保在启动时检查MySQL服务是否健康,以及在运行时是否继续保持健康。
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 10
    environment:
      MYSQL_ROOT_PASSWORD: Password123@mysql  # 设置容器的环境变量,这里配置mysql的密码
    volumes:
      - /opt/demo/conf/my.cnf:/etc/mysql/conf.d/my.cnf   # 挂载卷,将主机的/opt/demo/conf/my.cnf目录映射到容器的/etc/mysql/conf.d/my.cnf目录
      - /opt/demo/bin/mysql:/docker-entrypoint-initdb.d/
      - cmp-mysql-data:/var/lib/mysql # 挂载卷,将cmp-mysql-data映射到容器的/var/lib/mysql目录
    networks:
      - demo-network ## 将容器连接到demo-network网络

volumes:
  cmp-mysql-data:
    driver_opts:
      type: none
      device: /opt/demo/data/mysql
      o: bind

输入docker-compose -f xx.yaml up -d 命令后,docker引擎会自动 docker-proxy -proto tcp -host-ip :: -host-port 3306 -container-ip 172.19.0.3 -container-port 3306 把容器的端口服务暴露出来。可以通过docker network list以及docker network inspect demo-network查看详细网络信息。

根据进程号查看容器

查看进程号PID,然后查看/proc//cgroup 里面会有kubepods、docker xxx相关资源字样,那么xxx就是容器ID, 如果没有docker相关的字样说明不是容器,可能是containerd进程,各个容器是它的子进程。

常见问题

  1. 有些专门功能的容器例如kafka、mongo,POD里面一定有专门的二进制工具,如果没有一定是进错了容器,别进到pause容器了。
posted @ 2019-07-12 14:40  JaneySJ  阅读(281)  评论(0编辑  收藏  举报