1.Docker入门

1.为什么要用docker?

相比于传统:
部署非常慢
成本非常高
资源浪费
难于迁移和扩展
可能会被限定硬件厂商
  • 由于物理机的诸多问题,后来出现了虚拟机

  • 一个物理机可以部署多个app,每个app独立运行在一个VM里。

  • 但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道程度时,操作系统本身资源也就消耗殆尽,或者说必须扩容。

  • 由于环境部署配置的麻烦,出现了以下

    • 程序员将代码以及程序依赖,打包成一个docker镜像文件,以后需要把这个镜像文件,发给测试,运维,只需要安装docker,安装这个镜像文件,就可以运行开发环境了。

2.Docker VS 传统虚拟机

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生
系统支持量 单机支持上千个容器 一般几十个

3.环境配置的难题

  • 让开发人员最头疼的麻烦事之一就是环境配置了,每台计算机的环境都不相同,应该如何确保自己的程序换一台机器能运行起来呢?
  • 用户必须确保的是:
    • 操作系统的相同
    • 各种平台库和组件的安装
    • 例如python依赖包,环境变量等
  • 如果环境配置这么痛苦的话,换一台机器,就得重新配置一下,那么在安装软件的时候,带着原始环境一模一样的复制过来。

解决方案1:虚拟机

  • 虚拟机也可以制作模板,基于模板创建虚拟机,保证环境问题一致
  • 虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
  • 虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

1)资源占用多

虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。

(2)冗余步骤多

虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。

(3)启动慢

启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

解决方案2:Linux容器

  • 由于虚拟机的诸多问题,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写LXC)
  • 现在:自从用上docker容器后,可以实现开发、测试和生产环境的统一化和标准化。
  • Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。在正常进程的外面套了一个保护层,对于容器里面进程来说,它接触的资源都是虚拟的,从而实现和底层系统的隔离

(1)启动快

容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少

容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3)体积小

容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

  • 说的通俗点:Docker作用

    解决环境部署问题,基于一个镜像文件,能够运行出容器示例,就不需要做环境部署。

4.docker容器的优势

更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意 地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员 可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系 统进行集成测试,
而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

5.工作中的虚拟化和容器

6.Docker的三大生命周期概念

  • 镜像文件,可以理解为操作系统的
  • 容器实例,基于docker镜像运行出的容器实例 ,可以理解为微型操作系统
  • 仓库,存储镜像文件的地方

7.docker安装方式

1.yum安装,配置yum仓库
-阿里云仓库,清华源仓库,163仓库, 问题是,docker的版本可能很低,有很多漏洞
-选择软件官方提供的yum仓库,版本都是最新的,但是可能下载较慢
-由于网速问题,学习阶段还是使用阿里云的docker [root@xujunk ~]#yum install docker -y 2.rpm 不推荐 3.源码编译安装,很麻烦,如果没有特定需求,还是选择yum
  • 卸载docker
yum remove docker* docker-* -y

8.Docker镜像加速器

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

9.镜像,仓库,容器的增删改查管理命令

  • 启动
systemctl status/start/stop docker
[root@xujunk ~]#docker images  #列出当前所有的镜像文件 

[root@xujunk ~]#docker  run  hello-world   #运行镜像文件,生成docker容器实例,docker run命令,会自动下载不存在的镜像
#容器是随时创建,随时删除的,轻量级,每次docker run 都会生成新的容器记录
#docker容器进程,如果没有在后台运行的话,就会立即挂掉, (容器中必须有正在工作的进程) #运行一个一直活着的容器进程
docker run -d centos /bin/sh -c "while true;do echo '你个糟老头子,不听课,坏得很'; sleep 1;done"
docker rmi  镜像名字/镜像id   #删除镜像文件
docker rm 容器id/容器进程名字 #删除容器记录
docker rmi -f #强制删除镜像文件
docker rm `docker ps -aq` #批量删除容器记录,只能删除挂掉的容器记录
#docker容器进程的启停命令

docker start  容器id
docker stop 容器id
docker search  镜像文件名字   #搜索镜像文件
docker images #列出当前所有的镜像文件
docker ps #列出当前记录正在运行的容器进程
docker ps -a #列出所有的容器进程,以及挂掉的 docker logs 容器id #查看容器内的日志信息
docker logs -f 容器id #检测容器内的日志
docker ps -aq #列出所有容器id #进入容器空间内的命令
docker exec -it 容器id /bin/bash #进入容器空间内
-i 交互式命令操作
-t 开启一个新的终端
#退出容器
exit #运行一个ubuntu容器
docker run -it ununtu cat /etc/os-release #查看一个系统版本
  • 删除一个镜像方式
1.ps -a #查看是否有用此镜像运行中的容器
2.docker stop 容器id #将启动中的容器关闭
2.docker ps -a #查看所有的容器进程,以及挂掉的
4.docker rm 容器id #删除残留容器
5.docker rmi 镜像文件名字 #删除镜像文件
  • 提交一个自定制的镜像文件
#过程实现
#运行出容器实例 二次修改容器实例 提交容器实例为新的镜像 导出镜像 发给别人导入 1.docker run -it centos /bin/bash #进入一个纯净的centos容器空间内,此时是最小化安装的系统,没有vim 没有py3 2.在容器空间内 yum install vim ,然后退出容器 3.此时这个容器记录就是携带者 vim的容器记录了(可以理解为携带者程序依赖,或者python3等等) 4.提交这个容器为新的 镜像文件
311110e1ec56
docker commit 容器进程id 镜像文件的名字
docker commit 419 s21docker-centos-vim
#e.g.:[root@xujunk ~]#docker commit 311110e1ec56 docker-centos-vim
sha256:d1870159517111e3756f022fdc851a3c90b1bef6daf2c54b4d0a8a3da4224a1 5.导出docker镜像,成为一个压缩文件,可以发送给你的测试,运维同事了 docker save 镜像文件名/镜像id > /opt/centos-vim.tar.gz [root@xujunk ~]#docker save d18701595171 > /opt/centos-vim.tar.gz 6.此时可以发送文件,给别人导入了
#这里为了简便在本机进行操作,将原镜像文件删除
[root@xujunk ~]#docker rmi 镜像文件id docker load < 同事给你发的镜像文件
[root@xujunk ~]#docker load < /opt/centos-vim.tar.gz
  • **容器内运行一个web程序 ,进行端口映射 **
1.下载一个flask的docker镜像
[root@xujunk ~]#docker pull training/webapp 2.运行docker镜像 docker run -d -P
-d 后台运行
-P 随机端口映射 随机的宿主机的端口:容器内的端口(自动指定的,由代码指定)
-p 指定端口映射 宿主机的7777:8500 3.创建一个容器空间,然后在里面执行 python app.py 命令
[root@xujunk ~]#docker run -d -P training/webapp python app.py 创建一个容器空间,然后在里面执行 python app.py 命令
[root@xujunk ~]#docker run -d -p 6000:5000 training/webapp python app.py 3.查看后台运行容器端口:
[root@xujunk ~]#docker ps
"""
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ff5a02461a2 training/webapp "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:32769->5000/tcp musing_tesla
"""
4.访问这个容器应用
服务器ip:宿主机的映射端口
浏览器输入:
192.168.58.131:32768 5.进入容器空间内,查看代码

10.dockerfile学习

  • dockerfile学习,docker的脚本文件,用于构建镜像文件的
#FROM指令用于  指定容器用什么发行版

#制作base image 基础镜像,尽量使用官方的image作为base image
FROM scratch
#使用base image
FROM centos
#带有tag的base image
FROM ubuntu:14.04 #定义标签变量的
LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer="yc_uuu@163.com" #万能RUN指令,让容器自己去做些什么事
#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim \
Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
RUN yum install redis #自动安装redis WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test #如果没有就自动创建
WORKDIR demo #再进入demo文件夹
RUN pwd #打印结果应该是/test/demo - 小示例:
"""
WORKDIR /opt
WORKDIR /tmp
WORKDIR ../
"""
#路径切换到根目录 # ADD命令用来 将宿主机的文件添加到容器空间内
#ADD存在压缩文件解压的功能,因此,仅仅添加文件到容器内,用COPY而不是ADD ADD and COPY
ADD hello / #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
ADD test.tar.gz / #添加到根目录并解压 ENV #环境变量,尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 #设置一个mysql常量 示例:RUN yum install -y mysql-server=“${MYSQL_VERSION}”

11.dockerfile构建一个flask web app

1.创建一个文件:
[root@xujunk opt]#mkdir s21docker
[root@xujunk opt]#cd s21docker
2.编写flask代码文件
[root@xujunk s21docker]#vim s21flask.py
"""
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
return "hello docker"
if __name__=="__main__":
app.run(host='0.0.0.0',port=8080)
"""
3.准备Dockerfile (名字必须叫做 Dockerfile)
"""
FROM centos
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY epel.repo /etc/yum.repos.d/
RUN yum clean all
RUN yum install python-setuptools -y
RUN easy_install flask
COPY s21flask.py /opt/
WORKDIR /opt
EXPOSE 8080
CMD ["python","s21flask.py"] """
4.在Dockerfile同级目录,准备好其他环境文件,代码文件:CentOS-Base.repo Dockerfile epel.repo s21flask.py
[root@xujunk s21docker]#cp /etc/yum.repos.d/CentOS-Base.repo ./
[root@xujunk s21docker]#cp /etc/yum.repos.d/epel.repo ./
#查看s21docker目录下文件:
[root@xujunk s21docker]#ls
CentOS-Base.repo Dockerfile epel.repo s21flask.py 5.构建docker镜像 docker build -t xujunkai521/s21-flask-docker .
docker build 编译Dockerfile
-t 给镜像加上名字 ,镜像名字,以仓库地址开头,则可以推送到仓库中管理
. 找到当前的Dockefile文件 #会按照Dockerfile从上到下一步一步编译 6.构建完毕之后,查看镜像文件
[root@xujunk s21docker]#docker images 7.运行这个flask镜像文件,生成容器实例,代码就跑在容器中了
[root@xujunk s21docker]#docker run -d -p 9999:8080 指定你要运行的镜像id/名字 8.web端访问http://192.168.58.131:9999/ 成功访问
  • docker run解析:

12推送本地镜像到docker hub 共有仓库

  • 流程图:

  • 代码流程

    1.登录docker账户
    [root@xujunk s21docker]#docker login
    2.修改docker镜像文件名字,以docker hub账号开头
    [root@xujunk s21docker]#docker tag docker.io/redis xujunkai521/redis
    3.推送镜像到dockerhub仓库中,(注意这个是公共仓库)
    [root@xujunk s21docker]#docker push xujunkai521/redis

13.私有docker仓库搭建(保证镜像安全)

1.下载私有仓库镜像文件
[root@xujunk s21docker]#
docker run -d \
-p 5000:5000 \ # 宿主机的端口(自定义,自己考虑去分配):容器内暴露的端口(django中写了 8000),flask 5000
-v /opt/data/registry:/var/lib/registry \
registry -p 表示端口映射
-v 表示宿主机路径和容器内路径的映射
2.修改docker的配置文件,支持推送非https的私有镜像
[root@xujunk s21docker]#cat /etc/docker/daemon.json ,内容如下 {
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries": [
"192.168.58.131:5000"
]
} 3.修改docker的启动文件,加载第二步,修改的配置文件
[root@xujunk s21docker]#vim /lib/systemd/system/docker.service #找到如下的[Service] 代码块,添加参数
[Service]
EnvironmentFile= -/etc/docker/daemon.json
4.修改了docker配置文件,重新加载docker
[root@xujunk s21docker]#systemctl daemon-reload
5.重启docker服务
[root@xujunk s21docker]#systemctl restart docker
6.由于重启了docker,需要重新运行私有仓库的容器进程 [root@xujunk s21docker]#docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry --privileged=true docker容器的安全机制:设置特权级运行的容器
7.建立完私有云,就上传一波文件吧!
[root@xujunk s21docker]#docker tag docker.io/hello-world 192.168.58.131:5000/hello-666
#把hello-666镜像 上传到192.168.58.131:5000路径
[root@xujunk s21docker]#docker pull 192.168.58.131:5000/hello-666 8.查看浏览器:
http://192.168.58.131:5000/v2/_catalog
  • hello-666上传到私有仓库

如何要把文件下拉下来,执行下面命令:
[root@xujunk s21docker]#docker pull 192.168.58.131:5000/hello-666

Docker 基础篇 入门篇的更多相关文章

  1. Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码

    Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...

  2. 项目17-超详细“零”基础kafka入门篇

    分类: Linux服务篇,Linux架构篇   1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1) ...

  3. 一、Ansible基础之入门篇

    目录 1. Ansible基础 1.1 介绍 1.2 工作原理 1.3 如何安装 1.3.1 先决条件 1.3.2 安装Ansible 1.4 管理节点与被管理节点建立SSH信任关系 1.5 快速入门 ...

  4. Docker系列之入门篇

    Dcoker是什么? 概述 Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行 ...

  5. 超详细“零”基础kafka入门篇

    1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1)流媒体平台有三个关键功能: 发布和订阅记录流,类 ...

  6. Docker基础(1) 原理篇

    Docker是什么 Docker的构成 Docker的分层和写时拷贝策略 Docker与主流虚拟机的区别 Docker镜像与容器的关系 镜像的变更管理 Docker是什么 Docker是一个开源的应用 ...

  7. 二、JavaScript语言--JS基础--JavaScript入门篇

    1.如何插入JS 使用<script>标签在HTML网页中插入JavaScript代码.注意, <script>标签要成对出现,并把JavaScript代码写在<scri ...

  8. JVM基础快速入门篇

    Java是一门可以跨平台的语言,但是Java本身是不可以实现跨平台的,需要JVM实现跨平台.javac编译好后的class文件,在Windows.Linux.Mac等系统上,只要该系统安装对应的Jav ...

  9. Docker基础——从入门到精通

    一个完整的docker由几个部分组成? docker client  docker daemon docker images docker containers 容器是一个存储.运输工具,它能对容器内 ...

随机推荐

  1. 动态查找之二叉树查找 c++实现

    算法思想 二叉搜索树(又称二叉查找树或二叉排序树)BST树 二叉查找树 二叉查找树,也称二叉搜索树,或二叉排序树.其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树: (1)若任意节点的左 ...

  2. SonarQube7.4安装和使用

    声明 本文转自:https://www.jianshu.com/p/dd4a4bc59fc3?from=singlemessage 正文 近期比较关注代码的检测,之前由于用的findbugs,因此没有 ...

  3. Windows通过URL启动本机App

    Windows通过URL启动本机App http://xxx.itdhz.com/?file=001-Windows/100-Windows通过URL启动本机App

  4. Swift5升级遇到的AVCapturexxxDelegate的坑,写法换了

    升级到swift5之后,遇到关于AVCapture的两个代理都失效了, 找了一圈,发现原因是代理方法写法变了,如果不替换,代理事件就收不到了 解决方法: 替换新写法就可以了 我这边只举例我遇到的两个例 ...

  5. 如何在nginx下实现访问web网站密码认证保护的功能

    在某些特定的环境下,我们希望nginx下的web站点在访问时需要用户输入账户密码才能访问.以便拒绝那些不速之客. 其实,配置起来也很简单,按照下面的步骤即可实现. 一.编辑虚拟主机配置文件. serv ...

  6. JS 从整数里 随机选一个

    比如:现有数字随机一个 num = 3)) // 现有数随机一个 randomNum 的值只会是 0 1 2 3 里的随机一个 如果想要从数组随机一个下标index 就不要+1 如: parseInt ...

  7. SQL调用另一台服务器的表及存储过程(SQL函数openrowset()的使用以及相关问题处理)

    --查询表select * from openrowset('SQLOLEDB', 'IP'; 'sa'; '密码',数据库名称.dbo.表名称) --查询存储--示例1select * from o ...

  8. 002-Python3-基础语法-赋值、显示类型、数据类型[数值、字符串、列表、元祖、集合、字典]

    一.基础语法 参看地址:https://www.runoob.com/python3/python3-tutorial.html 基础数据类型 Python 中的变量不需要声明.每个变量在使用前都必须 ...

  9. PHP Y2K38 (2038年) 问题

    PHP 的 strtotime('2100-01-01'); 转换失败:经查询是因为32位系统的 Y2K38问题: Y2K38 问题:当时间大于 2038年01月19日03:14:07 时,strto ...

  10. elasticsearch中mapping的_source和store的笔记(转)

    原文地址: https://www.cnblogs.com/zklidd/p/6149120.html 0.故事引入 无意中看到了ES的mapping中有store字段,作为一个ES菜鸡,有必要对这个 ...