什么是docker?

很多人都是使用docker但是对docker的理解其实并没有这么透彻,只知道怎么用但是不知道为什么用 什么时候去用。

一、环境配置的难题

    软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

    用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量

    环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

Linux 容器

由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

1、先卸载你的旧版本的docker(可以不卸载别较真 哈哈)

CentOS安装docker

请遵循官方安装方式!!!

https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-after-using-the-convenience-script

官方教程如下,最正确安装docker姿势

1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine 2.设置存储库
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo 3.安装docker社区版
sudo yum install docker-ce
4.启动关闭docker
systemctl start docker

2、下载docker加速器

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

下载完成之后就重启docker然后就可以了

然后看看你的配置是否生效了

cat /etc/docker/daemon.json

也可以手动进行和配置加速器:

cat /etc/docker/daemon.json #修改这个文件为如下内容

{
"registry-mirrors": [
"http://95822026.m.daocloud.io"
],
"insecure-registries": []
}
---------------------------------------------------------
或者用这条命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io #事后重启docker
systemctl restart docker

然后查看docker版本 和状态信息

docker   version

在启动docker的时候有时候会报错:WARNING: IPv4 forwarding is disabled. Networking will not work.

是因为docker被禁用了 我们要去系统配置中打开设置

我们需要在/usr/lib/sysctl.d/00-system.conf中添加

systemctl restart network && systemctl restart docker

查看docker所有的镜像

docker images
也可以
docker image ls

如果查看docker  镜像的时候发现下面的错误就是你的docker安装了但是 是没有启动的

需要先启动docker

启动docker:

    systemctl start docker

su root # 先切换到root用户, 再执行以下命令

systemctl enable docker # 开机自动启动docker

systemctl start docker # 启动docker
systemctl restart docker # 重启dokcer

我们想下载的镜像可以直接通过pull来下载 但是下载之前也可以通过search来看看要下载的信息

docker  search + 要查看的镜像

docker  search hello-world  # 查看hello-world镜像

就可以看到不同的版本的镜像的点赞数目

我们最好以点赞数目最多的使用

分层技术一层一层下载

小技巧:

你可以直接run一个镜像的前3位id 就可以跑它

查看运行的docker 容器

docker  ps  查看正在运行的docker 容器

docker  ps -a   查看所有的运行过的容器

docker ps -aq 查看所有的容器id

删除docker镜像

docker  rmi +要删除的镜像名(镜像id)

docker  rm +要删除的容器id

镜像是你下载下来的  容器是你启动的镜像生成的

批量删除:

docker ps -aq 是查看你的所有的正在运行的容器id
然后用反引用号 把这查到的id都加进去 docker rm `docker ps -aq`
批量删除已经推出的容器:
  docker container prune

当你删除镜像的时候可能会发生:

Error response from daemon: conflict: unable to delete 1e1148e4cc2c (cannot be forced) - image has dependent child images

这个是由于你的镜像有正在运行的生成的容器造成的,我们要先删除其生产的容器然后再进行镜像的删除

当报错无法删除的时候就进行值的

然后  docker ps -a 查出所有的容器id

然后docker  rm 删除对应的容器  就可以 了

如果容器很多那就要一个一个删除或者删除所有的推出额镜像:docker container prune

然后再查看你的容器就没有了

运行一个ubuntu容器

咱们要在cenots7操作系统下,以docker下载一个ubuntu image文件,然后以image启动容器

docker pull ubuntu

或者指定版本:docker pull ubuntu:14.04

运行这个乌班图容器!

docker run  ubuntu

也可以指定参数启动
docker run - rm ubuntu

dicker 启动的参数

docker run就是运行容器的命令。
参数
-it : -i 是交互式操作,-t是终端
--rm : 容器退出后将其删除。也可以不指定参数,手动docker rm,使用-rm可以避免浪费空间。
ubuntu:14.04 这指的是镜像文件
bash : 指定用交互式的shell,因此需要bash命令 eg:
docker run --rm ubuntu # 启动后删除 不留痕迹 docker ps -a 也看不到
  docker run -it --rm ubuntu # 启动是的交互命令结束不留痕迹

用 --rm 参数启动的和无参数的是不一样的

执行了docker run -it --rm unbuntu 之后交互界面的信息都不一样了

在这个里面查看系统都显示是ubuntu的了   cat /etc/os-release

 docker  运行centos

下载centos后 然后用-it进行centos容器内的交互界面

-d后台运行

docker run -d centos  /bin/bash -c  '你要执行的shell脚本'

docker run -d centos  /bin/bash -c 'while true;do echo hello docker66666;sleep 1;done'

然后就会返回给我们一段执行后的启动后的id

然后我们想要查看这个进程运行的信息

 docker exec -it  要查看的进程id  /bin/bash 

 docker exec -it  78b  /bin/bash 

查看容器内的输出

然后我们退出centos内的进程 到外面查看docker 的日志 因为刚才是在centos容器内  我们的docker 是安装在服务器内的 所以要到服务器的大环境内 而不是某一个docker容器内

docker  logs  +要查看的进程id

也可以在后面 加上-f 参数 可以一直查看  和tail -f 一样

 查看docker  的进程

docker ps

停止docker  进程

如果我们有docker进程这个时候不想让他跑了就用stop

docker  stop +要停止的docker进程

重现再跑起来 要么执行最开始跑的命令 要么就执行start

docker start  +要启动的进程

先查看以前跑过的进程再start

docker 自定义镜像  commit(构建自定义的镜像)

我们在启动 的docker进程有个id  我们可以根据这个id来打包

docker  commit + 要打包的进程id  +新起的包名

外部访问容器

容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射

docker run -d -P trainning/webapp python app.py

参数解析:
  -d 后台运行容器
  -P 随机端口映射
  -p 宿主机端口容器端口(就是可以指定端口小写的p指定端口容器)
  

也可以通过-p参数指定映射端口

#指定服务器的9000端口,映射到容器内的5000端口
[root@oldboy_python ~ 16:46:13]# docker run -d -p 9000:5000 training/webapp python app.py
c0b5a6278d0f4f2e9b9eba8680451111d8b911b61de0c37ea64cb337aefb854e

docker运行一个flask web应用,暴露端口供给windows使用

1、首先我们要先下载系统镜像 centos, 然后启动这个镜像生成容器

2、然后进入这个镜像内安装python2的软件管理工具 easy_install

3、安装flask

4、编写好flask脚本

5、退出容器产生容器id记录

6.提交此容器记录,构建镜像

7.查看镜像

8.运行flask_web镜像,暴露端口访问

9.此时在windows浏览器访问 7000端口的 flask应用

    1.docker run -it centos
2. 安装 easy_install 命令,python2软件包管理
yum install python-setuptools
3.安装flask
easy_install flask
4.编写好flask web脚本
    cd /home # 脚本写在home下
    然后yum install vim -y 安装vim 编辑器
    touch flask_web.py # 建立一个脚本文件编辑脚本
from flask import Flask app = Flask(__name__)

@app.route('/')
          def index():
                return 'Hello This is docker'

        #此脚本当做模块导入时候,__main__里代码不执行
#当做脚本文件直接运行的时候,执行__main__代码
if __name__ == '__main__':
app.run(host='0.0.0.0',port=9000) 5.退出容器,产生容器id记录
exit
6.提交此容器记录,构建镜像(找到你的容器内的id你进入的时候会有显示的)
docker commit 976 s12/flask_web
7.查看镜像
docker images
8.运行flask_web镜像,暴露端口访问 启动的时候要指定python解释器
docker run -d -p 7000:9000 s12/flask-web python /home/flask-web.py
9.此时在windows浏览器访问 7000端口的 flask应用

然互docker ps查看是否启动了

接着访问指定的7000端口就能看到内容了

docker hub

docker hub 顾名思义就是一个类似于我们常用的github存储代码一样这个是存储我们的  生成的容器的

首先我们打包的镜像 直接推送是不可以的  需要先起个tag名字才能进行推送的

打包:

docker  tag 镜像名字   你的dockerhub名字/起的tag名字

docker tag caicai/flask-web zyltry/caicai  # 给我的caicai/flask-web镜像在zyltry的dockerhub下起个caicai的tag

然后直接docker images  然后把你起的tag生成的镜像名字推上去

直接docker  push + 镜像名字

然后 就可以在你的 docker  hub上看到你提交的信息了

发布docker image到仓库

第一种,docker hub公有镜像发布

1.docker提供了一个类似于github的仓库dockerhub,
网址https://hub.docker.com/需要注册使用
2.注册docker id后,在linux中登录dockerhub
docker login 注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
docker tag chaoyu/centos-vim zyltry163/centos-vim
语法是: docker tag 镜像名 docker hub名字/仓库名 3.推送docker image到dockerhub
docker push 镜像名字:latest
4.在dockerhub中检查镜像
https://hub.docker.com/
5.删除本地镜像,测试下载pull 镜像文件
docker pull 镜像名

 

私有仓库

初始docker的更多相关文章

  1. 第1章 初始Docker容器

    1.1 什么是Docker slogan:Build Ship Run Any App Anywher.关键在于Ship,通过把程序和程序运行所需要的环境一起交付. Linux容器技术: Docker ...

  2. 【Docker学习之一】初始Docker

    一.云计算的概念 PaaS(Platform-as-a-Service:平台即服务),把应用服务的运行和开发环境作为一种服务.SaaS(Software-as-a-Service),意思为软件即服务, ...

  3. Docker++:从 0 到 1 学习Docker(笔记)

    本篇文章有点长 ... 知识点如下:下 ↓ ↓ ↓ ~ 初识 Docker  ~ Docker 命令 ~ Docker 容器的数据卷 ~ Docker 应用部署 ~ Dockerfile ~ Dock ...

  4. Docker容器化技术

    1. 初始Docker 1.1 Docker概念 Docker概念:Docker是一个开源的应用容器引擎 诞生于2013年初,基于Go实现,dotCloud公司出品(后改名为Docker Inc) D ...

  5. Hyperledger Fabric组织的动态添加和删除

    前言 在Fabric定制联盟链网络工程实践中,我们虚拟了一个工作室的联盟链网络需求,并根据此需求分析了整个网络的架构且已经完成了一个简单 fabric 网络模型.本文将在其基础上,在 mychanne ...

  6. Hyperledger Fabric节点的动态添加和删除

    前言 在Hyperledger Fabric组织的动态添加和删除中,我们已经完成了在运行着的网络中动态添加和删除组织.本文将在其基础上,详细介绍了如何在 soft 组织上添加新的 peer2 节点,并 ...

  7. Hyperledger Fabric无系统通道启动及通道的创建和删除

    前言 在Hyperledger Fabric组织的动态添加和删除中,我们已经完成了在运行着的网络中动态添加和删除组织,但目前为止,我们启动 orderer 节点的方式都是通过系统通道的方式,这样自带系 ...

  8. Hyperledger Fabric无排序组织以Raft共识算法启动多个Orderer服务、多组织共同运行维护Orderer服务

    前言 在Hyperledger Fabric无系统通道启动及通道的创建和删除中,我们已经完成了以无系统通道的方式启动 Hyperledger Fabric 网络,并将链码安装到指定通道.但目前为止,实 ...

  9. Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务

    前言 在实验Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务.多组织共同运行维护Orderer服务中,我们已经完成了让普通组织运行维护 Orderer 服务,但是 ...

随机推荐

  1. Unable to handle kernel NULL pointer dereference at virtual address 00000000问题的解决

    今天在编译好内核模块后,安装内核模块memdev.ko的时候,出现了Unable to handle kernel NULL pointer dereference at virtual addres ...

  2. MySQL Optimization 优化原理

    MySQL Optimization 优化原理 MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图. ...

  3. Java 集合框架:HashMap

    原文出处:Java8 系列之重新认识 HashMap 摘要 HashMap 是 Java 程序员使用频率最高的用于映射 (键值对) 处理的数据类型.随着 JDK(Java Developmet Kit ...

  4. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    目录 为什么是 JWT Bearer 什么是 JWT JWT 的优缺点 在 WebAPI 中使用 JWT 认证 刷新 Token 使用授权 简单授权 基于固定角色的授权 基于策略的授权 自定义策略授权 ...

  5. Spring缓存注解@Cache,@CachePut , @CacheEvict,@CacheConfig使用

    @Cacheable.@CachePut.@CacheEvict 注释介绍 表 1. @Cacheable 作用和配置方法 @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结 ...

  6. [转]ASP.NET cache缓存的用法

    本文转自:https://blog.csdn.net/mss359681091/article/details/51076712 本文导读:在.NET运用中经常用到缓存(Cache)对象.有HttpC ...

  7. 消息管理-activemq

    1.ConnectionFactory("tcp://192.168.1.103:61616/"); 本机地址192.168.1.103 也 可以是localhost 消息的生产者 ...

  8. val();html();.text()区别

    对于innerHTML 属性,几乎所有的元素都有innerHTML属性,它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML.(获取HTML当前标签的起始和结束里面的内容) 对于inner ...

  9. Struts初始

    1.首先我们先创建一个maven的简单工程, 如图 然后点击创建一个简单的工程,点击下一步, 然后, 再次输入工程的各项信息,1组织名,2.项目名称,版本名,一般为默认,3,jar包暂时默认,当前的j ...

  10. 一:idea中使用eclipse主题快捷键

    idea -->file -->import settings -->keymap-shkstart.jar 1 执行(run) alt+r 2 提示补全 (Class Name C ...