docker

Posted smallwolf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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发布
    

技术图片

以上是关于docker的主要内容,如果未能解决你的问题,请参考以下文章

markdown docker-compose片段

sh Docker片段

《Docker 源码分析》全球首发啦!

docker 部署 coredns(内部域名解析)

docker 部署 coredns(内部域名解析)

将 Docker 容器限制为单个 cpu 核心