zoukankan      html  css  js  c++  java
  • docker

    Docker

    当你发现自己的才华撑不起你的野心是,你就应该静下心来学习了

    1. 概念

    Docker是Docker.inc公司开源的一个基于轻量级虚拟化技术的容器引擎项目.整个项目基于GO语言开发,通过分层镜像标准化和内核虚拟化技术,Docker使得开发者和运维工程师可以以统一的方式跨平台发布应用,并以几乎没有额外开销的情况下提供资源隔离的应用运行环境

    轻量级虚拟机

    ​ 每个容器共享宿主主机的内核 秒级启动

    传统虚拟机

    ​ 每台虚拟机拥有一个独立的内核 分钟级别

    1.1 容器和VM的区别

    • 容器提供了基于进程的隔离,
    • 虚拟机提供了资源的完全隔离
    • 虚拟机启动时间长,容器秒启动
    • docker使用的是宿主机的内核
    • 虚拟机使用的独立的内核
    • docker只能在64位的操作系统上运行

    1.2 Docker三大核心组件

    • Docker 镜像 - Docker images
    • Docker 仓库 - Docker registeries
    • Docker 容器 - Docker containers

    仓库(registry) --> Repository --> 镜像(按版本区分)

    yum库 --> 不容repo --> 软件(按名称区分)

    docker仓库:

    ​ 共有 docker.io

    国内:

    ​ ali / 网易蜂巢 / daocloud

    1.3 配置daocloud (可选可不选)

    配置daocloud国内docker镜像选配

    1. 添加daocloud镜像

    2. 添加一个主机!

    3. 按照提示配置

    1.4 run的运行原理

    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    
    

    1.5 Docker是怎么工作的

    docker是一个cs结构的系统,docker守护进程运行在主机上,然后通过socket连接从客户端访问,客户端接收命令并管理运行在主机上的寄存器, 容器,是一个运行时环境,就是一个集装箱

    2. Docker容器数据卷

    主要就是做数据持久化和数据共享,容器关闭后数据还可以继续使用

    2.1. 命令添加

    docker run -it -v /宿主机绝对路径目录:/容器内部目录 镜像名
    #例子:
    docker run -it -v /myDataVolume:/dataVolumeContainer ubuntu
    
    docker inspect containerid #以json的方式查看docker信息
    
    docker attach containerId #重新进入容器
    
    # 带权限的命令
    docker run -it -v /宿主绝对路径:/容器内目录:ro 镜像名 # :ro 只读命令
    

    2.2. Dockerfile

    vim /docker/Dockerfile
    _______________________________________________________
    # volume test
    FROM ubuntu
    #VOLUME 用来给镜像添加一个或者多个数据卷 
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished,-------success1"
    CMD /bin/bash
    ________________________________________________________
    
    docker build /docker/Dockerfile wang/ubuntu . #生成新的容器
    docker run -it wang/ubuntu /bin/bash # 创建并进入容器
    #如果不指定主机的映射地址默认会在下面路径下
    /var/lib/docker/volumes/8cfc9db73a5f24151e2501b594a95a4801e14db76b74c8d69ef4411c6e728914/_data
    

    2.3. 数据卷容器

    1. 命名的容器挂载数据卷,其它容器通过挂载这个父容器实现数据共享,挂载数据卷的容器称为数据卷容器

    2. 容器间传递共享(volumes-from)

      1. docker run -it --name dc02 --volumes-from dc01 wang/ubuntu   #dc02继承dc01
        
      2. 容器间配置信息的传递,数据卷的生命周期一直持续到没有容器为止

    3. Dockerfile

    3.1 是什么

    • Dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
    • 构建三步骤: 1.编写dockerfile文件 2. docker build 3. docker run

    dockerfile文件源码

    FROM scratch # 类似于java中的obejct 源镜像
    ADD centos-7-x86_64-docker.tar.xz /
    # 说明
    LABEL org.label-schema.schema-version="1.0" 
        org.label-schema.name="CentOS Base Image" 
        org.label-schema.vendor="CentOS" 
        org.label-schema.license="GPLv2" 
        org.label-schema.build-date="20191001"
    # 命令
    CMD ["/bin/bash"]
    

    3.2 Dockerfile 构建过程

    3.2.1 dockerfile基础知识

    1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
    2. 指令按照从上到下,顺序执行
    3. # 表示
    4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

    3.2.2 结构

    3.2.3 保留字指令

    保留字 作用
    FROM 基础镜像,当前新镜像是基于哪个镜像的
    MAINTAINER 镜像维护者的姓名和邮箱地址
    RUN 容器构建的时需要运行的命令
    EXPOSE 暴露出该镜像的端口号
    WORKDIR 指定工作目录,登录时进入哪个文件夹
    ENV 用来在构建镜像是设置环境变量
    ADD 添加文件 加解压缩
    COPY 类似ADD只是复制作用
    VOLUME 指定映射 保存数据和持久化
    CMD 指定一个容器启动时要运行的命令,dockerfile可以指定多个cmd但只有最后一个生效
    ENTRYPOINT 指定一个容器启动时要运行的命令
    OBBUILD 触发器,当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

    3.2.4 Base镜像(scratch)

    Docker Hub 中99% 的镜像都是通过base镜像中安装和配置需要的软件构建出来的
    

    3.2.5 自定义镜像

    1. 编写

      FROM centos # 继承ubuntu镜像
      MAINTAINER 366909600@163.com # 作者的信息 邮箱
      ENV MYPATH /usr/local # 定义环境变量
      WORKDIR $MYPATH # 指定运行容器是进入指定的文件夹
      
      RUN yum -y install vim # 构建时安装vim
      RUN yum -y install net-tools
      
      EXPOSE 80 # 对外暴露的端口
      
      CMD echo $MYPATH
      CMD echo "success ......... ok"
      CMD /bin/bash
      
      ------ubuntu--------
      
      FROM ubuntu
      MAINTAINER 366909600@163.com
      ENV MYPATH /usr/local
      WORKDIR $MYPATH
      
      RUN apt-get update
      RUN apt-get install -y vim
      RUN apt-get install -y net-tools
      
      EXPOSE 80
      
      CMD echo $MYPATH
      CMD echo "success ......... ok"
      CMD /bin/bash
      
      
      
    2. 构建

      docker build -f /docker/Dockerfile -t myubuntu:1.1 .  #'.' 代表当前目录下 1.1 是版本号
      
    3. 运行

      docker run -it myubuntu:1.1 /bin/bash
      
    4. 列出镜像的变更历史

      docker history b263356c5274镜像id #列出该镜像的历史层级
      

    3.3 案例:自定义tomcat

    1. mkdir -p /docker/tomcat9 && touch c.txt
      
    2. 拷贝jdk和tomcat的压缩包到tomcat9目录
      
    3. 在tomcat9目录创建Dockerfile
      
      # 自定义tomcat9镜像
      # 继承centos
      FROM centos
      MAINTAINER 366909600@163.com
      # 把宿主机上下文的c.txt拷贝到容器的/usr/local路径下
      COPY c.txt /usr/local/cincontainer.txt
      # 将jdk与tomcat添加解压到容器中的/usr/local
      ADD apache-tomcat-9.0.34.tar.gz /usr/local
      ADD jdk-8u221-linux-x64.tar.gz /usr/local
      # 安装vim编辑器
      RUN yum -y install vim
      # 设置工作访问时的落脚点 
      ENV MYPATH /usr/local
      WORKDIR $MYPATH
      # 配置JDK与tomcat的环境变量
      ENV JAVA_HOME /usr/local/jdk1.8.0_221
      ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.34
      ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.34
      ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME/bin
      # 容器运行时监听的端口
      EXPOSE 8080
      # 启动时运行tomcat
      
      #ENTRYPOINT ["$CATALINA_HOME/bin/startup.sh"]
      #CMD ["$CATALINA_HOME/bin/catalina.sh","run"]
      CMD $CATALINA_HOME/bin/startup.sh && tail -f $CATALINA_HOME/logs/catalina.out
      
      
      
      
      
    4. docker build -f /docker/tomcat9/Dockerfile -t mytomcat9 .

    5. docker run -d -p 9080:8080 --name myt9 -v /docker/tomcat9/test:/usr/local/apache-tomcat-9.0.34/webapps/test -v /docker/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.34/logs --privileged=true mytomcat9
      
      -d  后台启动
      -p 映射外部:内部端口
      --name 自定义容器名称
      -v 添加容器卷 宿主机目录:容器目录
      --privileged=true 开启写权限
      
      
    6. 验证

    7. 结合容器卷将测试的web服务test发布
      

    4. Docker 常用安装

    4.1 步骤

    1. 搜索镜像
    2. 拉去镜像
    3. 查看镜像
    4. 启动镜像
    5. 停止镜像
    6. 移除镜像

    4.2 安装Mysql

    1. docker run -p 33061:3306 --name mysqltest -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/logs:/logs -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
      
    2. docker exec -it containerId /bin/bash
      
    3. # 备份sql
      docker exec b7cf0abb10eb sh -c 'exec mysqldump --all-databases -uroot -p123456' > /docker/mysql/all-database.sql
      

    4.3 安装redis

    docker run -p 6379:6379 -v /docker/redis/data:/data -v /docker/redis/conf/redis.conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
    

    5. 本地镜像推送到阿里云

    docker commit -a songjian -m "new myubuntu with vim add ifconfig" ee0d493cba7b myubuntu:1.2
    
    登录阿里云 搜索镜像
    1.镜像仓库
    2.创建镜像仓库
    3.创建命名空间->仓库名称->私有/共有->摘要
    4.代码源->本地代码源
    5.将代码push到阿里云
    $ sudo docker login --username=wangweibin60@gmail.com registry.cn-hangzhou.aliyuncs.com
    $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/songjianmoon/mybuntu:[镜像版本号]
    $ sudo docker push registry.cn-hangzhou.aliyuncs.com/songjianmoon/mybuntu:[镜像版本号]
    
    5.拉去镜像
    docker pull registry.cn-beijing.aliyuncs.com/songjianmoon/myubuntu:[镜像版本号]
    

    6. Linux安装docker

    1. 安装gcc

      yum 安装gcc
      yum -y install gcc
      yum -y install gcc-c++
      
    2. 删除原有docker,如果有

      $ sudo yum remove docker 
                        docker-client 
                        docker-client-latest 
                        docker-common 
                        docker-latest 
                        docker-latest-logrotate 
                        docker-logrotate 
                        docker-engine
      

    docker官网

    docker官网

    yum install -y yum-utils
    
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
    yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm
    

    安装最新版本命令

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

    docker随系统启动

    systemctl enable docker.service
    
    
    ## 7. Docker命令
    
    ### 7.1 帮助命令
    
    ```shell
    docker version #查看版本
    docker info
    

    7.2 镜像命令

    | REPOSITORY | TAG | IMAGE ID | CREATED | VIRTUAL SIZE |
    |------------|-----|----------|---------|--------------|
    |   镜像名称  | 版本|   镜像ID |  创建时间|  大小         |
    
    ------------------------镜像-------------------------------------
    docker images # 列出本地所有镜像
    	 -a  #列出本地所有的镜像(包含中间映像层)
         -q  #只显示镜像id
         --digests #显示镜像的摘要信息
         --no-trunc #显示完整的镜像信息
    	 -qa #显示所有镜像的id 可以查出所有id批处理操作
    docker search 镜像的名称  # 查找某个镜像	http://hub.docker.com 上寻找资源
    	-s #列出收藏数不小于指定值得镜像
    	--no-trunc #显示完整的镜像信息
    	--automated #只列出automated build类型的镜像
    docker pull 镜像名称[TAG] #拉去一个镜像
    docker rmi imageId [imageId] # 删除镜像 ,删除镜像之前必须先删除创建的容器 [imageId]删除多个image
    docker rmi -f ${docker images -q} #删除所有镜像
    -----------------------------------------------------------------
    

    7.3 容器命令

    -------------容器--------------
    docker run [OPtiONS] imageId [CMD] [ARGS] #  新建并运行一个容器
    	[OPTIONS] 
    	=> --name='容器的新名称' : 为容器指定一个名称 是唯一的
    	=> -d : 后台运行容器,并返回容器的id
    	=> -i : 以交互模式运行容器,通常与 -t一起使用
    	=> -t : 为容器分配一个伪输入终端,通常与-i一起使用
    	=> -P : 随机端口映射
    	=> -p : 指定端口映射,有四种各执
    		-> ip:hostport:containerport
    		-> ip::containerport
    		-> hostport:containerport
    		-> containerport
    		
    		
    		
    docker ps # 列出所有正在运行的容器
    	docker ps -a #列出所有正在运行或者已经停止的容器
    	
    exit #容器停止并退出
    ctrl+P+Q #容器不停止并退出
    
    docker stop containerId # 停止一个容器
    docker start containerId # 启动一个容器
    docker restart containerId # 从起一个容器
    # 删除一个容器
    docker rm containerId 
    # 删除多个容器
    docker rm -f ${docker ps -a -q} 
    docker ps -a -q| xargs docker rm
    
    -------------------查看日志-----------------------
    docker logs -f -t --tail containerId 
    	-t # 加入时间戳
    	-f # 跟随最新的日志打印
    	--tail # 数字显示最后多少条
    
    -------------------查看容器内 top--------------------
    docker top containerId
    -------------------查看容器内细节-----------------
    docker inspect containerId
    -------------------进入容器--------------------
    docker exec -it containerId /bin/bash
    docker attach containierId
    
    
    -------------------------拷贝-------------------------
    docker cp containerId:/tmp/log.log /home # 将容器中log.log文件拷贝到home文件夹中
    
    
    
    
  • 相关阅读:
    LeetCode :: Validate Binary Search Tree[具体分析]
    一世12年龄在泥土还在打,硅谷00创业毕竟开始播放!
    大学毕业生上班第一天6月3号码
    发送到快捷方式不见了
    【转】三种方式在C++中调用matlab
    【转】C++调用Matlab的.m文件
    C++函数模板与模板函数
    Visual Studio 行末回车时运算符两侧自动加空格是怎么设置的
    java回顾4 Java基本数据类型
    zoj 2402
  • 原文地址:https://www.cnblogs.com/smallwolf/p/12769311.html
Copyright © 2011-2022 走看看