zoukankan      html  css  js  c++  java
  • 虚拟容器化学习----Docker学习

    安装前准备

    • yum install -y yum-utils device-mapper-persistent-data lvm2 安装数据存储驱动包 , 安装yum工具
    • yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 设置安装源
    • yum makecache fast yum自动检测最快安装源

    安装

    yum -y install docker-ce 安装docker开源社区版本

    service docker start 启动docker服务

    检测

    docker version 查看版本信息

    docker pull hello-world 下载docker hello-word

    docker run hello-world

    更换阿里云的镜像加速

    1. 登录阿里云
    2. 搜索镜像加速器
    3. 根据相关操作文档操作即可
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": [加速器地址]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

    Docker是什么

    Docker 是一种CS架构的软件, Docker 是提供应用打包,部署于运行引用的容器平台

    docker 引擎包裹:

    1. docker 引擎
    2. docker REST API
    3. docker CLI

    Docker 使用了HTTP 协议,docker的兼容于拓展很好

    docker 结构

    • 客户端:docker CLI
    • 通信层:REST API
    • 引擎:docker daemon

    容器与镜像

    镜像: 镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的集装箱

    容器: 镜像的实例,由Docker负责创建,容器之间彼此隔离

    docker 容器与镜像在宿主机上的安装路径 /var/lib/docker 除非特殊需要,一般不建议修改默认安装地址

    Docker 常用命令

    • docker pull 镜像名<:tags> - 从远程仓库抽取镜像
      • tags:指定版本类型
    • docker images - 查看本地镜像
    • docker run 镜像名 <:tags> - 创建容器,启动应用
      • 如果在运行run的时候,镜像在没有pull到本地的话docker会先去pull latest 版本的镜像 latest 版本为使用最多的版本
      • tags:指定版本类型
    • docker ps - 查看正在运行中的镜像
    • docker rm <-f> 容器id - 删除容器
      • 如果容器在运行的情况下 <-f> 强制删除
    • docker rmi <-f> 镜像名<:tags> - 删除镜像
      • 如果镜像存在且有容器在运行的情况下 <-f> 强制删除
      • tags:指定版本类型
    • docker stop 容器id - 停止容器
    • docker exec [-it ] 容器id linux 命令...[bash || /bin/bash]
      • exec 在容器内部执行命令
      • -it 使用交互的方式执行命令

    PS

    • hub.docker.com docker 远程中央仓库

    • 在开发中可以使用 -f 强制移除,但是在开发环境中不能这么做,-f 相当于强制关机。

    • docker hub 一般有图片或者镜像名为需要的软件名一般是官方提供的。其他的通常是有第三方或个人提供的。第三方的一般不推荐,除非你对它非常了解

    Docker 宿主机与容器通信

    docker run -p 宿主机端口:容器内部端口 -d 容器名

    • -p 端口映射
    • -d 后台运行

    查看

    容器生命周期

    DockerFile 构建镜像

    什么是Dockerfile

    • DockerFile 是一个包含用于组合镜像的命令的文本文档
    • Docker通过读取Dockerfile中的指定命令按步自动生成镜像
    • docker build -t 机构/镜像名<:tags> Dockerfile 目录

    Docker 的分层(Docker layer)

    docker file 在构建的过程中,每一步都会创建一个临时容器,这个临时容器是只读的,好处:临时容器在使用的时候的好处在于可以共用。

    列如

    1. 构建一个普通的Dockerfile

    2. 对Dockerfile重新进行编辑

    修改完之后重新build,之后输出如下

    它使用了缓存,这里看到没有使用缓存的是由输出的。使用缓存的是没有输出的

    Dockerfile 基础命令

    • FROM 容器版本 基于基准镜像

      • 尽量使用官方提供的BASE Image
      • FROM scratch 不依赖任何基准镜像
    • MAINTAINER 作者 没有运行含义,只是说明名作者

    • LABEL XXX="XXX" 描述性信息

    • WORKDIR 容器目录 切换工作目录 , 如果当前目录不存在的时候,会自动创建这个目录

      • 这个目录是通过我们的docker exec -it 进程号 bash 进入来的

    • 尽量使用绝对路径

    • ADD 宿主机目录 容器目录 将宿主机的目录全部复制到容器目录中

      • ADD xxx.gz / 添加根目录并解压缩
      • ADD 除了复制,还具备添加远程文件功能
    • ENV XXX /XXX/XXX 设置环境常量

      • ENV JAVA_HOME /usr/local/openjdk8
      • RUN ${JAVA_HOME}/bin/java -jar XXX.jar
      • 尽量使用环境常量,可提高程序的维护性
    • RUN&&CMD&&ENTRYPOINT

      • RUN 在构建镜像时执行命令(修改镜像内部的文件)
      • CMD|ENTRYPOINT 在容器创建时执行命令(对容器中的文件进行操作)

    RUN 构建时运行

    • 命令格式 RUN yum install -y vim # Shell
    • 命令格式 RUN ["yum","install","-y","vim"] #Exec
      • 在分不清的情况下推荐使用

    Shell 运行方式

    1. 使用Shell执行时,当前shell 时父进程,生成一个子shell进程
    2. 在子shell中执行脚本,脚本执行完毕,退出子shell进程,回到当前shell

    Exec 运行方式

    1. 使用Exec方式,会用Exec进程替换当前进程,并保持PID不变
    2. 执行完毕,直接退出,并不会退回之前的进程环境

    ENTRYPOINT 启动命令

    • ENTRYPOINT (入口点) 用于在容器启动时执行命令
    • Dockerfile中只有最后一个ENTRYPOINT会被执行
    • 推荐使用Exec格式

    CMD 默认命令

    • CMD 用于设置默认执行的命令
      • 如Dockerfile中出现多个CMD,则只有最后一个被执行
      • 如容器启动时附加指令,则CMD被忽略
      • 推荐使用Exec命令格式
      • 若容器启动时有其他的参数,CMD 将不会执行

    当我们使用下面这种情况启动容器时CMD将不会被执行,这里可以配合ENTRYPOINT一起使用。

    Dockerfile 使用例子

    使用Dockerfile 构建redis

    FROM centos
    # 安装C编译组件
    RUN ["yum","install","-y","gcc","gcc-c++","net-tools","make"]
    WORKDIR /usr/local
    ADD redis-5.0.5.tar.gz .
    WORKDIR /usr/local/redis-5.0.5/src
    RUN make && make install
    WORKDIR /usr/local/redis-5.0.5
    ADD redis.conf .
    EXPOSE 6379
    CMD ["redis-server","redis.conf"]
    
    • 构建镜像

    docker build -t xxx/xxx:1.0 .

    • 启动容器

    docker run -p 7000:6379 xxx/xxx:1.0

    容器间的单向访问

    docker 内部每个容器都会有一个虚拟ip

    docker inspect id 显示容器的原数据

    ip放再netSetting中。

    在容器间通信的时候不能使用ip进行通信,这个虚拟ip会变动的。

    这时我们可以通过对容器取个名字

    docker run -d --name xxx 镜像

    在没有配置的情况下,ip默认时互通的,但是别名时无法访问得

    若要能使用别名访问需要在启动的时候添加额外的参数

    docker run -d --name xxx --link 别名 镜像名

    Bridge 网桥双向通信

    docker 环境下的网桥能够直接链接到宿主机的物理网卡上,配置了网桥后,容器内部可以直接访问到公网上的数据了。

    网桥还可以实现docker容器网络上的分组,只要绑定在同一个网桥上,这是容器在网络层面进行了分组。在同一个网桥上,天然互通。

    • docker network ls :列出docker网络服务
    • docker network create -d bridge 网桥名称 创建网桥
    • docker network connect 网桥名称 容器名称 容器与网桥绑定

    Volume 容器间数据共享

    在宿主机上开个空间,所有容器可以读取这个空间上的文件

    1. 通过设置-v挂在宿主机目录

      docker run --name 容器名 —v 宿主机路径:容器内挂在路径 镜像名

    2. 通过--volumes-from 共享容器内挂载点

      1. 创建共享容器docker create --name 共享容器名 -v /xx/xx:/xx/xx 镜镜像名 /bin/true
      2. 共享容器挂载点 docker run --volumes-from 共享容器名 --name xxx -d 镜像名

    DockerCompose容器编排

    docker 官方为我们提供的容器编排工具时docker compose

    我们可以使用docker compose对一组容器进行编排,让他们有顺序的创建。有顺序的启动。

    • Docker Compose 单机多容器部署工具
    • 通过yml文件定义多容器如何部署
    • WIN/MAC 默认提供Docker Compose, Linux 需要安装

    安装

    由于是github 所以下载会比较慢

    https://docs.docker.com/compose/install/

    安装后若出现

    Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/doc

    这种情况的问题则是版本不对,需要去官网下载对应版本的docker-compose然后手动替换掉

    docker-compose官网:https://github.com/docker/compose/releases/

    /usr/local/bin/ 路径下的docker-compose 删除

    重新上传正确版本的docker-compose

    授权chmod +x /usr/local/bin/docker-compose

    因为正式环境下使用的比较少,一般不使用这个,所以这里我不打算研究了

  • 相关阅读:
    ssh事务配置
    使用注解实现事务处理
    c3p0、dbcp<转>
    添加业务层和事务机制
    使用spring集成hibernate
    使用Adivisor配置增强处理
    aop注解
    Spring IoC实现解耦合
    python console的命令执行
    python格式化输出
  • 原文地址:https://www.cnblogs.com/bananafish/p/13386185.html
Copyright © 2011-2022 走看看