zoukankan      html  css  js  c++  java
  • 我的Docker学习记录(一)

    1、Docker的基本概念

    这里概念大部分都是拿来主义,想要更详细的了解可以去官网或者搜索下

    1.1、Docker简介

    引用下百科的话:

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

    1.2、Docker基础概念

    镜像(Image): Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

    容器(Container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    仓库(Repository): 仓库可看着一个代码控制中心,用来保存镜像。

    1.3、小结

    这里我用自己的理解来说下,如果有不到位的可以交流下。

    本人是个Javaer, 就以Java的角度来思考Docker的相关概念吧。首先,我们把Docker理解为JVM;可以把Repository暂时理解为我们的项目资源或者是Maven仓库吧,是存放镜像的集合;然后Image就是我们的Class文件,一个类的概念,模版的概念;而Container就可以理解为通过 new 出来的对象了。

    其实Docker通过翻译是码头工人,而Container除了容器的意思外还有集装箱。这里也可认为Docker就是搬运,装载,卸载等功能,Container集装箱就是隔离各类货品(应用资源),它们有自己独立的空间和环境(例如Java环境来运行Java应用)。

    就跟JVM一样,写了一份代码,只要与虚拟机挂钩,其他环境等都不需要管;Docker容器的隔离使得各类应用有自己的文件系统,可以做到互相不受影响。

    好好想下,如果有一种平台可以直接拉取我们版本管理工具管理的代码,然后编译打包成Image文件,然后导入到Docker中。紧接着使用Docker通过镜像创建容器并且运行。那么我们从开发到部署整个过程就连起来且实现了自动化了(当然开发没有自动化。。)。其实这个也已经有了相应的软件来支撑了,Git、Jenkins、Rancher等等。


    2、Docker的安装与运行

    这里需要明确,本人系统是Ubuntu 16,安装的过程均基于此

    2.1、Docker安装

    安装Docker的方式存在多种,Docker提供了一种比较便利的方式供我们下载使用,这里只介绍脚本下载的方式

    # 首先,确保已经安装了 curl , 键入命令查看是否存在, 如果不存在请先安装
    curl -V 
    ##### 下载docker的安装脚本 #####
    # 下载shell
    curl -fsSL https://get.docker.com -o get-docker.sh
    # 运行shell,这里加入阿里镜像下载,https://mirrors.aliyun.com/docker-ce
    sudo sh ./get-docker.sh --mirror Aliyun
    

    2.2、Docker服务相关配置

    2.2.1、配置用户组及镜像链接

    由于访问Docker需要sudo权限,这里将本登录用户加入docker用户组可以避免多次sudo的情况

    sudo groupadd docker
    sudo usermod -aG docker $USER
    

    由于官网链接网速感人,一般需要配置镜像链接

    sudo vim /etc/docker/daemon.json
    

    这里我加入了两个镜像地址,如下

    {
        "registry-mirrors": [
            "https://6kx4zyno.mirror.aliyuncs.com",
    		"http://hub-mirror.c.163.com"
        ]
    }
    

    2.2.2、启动服务

    # 设置Docker开机自启动
    sudo systemctl enable docker
    # 启动Docker服务
    sudo systemctl start docker
    # 测试是否成功
    docker version
    

    3、把玩Docker

    这里有个建议,docker run --help ,遇到不知道的--help下,或者man docker .......

    3.1、运行Redis

    首先,需要拿到Redis镜像,然后利用Docker将Redis运行在容器中。

    # 一般直接运行docker run docker会从本地镜像中查找,如果没有会直接在中央仓库查找并pull
    # 这里演示下pull 下载Redis最新版,latest最新版,不指定默认latest
    docker pull redis:latest
    # 下载后即可命令容器运行Redis
    # docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    docker run -d --rm --name redis-test-00 -p 1234:6379 redis:latest
    # -d 就是--detach简写 后台运行容器并打印容器ID
    # --rm 当容器退出时自动删除容器(一般容器停止时会保存当前容器,停止后可重新根据ID重启容器)**值得注意的是如果没有这个参数,那么容器会保留,可以通过docker start redis-test-00重启**
    # --name string 当前要运行的容器的别名
    # -p port:port ... ... 就是--publish简写 后面跟着端口映射list,用于配置宿主机与容器间的端口映射,这里将主机的1234端口与容器的6379端口进行映射(比如Tomcat启用8080端口在容器中运行,这里参数 -p 8090:8080, 这样主机localhost:8090即可访问)
    # redis:latest 指定镜像名及版本号,如果版本是latest一般不用指明
    
    # ***具体可通过 --help 查看***
    
    # 运行成功后可通过ps查看,ps加入参数 --all可看所有的容器,包含已停止的
    docker ps
    # 可进入容器内部与其交互
    docker exec -it redis-test-00 /bin/bash
    # docker exec 在运行的容器中执行命令操作
    # -it 其实是 -i -t; -i Keep STDIN open even if not attached 与其控制台保持交互, -t Allocate a pseudo-TTY 分配一个虚拟的终端;这里大概总是成双出现,一般理解为与容器终端交互即可吧。(个人理解)
    
    # 现在进入与容器交互的模式了,可以直接在终端使用Redis
    redis-cli
    set k v
    get k
    del k
    get k
    ....
    # 退出可键入exit或 Ctrl+D
    # 如果要停止当前的容器
    docker stop redis-test-00
    
    

    3.2、利用Dockerfile打包镜像

    官方有个通过Dockerfile打包的例子,这里用这个来做实验,官方网址https://docs.docker.com/get-started/part2/

    首先,先git一份官方的项目

    git clone https://github.com/dockersamples/node-bulletin-board
    cd node-bulletin-board/bulletin-board-app
    

    然后再创建一个Dockerfile

    touch Dockerfile
    vim Dockerfile 
    

    将以下内容复制进Dockerfile中

    
    # Use the official image as a parent image
    # 以此镜像作为基础,在此基础上打包成新的镜像
    FROM node:current-slim
    
    # Set the working directory
    # 将此路径作为镜像运行在容器时的工作目录,例如使用docker exec进入容器,它的目录就是此目录了
    WORKDIR /usr/src/app
    
    # Copy the file from your host to your current location
    # 将当前文件夹下的package.json 复制到工作目录下 容器中的/usr/src/app
    COPY package.json .
    
    # Run the command inside your image filesystem
    # 在image打包前执行的命令, 由于npm速度慢,必要时可以后面加入  --registry=https://registry.npm.taobao.org
    RUN npm install
    
    # Inform Docker that the container is listening on the specified port at runtime.
    # 容器运行时需要暴露的端口号码,项目中server.js 定义了监听端口8080,所以这里是将运行容器的8080暴露出来
    EXPOSE 8080
    
    # Run the specified command within the container.
    # 在容器被运行后执行的命令
    CMD [ "npm", "start" ]
    
    # Copy the rest of your app's source code from your host to your image filesystem.
    # 将当前主机所有文件夹下的所有东西copy到镜像,当然,我也不知道为什么不把这个放在前面,为什么要先COPY package.json后再COPY当前目录所有东西
    COPY . .
    
    # 这里按照我的个人理解是 在启动了镜像node:current-slim做为容器
    # 然后再运行了此文件的RUN、COPY命令,并且将此运行的容器文件再打包作为我们要的镜像的基础文件
    

    准备好后就可以使用docker build命令打包成image了

    # 注意命令后有个 . ,这个点用于指明当前路径
    docker build -t board-app:v3 .
    # 这里的命令通过 --help查看下
    # 主要格式为 docker build [OPTIONS] PATH | URL | -
    # -t --tag的简写,后面标明构建镜像对象的名称及版本号,不指定版本号默认为latest
    # 除了此参数,还可指定CPU,内存等等等的参数等,这个可以通过 docker build --help查看
    

    执行了构建镜像命令后就可以运行容器了,

    docker run -itd --rm --name board-app-1 -p 8080:8080 board-app:v3
    

    通过访问 localhost:8080就可以看到web界面了。

    关于以上的Dockerfile中的指令可以见这个 https://www.cnblogs.com/linjiqin/p/8735230.html

    4、总结

    总结下Docker的学习过程,别到时用到时完全忘了重新学习节奏太慢。
    虽然很懒,不知什么时候就不会再写这种东西,但是现在写了,以后的事情再说吧。
    Docker远远不止这些,求知之路任重而道远。

    Docker相关链接
    https://docs.docker.com/
    http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
    https://www.cnblogs.com/linjiqin/p/8735230.html
    https://www.runoob.com/docker/docker-tutorial.html

  • 相关阅读:
    鼠标滚动倾斜分割切换
    表格数据模糊搜索
    简单三级联动
    整屏切换特效
    滚动条滑至底部自动加载内容
    使用鼠标滚轮或者手势滑动到页面节点部分
    ajax 跨域前后端实现
    ajax 跨域解决方案
    php stdClass Object 解析
    Git 设置仓库指定忽略的文件
  • 原文地址:https://www.cnblogs.com/lger/p/12498401.html
Copyright © 2011-2022 走看看