Docker学习

介绍 :


  为了能让我们不同的程序可以在隔离的环境中运行;我们可以使用虚拟机;也可以使用Docker容器来进行环境隔离

  • 虚拟机:整个架构比较冗余,宿主机操作系统上又有多个操作系统运行,性能和效率会极大的降低
  • Docker:Docker引擎是运行在宿主机操作系统上的,跑的应用程序进程是可以在宿主机上查看到的

对比:

  • 虚拟机 [由下到上]。整个架构比较冗余,宿主机操作系统上又有多个操作系统运行,性能和效率会极大的降低
  • 第一层:地层硬件 Infrastructure
  • 第二层:操作系统 Host Perationg System
  • 第三层:虚拟化技术 Hypervisor
  • 第四层:虚拟机系统 Guest OS
  • 第五层:系统底层库 Bins/Libs
  • 第六层:我们跑在系统上的应用程序
  • Docker [由下到上]。Docker引擎是运行在宿主机操作系统上的,跑的应用程序进程是可以在宿主机上查看到的
  • 第一层:地层硬件 Infrastructure
  • 第二层:操作系统 Host Perationg System
  • 第三层:Docker引擎 Docker Engine
  • 第四层:系统底层库 Bins/Libs
  • 第五层:我们跑在系统上的应用程序

  

dockerfile 构建golang基础镜像 go docker部署_redis

 

区别:

  Docker引擎是直接运行在宿主机上的,对比可以看出Docker引擎相当于替代了Vm虚拟机和虚拟机操作系统

  由于Docker是运行在宿主机上的容器,所以我们在宿主机上是可以直接查看到我们运行起来的程序的进程的

  而在虚拟机操作系统中我们运行起来的程序,在宿主机上是无法查看到其运行的程序的进程的

  

dockerfile 构建golang基础镜像 go docker部署_Docker_02

组建:

  • Docker engine :Docker引擎[Server服务端、Client客户端]
  • Docker Hub:Docker镜像。别人打包好的镜像Image
  • Docker Registry:自己搭建的Hub提供镜像服务端地方
  • Docker Swarm:做Docker集群、Docker分布式用的
  • Docker Compose:写批量化启动Docker服务的脚本
  • Docker Cloud:企业收费的服务

概念:

  • Host:宿主机操作系统
  • Daemon:后台进程
  • Client:Docker命令。相当于客户端
  • Registry:源。私有搭建Docker Hub提供镜像服务端地方
  • Image:镜像。
  • container:容器。启动起来的环境[正在运行的环境]就叫容器。
  • 容器中包含的是要运行的应用,以及应用运行时所需要的所有环境
  • 一个Docker容器只干一件事情。如:redis一个容器mysql一个容器
  • Readonly:只读的。在Docker写的东西不会被保存
  • Single process:单个进程的

镜像与容器

  • 有一个Ubuntu和Django app环境打包好的镜像。可以启动起来多个Container容器
  • 镜像Image是不可改变Readonly的,容器Containers也是不可保存任何东西的.
  • 如果想要在一个镜像的基础上打包一个新的镜像如何处理呢?
  • Docker镜像是只读的不可改变的,如果有一个Ubuntu镜像,想要定制一个django镜像,就需要在
  • 底层的Ubuntu镜像+新加中层python镜像,两个镜像堆积到一起形成一个新的Ubuntu+python镜像
  • 再新加上层django镜像,三个镜像堆积到一起形成一个新的Ubuntu+python+django镜像就打包好了
  • 如果本地没有命令执行的镜像,需要从网上pul下拉dockerl镜像的时候,是如何处理的呢?
  • 镜像是不可改变的,当去网上下拉一个django镜像的时候,发现其以来于python镜像,
  • 然后去下拉python镜像,又发现python镜像依赖于Ubuntu镜像,然后再去下拉ubuntu镜像 
  • 如果已下拉成功Django镜像,又想下拉flask镜像,两者依赖的python和Ubuntu相同,本地已有就不会再重新下拉了[镜像id识别]

    

dockerfile 构建golang基础镜像 go docker部署_docker_03

 

命令示例:

  • docker run ubuntu /bin/echo 'hello word' 
  • 此命令是用docker去启动一个ubuntu镜像,然后执行Linux命令:/bin/echo 'hello word' 
  • Linux命令执行完后,此ubuntu就不在运行了,但是还在。
  • 相当于快速启动一个虚拟机运行完linux命令后快速退出。
  • 从新执行此Docker指令时,虽然是同一个ubuntu镜像,但运行的不是同一个ubuntu容器
  •  docker run training/webapp python app.py
  • 子命令是:run;镜像是:training/webapp;Linux命令:python app.py
  • training/webapp表示:识别符目录分级/webapp镜像
  • 此命令是启动一个training/webapp镜像,在此容器中运行叫app.py的python文件
  • 注意:Mac默认是不支持Docker的,其运行原理是Mac后台启动了一个小型Linux虚拟机运行Docker。

docker命令

  • docker ps:      查看正在运行的docker容器进程
  • docker ps  -a: 查看所有的docker容器进程,包括退出的
  • docker inspect docker容器进程ID或名字:  查看此docker详情
  • docker top docker容器进程ID或名字:        查看此docker容器中有哪些程序正在运行及详情
  • docker exec -it docker容器的ID或名字  /bin/bash:-it以交互模式进到该容器内部,执行/bin/bash命令启动命令执行程序
  • 进入后就和打开一个新的Linux虚拟机一样,可以在内执行Linux命令
  • 可以用命令修改此容器中程序的代码信息,但是改不了镜像中程序的代码信息
  • 你修改的只是容器中的文件,程序运行完后此容器里面的所有东西就都没有了;
  • 随着容器被删除,其拥有的资源和文件也都会被删除。但是镜像是一直存在的
  • docker run --help:查看子命令run的参数
  • docker run -e 环境变量参数 training/webapp python app.py:-e 参数 是为此容器设置环境变量的参数
  • docker stop docker容器进程ID或名字:停掉此Docker容器
  • docker start docker容器进程ID或名字:启动此Docker容器
  • docker rm docker容器进程ID或名字:   删除此Docker容器[必须是停止运行的容器才可以删除]
  • docker ps -a | cut -d ' ' -f1 | grep -v CONTAINER | xargs docker rm:同时删除所有的容器
  • docker ps -a :查看所有容器
  • cut -d ' ' -f1  :按照空格分割,取第一个
  • grep -v CONTAINER  : 取出不包含CONTAINER的信息
  • xargs docker rm  : xargs指当作docker rm

容器中的数据持久化 

实现原理:将容器中的某个目录映射到宿主机的某个目录中去 

未持久化测试:

  • docker run redis : 启动redis镜像
  • docker ps : 查看正在运行的docker容器信息
  • docker inspect docker容器进程ID或名字 :查看此docker容器的详细信息
  • docker inspect docker容器进程ID | grep IP :查看此docker容器的IP信息
  • redis-cli 此docker容器的ip : 链接redis
  • set a 10 : 存入一个键值对
  • get a : 可以获取到数据10
  • 如果没有对此redis容器做映射操作,当关闭此redis容器后,再去get获取reids中a的值是获取不到的
  • 再次启动redis容器,此时启动的是一个新的redis容器,也是不能get获取redis中a的数据的[已被删除]
  • 如果我们删除掉redis容器,这时我们就再也找不回redis中存放的数据了,这样的情况显然不是我们想要的,
  • 我们希望即使删除或关闭redis容器后里面的数据还会被保存下来,就需要持久化处理

做持久化测试:

  • docker run --name r1 -v /data redis
  • --name r1 : 给启动的redis容器起的名字
  • -v /data :  映射。映射到容器内的/data目录下生成一个dump.rdb文件
  • set a 10
  • save
  • docker exec -it r1 /bin/bash :进入名字叫r1的容器内部 并执行/bin/bash操作启动命令执行程序
  • cd /data :进入到data目录下
  • ls :查看,会生成一个dump.rdb文件
  • 在这种情况下关闭名叫r1的redis容器,再从新启动一个新的redis容器叫做r2。
  • 由于数据是被写到名叫r1的redis容器的/data文件夹中的,
  • 此时名叫r2的redis容器同样也是不能获取到保存的数据的
  • docker run --name r3 -v /tmp/redis:/data
  • -v /tmp/redis:/data  :-v 表示映射。
  • 将宿主机上的/tmp/redis目录 映射到
  • redis-cli 此容器的ip :链接容器的redis服务
  • set a 10 :在redis中存入数据
  • 此时停止或删除掉容器后,映射到宿主机上文件还在,里面的数据还是保存完好的
  • 再次启动redis容器的时候是要指定宿主机和容器的文件映射关系的,否则新容器找不到的
  • 再次启动容器:docker run --name r4 -v /tmp/redis: /data redis 数据是可以回去到的

docker命令

Usage: [sudo] docker [subcommand] [flags] [arguments]

  • docker run ubuntu /bin/echo ‘Hello World’
  • run启动一个ubuntu的docker镜像后,执行Linux命令/bin/echo 'Hello Word'
  • docker run training/webapp python app.py
  • run启动一个training/webapp的docker镜像后,执行运行python的app.py文件
  • docker ps
  • 查看正在运行的docker容器信息。-a表示所有
  • docker top
  • 查看此docker容器中有哪些程序正在运行及详情
  • docker exec -it
  • 进到该容器内部,-it以交互的模式 
  • docker stop <container_id>
  • 停止该容器 
  • docker rm <container_id>
  • 删除该容器
  • docker run -v /data redis
  • 启动redis镜像,文件映射到/data文件夹下
  • docker run --rm --name r1 -v /data/redis:/data redis
  • docker run :启动docker的redis镜像
  • --rm :退出容器时同步将此容器删除
  • --name r1 :为开启的容器起一个名字叫r1
  • -v : 映射
  • -v /data/redis: /data :将宿主机上的/data/redis目录 映射到 名叫r1的redis容器内的/data目录上
  • docker run --rm --volumes-from r1 --name r2 redis
  • docker run :启动docker的redis镜像
  • --rm :退出容器时同步将此容器删除
  • --volumes-from r1  :新开启的容器继承自容器r1,意思是说和r1容器使用的是同一个映射目录
  • --name r2 :为新开启的容器起一个名字叫r2
  • docker run --rm --name wp -p 0.0.0.0:8080: 80
  • run:启动wordpress镜像服务
  • --rm : 退出后自动删除此容器
  • --name wp :为容器起一个名字叫wp
  • -p 0.0.0.0:8080: 80 :将本地宿主机的8080端口映射到wordpress镜像运行的80端口上
  • 这样就可以通过本地的ip访问这项服务
  • docker
  • 查看docker所有的子命令
  • docker 子命名 --help:查看子命令使用方式
  • docker cp 
  • 将宿主机本地中的文件拷到容器中;或者将容器中的文件拷到宿主机本地中。进行文件交互
  • docker cp 容器名 : 容器内的文件路径 本地存放的路径
  • docker cp webapp:/opt/webapp/app.py .
  • 将webapp容器中的/opt/webapp/app.py文件拷到本地的当前目录下(点).
  • docker cp app.py webapp:/opt/webapp/app.py 
  • 将本地当前目录下的app.py文件拷到webapp容器中的/opt/webapp/app.py文件中

镜像

镜像操作:

  • docker search
  • docker search django
  • 如果想装一个django镜像但不确定其名字时,就可以用search搜索一下
  • 这时就会列出所有保含django这个名字的所有镜像
  • docker pull
  • 指定某个镜像,并下载下来
  • docker pull mysql 
  • 下载mysql镜像。其依赖的其他镜像如果本地已存在就不会重复下载
  • docker pull mysql:5.7
  • 指定下载mysql的5.7的版本。没有指定的话默认下载最新版本「mysql : latest」
  • docker images
  • 查看本地有多少下载下来的镜像
  • docker rmi
  • 删除下载的某个镜像
  • docker rmi 镜像ID
  • docker rmi 镜像名: 版本号
  • 如果不指定版本号,默认找的是latest

打包镜像:

定制并打包自己的镜像。将自己定制修改后的容器打包成属于自己的镜像

  • docker commit -m “add supervisor” -a “YaPeng” <container_id> python:2.7s
  • docker commit -m "change port" -a "gyp"  webapp gyp/webapp:1.0
  • -m "change port"
  • -a "gyp"
  • webapp    
  • gyp/webapp:1.0
  • docker images
  • 查看本地下载或已有的镜像
  • docker run --rm --name web gyp/webapp:1.0 python app.py
  • run:运行自己打包的镜像
  • --rm:退出容器时同步删除此容器
  • --name web:为此容器起的名子叫web
  • gyp/webapp:1.0:镜像名字: 镜像版本号
  • python app.py:Linux命令,运行名叫app.py的python文件
  • 查看名叫web容器的详细信息
  • curl http://172.17.0.3:6000/
  • 终端访问ip为172.17.0.3:6000的程序

镜像发布:

  • 首先去DockerHub上注册一个docker账号
  • docker login
  • docker push gyp/webapp:1.0
  • 将自己的镜像上传到DockerHub上去
  • 注意:gyp此处名字必须和docker的用户名一致
  • 镜像上传的时候也是分层的,不会上传Docker仓库中已有的镜像

 

 

 

 

 

 


生如逆旅 一苇以航