为什么使用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

安装指令

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

启动与关闭

  1. service docker start
  2. service docker stop

修改镜像源

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

方法一

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

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

方法二

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

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

最后,改完重启:

  1. 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下来

  1. # 拉取redis镜像
  2. docker image pull redis

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

container

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

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

常用的cheat sheet

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

基于docker部署应用

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

Dockerfile主要指令

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

使用docker部署一个spring boot项目

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

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

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

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

参考

docker官方文档

Docker 中国官方镜像加速

Spring Boot实战

Docker 入门教程

docker基础——关于安装、常用指令以及镜像制作初体验的更多相关文章

  1. Docker源码安装附内网镜像安装演示

    Docker源码安装附内网镜像安装演示 系统版本要求 当前系统版本:CentOS Linux release 7.9.2009 (Core) 内核版本:3.10.0-1160.el7.x86_64 注 ...

  2. Docker Alpine Dockerfile 安装nginx,最小镜像

    Docker Alpine Dockerfile 安装nginx,最小镜像 FROM alpine MAINTAINER will ## 将alpine-linux:apk的安装源改为国内镜像 RUN ...

  3. 第三次随笔--安装虚拟机及学习linux系统初体验

    第三次随笔--安装虚拟机及学习linux系统初体验 ·学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 首先按照老师的提示步骤进行VirtualBox虚拟 ...

  4. 【Docker】docker 入门以及一些常用指令

    概述 Docker是一款针对程序开发人员和系统管理员来开发.部署.运行应用的一款虚拟化平台.Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的 ...

  5. Docker Kubernetes YAML文件常用指令

    YAML文件常用指令 配置文件说明: 定义配置时,指定最新稳定版API(当前为v1). 配置文件应该存储在集群之外的版本控制仓库中.如果需要,可以快速回滚配置.重新创建和恢复. 应该使用YAML格式编 ...

  6. docker系列(一):docker基础与安装笔记

    1 什么是docker docker是基于GO语言编写的开源容器项目,诞生于2013年初,到目前为止,已经经历了6年的发展演变.现如今,docker已经非常火爆,特别是在一线IT企业,部署.运维等工作 ...

  7. Docker基础教程(常用命令篇)

    1.查看docker信息 # 查看docker版本 $docker version # 显示docker系统的信息 $docker info 2.启动容器 # 交互式 $docker run -it ...

  8. Docker学习笔记_Dockerfile常用指令

    Dockerfile常用指令

  9. Python基础学习参考(一):python初体验

    一.前期准备 对于python的学习,首先的有一个硬件电脑,软件python的运行环境.说了一句废话,对于很多初学者而言,安装运行环境配置环境变量的什么的各种头疼,常常在第一步就被卡死了,对于pyth ...

随机推荐

  1. 【Linux】ping命令详解

    1.ping指定目的地址10.10.0.1 为接口tun0 ping 10.10.0.1 -i tun0

  2. C#多样式EXECl导出

    sing NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.HSSF.Util; using System; using System.Collecti ...

  3. Python列表类型及常用操作

    Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...

  4. 腾讯bugly 映射用法

    package com.tencent.bugly.agent; import android.app.Activity; import android.content.Context; import ...

  5. python模块详解 XML

    XML模块 XML是实现不同语言或程序之间进行数据交换的协议,和json一样. XML格式: <?xml version="1.0" encoding="UTF-8 ...

  6. element-ui打包的坑爹之处 !!!必看三遍!!!

    最近笔者打包element-ui出现如下问题: ERROR in static/js/0.4cad92088cb8dc6e7afd.js from UglifyJs Unexpected token: ...

  7. HTML-JS-CSS基础

    HTML-JS-CSS基础 1.html hyper text markup language,超文本标记语言,所见即所得.web开发中用于展示功能的部分,浏览器可对其进行渲染.产生各种可视化组件,比 ...

  8. 去除Windows平台下每行代码的“^m”

    有时在Windows里编写好的shell脚本放到Linux里不能运行了,打开编辑器显示正常,结果用vim打开发现每一行末尾都有^m,于是搜了一下解决办法. Windows上写好的文件,在Linux或者 ...

  9. SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI

    SAP Cloud for Customer(C4C)和SAP其他传统产品进行数据同步的方式,如下图所示,可以使用SAP Netweaver Process Integration或者SAP HANA ...

  10. linux lnmp搭建

    1.安装nginx: yum install gcc -y yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum inst ...