• Docker入门


    目录

    Docker的作用

    Docker的核心概念

    Docker安装

    镜像命令

            镜像下载

            查看镜像

            搜索镜像

            删除镜像

    容器命令

            创建容器

            列出容器

            新建并启动容器(最常使用)

            守护态运行

            启动容器

            终止容器

            重启容器

            进入容器

    attach命令

    exec命令(最常使用)

            退出容器

            删除容器

     重点:各种参数的作用

    核心命令

            日志命令

            查看容器里面的进程

            从容器拷贝文件到主机上

    Docker数据管理

            什么是数据卷

            配置数据卷

            数据卷容器

    DockerFile

            构建镜像

            常见的13种指令

            CMD和MAINTAINER的区别 

    公有云

            发布镜像到DockerHub

            发布镜像到阿里云


     

    部分图片来自百战程序员  

    Docker的作用

    Docker只能在Linux中运行 

    开发者需要能方便高效构建应用,并且任何时间任何地点都可以获取。

    Docker在开发和运维中的优势

    对开发和运维( DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。

    优势:

    • 更快速的交付和部署
    • 更高效的资源利用
    • 更轻松的迁移和扩展
    • 更简单的更新管理

    Docker与虚拟机比较

    作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势。

    特性

    容器

    虚拟机

    启动速度

    秒级

    分钟级

    磁盘使用

    一般为MB

    一般为GB

    性能

    接近原生

    弱于

    系统支持量

    单机支持上千个容器

    一般几十个

    隔离性

    完全隔离

    完全隔离

     

    Docker的核心概念

    • 镜像(Image)
    • 容器 (Container)
    • 仓库 (Repository)

    Docker 镜像 (Image) 类似于虚拟机镜像,可以将它理解为个面向 Docker引擎的模板,包含了文件系统。

    镜像从何而来

    • 从Docker Hub下载 原理相当于maven-> 中央仓库
    • 通过Docker file自己创建出来

    Docker容器

    Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

    注意:

    容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层

     

    Docker仓库

    Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问。

    注意:

    Docker利用仓库管理镜像的设计理念与Maven非常相似。

     

    咱们再来理解docker的两句口号就更好理解了

    • 「Build, Ship and Run (搭建,发送给同事,同事即可运行)」
    • 「Buildonce,Runanywhere (搭建一次,运行到任何地方)」

     

    Docker安装

    系统环境

    序号

    软件

    版本

    1

    Centos

    7.5

    2

    Linux内核

    3.8之上

    关闭防火墙

    systemctl stop firewalld

    关闭selinux

    vim /etc/selinux/config

    SELINUX=disabled

    安装docker引擎

    yum install -y  docker

    启动docker

    systemctl start docker

    设置docker自启动

    systemctl enable docker

    测试docker是否安装成功

    docker run hello-world

    镜像命令

            镜像下载

    Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

    镜像下载

    镜像是Docker运行容器的前提。

     

    语法格式:

    docker pull 镜像名字:[tag]

    注意:

    如果不指定tag,则下载Docker Hub公共注册服务器中仓库的最新版本。

     例:下载mysql5.7

    我这里已经下载过了,所以没有提示下载信息 

     

     

            查看镜像

    列出本地主机上已有的镜像。

    [root@docker ~]# docker images

    REPOSITORY  TAG    IMAGE ID  CREATED  SIZE

    参数:

    • 来自于哪个仓库,比如 ubuntu仓库。镜像的标签信息,比如14.04。
    • 镜像的ID号(唯一)。
    • 创建时间。
    • 镜像大小。

    镜像的ID信息十分重要,它唯一标识了镜像。

     

            搜索镜像

    搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。

    docker serach  [镜像名字]

    参数:

    可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级 (表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。

    例子:搜索镜像mysql:5.7 

     

            删除镜像

    使用镜像的标签删除镜像

    docker rmi 源名字

    docker rmi image idimage id可以只写前两位)

     

    容器命令

            创建容器

    Docker的容器十分轻量级,用户可以随时创建或者删除容器。

    语法格式

    docker create -it 镜像名字

    注意:

    使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

     

            列出容器

    docker ps

    参数:

    • -a: 显示未启动容器
    • -q:返回容器id号

     

            新建并启动容器(最常使用)

    启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态( stopped)的容器重新启动。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。

    语法格式:

    docker run 镜像名字 /bin/echo 

    Docker在后台运行的标准操作包括:

    • 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
    • 利用镜像创建并启动一个容器。
    • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
    • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
    • 从地址池配置一个IP地址给容器。
    • 执行用户指定的应用程序。
    • 执行完毕后容器被终止。

     

    下面命令则启动一个bash端,运行用户交互

    docker run -t -i 镜像名字  /bin/bash

    参数:

    其中,-t选项让Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。

    exit命令退出。

     

     例子:创建tomcat容器并启动后台运行 

            守护态运行

    更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。用户可以通过添加-d参数来实现。

    语法格式(run后面加-d即可称为守护态运行)

    docker run -d 镜像名字 /bin/bash -c  "while true; do echo hello world ;sleep 1 ;done"

    例子:创建tomcat容器并启动后台运行 

            启动容器

    处于终止状态的容器,可以通过docker start命令来重新启动:

    语法:

    docker start 容器id

     

            终止容器

    docker restart命令会将一个运行态的容器终止,然后再重新启动

    语法:

    docker restart 容器id

            重启容器

    docker restart命令会将一个运行态的容器终止,然后再重新启动

    语法:

    docker restart 容器id

     

            进入容器

    在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等。

    attach命令

    语法格式:

    docker attach 容器id

    注意:

    1、但是使用attach命令有时候并不方便。当多个窗口同时attach 到同一个容器的时候,所有窗口都       

    会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

    2、使用attach命令进入容器过后,使用exit退出,那么容器也会终止

     

    exec命令(最常使用)

    Docke自1.3版本起,提供了一个更加方便的工具exec,可以直接在容器内运行命令。例如进入到刚创建的容器中,并启动一个bash:

    docker exec -it 容器id  /bin/bash

    注意:使用了exec命令进入容器,exit退出容器时不会终止容器

     

    例子:进入mytomcat5,输出文件列表

     

            退出容器

    #如果docker容器在启动的时候没有加 -d 参数

    exit # 会直接停止容器并退出

    Ctrt + p + q # 容器不停止 并退出

     

            删除容器

    语法格式:

    docker rm 容器id

    参数:

    • -f, --force=false强行终止并删除一个运行中的容器。
    • -l, --link=false删除容器的连接,但保留容器。
    • -V,--volumes=false删除容器挂载的数据卷。

     例子:强制终止并删除mytomcat5容器

     

     重点:各种参数的作用

    一、选项说明

    官方文档:https://docs.docker.com/engine/reference/commandline/run/

    • -p 映射端口 宿主机端口号:容器内应用端口
    • -P 随机端口
    • --name容器的名字

     

    核心命令

            日志命令

    语法格式:

    docker logs 容器id

    参数:

    • -f, --follow 跟踪实时日志
    • --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
    • --tail string 从日志末尾显示多少行日志, 默认是all
    • -t, --timestamps 显示时间戳
    • --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

            查看容器里面的进程

    语法格式:

    docker top 容器id

            从容器拷贝文件到主机上

    语法格式:

    docker cp 容器id:容器内路径   目录路径

    Docker数据管理

            什么是数据卷

    什么是容器数据卷

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)

    思考

    • Docker容器删除后,在容器中产生的数据还在吗?

    • Docker容器和外部机器可以直接交换文件吗?

    • 容器之间能进行数据交互?

    数据卷概念

    • 数据卷是宿主机中的一个目录或文件。
    • 当容器目录和数据卷目录绑定后,对方修改会立即同步。
    • 一个数据卷可以同时被多个容器同时挂载。
    • 一个容器也可以被挂载多个数据卷。

    数据卷作用

    • 容器数据持久化。
    • 外部机器和容器间接通信。
    • 容器之间数据交换。

     

    一句话:

    卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。

     

            配置数据卷

    docker run  -v 宿主机目录(文件):容器内目录(文件)

    注意事项

    1. 目录必须是绝对路径
    2. 如果目录不存在则会自动创建
    3. 可以挂载多个数据卷

    示例

    给Tomcat服务器挂载/opt/webapps路径。

    docker run -d --name mytomcat -p 8080:8080 -v /opt/webapps:/usr/local/tomcat/webapps tomcat

     

            数据卷容器

     

    Volume基本使用

    参数:

     create # 创建数据卷 

    inspect #查看数据卷元数据 

    ls #查看数据卷列表

     prune #删除所有未使用的卷

     rm #删除数据卷

     

     

    创建一个自定义容器

    docker volume create 容器数据卷名

    查看所有容器卷

    docker volume ls

    查看指定容器卷详情信息

    docker volume inspect 容器数据卷名

    删除数据卷

    docker volume rm 容器数据卷名

    使用指定卷容器

    有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以tomcat为例:

    docker run -d -it --name=容器数据卷名 -p 8080:8080 -v 容器数据卷名:/usr/local/tomcat/webapps tomcat

    注意:

    -v代表挂载数据卷,这里使用自定数据卷edc-tomcat-vol,并且将数据卷挂载到/usr/local/tomcat/webapps 。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

     

    DockerFile

            构建镜像

    简单示例

    在一个空白的文本文件, 命名必须为Dockerfile

    vim  Dockerfile

    示例1

    Dockerfile文件内容:

    #基础镜像

    FROM centos

    #维护者

    MAINTAINER baizhan

    #运行命令

    RUN "yum install wget"

    #启动容器运行命令

    CMD echo "hello Dockerfile"

    示例2

    Dockerfile文件内容:

    FROM java:8

    MAINTAINER WCC

    CMD java -version

    构建镜像命令

    docker build -t 镜像名字:版本 .

    注意

    . 代表Dockerfile文件在当前路径

     

            常见的13种指令

     

    FROM

    指定基础镜像,必须为第一个命令。

    指令格式:

    FROM

    FROM :

    注意:

    tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

     

    MAINTAINER

    维护者信息

    指令格式:

    MAINTAINER

    示例

     MAINTAINER Jasper Xu   MAINTAINER sorex@163.com 

    WORKDIR

    工作目录,类似于cd命令

    指令格式:

    WORKDIR /usr/workdir

    示例

    WORKDIR /a  (这时工作目录为/a)

    WORKDIR b  (这时工作目录为/a/b)

    WORKDIR c  (这时工作目录为/a/b/c)

    示例

    WORKDIR /OPT

    RUN mkdir docker

    WORKDIR /usr/local

    RUN echo "test" > a.info

    注意: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

     

    RUN

    构建镜像时执行的命令

    指令语法:

    # 1. shell执行

    格式 RUN

    # 2. exec执行

    格式 RUN["executable", "param1", "param2"]

    示例

    WORKDIR /OPT

    RUN mkdir docker

    WORKDIR /usr/local

    RUN echo "test" > a.info

    注意:

    RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

     

    ADD

    将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。

    指令格式:

     ADD ...  

     ADD ["",... ""] 用于支持包含空格的路径示例: 

    示例

    添加所有以"hom"开头的文件

    ADD hom* /mydir/

    ? 替代一个单字符,例如:"home.txt"

    ADD hom?.txt /mydir/  

    添加 "test" 到 WORKDIR/relativeDir/

    ADD test relativeDir

    添加 "test" 到 /absoluteDir/

    ADD test /absoluteDir/

     

    COPY

    功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。

    语法格式:

    COPY <源路径>  <目标路径>

    示例

    COPY ./start.sh /start.sh

     

    CMD

    构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。

    指令格式:

    CMD指令与RUN指令相似,也具有两种格式:

    1. shell格式:CMD <命令>

    2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]

    示例

    CMD echo "This is a test." | wc -

    CMD ["/usr/bin/wc","--help"]

    注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

     

    ENTRYPOINT

    配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

    指定容器启动的要运行的命令,可以追加命令

    指令格式:

    ENTRYPOINT ["executable", "param1", "param2"]

    ENTRYPOINT command param1 param2 (shell内部命令)

    示例

    ENTRYPOINT ["top", "-b"]

    注意:

    ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

     

    ENV

    这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。

    指令格式:

    ENV =

    示例

    ENV JAVA_HOME=/usr/local/jdk1.7.0_79

    ENV PATH=$JAVA_HOME/bin:$PATH

     

    EXPOSE

    指定于外界交互的端口

    指令格式:

    EXPOSE

    示例

    EXPOSE 80

    注意:

    EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

     

    VOLUME

    用于指定持久化目录

    指令格式:

    VOLUME ["/path/to/dir"]

    示例

    VOLUME ["/data"]

    VOLUME ["/var/www", "/var/log/apache2"]

    注意:

    一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

    1 卷可以容器间共享和重用

    2 容器并不一定要和其它容器共享卷

    3 修改卷后会立即生效

    4 对卷的修改不会对镜像产生影响

    5 卷会一直存在,直到没有任何容器在使用它

     

    USER

    USER指令用于将会用以什么样的用户去运行

    指令格式:

    USER user

    USER user:group

    注意:

    使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

     

    ONBUILD

    帮助别人定制而准备的

    指令格式:

    ONBUILD[INSTRUCTION]

    示例

    FROM centos

    WORKDIR /data

    ONBUILD RUN mkdir test

    FROM test:02

     

            CMD和MAINTAINER的区别 

    区别:

    • CMD #指定这个容器启动的时候要运行的命令,可被替换
    • ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令

     

    例子

    Dockerfile文件

    #基础镜像

    from centos

    #启动容器运行命令

    CMD ["ls" ,"-a"]

    构建镜像

    docker build -t test:v1 .

    此时如果运行一下命令则会报错

    docker run test:v1 -l

    但是如果把CMD换成ENTRYPOINT则可运行,因为CMD是将["ls" ,"-a"]替换为-l,而ENTRYPOINT是在["ls" ,"-a"]后面追加-l

     

    公有云

            发布镜像到DockerHub

    创建仓库

    设置仓库信息

    注意:

    DockerHub  Docker Hub

     

    发布基本命令

    注册docker账号

    docker login --username=kalista

    注意:

    填写注册Docker Hub的密码。

     

    把容器提交到docker hub上

    docker commit -m "镜像描述" -a "作者" 容器id/容器名字 远程库的名字:上传到docker hub上的名字

    注意:

    • -m 镜像描述
    • -a 作者

     

    将镜像,容器,远程库进行标识

    docker tag 镜像id 远程库的名字:上传到docker hub上的名字

    将于远程库有标识关系的库提交

    docker push 远程库的名字:上传到docker hub上的名字

     

            发布镜像到阿里云

    创建仓库

    创建镜像仓库

    设置命名空间和仓库名字

    登录阿里云Docker Registry

    docker login --username=1858778****@163.com registry.cn-hangzhou.aliyuncs.com

    注意:

    用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。您可以在访问凭证页面修改凭证密码。

     

    将镜像推送到Registry

    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]$

     

    将镜像,容器,远程库进行标识

    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]

     

    将于远程库有标识关系的库提交

    docker push registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]

     

    从Registry中拉取镜像

    docker pull registry.cn-hangzhou.aliyuncs.com/kalista/mytomcat:[镜像版本号]

    代码都是在阿里云对应仓库中有对应的

  • 相关阅读:
    mybatis拦截器 多租户隔离 及 数据权限隔离 动态可扩展
    STC单片机17——adc 8032
    Maven入门到掌握(一套打通任督二脉)
    HCIP静态路由综合实验
    make quick-example I: 变量语法 & 变量插值
    Ansible - templates实战
    管式水分仪和三针式土壤水分传感器的区别
    Sql综合练习
    Tomcat下载及使用说明
    网络协议:HTTPS
  • 原文地址:https://blog.csdn.net/cccccccmmm/article/details/127948916