• Docker学习笔记-概念和常见命令


    Docker架构

    Docker包括三个基本概念:

    镜像(image):docker镜像就相当于一个root文件系统。比如:官方镜像ubuntu16.04就包含了完整的一套ubuntu16.04最小系统的root文件系统。

    容器(container):镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行的实体。容器可以被创建、启动、停止、删除、暂停等。

    仓库(Repository):仓库可以看成一个代码控制中心,用来保存镜像。

    docker使用客户端-服务端(C/S)架构模式,使用远程API来管理和创建Docker容器。

    docker容器通过docker镜像来创建。

    Docker安装

    ubuntu下按照docker软件

    官方安装脚本自动安装:

    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    curl -sSL https://get.daocloud.io/docker | sh
    
    • 1
    • 2

    国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。

    Docker使用

    docker hello world

    runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
    Hello world
    
    • 1
    • 2

    docker:Docker的二进制执行文件

    run:与前面的docker组合来运行一个容器

    ubuntu:15.10 指定要运行的镜像,docker首先从本地主机上查找镜像是否存在,不存在,docker就会从镜像仓库docker hub下载公共镜像。

    /bin/echo “hello world”:在启动的容器里执行的命令

    Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

    运行交互式的容器

    runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
    root@0123ce188bd8:/#
    
    • 1
    • 2

    -t:在新容器内指定一个伪终端或终端。

    -i:允许你对容器内的标准输入进行交互。

    exit或者ctrl+d 退出容器

    启动容器(后台模式)

    -d:后台运行模式 docker run -d

    runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63  #容器id  唯一的
    
    • 1
    • 2

    查看是否有容器运行:docker ps

    runoob@runoob:~$ docker ps  # 查看容器运行
    CONTAINER ID        IMAGE                  COMMAND              ...  
    5917eac21c36        ubuntu:15.10           "/bin/sh -c 'while t…"    ...
    
    • 1
    • 2
    • 3

    STATUS: 容器状态。

    状态有7种:

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

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

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

    查看容器内的标准输出 docker logs

    runoob@runoob:~$ docker logs 2b1b7a428627  # 容器id  12个字节
    runoob@runoob:~$ docker logs amazing_cori  # 容器名称
    
    • 1
    • 2

    停止容器 docker stop

    runoob@runoob:~$ docker stop 2b1b7a428627  # 容器id  12个字节
    runoob@runoob:~$ docker stop amazing_cori  # 容器名称
    
    • 1
    • 2

    Docker容器使用

    获取镜像:docker pull ubuntu

    启动容器:docker run -it ubuntu /bin/bash

    退出容器终端:exit

    启动已停止运行的容器: docker ps -a

    ​ docker start b750bbbcfd88 (容器的id)

    后台运行: -d指定运行模式,参数默认不会进入容器

    ​ docker run -itd --name ubuntu-test ubuntu /bin/bash

    停止的容器启动: docker start 《id、名字》

    停止一个容器: docker stop <容器 ID>

    正在运行的容器重启: docker restart <容器 ID>

    进入容器: docker attach(不推荐使用,用了exit,退出容器会停止容器)

    ​ docker exec (推荐使用,退出容器终端不会导致容器停止)

    导出容器: docker export 容器 ID > xxx.tar

    ​ docker export 1e560fca3906 > ubuntu.tar

    导入容器: docker import 从容器快照文件中再导入为镜像

    ​ docker/ubuntu.tar | docker import - test/ubuntu:v1 #v1是版本号

    ​ docker import http://example.com/exampleimage.tgz example/imagerepo #通过指定 URL 或者某个目录来导入

    删除容器: docker rm -f 1e560fca3906

    ​ docker container prune # 清理所有处于终止状态的容器

    运行一个web应用:

    runoob@runoob:~# docker pull training/webapp  # 载入镜像
    runoob@runoob:~# docker run -d -P training/webapp python app.py
    
    • 1
    • 2

    -d: 后台运行 -P:将容器内部使用的网络端口随机映射到我们使用的主机上

    runoob@runoob:~#  docker ps
    CONTAINER ID        IMAGE               COMMAND             ...        PORTS                 
    d3d5e39ed9d3        training/webapp     "python app.py"     ...        0.0.0.0:32769->5000/tcp
    
    • 1
    • 2
    • 3

    docker容器开了5000端口,映射到主机端口的32769上

    通过 -p参数设置不一样的端口(5000:5000)

    runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py
    
    • 1

    容器内部的 5000 端口映射到我们本地主机的 5000 端口上

    runoob@runoob:~#  docker ps
    CONTAINER ID        IMAGE                             PORTS                     NAMES
    bf08b7f2cd89        training/webapp     ...        0.0.0.0:5000->5000/tcp    wizardly_chandrasekhar
    d3d5e39ed9d3        training/webapp     ...        0.0.0.0:32769->5000/tcp   xenodochial_hoov
    
    • 1
    • 2
    • 3
    • 4

    快捷查看网络端口: docker port bf08b7f2cd89

    ​ docker port wizardly_chandrasekhar

    查看容器内部标准输出: docker logs -f bf08b7f2cd89

    查看容器内部运行的进程: docker top wizardly_chandrasekhar

    查看docker的底层信息: docker inspect wizardly_chandrasekhar #记录着 Docker 容器的配置和状态信息

    移除一个容器: docker rm (id\name) #容器必须是处于停止状态下

    ps:解决docker权限问题,选择方法2。

    方法1: 使用sudo获取管理员权限,运行docker命令

    方法2: 创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket

    sudo groupadd docker     #添加docker用户组
    sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
    newgrp docker     #更新用户组
    docker ps    #测试docker命令是否可以使用sudo正常使用
    
    • 1
    • 2
    • 3
    • 4

    Docker镜像使用

    管理和使用本地docker主机的镜像

    列出镜像列表:docker images

    如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

    获取新镜像: docker pull ubuntu:13.10

    查找镜像: docker search httpd ( https://hub.docker.com/ 网站查找)

    删除镜像: docker rmi hello-world

    https://www.runoob.com/docker/docker-image-usage.html

    创建镜像

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

      (可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)

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

    创建dockerfile文件,包含一组指令告诉docker如何构建我们的镜像

    每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

    第一条FROM,指定使用哪个镜像源

    RUN 指令告诉docker 在镜像内执行命令,安装了什么

    runoob@runoob:~$ cat Dockerfile 
    FROM    centos:6.7
    MAINTAINER      Fisher "fisher@sudops.com"
    
    RUN     /bin/echo 'root:123456' |chpasswd
    RUN     useradd runoob
    RUN     /bin/echo 'runoob:123456' |chpasswd
    RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
    EXPOSE  22
    EXPOSE  80
    CMD     /usr/sbin/sshd -D
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    RUN 指令告诉docker 在镜像内执行命令,安装了什么

    runoob@runoob:~$ docker build -t runoob/centos:6.7 .
    
    • 1
    • -t :指定要创建的目标镜像名
    • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

    (所有者、所属组和其他人)

    设置镜像标签

    docker tag添加一个新的标签

    runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev
    
    • 1

    容器连接

    #  默认是tcp
    runoob@runoob:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
    95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
    #  指定是udp端口
    runoob@runoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
    6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
    runoob@runoob:~$ docker ps
    CONTAINER ID        IMAGE               COMMAND           ...   PORTS                                NAMES
    6779686f06f6        training/webapp     "python app.py"   ...   5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
    95c6ceef88ca        training/webapp     "python app.py"   ...    5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
    33e4523d30aa        training/webapp     "python app.py"   ...     0.0.0.0:5000->5000/tcp               berserk_bartik
    fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    查看绑定情况

    runoob@runoob:~$ docker port adoring_stonebraker 5000
    127.0.0.1:5001
    
    • 1
    • 2

    容器命名: 使用 –name 标识来命名容器

    runoob@runoob:~$  docker run -d -P --name runoob training/webapp python app.py
    43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
    
    • 1
    • 2

    新建网络

    创建新docker网络

    $ docker network create -d bridge test-net
    
    • 1

    docker network ls ---------查看docker网络

    -d:参数指定 Docker 网络类型,有 bridge、overlay。

    其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。

    运行一个容器并连接到新建的 test-net 网络:

    $ docker run -itd --name test1 --network test-net ubuntu /bin/bash
    $ docker run -itd --name test2 --network test-net ubuntu /bin/bash
    
    • 1
    • 2

    运行了两个容器,test1和test2.

    下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

    $ ping test1
    $ ping test2
    
    • 1
    • 2

    DNS:域名系统

    仓库管理

    仓库(Repository)是集中存放镜像的地方。

    https://hub.docker.com 免费注册一个 Docker 账号。

    登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。

    $ docker login
    $ docker logout
    
    • 1
    • 2

    用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。

    以下命令中的 username 请替换为你的 Docker 账号用户名。

    $ docker tag ubuntu:18.04 username/ubuntu:18.04
    $ docker image ls
    
    REPOSITORY      TAG        IMAGE ID            CREATED           ...  
    ubuntu          18.04      275d79972a86        6 days ago        ...  
    username/ubuntu 18.04      275d79972a86        6 days ago        ...  
    $ docker push username/ubuntu:18.04
    $ docker search username/ubuntu
    
    NAME             DESCRIPTION       STARS         OFFICIAL    AUTOMATED
    username/ubuntu
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    DockerFile

    注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

    FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

    RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

    shell 格式:

    RUN <命令行命令>
    # <命令行命令> 等同于,在终端操作的 shell 命令。
    
    • 1
    • 2

    exec 格式:

    RUN ["可执行文件", "参数1", "参数2"]
    # 例如:
    # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
    
    • 1
    • 2
    • 3

    注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

    FROM centos

    RUN yum -y install wget
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    RUN tar -xvf redis.tar.gz
    
    • 1
    • 2
    • 3

    以上执行会创建 3 层镜像。可简化为以下格式:

    FROM centos
    RUN yum -y install wget \
      && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
      && tar -xvf redis.tar.gz
    
    • 1
    • 2
    • 3
    • 4

    指令详解

    copy

    从上下文目录中复制文件或者目录到容器里指定路径。

    COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
    COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
    
    • 1
    • 2

    [–chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。

    <源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

    COPY hom* /mydir/
    COPY hom?.txt /mydir/
    
    • 1
    • 2

    <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

    ADD

    ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY

    • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
    • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

    CMD

    类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

    • CMD 在docker run 时运行。
    • RUN 是在 docker build。
    CMD ["<可执行文件或命令>","","",...] 
    
    • 1
    • FROM- 镜像从那里来

    • MAINTAINER- 镜像维护者信息

    • RUN- 构建镜像执行的命令,每一次RUN都会构建一层

    • CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数

    • VOLUME- 定义数据卷,如果没有定义则使用默认

    • USER- 指定后续执行的用户组和用户

    • WORKDIR- 切换当前执行的工作目录

    • HEALTHCHECH- 健康检测指令

    • ARG- 变量属性值,但不在容器内部起作用

    • EXPOSE- 暴露端口

    • ENV- 变量属性值,容器内部也会起作用

    • ADD- 添加文件,如果是压缩文件也解压

    • COPY- 添加文件,以复制的形式

    • ENTRYPOINT- 容器进入时执行的命令

  • 相关阅读:
    2022-08-13 达梦创建实例与用户密码过短
    基于Gin框架的HTTP接口限速实践
    【从零开始学微服务】01.微服务的过去与现在
    卷积神经网络特征融合,两个神经网络同时训练
    项目的关闭与重启
    SELinux零知识学习十九、SELinux策略语言之类型强制(4)
    Leetcode 381. Insert Delete GetRandom O(1) - Duplicates allowed (数据结构设计好题)
    java基于springboot+jsp鲜活农产品销售商城系统
    RabbitMQ坑大全
    makefile 中命令包及eval的使用
  • 原文地址:https://blog.csdn.net/xuan196/article/details/126003413