美文网首页
docker入门

docker入门

作者: 马小跳_ | 来源:发表于2018-05-19 16:45 被阅读9次

    docker

    一、简介及安装

    面向用户

    • 开发,测试,运维

    预备知识

    • linux命令行
    • bash

    简介

    • docker:an open source project to pack, ship and run and application as la lightweight container.(一个开源项目,可以用来将应用以轻量级容器的形式来打包,发布和运行。)
    • allows to package an application with all of its dependencies into a standardized unit.(允许一个应用程序及其所有依赖以一种标准单位来打包。)

    类比

    • 可以粗糙的理解为轻量级的虚拟机
    • 开挂的chroot(对应用程序做了文件和系统的分离)

    虚拟机构成

    1. server
    2. host os
    3. hypervisor # 虚拟层,虚拟出了硬件
    4. guest os
    5. Bins/libs
    6. app

    docker构成

    1. server
    2. host os
    3. Docker engine # 利用了host os 的namespace 和control group 来做到将app分离。因为没有虚拟层,它比虚拟机轻量级,程序启动速度和内存需求都会小很多。
    4. Bins/libs
    5. app

    mac安装

    官网:www.docker.com

    下载:brew cask install docker

    网易镜像地址http://hub-mirror.c.163.com

    在任务栏点击 Docker for mac 应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中填写加速器地址即可。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。

    二、实践第一步

    常见名词

    English 中文
    host 宿主机(正在使用的电脑)
    Image 镜像(从远端拉取或者本地构建的可以重复使用的软件的大包)
    container 容器(镜像的运行实体)
    registry 仓库(存放镜像)
    daemon 守护进程(用来接收用户命令)
    client 客户端(客户操作,用来给daemon传输命令)

    命令小结

    命令 用途
    docker pull 从远端registry获取image
    docker build 创建image
    docker images 列出本地image
    docker run 运行container
    docker ps 列出正在运行container
    docker ps -a 列出所有container
    docer rm 删除已经结束的container
    docker rmi 删除image
    docker cp 在host和container之间拷贝文件
    docker commit 保存改动,生成新的image镜像

    操作示例

    docker run
    docker info
    docker run ubuntu echo hello docker
    docker run nginx  # 运行一个容器,先从本地查找,没有到话就去远端的registry下载
    docker images  # 查看本地images
    docker run -p 8080:80 -d daocloud.io/nginx 
    # -p 端口映射  -d 允许将container直接返回
    # 返回值为container_id
    
    docker ps  # 查看container
    
    docker cp index.html aaaaaa://usr/share/nginx/html
    # 将文件拷贝到容器中
    # 需要参数分别为 文件 容器id  容器内部的路径
    
    docker stop container_id  # 停止一个容器
    
    重启后index.html没有生效,是因为docker在容器内做的操作都是暂时的
    
    持久化:
    docker commit -m "fun" container_id
    # 返回值为新的 image_id
    
    docker commit -m "fun" container_id image_name
    
    删除image
    docker rmi image_id
    
    清楚运行的container
    docker stop container_id
    
    docker ps  # 当前正在运行的容器
    docker ps -a  # 列出所有的容器,包括已停止的
    docer rm container_id1 container_id2
    

    三、dockerfile镜像

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

    docker commit -m "fun" container_id image_name
    

    第一个dockerfile

    FROM alpine:lastest  # 基础镜像的名字
    # alpine 极小的linux环境,针对docker
    MAINTAINER xbf  # 作者
    CMD echo "hello docker" # 运行容器时产生的效果
    
    mkdir d1
    touch Dockerfile
    
    FROM alpine:lastest
    MAINTAINER xbf
    CMD echo "hello docker"
    
    docker bulid -t hello_docer .
    # -t 指定标签名, . 表示当前路径都送给docer engine 用来产生image
    
    docker images hello_docker
    
    docker run hello_docker
    

    第二个dockerfile

    docker run -d -p 80:80 xbf/hello-nginx
    

    dockerfile语法

    命令 语法
    from 指定base image
    run 执行命令
    add 添加文件 (可以讲远程文件加到容器)
    copy 拷贝文件
    cmd 执行命令
    expose 暴露端口
    workdir 指定路径
    maintainer 维护者
    env 设定环境变量
    entrypoint 容器入口
    user 指定用户
    volume Mount point (指定容器挂载的卷)

    镜像分层

    dockerfile中的每一行都会产生一个新层

    每一行 都是单独保存

    FROM alpine:lastest  # 
    MAINTAINER xbf  # 
    CMD echo "hello docker"  # 
    

    已经存在image里边的层是只读的,容器层是可读可写的

    镜像在运行起来的时候里面的层是只读的,在其上的容器层是可读可写的

    相同的镜像层会复用,一定程度上减小了空间的使用

    四、存储

    volumn介绍

    提供独立与容器之外的持久化存储,可以被其他容器进行访问。

    volumn操作

    方式一:

    运行一个容器并(-v)挂载一个卷

    docker run -v /usr/share/nginx/html nginx
    

    macOS 中多了一层虚拟层

    因此不能直接访问到 Mounts 中的 Source 路径

    需要先使用 screen 命令进入到 tty 中

    容器信息中

    • Mounts代表挂载信息
    • Source是宿主机位置
    • Destination是容器中的位置
    docker run -d --name nginx -v /usr/share/nginx/html nginx
    docker inspect nginx
    
    screen ...../tty
    
    docker exec -it ngnix /bin/bash
    

    方式二:

    本地目录挂载到容器内的数据卷(虚拟卷)

    可以映射宿主机目录到容器中

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

    注意:

    • $PWD - shell 命令中本地当前目录的环境变量
    • nginx的配置文件/etc/nginx/conf.d/default.conf中默认的根路径root是/usr/share/nginx/html,所以此处配置容器中的目标路径是/var/www/html并不能在浏览器中打开本地的index.html,需要更改绑定路径或nginx根路径

    方式三:

    使用其他容器创建的存储(挂载其他容器的数据卷)

    docker run -volumes-from [容器数据目录]
    
    docker create -v $PWD/data:/var/mydata data_containerd
    

    五、镜像仓库

    常用命令

    docker search xxx  # 从registry中搜索镜像
    docker pull xxx  # 拉取镜像
    docker push xxx/yyy  # 推送自己的镜像到仓库
    

    国内的一些仓库

    • daocloud
    • 时速云
    • aliyun

    registry操作

    docker search whalesay
    docker pull docker/whalesay
    docker images
    docker run docker/whalesay cowsay 'haoge zhenniubi'
    docker tag docker/whalesay mxt/whalesay
    docker push mxt/whalesay
    
    docker login
    hub.docker.com
    

    六、多容器app

    docker-compose安装

    • Mac/windows:自带
    • Linux:curl https://github.com/docker/compose/releases/download/1.9.0

    三个容器:

    • ngnix
    • Ghost app
    • mysql

    docker-compose.yaml

    yaml是一种常用的配置文件格式,通过缩进表示层级关系

    ghost-app:
        build: ghost
        depends_on:
            - db
        ports:
            - "2368:2368"
    nginx
        build: nginx
        ports:
            - "80:80"
        depends_on:
            - ghost-app
    db:
        image:"mysql:5.7.15"
    

    三个顶层的对象,对应三个服务,分别有自己的描述。

    实战

    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: 'utf-8'
                },
                debug: false
            },
            paths: {
                contentPath: path.join(process.env.GHOST_CONTENT, '/')
            },
            server: {
                host: '0.0.0.0',
                port: '2368'
            }
        }
    };
    module.exports = config;
    

    ngnix.conf

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

    docker-compose.yml

    version: '2'
    networks:
      ghost:
    services:
      ghost-app:
        build: ghost
        networks:
          - ghost
        depends_on:
          - db
        ports:
          - "2368:2368"
      
      ngnix:
        build: ngnix
        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"
    
    mkdir ghost
    cd ghost
    mkdir ghost
    mkdir nginx
    mkdir data
    
    cd ghost
    touch Dockerfile
    vi Dockerfile
    
    FROM ghost
    COPY ./config.js /var/lib/ghost/config.js
    EXPOSE 2368
    CMD ['npm', 'start', '--production']
    
    
    cp ../../backup/ghost/ghost/config.js
    cat config.js
    
    
    cd ../ngnix
    touch Dockerfile
    
    FROM ngnix
    COPY ngnix.conf /etc/ngnix/ngnix.conf
    EXPOSE 80
    
    touch ngnix.conf
    vi ngnix.conf
    
    
    cd ..
    touch docker-compose.yml
    vi docker-compose.yml
    
    
    docker-compose up -d 
    

    步骤

    1. 创建三个目录:dataghostngnix

    2. ghostngnix是用来存放dockfile和配置文件,用来构建镜像

    3. data是用来存放博客需要的数据

    4. compose是用名字把各个服务链接起来,它自己会做名字解析

    拉起
        docker-compose up -d
    
    停止
        docker-compose stop
        docker-compose rm
    
    构建
        docker-compose build
    

    compose拉取三个容器,这三个容器间互相协作,完成了一个多容器的app。

    Docker-compose.yml 常用命令

    命令 用途
    build 本地创建镜像
    command 覆盖缺省命令
    Depends_on 容器之间的依赖关系
    ports 定义和暴露端口
    Volumes
    image pull镜像

    Docker-compose命令

    命令 用途
    up 启动服务
    stop 停止服务
    rm 删除服务中的某个容器
    logs 查看各个容器的命令
    ps 列出服务相关的容器

    相关文章

      网友评论

          本文标题:docker入门

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