zoukankan      html  css  js  c++  java
  • docker基础——关于安装、常用指令以及镜像制作初体验

    为什么使用docker

    docker就是一个轻量级的虚拟机,他解决的是服务迁移部署的时候环境配置问题。比如常见的web服务依赖于jdk、Tomcat、数据库等工具,迁移项目就需要在新的机器重新配置这些,不光麻烦,而且可能配错。

    如果能够将整个服务连同他依赖的外部环境一同打包就好了,docker就是这么干的。他将配置好的软件打包成image,在新的机器里面启动这个image即可

    当然我所理解的只是一小部分,docker还有提供弹性云服务、组建微服务架构等方面的应用

    最后,相对于传统虚拟机,docker占用的资源很少,docker本身只消耗系统的一个进程的开销。而虚拟机,比如VMware,是模拟出一个完整的操作系统。

    安装docker-ce

    docker分为社区版和企业版,其中docker-ce就表示社区版本,下面演示使用repository(库)安装docker-ce的指令。另外,笔者默认使用的是root账户,如果不是root账户请在每个指令前添加sudo指令

    注:笔者的系统版本为Ubuntu 16.04LST

    安装指令

    # 升级apt包
    apt-get updat
    
    #安装必要的工具,使apt可以基于htpps协议使用repository
    apt-get install apt-transport-https ca-certificates curl 
    software-properties-common
    
    #安装docker官方GPG key 并验证
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
    #如果成功,会显示pub uid sub等字段信息
    apt-key fingerprint 0EBFCD88
    
    #将docker安装源加入ppa
    add-apt-repository 
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu 
       $(lsb_release -cs) 
       stable";
    
    #刷新apt源
    apt-get update
    
    #安装docker-ce,如果前面准备工作都做好了就可以执行安装了
    apt-get install docker-ce
    
    #测试是否安装成功
    docker run hello-world
    

    启动与关闭

    service docker start
    service docker stop
    

    修改镜像源

    官方镜像库地址在国外,我们docker pull的时候会很慢,甚至报timeout拉不下来,对于大陆的用户官方推荐修改镜像源地址。

    方法一

    在启动守护进程时传入--registry-mirror:

    docker --registry-mirror=https://registry.docker-cn.com daemon
    

    方法二

    修改配置文件,修改/etc/docker/daemon.json(没有的自己创建),添加下面键值对:

    "registry-mirrors": ["https://registry.docker-cn.com"]
    

    最后,改完重启:

    service docker restart
    

    国内常用的镜像地址

    docker官方中国区:https://registry.docker-cn.com

    网易:http://hub-mirror.c.163.com

    ustc:https://docker.mirrors.ustc.edu.cn

    image 和 container

    imagecontainer是docker两个重要的元素。

    Image

    image——镜像,即docker打包配置好的环境整合后,形成的二进制文件。比如,在别人的Ubuntu镜像基础上,我们有加入了自己的Tomcat服务器和jdk,然后在打包,这就是自定义的image

    官方在docker hub上定义一个library库,里面都是官方提供的镜像,我们可以通过docker命令直接pull下来

    # 拉取redis镜像
    docker image pull redis
    

    后面,我们会给出一些关于imagecontainer常见指令的cheat sheet。这里以介绍概念为主

    container

    container——容器,他就是image的实例。类比于java,image就像一个Class<T>对象,而container就像通过Class生成的实例对象T。一个image模板可以生成无数个container实例,这些container之间环境一样又互相独立

    # 以redis镜像为模板,创建一个容器叫test-redis
    docker container run --name test-redis -d redis
    

    常用的cheat sheet

    # 搜索redis镜像
    docker seacher redis
    
    #下载镜像,library是官方库,不写的话默认pull官方库
    docker pull library/redis
    
    #列出所有的镜像
    docker images
    
    #删除redis镜像,这个redis就是镜像名称
    docker image rm redis
    
    #删除所有的镜像
    docker image rm $(docker image ls -a -q)
    
    #启用redis image作为一个容器,名称为test-redis
    docker run --name test-redis -d redis
    
    #查看运行中的容器
    docker ps
    #或者
    docker container ls
    
    # 查看所有的容器(运行的和停止的)
    docker ps -a
    
    #关闭容器,test-redis是容器名,填写容器id也可以
    docker stop test-redis
    #或者
    docker container kill e494
    
    #启动容器id为e494的容器,其实就是前面的redis
    docker start e494
    
    #删除容器
    docker container rm e494
    
    #删除所有停止的容器
    docker rm $(docker ps -a -q)
    
    #启用镜像时将内部端口映射到Linux 系统的端口上,这里将容器的6379端口映射到本机的6478端口上
    docker run -d -p 6478:6379 --name test-redis redis
    
    #注1:如果是在虚拟机上的容器,其实虚拟机还要再映射一次端口到真实主机的端口上
    
    #注2:如果是局域网,很不幸的,还需要将私有ip映射到公网ip上。。。
    
    #注3:如果没有公网ip,很不幸的,可能需要借助花生壳之类的工具提供公网ip,进行内网穿透orz
    
    # 查看e494容器的运行日志
    docker log e494
    
    #进入e494这个容器的内部bash界面操作
    docker exec -it e494 bash
    

    基于docker部署应用

    部署应用,即将我们的App制作成镜像——Image,可以到处运行。制作image就需要编写Dockerfile,这是一个文本文件,docker根据这个文件生成image

    Dockerfile主要指令

    # 继承一个官方的基础镜像,这里是Python,tag = 2.7-slim
    FROM python:2.7-slim
    
    # 设置镜像工作目录
    WORKDIR /app
    
    # 拷贝当前目录文件到 镜像/app目录下
    ADD . /app
    
    # RUN表示运行一个Linux指令
    RUN pip install --trusted-host pypi.python.org -r requirements.txt
    
    # 设置容器对外端口
    EXPOSE 80
    
    # 设置环境变量
    ENV NAME World
    
    #让容器像一个可执行程序一样运行
    ENTRYPOINT ["/bin/echo"]
    
    #启动镜像时执行的指令,这是在image完成后的动作,一个dockerfile只能有一个cmd
    CMD ["python", "app.py"]
    

    使用docker部署一个spring boot项目

    • 制作Dockerfile
    #dockerfile
    #下载基础镜像java:8
    FROM java:8
    
    #将dockerdemo.jar(我们的springboot打包文件)复制到镜像目录,并改名为app.jar
    ADD dockerdemo.jar app.jar
    
    #镜像包对外端口为8080
    EXPOSE 8080
    
    #启用容器时运行指令 java -jar /app.jar
    ENTRYPINT ["java","-jar","/app.jar"]
    
    • 编译镜像

    将Dockerfile和jar包一起放在/var/app文件夹下,运行指令

    #luzj/docker 为镜像名,后面的.表示Dockerfile的目录在当前目录
    docker build -t luzj/docker .
    
    • 查看镜像库
    docker images
    

    docker镜像查询

    • 运行镜像
    docker run -d --name mydocker -p 8080:8080 luzj/docker
    
    • 访问http://192.168.11.128:8080/index

    访问容器

    参考

    docker官方文档

    Docker 中国官方镜像加速

    Spring Boot实战

    Docker 入门教程

  • 相关阅读:
    常用的STL
    CString,string,char数组的转换
    linux知识
    十一种通用滤波算法(转)
    修复被勒索病毒cl0p损坏的svn代码
    android shell 转发代理shell示例
    3proxy配置
    windbg调试写dmp,随机名字
    nexus6p刷机注意
    mysql语句学习
  • 原文地址:https://www.cnblogs.com/Franken-Fran/p/docker_Ftaste.html
Copyright © 2011-2022 走看看