• Docker快速入门


    1.参考资料

    官方文档:https://docs.docker.com/docker-for-windows/
    仓库地址:https://hub.docker.com/

    2.Docker 的安装

    2.1.docker的组成部分

    image-20210819174532504

    1. 镜像(image):docker镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器,类似java中的Class

    2. 容器(container):类似java中通过Class创建的实例;容器可以理解为一个简易的linux系统

    3. 仓库(repository):存放镜像的地方,

      分为共有仓库和私有仓库

      • Docker Hub:国外的

      • 阿里云:配置镜像加速

    2.2.环境准备

    我们要有一台服务器,并且可以操作它

    1. Linux命令基础

    2. CentOS 7

    3. 使用Xshell链接远程服务器(免费版即可)

      image-20210819175245515

    2.3. 安装docker

    https://docs.docker.com/engine/install/centos/
    卸载旧的版本

    $ 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
    

    image-20210903152542051

    设置镜像的仓库

    $ sudo yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
        
    $ sudo yum-config-manager 
        --add-repo 
        https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云镜像
    

    安装docker引擎

    yum makecache fast
    

    安装docker引擎

    yum install docker-ce docker-ce-cli containerd.io # docker-ce 社区版 ee 企业版
    

    CentOS 8中安装Docker出现和Podman冲突

    yum erase podman buildah
    

    继续执行安装即可

    image-20210820141207869

    image-20210819182217338

    2.4.启动docker

    systemctl start docker # 代表启动成功
    

    image-20210819182453373

    docker version
    

    image-20210819182627553

    docker run hello-world
    

    image-20210819183126098

    docker images
    

    image-20210819183003591

    2.5.卸载Docker

    # 卸载依赖
    yum remove docker-ce docker-ce-cli containerd.io
    # 删除资源
    rm -rf /var/lib/docker # docker 的默认工作路径
    

    3.docker 常用命令

    以上已经用到了一些相关命名下面整体介绍一下。

    命令参考地址:

    https://docs.docker.com/engine/reference/commandline/docker/

    image-20210820142951687

    3.1. 全局命令

    docker version # 显示docker的基本信息
    docker info # 系统信息,镜像和容器的数量
    docker 命令 --help # 全部信息
    

    3.2.镜像命令

    3.2.1.docker images

    docker images # 查看所有本地主机上的镜像
    --all , -a		Show all images (default hides intermediate images) # 显示所有
    --digests		Show digests
    --filter , -f		Filter output based on conditions provided
    --format		Pretty-print images using a Go template
    --no-trunc		Don’t truncate output
    --quiet , -q		Only show numeric IDs # 只显示id
    

    image-20210820143814479

    -f, --filter filter   Filter output based on conditions provided
          --format string   Pretty-print search using a Go template
          --limit int       Max number of search results (default 25)
          --no-trunc        Don't truncate output
    

    image-20210820143959955

    3.2.3.docker pull

    docker pull mysql # 下载mysql镜像,default tag,默认最新版latest
    

    image-20210820144647100

    # 指定版本下载 
    docker pull mysql:5.7
    

    分层下载的好处是:不同的版本相同的部分不用重新下载。

    3.2.4. docker rmi

    # 删除一个 可以通过名称 也可以指定id -f表示删除所有
    docker rmi -f d1165f221234
    # 删除多个 用空格分隔id
    docker rmi -f id id id
    # 删除所有 
    docker rmi -f $(docker images -aq) # images -aq就是查所有镜像id,从而递归删除
    

    3.2.容器命令

    有了镜像才能创建容器,linux,下载一个centos镜像来测试学习

    3.2.1.新建容器并启动

    docker run [可选参数] image
    # 参数说明
    # --name=“Name” # 容器名字,用于区分容器
    # -it 使用交互方式运行,进入容器查看内容
    # -d 后台运行
    # -p 端口映射 主机端口::容器端口
    # -v 卷挂载
    # -e 配置
    
    # docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
    
    

    image-20210904182919157

    3.2.2.进入容器

    docker exec -it 1de87c606832 /bin/bash
    

    image-20210904184742854

    # docker attach 1de87c606832
    

    区别
    docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
    docker attach 进入容器正在执行的终端,不会启动新的进程

    # 查看目录
    ls
    

    image-20210904184829645

    3.2.3.查看容器

    # 查看正在运行的容器
    docker ps
    # 查看曾经运行的容器
    docker ps -a
    # 显示最近创建的容器,设置显示个数
    docker ps -a - n=? 
    # 只显示容器的编号
    docker ps -aq
    

    image-20210904184911149

    3.2.4.退出容器

    # 容器停止退出
    exit
    # 容器不停止退出 注意必须在英文输入法下,中文输入法不行
    Ctrl + P + Q
    

    3.2.5.删除容器

    # 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f
    docker rm 容器id
    # 删除所有容器
    docker rm -f $(docker ps -aq)
    # 删除所有容器
    docker ps -a -q|xargs docker rm
    

    3.2.6.导入导出

    docker export $CONTAINER_ID > ubuntu.tar
    

    image-20210904191302799

    $ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
    

    3.2.7.自动重启

    docker run --restart=always 容器id(或者容器名称)
    #no - container:不重启
    #on-failure - container:退出状态非0时重启
    #always:始终重启
    docker update --restart=always  容器id(或者容器名称)
    

    3.2.8.相关状态

    docker start $CONTAINER_ID
    docker restart $CONTAINER_ID
    docker stop $CONTAINER_ID
    docker kill $CONTAINER_ID
    

    3.3.常用其他命令

    3.3.1.后台启动docker

    docker run -d 镜像名
    # 用docker ps 查看的时候 发现停止了
    
    # 后台运行,docker发现前台没有,容器启动后,发现自己没有提供服务,会立刻停止
    

    3.3.2.查看日志

    docker logs
    docker logs -f --tail=20  $CONTAINER_ID #查看最新20行
    

    image-20210903164046849

    3.3.3.查看容器信息

    docker inspect $CONTAINER_ID 
    

    image-20210903162732212

    3.3.4.文件copy

    容器copy 到主机

    docker cp $CONTAINER_ID:路径 空格 主机路径
    
    docker cp 83b0be074d94:/etc/mysql /home
    

    主机copy 到容器

    docker cp 主机路径 空格 $CONTAINER_ID:路径
    

    后面我们会遇到

    3.3.5.任务管理器

    docker stats
    

    image-20210903170459968

    4.容器数据卷

    在Docker中,要想实现数据的持久化,数据就不应该在容器中,否则容器删除,数据就会丢失。故容器之间要有一个数据共享技术,把Docker容器中产生的数据,同步到本地,这就是卷技术。

    优点

    1. 容器的持久化和同步操作

    2. 容器间可以数据共享

    image-20210903171643089

    4.1.使用数据卷

    目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:

      (1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)

    img(2)bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式)

      但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

      (3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)

    img

    4.1.1.命令挂载

    docker run -it -v -p  /宿主机绝对路径:/容器内目录:权限   镜像名
    # -it 交互式进入
    # -v volume卷技术
    # -p 主机端口
    
    # 挂载
    docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
    
    -d 后台运行
    -p 端口映射
    -v 卷挂载
    -e 环境配置 安装启动mysql需要配置密码
    --name 容器名字
    

    主机目录/home/mysql/conf与/etc/mysql/conf容器目录同步。

    查看其信息

    image-20210903172302584

    soruce:主机地址

    destination:容器地址

    4.1.2.匿名与具名挂载

    匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径。

    # -v 容器内路径
    docker run -d -P --name nginx01 -v /etc/nginx nginx
    

    具名挂载:就是挂载的卷陪一个自己的名字,可以方便的查找

    # -v 卷名:/容器内路径
    docker run -d -P --name nginx01 -v wyl-nginx:/etc/nginx nginx
    

    image-20210905000343906

    docker inspect 6d4a76d84a35
    

    image-20210905000512455

    4.1.3.查看卷信息

    docker volume inspect wyl-nginx
    

    image-20210905000602511

    4.1.4.改变文件的读写权限

    # ro: readonly
    # rw: readwrite
    # 指定容器对我们挂载出来的内容的读写权限
    docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:ro nginx
    docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:rw nginx
    

    4.2.查看所有的数据卷

    docker volume ls
    

    image-20210905001800959

    4.3.共享卷

    docker run -it --name nginx03 --volumes-from nginx02 nginx:latest
    

    nginx03继承nginx02的volumes

    可以验证,在nginx02下加一个数据,在nginx03下也会出现

    删除容器共享文件不会删除。

    5.dockerFile

    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

    5.1.命令

    FROM # 基础镜像 比如centos
    MAINTAINER # 镜像是谁写的 姓名+邮箱
    RUN # 镜像构建时需要运行的命令
    ADD # 添加,比如添加一个tomcat压缩包
    WORKDIR # 镜像的工作目录
    VOLUME # 挂载的目录
    EXPOSE # 指定暴露端口,跟-p一个道理
    RUN # 最终要运行的
    CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,而且可被替代
    ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
    ONBUILD # 当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令
    COPY # 将文件拷贝到镜像中
    ENV # 构建的时候设置环境变量
    

    image-20210904192846385

    5.2.创建centos

    5.2.1.创建dockerfile

    # 进入home目录
    cd /home
    
    # 创建一个目录,之后的东西都保存到这里
    mkdir dockerfile
    # 进入这个目录
    cd dockerfile/
    # 创建一个dockerfile,名字叫mydockerfile
    vim mydockerfile-centos
    
    FROM centos
    MAINTAINER wyl<1714404171@qq.com>
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 8088
    
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash
    

    image-20210904195608613

    5.2.2.docker build

    cd /home/docerfile
    docker build -t mycentos -f mydockerfile-centos .
    

    后面的不要忘记

    image-20210904205531218

    image-20210904205704837

    6.Docker Compose

    前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知.对此我们就可以来学习一下docker compose

    它是一个用于定义和运行多容器 Docker 的应用程序工具

    6.1. compose安装

    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    or
    sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    

    image-20210904212608930

    pip安装

    sudo pip install docker-compose
    

    6.2.权限

    sudo chmod +x /usr/local/bin/docker-compose
    

    image-20210904225302027

    6.3.Compose 使用

    三个步骤:

    • 使用 Dockerfile 定义应用程序的环境。

      FROM java:8
      VOLUME /tmp
      ADD docker-demo.jar app.jar
      RUN bash -c 'touch /app.jar'
      EXPOSE 9000
      ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
      
    • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

      Compose和Docker兼容性:
          Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
          目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
      
      常用参数:
          version           # 指定 compose 文件的版本
          services          # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
      
              build                 # 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
                  context               # context: 指定 Dockerfile 文件所在的路径
                  dockerfile            # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
                  args                  # args: Dockerfile 在 build 过程中需要的参数 (等同于 docker container build --build-arg 的作用)
                  cache_from            # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
                  labels                # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用)
                  shm_size              # v3.5中新增的参数, 设置容器 /dev/shm 分区的大小 (等同于 docker container build --shm-size 的作用)
      
              command               # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式
      
              configs               # 
      
              cgroup_parent         # 
      
              container_name        # 指定容器的名称 (等同于 docker run --name 的作用)
      
              credential_spec       # 
      
              deploy                # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm
                  endpoint_mode         # v3.3 版本中新增的功能, 指定服务暴露的方式
                      vip                   # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
                      dnsrr                 # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
                  labels                # 指定服务的标签,这些标签仅在服务上设置
                  mode                  # 指定 deploy 的模式
                      global                # 每个集群节点都只有一个容器
                      replicated            # 用户可以指定集群中容器的数量(默认)
                  placement             # 
                  replicas              # deploy 的 mode 为 replicated 时, 指定容器副本的数量
                  resources             # 资源限制
                      limits                # 设置容器的资源限制
                          cpus: "0.5"           # 设置该容器最多只能使用 50% 的 CPU 
                          memory: 50M           # 设置该容器最多只能使用 50M 的内存空间 
                      reservations          # 设置为容器预留的系统资源(随时可用)
                          cpus: "0.2"           # 为该容器保留 20% 的 CPU
                          memory: 20M           # 为该容器保留 20M 的内存空间
                  restart_policy        # 定义容器重启策略, 用于代替 restart 参数
                      condition             # 定义容器重启策略(接受三个参数)
                          none                  # 不尝试重启
                          on-failure            # 只有当容器内部应用程序出现问题才会重启
                          any                   # 无论如何都会尝试重启(默认)
                      delay                 # 尝试重启的间隔时间(默认为 0s)
                      max_attempts          # 尝试重启次数(默认一直尝试重启)
                      window                # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s)
                  update_config         # 用于配置滚动更新配置
                      parallelism           # 一次性更新的容器数量
                      delay                 # 更新一组容器之间的间隔时间
                      failure_action        # 定义更新失败的策略
                          continue              # 继续更新
                          rollback              # 回滚更新
                          pause                 # 暂停更新(默认)
                      monitor               # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0)
                      max_failure_ratio     # 回滚期间容忍的失败率(默认值为0)
                      order                 # v3.4 版本中新增的参数, 回滚期间的操作顺序
                          stop-first            #旧任务在启动新任务之前停止(默认)
                          start-first           #首先启动新任务, 并且正在运行的任务暂时重叠
                  rollback_config       # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略
                      parallelism           # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚
                      delay                 # 每个组回滚之间的时间间隔(默认为0)
                      failure_action        # 定义回滚失败的策略
                          continue              # 继续回滚
                          pause                 # 暂停回滚
                      monitor               # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0)
                      max_failure_ratio     # 回滚期间容忍的失败率(默认值0)
                      order                 # 回滚期间的操作顺序
                          stop-first            # 旧任务在启动新任务之前停止(默认)
                          start-first           # 首先启动新任务, 并且正在运行的任务暂时重叠
      
                  注意:
                      支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子选项
                      security_opt  container_name  devices  tmpfs  stop_signal  links    cgroup_parent
                      network_mode  external_links  restart  build  userns_mode  sysctls
      
              devices               # 指定设备映射列表 (等同于 docker run --device 的作用)
      
              depends_on            # 定义容器启动顺序 (此选项解决了容器之间的依赖关系, 此选项在 v3 版本中 使用 swarm 部署时将忽略该选项)
      
    • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

      docker-compose up
      docker-compose up -d  // 后台启动并运行容器
      

      6.3.卸载

    # pip卸载
    pip uninstall docker-compose
    

    6.4.常用命令

    image-20210904231917066

    7.docker network

    默认情况下容器与容器、容器与宿主机的网络是隔离开来的,

    当你安装docker的时候,docker会创建一个桥接器docker0,通过它才让容器与容器、容器与宿主机之间通信。

    Docker安装的时候默认会创建三个不同的网络,你可以通过命令查看这些网络。

    docker network ls
    

    image-20210905204545744

    #帮助命令后显示下面信息
    [root@vultrguest ~]# docker network --help
    
    Usage:	docker network COMMAND
    
    Manage networks
    
    Options:
          --help   Print usage
    
    Commands:
        connect 将某个容器连接到一个docker网络
        create 创建一个docker局域网络
        disconnect 将某个容器退出某个局域网络
        inspect 显示某个局域网络信息
        ls 显示所有docker局域网络
        prune 删除所有未引用的docker局域网络
        rm 删除docker网络
    
    Run 'docker network COMMAND --help' for more information on a command.
    

    7.1.默认网络

    7.1.1.None Network

    网络模式为none的,即不会为容器创建任何的网络环境。

    一旦Docker Container采用了none网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。

    7.1.2.Host Network

    如果你在创建容器的时候使用--network=host选项,那么容器会使用宿主机的网络,容器与宿主机的网络并没有隔离。

    使用这种网络类型的好处就是网络性能很好,基本上跟宿主机的网络一样,它很大的弊端就是不安全

    你可以在容器中更改宿主机的网络,如果你的程序是用root用户运行的,有可能会通过Docker容器来控制宿主机的网络。

    当我们在容器中执行类似ifconfig命令查看网络环境是,看到的都是宿主机上的信息。

    7.1.3.Bridge Network

    桥接网络是默认的网络类型,我们可以使用下面的命令来查看默认的网络配置信息。

    这儿桥接的网络名为docker0。当我们启动一个容器的时候,每个容器会有它自己的虚拟网络接口连接到docker0,并获得一个IP地址。

    image-20210905205007741

    7.2.自定义网络

    7.2.1创建网络

    docker network create mynet
    

    image-20210905205325275

    7.2.2.把容器加入局域网

    #运行redis容器
    docker run -itd --name redis  --network mynet --network-alias redis -p 6379:6379 redis
    #运行nginx容器
    docker run -d --name nginx -p 8081:8081 --network mynet --network-alias nginx --privileged=true   -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs  nginx
    
    

    image-20210905205748631

    7.2.3.查看mynet 信息

    image-20210905205917495

    7.2.4.docker network connect

    也可以不指定网络,直接启动容器,然后使用docker network connect接入网络

    docker network connect mynet nginx
    docker network connect mynet redis
    

    7.2.5.移除局域网

    docker network disconnect mynet nginx
    
  • 相关阅读:
    Json Web Token
    logstash 收集 IIS 日志实践
    Lucene Query In Kibana
    autofac 在.net core 与经典asp.net中的差异
    .net core 集成 autofac.
    向量化
    神经网络学习1
    漏斗限流
    正则化(Regularization)
    简单限流
  • 原文地址:https://www.cnblogs.com/wyl1924/p/15228289.html
Copyright © 2020-2023  润新知