Docker入门

作者: 我可能是个假开发 | 来源:发表于2019-07-04 17:18 被阅读22次

    Docker入门

    一、Docker简介

    1.什么是Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
    容器是完全使用沙箱机制,相互之间不会有任何接口。

    e1b48195415f79f752e4da6e773bd3e.png

    核心概念:

    1.Docker镜像

    类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统。
    例如:一个镜像可以包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。镜像也可以安装了Apache应用程序,可以把它称为一个Apache镜像。
    镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并通过简单的命令就可以直接使用。

    2.Docker容器

    Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
    容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。
    可以把容器看做一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序打包而成的应用盒子。
    镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。

    3.Docker仓库

    Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。
    注册服务器:Registry
    注册服务器是存放仓库的地方,其上往往放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。
    根据所存储的镜像公开分享与否,Docker仓库可以分为

    • 公开仓库(Public):最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问。
    • 私有仓库(Private):用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。
      当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需将其从仓库上pull下来就可以了。

    2.安装

    官网:www.docker.com
    Linux安装:

    $ sudo wget -qO- https://get.docker.com/ | sh 
    安装docker本身
    sudo:当前用户是普通用户,但执行该命令时使用root身份执行
    wget:命令行下载工具
    -q:使wget输出不要那么多
    O-:把wget的输出直接输出到标准输出,而不是输出到文件
    |:管道 
    | sh:把输出交给sh
    
    $ sudo usermod -aG docker xxx  
    允许非root用户(非superuser)来运行docker
    修改用户组,把这个用户组加入到docker组里面(用户如果在docker组里,则可以不用sudo,不需要root就可以执行docker命令)
    

    检查是否安装成功:docker info
    如果执行此命令报错,则是docker没有启动,在centos中,使用

    service docker start
    
    安装docker.png 查看信息.png

    3.Docker架构

    docker架构.png

    Docker host:进行docker操作的宿主机
    Docker Daemon:负责各种各样的docker操作,比如下载docker镜像,运行一个容器,客户端通过命令,把命令交给docker daemon,由docker Daemon来做实际的操作。
    Registry:互联网的saas服务,daemon可以和registry交互,比如获取一个image,或者push一个image;是Docker的镜像存储服务端。

    架构.png

    客户端和守护进程进行操作,把命令送给守护进程,守护进程拖取镜像,运行容器并和远端的镜像仓库进行交互。

    4.使用docker

    docker run centos echo hello docker
    
    1787a55467271333a42791543e0fbf4.png

    在centos这个image里运行了echo hello docker命令

    docker在运行一个容器之前会先查看本地是否有该容器需要的image,如果没有则会从远端下载。

    使用docker images命令查看本地的所有images:


    docker images.png
    docker run -p 8080:80 -d daocloud.io/nginx
    返回一串字符串:contain的id
    -p:做端口映射,把docker nginx本身的80端口映射到本地的host的8080端口。
    -d:允许程序直接返回,把container作为守护进程来执行。
    

    使用docker ps命令查看当前正在运行的docker的container:

    dockerps.png

    5.docker基础命令

    命令 用途
    docker pull 获取image(镜像)
    docker build 创建image
    docker images 列出image
    docker run 运行container
    docker stop 容器id 停止容器
    docker ps 列出正在运行的container
    docker ps -a 列出所有的container
    docker rm 容器id 删除container
    docker rmi 删除image
    docker cp 在host和contaiiner之间拷贝文件
    docker commit 保存改动为新的image

    二、镜像与容器

    1.docker commit

    在使用docker cp index.html 32daa9dcs45c://usr/share/nginx/html修改了nginx的图片页面,停止再重启docker容器,
    使用docker run -p 8080:80 -d daocloud.io/nginx查看,之前所做的改动会失效:
    docker在容器内所做的修改的都是暂时的,没有被保存下来的

    要永久保存:
    修改:docker cp index.html e5f32u43k51://usr/share/niginx/html
    保存:docker commit -m 'fun' e5f32u43k51 nginx-fun 返回一个新产生的imageid
    此时是产生了一个跟之前一模一样的image,可以把之间的删除掉。

    2.dockerfile

    通过编写简单的文件自创docker镜像

    第一个Dockerfile

    FROM alpine:latest  要产生的新镜像有一个baseimage基础镜像
    MAINTAINER hcx  共享时告诉其他人,这是hcx写的
    CMD echo 'hello docker' 运行的命令:echo ‘hello docker’
    

    alpine:专门针对Docker来做的一个极小的linux环境

    docker build

    使用Docker命令构建一个image:

    docker build -t hello_docker .
    -t:设定一个标签:hello_docker
    .:路径名,把该路径下的所有内容送到docker engine,让其产生image。
    
    e9f1c24c261b4fb4744eb1ad06555ed.png

    docker images hello_docker:查看是否生成了该文件
    docker run hello_docker:运行该image

    Dockerfile语法

    命令 用途
    FROM base image (指定一个基础镜像)
    RUN 执行命令 (在容器内执行一个命令)
    ADD 添加文件(往容器中添加文件,还可以将远程的文件加入到容器里面)
    COPY 拷贝文件(拷贝一个文件或目录)
    CMD 执行命令 (给容器指定一个执行的入口)
    EXPOSE 暴露端口
    WORKDIR 指定路径(指定命令运行的路径)
    MAINTAINER 维护者
    ENV 设定环境变量
    ENTRYPOINT 容器入口
    USER 指定用户(指定执行该命令的用户)
    VOLUME mount point(指定容器所挂载的卷)

    3.镜像分层

    Dockerfile中的每一层都产生一个新层

    FROM alpine:latest 4e38e38c7ct0
    MAINTAINER hcx   fb1gail4315b
    CMD echo 'hello docker' 8gf243gsfe8
    
    镜像分层.png

    三、容器存储

    1.Volume

    提供独立于容器之外的持久化存储

    2.Volume操作

    $ docker run -v /usr/share/nginx/html nginx
    
    771c87f9b0081506f446eddc0da058d.png
    docker inspect nginx
    
    a31115298de1c2e9b9cac8a3ccf2e2b.png b2d74e01849fcdfea0bfe5df4dd4026.png

    本地目录挂在到容器里的

    $ docker run -v $PWD/code:/var/www/html nginx
    

    把当前的目录映射到容器里:

    $ docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx
    $PWD:shell的宏变量,始终指向当前目录
    $PWD/html:当前目录下的html目录
    /usr/share/nginx/html:挂载在容器里的目录
    把当前的host目录挂到容器里的/usr/share/nginx/html目录
    

    $ docker run -volumes-from

    四、Registry 镜像仓库

    English 中文
    host 宿主机
    image 镜像
    container 容器
    registry 仓库
    daemon 守护进程
    client 客户端
    $ docker search whalesay
    $ docker pull whalesay
    $ dorcker push myname/whalesay
    

    国内的一些仓库:

    • daocloud
    • 时速云
    • aliyun
    bc183f83eb465ad6ab31ff7648a0183.png HelloDocker.png

    产生一个新tag,并共享到hub里:

    5e7509d03896647cfa120ce4b3e4112.png

    五、docker-compose 多容器app

    1.安装docker-compose

    linux上安装docker-compose:

    curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s) -$(uname -m) > /usr/local/bin/docker-compose
    

    下载一个二进制文件再将其变为可以执行的

    docker-compose:

    docker-compose.png

    docker-compose.yaml:

    docker-compose.yaml.png

    docker-compose.yml常用命令:

    命令 用途
    build 本地创建镜像
    command 覆盖缺省命令
    depends_on 连接容器
    ports 暴露端口
    volumes
    image pull镜像
    up 启动服务
    stop 停止服务
    rm 删除服务中的各个容器
    logs 观察各个容器的日志
    ps 列出服务相关的容器

    相关文章

      网友评论

        本文标题:Docker入门

        本文链接:https://www.haomeiwen.com/subject/lmqpwqtx.html