• Docker基本操作


    Docker

    简介

    什么是docker?A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.

    简而言之docker就是一个容器,将代码、依赖、环境配置等打包,打包好的容器可以发布到任何流行的linux上,能做到一次配置,到处运行。

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

    容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

    Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

    docker 中主要有两个概念 image (镜像)、container (容器),镜像是只读的,可移植;容器是可写的,可执行的,我们运行的都是容器,在容器里配置我们的服务并启动,配置完整的容器可以 commit 成为新的镜像。举个例子说明,镜像就像是 redis 的官方压缩包,里面有它自己的一些默认配置,这些配置都是制作镜像的人自己配置的,而容器就是解压以后的 redis ,我们可以对其做定向修改并启动它,同时我们可以将修改了配置以后的 redis 再次压缩成为一个压缩包,它便成了一个新的镜像。

    Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

    而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

    Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。

    总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样

     最常用的包括Images和Container,

    Images中存放下载的环境,仅可读

    Container(容器),可读可写,主要操作是在部份进行。

    Repository (仓库)     集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库(Github)。

    Docker 使用 C/S 结构,即客户端/服务器体系结构。 Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像。 Docker 客户端和服务端可以运行在一台机器上,也可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。

    docker-framework

    这张图展示了 Docker 客户端、服务端和 Docker 仓库(即 Docker Hub 和 Docker Cloud ),默认情况下Docker 会在 Docker 中央仓库寻找镜像文件,这种利用仓库管理镜像的设计理念类似于 Git ,当然这个仓库是可以通过修改配置来指定的,甚至我们可以创建我们自己的私有仓库。

    1、开始安装,整起:

    删除有关docker的旧版本依赖:

            sudo yum remove docker

                      docker-client

                      docker-client-latest

                      docker-common

                      docker-latest

                      docker-latest-logrotate

                      docker-logrotate

                      docker-engine

     sudo yum install -y yum-utils

          device-mapper-persistent-data

          lvm2

    设置docker仓库:

            sudo yum-config-manager

            --add-repo

            https://download.docker.com/linux/centos/docker-ce.repo

    启用docker仓库:

        sudo yum-config-manager --enable docker-ce-nightly

    安装最新的docker ce:

        sudo yum install docker-ce docker-ce-cli containerd.io

    启动docker服务:

        sudo systemctl start docker

    测试docker是否安装好:

     docker run hello-world

    执行该命令以后会出现以下的提示:

        Unable to find image 'hello-world:latest' locally

        latest: Pulling from library/hello-world

        1b930d010525: Pull complete

        Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e

        Status: Downloaded newer image for hello-world:latest

        Hello from Docker!

        This message shows that your installation appears to be working correctly.

    2、常用指令

    image 命令:

    - docker images : 查看docker镜像

    - docker build :由Dockerfile构建镜像

    - docker rmi :删除镜像

    - docker create : 由镜像构建容器

    - docker search : 搜索镜像

    - docker pull : 拉取镜像

    container 命令:

    - docker ps : 查看容器

    - docker rm : 删除容器

    - docker attach: 连接正在运行的容器

    - docker exec : 在容器中执行命令

    - docker commit : 由容器构建新的镜像

    - docker stop : 关闭容器

    - ctrl + p + q : 退出容器(不会关闭容器)

    - exit : 退出容器(会关闭容器)

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

    docker info

    version    显示 Docker 版本信息

    docker version
    docker search [OPTIONS] TERM
        

    OPTIONS说明

    参数解释
    --automated 只列出 automated build类型的镜像
    --no-trunc 显示完整的镜像描述
    -s 列出收藏数不小于指定值的镜像

    登陆操作

    和github有点类似,可以再阿里云上建立自己的docker仓库:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

     

    login     登陆到一个 Docker 镜像仓库

    docker login

    docker login -u 用户名 -p 密码

    logout   退出Docker 镜像仓库

    docker logout

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

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]

    OPTIONS说明

    参数解释
    -a 拉取所有 tagged 镜像
    --disable-content-trust 忽略镜像的校验,默认开启

        样例docker pull hub.c.163.com/library/mysql:latest

    push

    将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

    docker pull NAME[:TAG|@DIGEST]
    eg: docker push myapache:v1
     

    build

    使用Dockerfile创建镜像

    docker build [OPTIONS] PATH | URL | -

    OPTIONS说明

    参数解释
    --build-arg=[] 设置镜像创建时的变量
    --cpu-shares 设置 CPU 使用权重
    --cpu-period 限制 CPU CFS 周期
    --cpu-quota 限制 CPU CFS 配额
    --cpuset-cpus 指定使用的 CPU id
    --cpuset-mems 指定使用的内存 id
    --disable-content-trust 忽略校验,默认开启
    -f 指定要使用的 Dockerfile 路径
    --force-rm 设置镜像过程中删除中间容器
    --isolation 使用容器隔离技术
    --label=[] 设置镜像使用的元数据
    -m 设置内存最大值
    --memory-swap 设置 Swap 的最大值为内存 +swap,"-1"表示不限 swap
    --no-cache 创建镜像的过程不使用缓存
    --pull 尝试去更新镜像的新版本
    -q 安静模式,成功后只输出镜像 ID
    --rm 设置镜像成功后删除中间容器
    --shm-size 设置 /dev/shm 的大小,默认值是 64M
    --ulimit Ulimit 配置

    样例

    从已经创建的容器中更新镜像,并且提交这个镜像

    docker commit -m="has update" -a="shitao" ede0be5f1842 mysql:v2

    OPTIONS说明

    参数解释
    -m 提交的描述信息
    -a 指定镜像作者
    ede0be5f1842 容器 ID (通过docker ps -a查看)
    mysql:v2 mysql 镜像的仓库源名 v2 镜像的标签

    样例

    使用 Dockerfile 指令来创建一个新的镜像

    我们使用命令 docker build,从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

    docker build -t imagesname:2.0 /home/shitao/file/

    OPTIONS说明

    参数解释
    -t 指定要创建的目标镜像名
    imagesname:2.0 imagesname 镜像的仓库源名 2.0 镜像的标签
    /home/shitao/file/ dockerfile 路径

    tag

    标记本地镜像,将其归入某一仓库

    docker tag 9e64176cd8a2 mysql163:2.0.1

    OPTIONS说明

    参数解释
    9e64176cd8a2 镜像 id (镜像名)
    mysql163:2.0.1 mysql163 镜像的仓库源名 2.0.1 镜像的标签

    使用 docker images 命令可以看到,ID为 9e64176cd8a2 的镜像多个标签

    save

    将指定镜像保存成 tar 归档文件

    docker save -o /home/shitao/Downloads/mysql.tar 9e64176cd8a2

    将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档

    OPTIONS说明

    参数解释
    9e64176cd8a2 镜像 id (镜像名)
    /home/shitao/Downloads/mysql.tar 保存的地址

    import

    从归档文件中创建镜像

    docker import /home/shitao/Downloads/mysql.tar mysql:0.2

    OPTIONS说明

    参数解释
    mysql:0.2 mysql 镜像的仓库源名 0.2 镜像的标签
    /home/shitao/Downloads/mysql.tar 归档文件地址

    inspect

    获取容器/镜像的元数据

    docker inspect [OPTIONS] NAME|ID [NAME|ID...]

    OPTIONS说明

    参数解释
    -f 指定返回值的模板文件
    -s 显示总的文件大小
    --type 为指定类型返回JSON

    样例

    docker inspect 9e6

    容器生命周期管理

    run

    docker run -it hub.c.163.com/library/mysql /bin/bash

    OPTIONS说明

    参数解释
    -i 以交互模式运行容器,通常与 -t 同时使用
    -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
    hub.c.163.com/library/mysql 镜像名
    -P 将容器内部使用的网络端口映射到我们使用的主机上
    -d 后台运行容器,并返回容器ID

    start

    启动一个或多少已经被停止的容器

    docker start {容器ID|容器名称}

    stop

    停止一个运行中的容器

    docker stop {容器ID|容器名称}

    restart

    重启容器

    docker restart {容器ID|容器名称}

    kill

    杀掉一个运行中的容器

    docker kill {容器ID|容器名称}

    rm

    删除一个或多少容器

    docker rm [OPTIONS] CONTAINER [CONTAINER...]

    OPTIONS说明

    参数解释
    -f 通过 SIGKILL 信号强制删除一个运行中的容器
    -l 移除容器间的网络连接,而非容器本身
    -v 删除与容器关联的卷

    删除指定容器

    docker rm {容器ID|容器名称}

    删除所有容器

    docker rm $(docker ps -a -q)

    exec

    在运行的容器中执行命令

    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

    OPTIONS说明

    参数解释
    -d 分离模式: 在后台运行
    -i 即使没有附加也保持 STDIN 打开
    -t 分配一个伪终端

    样例

    docker exec -it {容器ID|容器名称} /bin/bash

    容器操作

    ps

    查看正在运行的容器

    docker ps [OPTIONS]

    OPTIONS说明

    参数解释
    -a 显示所有的容器,包括未运行的
    -f 根据条件过滤显示的内容
    --format 指定返回值的模板文件
    -l 显示最近创建的容器
    -n 列出最近创建的n个容器
    --no-trunc 不截断输出
    -q 静默模式,只显示容器编号
    -s 显示总的文件大小

    样例

    docker ps

    CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
    5a0ec27520c6 hub.c.163.com/library/mysql "docker-entrypoint..." 12 seconds ago Up 9 seconds 3306/tcp amazing_ardinghelli

    各个项目说明:

    项目解释
    CONTAINER ID 容器ID
    IMAGE 镜像名称
    COMMAND 命令
    CREATED 容器创建时间
    PORTS 端口
    NAMES 容器名称

    inspect

    获取容器/镜像的元数据

    docker inspect [OPTIONS] NAME|ID [NAME|ID...]

    OPTIONS说明

    参数解释
    -f 指定返回值的模板文件
    -s 显示总的文件大小
    --type 为指定类型返回JSON

    样例

    docker inspect 9e6

    top

    查看容器中运行的进程信息,支持 ps 命令参数

    docker top CONTAINER

    logs

    获取容器的日志

    docker logs [OPTIONS] CONTAINER

    OPTIONS说明

    参数解释
    -f 跟踪日志输出
    --since 显示某个开始时间的所有日志
    -t 显示时间戳
    --tail 仅列出最新N条容器日志

    样例

    docker logs -f 9e6

    Docker 命令

    Docker与宿主机相互拷贝文件:

      docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径      (可相互变化即实现文件的相互拷贝)

    批量删除Docker中已经停止的容器

    方法一:

    #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,

    sudo docker ps -a|grep Exited|awk '{print $1}'

    #查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器

    sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`

    方法二: 

    #删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)

    sudo docker rm $(sudo docker ps -a -q)

    方法三:

    #根据容器的状态,删除Exited状态的容器

    sudo docker rm $(sudo docker ps -qf status=exited)

    方法四:

    #Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。

    sudo docker container prune

  • 相关阅读:
    python检测服务器端口
    nodejs创建文件
    Git:代码冲突常见解决方法
    爬虫常用库介绍
    关于git提示“warning: LF will be replaced by CRLF”终极解答
    linux系统磁盘使用情况
    tkinter拦截关闭事件
    如何在python中调用C语言代码
    spring in action学习笔记十六:配置数据源的几种方式
    spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/12245683.html
Copyright © 2020-2023  润新知