zoukankan      html  css  js  c++  java
  • Docker入门

    转载请标明出处:
    http://blog.csdn.net/forezp/article/details/82454600
    本文出自方志朋的博客

    Docker简介

    Docker是容器技术的一个代表,容器的技术从本质上讲是程序打包、隔离的技术,不是一个很新的技术,核心的技术在内核中已经存在很久了。但容器技术被大众所用,变成这么流行,这么火爆的技术是因为Docker。Docker在13年被开源,变得越来越流行,Docker在微服务领域、云计算领域有着广泛的应用。这是为什么呢。任何技术的流行可能的原因有两点,一是能够解决大家的痛点,二是能够能够适应潮流.docker理顺了软件包的问题,有了docker运行一个镜像是非常容易的,不需要做各种环境的配置。

    什么是Docker?官方的解释如下:

    an open resource project to pack,ship and run any application as a lightweght containner.

    Build, Manage and Secure Your Apps Anywhere. Your Way.

    可以粗糙的认为是一个轻量级的虚拟机,因为在某种程度上来讲,docker和虚拟机是有非常多的相似点。它们都是讲应用放在相对独立的环境里,调度主机的内核来运行。但Docker确实不是虚拟机,这张图是虚拟机和Docker的对比图,左边这张图是虚拟机,右边是Docker,左边的虚拟机子宿主机上有一层Hypervisor虚拟层,虚拟出了硬件和设备,在虚拟层上面会安装GuestOs,然后再运行各种各样的程序,docker 是不一样的,docker是不一样的,它在宿主机上有一个Docker engine,然后再运行各种各样的应用程序。因为它没有虚拟机层,它会比虚拟机轻量很多,包括程序运行速度也非常的快。

    Docker为何这么火?天时地利人和。Docker 不是什么新技术,Docker的镜像版本管理是其火的根本原因。

    Docker安装

    Centos安装:

    安装:
    yum search docker
    yum -y install docker-io
    
    查看基本信息:docker info 
    启动:servie start docker
    

    Docker架构

    image.png

    从这张图可以看出,Docker的架构是非常简答的。中间是Host,上面装了一个Docker daemon的守护进程,守护进程应用做很多docker的操作,那么谁让 docker daemon来做这些操作呢,是最左边client,比如我们再终端操作输入dokcer的命令,客户端讲命令发送给docker守护进程,让docker去做一些操作,比如从最右边的镜像仓库拉取镜像到宿主机上,然后在宿主机上跑镜像,运行容器。

    常见的Docker命令

    docker run -p 80:80 -d  docker.io/nginx
    docker cp index.html containerId://usr/share/nginx/html
    docker exec -it containeId /bin/bash
    docker images
    docker ps [-a -q]
    docker stop containerId
    docker rm containerId
    docker rmi imagesId
    
    docker commit –m ’msg’ containerId [name] 
    docker build
    docker pull
    docker push
    docker login
    

    Dockerfile

    常用命令

    命令 用途
    WORKDIR RUN ENTRYPINT CMD执行的工作目录
    ENV 添加环境变量
    ADD 添加文件,会解压压缩包
    COPY 复制文件
    ONBUILD 触发器
    VOLUME 挂载卷
    FROM 基础镜像
    ENTRYPOINT 基础命令
    RUN 执行命令
    CMD 启动程序命令,拼接在基础命令后
    EXPOSE 暴露端口
    MAINTAINER 维护者

    如果不理解可以参考博客https://www.cnblogs.com/51kata/category/789766.html

    第一个Dockerfile

    FROM alpine:latest
    MAINTAINER fzp
    CMD echo 'hello docker'
    

    这个镜像的基础镜像是alpine:latest,所有者是fzp,容器启动的时候会执行echo命令。

    执行:

    docker build -t hello-img .
    
    docker run hello-img
    

    控制台输出: hello docker

    第二个Dockerfile

    FROM ubuntu
    MAINTAINER fzp
    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN apt-get update 
    RUN apt-get install -y nginx
    COPY index.html /var/www/html
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    EXPOSE 80
    

    这个镜像稍微复杂点,基础镜像是ubuntu,镜像所属者fzp,再一下一层是设置镜像加速的地址。将index.html拷贝到镜像的目录下。最后以前台进程的形式启动。

    index.html

    today i'm happy
    

    执行命令:

    docker build -t forezp/hello.nginx .
    
    docker run forezp/hello.nginx
    

    curl localhost

    控制台输出:today i’m happy

    Docker存储

    独立于容器之后的独立化存储

    第一种方式:

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

    -v指令 宿主的路径:容器路径

    将容器的路径的文件夹或者文件挂载到宿主机的路径。

    第二种方式:

    docker run -volumes-from …

    docker create -v $PWD/data:/var/mydata --name data_container ubuntu
    
    docker run -it --volumes-from data_container ubuntu /bin/bash
    
    cd /var/mydata
    
    touch what.txt
    
    exit 
    
    cd data
    
    ls
    

    可以查看宿主机的data目录有what.txt文件

    镜像仓库

    Regiestry,使用官方的docker hub。

    docker search whalesay
    
    docker pull dokcer/whalesay
    
    docker run dokcer/whalesay cowsay docker is fun
    
    docker tag dokcer/whalesay forezp/whalesay
    
    dcoker push forezp/whalesay
    
    docker login
    

    Docker Compose

    docker compose是Docker 官方的一个容器编排工具,现在以一个简单的搭建博客的例子来讲解。

    安装

    所以的例子都是在linux系统下完成的,docker compose在linux下的安装:

    curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod a+x /usr/local/bin/docker-compose
    

    验证安装成了没:

    docker-compose --version
    

    Docker Compse常用命令

    • docker-compose build
    • docker-compose up
    • docker-compose stop
    • docker-compose rm

    案例实战

    工程架构:

    WX20180903-233019@2x.png

    分为3个容器,最外层一个服务为ngixn,下一层服务为ghost app,最底层容器是Mysql

    在工作目录ghost下,有三个文件夹分别为ngix、ghost、db和一个docker-compose.yml文件,目录结构为:

    -ghost
     - nginx
         - Dockerfile
         - nginx.conf
     - ghost
       - Dockerfile
         - config.js
     - db
     - docker-compose.yml
    

    docker-compose.yml编写

    version: '2'
    networks:
      ghost:
    services:
      ghost-app:
        build: ghost
        networks:
          - ghost
        depends_on:
          - db
        ports:
          - "2368:2368"
      nginx:
         build: nginx
         networks:
          - ghost
         depends_on:
          - ghost-app
         ports:
          - "80:80"
      db:
        image: "mysql:5.7.15"
        networks:
          - ghost
        environment:
          MYSQL_ROOT_PASSWORD: mysqlroot
          MYSQL_USER: ghost
          MYSQL_PASSWORD: ghost
        volumes:
          - $PWD/data:/var/lib/mysql
        ports:
          - "3306:3306"
    

    nginx相关

    dockerfile编写:

    FROM nginx
    COPY nginx.conf /etc/nginx/nginx.conf
    EXPOSE 80
    

    配置文件文件编写nginx.conf

    worker_processes 4;
    events {
            worker_connections 1024;
            }
    http {
        server {
           listen 80;
           location / {
                 proxy_pass http://ghost-app:2368;
            }
        }
    }
    

    ghost app相关

    Dockerfile编写:

    FROM ghost
    COPY ./config.js /var/lib/ghost/config.js
    EXPOSE 2368
    

    配置文件config.js:

    var path = require('path'),
    config;
    config = {
      production: {
        url: 'http://mytestblog.com',
        mail: {},
        database: {
           client: 'mysql',
           connection: {
             host: 'db',
             user: 'ghost',
             password: 'ghost',
             database: 'ghost',
             port: '3306',
             charset: 'utf8'
           },
          debug: false
        },
        paths: {
           contentPath: path.join(process.env.GHOST_CONTENT,'/')
         },
         server: {
            host: '0.0.0.0',
            port: '2368'
         }
       }
    };
    module.exports = config;
    

    docker-compose打镜像,打完镜像之后运行.

    docker-compose buid
    docker-compose up
    

    运行之后在浏览器上访问:http://119.23.221.204/

    显示界面如下:

    WX20180904-000030@2x.png

    代码位置

    /usr/dockerstudy/ghost

    常用命令

    • docker stop $(docker ps -q) & docker rm $(docker ps -aq) 删除所有容器

    参考资料

    https://www.imooc.com/video/15735

    • 关注我的公众号,精彩内容不能错过!


    扫码关注有惊喜

    (转载本站文章请注明作者和出处 方志朋的博客

  • 相关阅读:
    初学版本控制更新Version control
    关于函数式编程(Functional Programming)
    Annotation
    Container 、Injection
    Build Tools
    Version Control
    URL和URI的区别
    函数式编程语言
    HTTP协议的简单解析
    Windows10安装MySQL8.0
  • 原文地址:https://www.cnblogs.com/forezp/p/9852075.html
Copyright © 2011-2022 走看看