2

Docker 常用命令

docker container(容器相关)

  • 1 . run运行

    • a. --publish/-p 开放端口

       docker container run --publish <expose_port>:<container_port> <image>:<tag>
    • b. --deatch/-d 后台运行

       docker container run --publish <expose_port>:<container_port> -d <image>:<tag>
    • c. --name 命名container

      docker container run --publish <expose_port>:<container_port> -d --name <custom_name> <image>:<tag>
    • d. --env/-e 设置环境变量

      docker container run --publish <expose_port>:<container_port> -d --env <env_key>=<env_value> --name <custom_name> <image>:<tag>
      
    • e. -it进入容器交互环境,实际上是-i-t的组合,下面语句会在运行container后,执行<command_to_exec> 命令。例如可以替换<command_to_exec>为bash,则会启动后进入bash交互环境,即容器内部的Linux环境,若需要退出,则执行exit退出,注意此时容器也会退出。

      docker container run -it --name <custom_name> <image>:<tag> <command_to_exec>
    • f. --network设置网络。Docker本身有自己的虚拟网络,通过该命令,可以指定虚拟网络,也可以指定直接通过NAT使用host网络,如:--network <custom_network_name>
    • g. -v绑定数据卷,

      docker container run -v <volume_name>:<path_in_docker> <image>:<tag> <command_to_exec>
    • h. -v绑定磁盘数据卷

      docker container run -v <path_in_local_mount>:<path_in_docker> <image>:<tag> <command_to_exec>
      #path_in_local_mount 可以使用$(pwd)使用shell命令执行后的结果[PS:以此类推,其他语法处也可以使用]
  • 2 . ls container列表

    • a. 显示运行中的container

      docker container ls
    • b. 显示所有container

      docker container ls -a
  • 3 . rm 删除container

    • a. 删除指定container

      #按照containId删除
      docker container rm <containerID>
      #按照名称删除
      docker container rm name
    • b. -f强制删除(可删除运行中的container)

      #按照containId强制删除
      docker container rm -f <containerID>
      #按照名称强制删除
      docker container rm -f name
  • 4 . top 查询容器中的进程

    • a.查询容器中的进程
    • b.

      #查询指定containerID的Container进程详情
      docker container top <containID>
      #查询指定name的Container进程详情
      docker container top <name>
  • 5 . inspect查询容器的配置详情

    • a. 返回形式为json结构,不返回活动中的容器和进行中的容器状态
    • b.

      #查询指定containerID的Container配置详情
      docker container inspect <containID>
      #查询指定name的Container配置详情
      docker container tinspectop <name>
    • c.查看指定docker内网ip

      docker container insepct --format '{{.NetworkSettings.IPAddress}}' <name>
  • 6 . stats 查询所有容器的状态

    • a.实时返回container的运行状态,不显示容器名称,只显示容器ID

      docker container stats
    • b.

      #查询指定containerID的Container配置详情
      docker container stats <containID>
      #查询指定name的Container配置详情
      docker container stats <name>
  • 7 . exec在container中执行命令

    • a . 当使用这种方式执行命令时,使用exit会退出容器,但是容器不会停止
    • b .

      docker container exec -it <container_name> <command_to_exec>
  • 8 . startstop:启动/停止容器
  • 9 . port查看容器端口映射

    #查询指定containerID的端口映射
    docker container port <containerID>
    #查询指定name的Container的端口映射
    docker container port <name>

docker network

  • 1 . ls显示所有网络

    • a.默认网络为bridge或者docker0 ,与host以NAT形式通讯
    • b.host网络是跳过docker的虚拟网络,直连到主机网络,这种方式牺牲了容器的安全性
    • c.none网络是在容器中移除了eth0只剩下localhost网络接口
    docker network ls
  • 2 . inspect查看网络具体信息

    • a.以Json形式返回具体的网络信息,其中IPAM显示驱动名称,网关和网段
    • b.Containers显示连接到该网络的Container信息以为IP地址
    docker network inspect <network_name>
  • 3 . create创建网络

    a.创建网络时默认使用bridge驱动,在创建的时候也可以指定第三方驱动来创建含有特定驱动的网络,如weave驱动
    b.此命令还有其他选项可以在创建时指定,如:ip等,具体查看help即可
    #创建默认驱动的网络
    docker network create <custom_network_name>
    #创建指定驱动的网络
    docker network create --driver <driver_name> <custom_network_name>
    #创建可互相通讯的network
    docker network create --driver overlay <custom_network_name>
    
  • 4 . connect连接指定网络到容器

    docker network connect <network_id> <container_id>
  • 5 . disconnect取消连接指定网络到容器

    docker network disconnect <network_id> <container_id>
  • 6 . 运行时指定需要暴露的端口,这样能保护docker内部的端口,只能在虚拟网络里访问,外部可访问的只有暴露出的端口

docker machine

  • 1.用于创建docker虚拟机,必须同时安装 virtualbox才能使用
  • 2.也可以使用在下网站创建docker集群:https://labs.play-with-docker...,只能活跃4H
  • 3.也可以使用云服务例如:https://www.digitalocean.com

    #创建虚拟机
    docker-machine create <node_name>
    #ssh连接
    docker-machine ssh <node_name>
    #查看虚拟机环境变量
    docker-machine env <node_name>

Docker Images

Dockerfile

# NOTE: this example is taken from the default Dockerfile for the official nginx Docker Hub Repo
# https://hub.docker.com/_/nginx/
# NOTE: This file is slightly different than the video, because nginx versions have been updated 
#       to match the latest standards from docker hub... but it's doing the same thing as the video
#       describes
FROM debian:stretch-slim
# all images must have a FROM
# usually from a minimal Linux distribution like debian or (even better) alpine
# if you truly want to start with an empty container, use FROM scratch

ENV NGINX_VERSION 1.13.6-1~stretch
ENV NJS_VERSION   1.13.6.0.1.14-1~stretch
# optional environment variable that's used in later lines and set as envvar when container is running

RUN apt-get update \
    && apt-get install --no-install-recommends --no-install-suggests -y gnupg1 \
    && \
    NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
    found=''; \
    for server in \
        ha.pool.sks-keyservers.net \
        hkp://keyserver.ubuntu.com:80 \
        hkp://p80.pool.sks-keyservers.net:80 \
        pgp.mit.edu \
    ; do \
        echo "Fetching GPG key $NGINX_GPGKEY from $server"; \
        apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
    done; \
    test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
    apt-get remove --purge -y gnupg1 && apt-get -y --purge autoremove && rm -rf /var/lib/apt/lists/* \
    && echo "deb http://nginx.org/packages/mainline/debian/ stretch nginx" >> /etc/apt/sources.list \
    && apt-get update \
    && apt-get install --no-install-recommends --no-install-suggests -y \
                        nginx=${NGINX_VERSION} \
                        nginx-module-xslt=${NGINX_VERSION} \
                        nginx-module-geoip=${NGINX_VERSION} \
                        nginx-module-image-filter=${NGINX_VERSION} \
                        nginx-module-njs=${NJS_VERSION} \
                        gettext-base \
    && rm -rf /var/lib/apt/lists/*
# optional commands to run at shell inside container at build time
# this one adds package repo for nginx from nginx.org and installs it

RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log
# forward request and error logs to docker log collector

EXPOSE 80 443
# expose these ports on the docker virtual network
# you still need to use -p or -P to open/forward these ports on host

CMD ["nginx", "-g", "daemon off;"]
# required: run this command when container is launched
# only one CMD allowed, so if there are multiple, last one wins

图片描述

docker image

  • 1 . build新建Image
在有Dockerfile的目录下执行,新建Image命令
在创建Image的时候,会按照命令一层一层的写入,建议在dockerfile中将不经常变化的层信息写在上面,把经常修改的层写在下面,这样当再次床架image时,会根据SHA1判断并使用相同的层,以便于提高创建image效率
docker image build -t <image_name> <image_dir>
  • 2 . history 查看image的layers历史信息

    该命令查看image的层历史
    docker image history <image>
  • 3 . inspect 查看image详细信息,包含所有的层信息

    docker image inspect <image>
  • 4 . ls 查看所有DockerImage列表

    docker image inspect <image>
  • 5 . tag 修改image的tag

    docker image tag <image>:<source_tag> <image>:<target_tag>
  • 6 . pull 从DockerHub拉取image

    docker image pull <image>:<tag>
  • 7 . push 推送image到DockerHub

    docker image push <image>:<tag>

docker volume

  • 1.ls 查询所有volume列表

    docker volume ls
  • 2.rm 删除指定volume

    docker volume rm <volume_name>
  • 3.inspect 查询volume信息

    docker volume inspect <volume_name>
  • 4.prune 删除所有未使用的本地数据卷

    docker volume inspect <volume_name>
  • 5.create 创建数据卷

    docker volume create <volume_name>

Docker Swarm

    1. 结构

图片描述
图片描述
图片描述

docker swarm

  • 1 . init 初始化Docker Swarm 单节点,默认为Leader-Manager,会创建Token供其他Swarm加入(join)时使用,创建Raft协议

    docker swarm init
  • 2 . init --advertise-addr 当创建swarm时指定的host名称对应多个ip地址时,需要具体指定哪个IP

    docker swarm init --advertise-addr <IP>
  • 3 . join当创建玩一个swarm节点时,系统会提示如何加入节点

    docker swarm join --token <token> <IP>:<PORT>
  • 4 . join-token获取Join时需要的token

    docker swarm join-token manager

docker node

  • 1 . ls 查看Swarm中的Node列表

    只有Swarm-Leader才能使用,Worker不支持
    docker node ls
  • 2 . inspect 查看Swarm中的Node详情

    docker node inspect <node_id>
  • 3 . ps 查看Swarm中的Node状态

    #查看node整体信息
    docker node ps
    #查看指定node的信息
    docker node ps <node_name>
  • 4 . rm 删除Swarm中的Node

    docker node rm <node_id>
  • 5 .update 更新swarm节点

    docker node update --<update_command> <param> <node_name>
    #更新接的角色为Manager
    docker node update --role manager <node_name>

docker service

  1. 用于替代docker run
  2. 创建后,如果使用docker container rm命令删除某个container,则Swarm会自动创建一个新的container,以保证整体节点数量
  • 1 . create 创建swarm节点

    #创建单节点
    docker service create <image>
    #创建多节点
    docker service create --replicas <node_number> <image>
    docker 17.10 之后,组要指定--detach true表示后台运行,若不指定该参数会同步显示所有执行过程
  • 2 . ls 查看创建的service信息

    docker service ls
  • 3 . ps 查看service的任务信息或者Container信息

    docker service ps <service_id/service_name>
  • 4 . update 更新service

    相比于docker updatedocker service update提供更多更新操作,可用于更新docker配置
    docker service update <service_id/service_name> <new_command>
    docker 17.10 之后,组要指定--detach true表示后台运行,若不指定该参数会同步显示所有执行过程
  • 5 . rm 删除service

    docker service rm <service_id/service_name>

其他

  • 1 . docker swarm 自带loadbalancer,但是是无状态的loadbalancer,不支持session,cookie等机制,可以在docker swarm 集群前置Nginx来实现真正的负载均衡
  1. LoadBalancer

图片描述
图片描述


Cheng_Gang
99 声望16 粉丝