1 容器软件docker简介+三大概念

一、docker简介

1.docker是什么?

Docker是一款容器软件。

Docker 是一个开源项目,诞生于2013年初,最初是 dotCloud 公司内部的一个业余项目。它基于Goole公司推出的 Go 语言实现。项目后来加入了Linux基金会,遵从了 Apache2.0协议,项目代码在GitHub上进行维护。

Docker 是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何支持docker的机器上运行。容器是完全使用沙盒机制,相互之间不会有任何接口调用。

Docker 的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整地摆放起来。并且各种各样的货物被装在集装箱里,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送熟菜的船和专门运送货物的船了。只要这些货物在集装箱里封装得好好的就行。那我就可以用一艘大船把他们都运走。

docker 就是类似的理念。云计算就好比大货轮。docker 就是集装箱。

2、docker的优点

在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发部署,而这正是Docker所能够提供的最大优势。Docker提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无务论新旧服器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。

(1)快

运行时的性能快,管理操作(启动、停止、开始、重启等等)都是以秒或毫秒为单位的。

(2)敏捷

像虚拟机一样敏捷,而且会更便宜,在bare metal (裸机)上部署像点一个按钮一样简单。

(3)灵活

将应用和系统“容器化”,不添加额外的操作系统。

(4)轻量

在一台服务器上可以部署100-1000个Containers容器。

(5)便宜

开源的,免费的,低成本的。

docker-ce:社区版

docker-ee:商业版

3、docker的缺点

所有容器共用 linux kernel 资源,资源能否实现最大限度利用,所以在安全上也会存在漏洞。

4、Docker与虚拟机的比较

 

在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发部署,而这正是Docker所能够提供的最大优势。Docker提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无务论新旧服器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。

 

 

 5.docker与虚拟化

Docker以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的supervisor支持。Docker虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。

 

 

 

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器时在操

作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

二、安装部署docker

下载链接:https://www.docker.com/products/docker-desktop

windows :
mac
linux

docker分为两个版本:
docker-ce : 社区版
docker-ee :企业版

linux 3.10的内核 有BUG

1、升级系统内核
    [root@localhost ~]# wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.167-1.el7.elrepo.x86_64.rpm    #下载内核
    [root@localhost ~]# wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.167-1.el7.elrepo.x86_64.rpm   #下载内核拓展包
    # 安装
    [root@localhost ~]# yum localinstall -y kernel-lt*
    # 启动时自动选择最新的系统版本
    [root@localhost ~]# grub2-set-default  0 && grub2-mkconfig -o /etc/grub2.cfg
    # 查看最新的系统内核启动版本
    [root@localhost ~]# grubby --default-kernel
    # 重启生效
    [root@localhost ~]# reboot
    # 检测
    [root@localhost ~]# uname -a

2、安装依赖包

[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

3、添加软件源信息

 [root@localhost ~]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4、更新并安装Docker-CE

 [root@localhost ~]# sudo yum makecache fast
 [root@localhost ~]# sudo yum -y install docker-ce-19.03.9

    k8s支持的最新的版本,也是最稳定的版本是19

5、启动Docker

[root@localhost ~]# systemctl start docker

6、检测docker

    [root@localhost ~]# docker info

7、加速docker(登录阿里云——产品——容器与中间件——容器镜像服务ACR--管理控制台——镜像工具——镜像加速器——选centos的镜像加速器)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": ["https://8mh75mhz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

检测是否成功加速:执行docker info 看下是否有aliyun的镜像

 

 

 

 三、docker的概念和基本使用

1.docker三大核心概念

 

(1)镜像 :镜像是启动容器的模板
(2)容器 :是对外提供服务的实例
(3)仓库(Harbor) :存放镜像的地方

官方仓库:hub.docker.com
第三方:阿里云、华为云
docker login [URL]
docker login registry.cn-hangzhou.aliyuncs.com

2.镜像

镜像是启动容器的模板,同一个镜像启动的所有的容器完全相同

2.1下载镜像

 

        docker pull [仓库的URL]/[命名空间]/[镜像名称]:[版本号]
        例:docker pull nginx
        
        docker info查看:
        默认的仓库URL:https://index.docker.io/v1/
        默认的命名空间:library
        默认的版本号:latest
        
        index.docker.io/library/nginx:latest等同于下载nginx,因为有默认值

2.2、查看本机镜像列表

        [root@localhost ~]# docker images
        [root@localhost ~]# docker image ls
        REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
        nginx        latest    f6987c8d6ed5   6 days ago   141MB
        仓库名       版本       镜像ID         创建距离现在的时间 大小

2.3 查看镜像的详情

docker inspect [镜像名称|ID]
        例:docker inspect nginx

2.4 镜像tag(别名)

docker tag [镜像ID] [新的名称]
        例:docker tag f6987c8d6ed5 xiaodocker

2.5 登录仓库(镜像上传到仓库需要先登录仓库)

docker login [仓库的URL地址]
        默认的仓库地址:hub.docker.com
        例:[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
   输入用户名,密码(需要https://hub.docker.com/注册才可以登录哦)
   vim /root/.docker/config.json   #里面保存了用户登录的地址和密码TOKEN值,第二次来不需要登录

2.6、上传镜像

 第一步:打tag(要写全了,不写全了使用默认的)
            [root@localhost ~]# docker tag f6987c8d6ed5 alvinos/nginx:v2
            查看docker images 多一条数据
第二步:上传 [root@localhost
~]# docker push alvinos/nginx:v2

2.7 删除镜像(rmi是rm image的缩写)

docker rmi [镜像的名称|ID]
  [root@localhost ~]# docker rmi alvinos/nginx:v2

注:docker镜像只能创建和删除,不能修改。
    docker的ID全宇宙唯一

 

3.容器

     对外提供服务的实例。

 3.1.容器生命周期

 

容器内的进程至少有一个进程运行在前台。

 

3.2、启动一个容器(镜像是启动容器的模板,所以启动镜像的时候要加上镜像的名称或者id)

 

 

docker run [参数] [镜像名称|ID] [启动命令]
    例:docker run centos(没有的话会下载)
      docker run nginx    #启动容器最简单的命令

    参数:(docker run --help)
        -d     : 以守护进程方式运行
        --rm   : 当容器生命周期结束时,立即删除该镜像
        --name : 指定容器名称
        -e     : 指定容器内部的环境变量
        -h     : 指定容器的主机名
        -p     : 端口映射(固定)   #要在互联网访问,需要端口映射
        -P     : 端口映射(随机)
        -i     : 打开标准输出(将容器内部的标准输出接入到命令行中,正常与-t组合使用)     
        -t     : 创建一个命令行(伪终端)
         -v     : 添加一个目录映射

        --link
        --network

 

例:[root@localhost ~]# docker run -d nginx    #后台运行容器
  [root@localhost ~]# docker run --rm nginx   当容器生命周期结束时,立即删除该镜像
  [root@localhost ~]# docker run -d --name nginx nginx   # --name 指定容器名称
  [root@localhost ~]# docker run -d --name nginxv1 -e NGINX_NAME=nginx nginx     #-e 指定容器内部的环境变量
  [root@localhost ~]# docker run -d --name nginxv2 -e NGINX_NAME=nginx -h hostnames nginx  # -h 指定容器的主机名
  [root@localhost ~]# docker run -d --rm --name nginxv3 -p 30000:80 nginx   #,要在互联网访问,需要-p端口映射,此时可访问192.168.15.105:30000
  64064393f87b5f2018142e014bdd020890c4310605c0c0cd97ce6c29a54b2b4d
[root@localhost ~]# docker run -d --rm --name nginxv4 -P nginx
3a86c4d34bdf8a2f1f3a2e8948c831c3c58c22443690fa2132fdbbdbf6599cbd

[root@localhost ~]# docker run -it --rm centos  #将容器内部的标准输出接入到命令行

[root@localhost ~]# ll /tmp
total 0
[root@localhost ~]# docker run --rm -d --name nginxv6 -P -v /tmp/:/usr/share/nginx/html nginx
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                   NAMES
510f2a49b418   nginx     "/docker-entrypoint.…"   5 seconds ago        Up 4 seconds        0.0.0.0:4001->80/tcp    nginxv6
[root@localhost ~]# echo "Hello word" >> /tmp/index.html
[root@localhost ~]# docker exec nginxv6 cat /usr/share/nginx/html/index.html
Hello word

[root@localhost ~]#  yum install pip3 
[root@localhost ~]# pip install django
[root@localhost ~]# django-admin startproject linux
[root@localhost ~]# cd linux/
[root@localhost linux]# django-admin startapp application
[root@localhost linux]# python3 manage.py runserver 0.0.0.0:8000 
此时访问http://192.168.15.105:8000/ 会出现django 界面
那么,如何在容器里面做呢,首页映射到容器里
[root@localhost linux]# cd ..
[root@localhost ~]# docker run --name django -it --rm -p 8000:8000 -v /root/linux/:/opt/ python:3.6 bash
root@379a06657ab0:/# cd /opt
root@379a06657ab0:/opt# ls
application  linux  manage.py
root@379a06657ab0:/opt# pip install django
root@379a06657ab0:/opt# python3 manage.py runserver 0.0.0.0:8000
此时访问http://192.168.15.105:8000/ 会出现django 界面

[root@localhost ~]#cd linux/
[root@localhost linux]# cd application/
[root@localhost application]# ll
[root@localhost application]# vim views.py
   def index(request):
      return HttpResponse("hello world")
 [root@localhost application]# cd ..
 [root@localhost linux]#cd linux/
 [root@localhost linux]#vim urls.py 
 path("",views.index)
 root@379a06657ab0:/opt# python3 manage.py runserver 0.0.0.0:8000
 此时访问192.168.15.105:8000,出现hello world

 

docker start : 启动一个容器
docker stop :停止一个容器
docker create :创建一个容器

docker run 和 docker create 之间有两个区别
1、docker run创建容器并立即启动,而docker create 只是创建
2、docker run创建的容器时up状态,而docker create创建的容器是create

3.3、查看本机运行的容器列表

docker ps
    -a : 显示本机上的所有的容器
    -q :  只显示ID
    例: docker ps    #查看本机上运行的容器
        docker ps -a  #显示机器上的所有容器
        docker ps -a -q #显示机器上所有容器的id

3.4在容器内部执行命令

docker exec [容器名称] [命令]
    [root@localhost ~]# docker exec nginxv1 printenv    #打印nginxv1的环境变量
    
    进入容器:
        docker exec -it [容器名称] bash
        [root@localhost ~]# docker exec -it hungry_wright bash

3.5 删除容器

docker rm [容器ID或名称]
    
    -f : 强制删除
    [root@localhost ~]# docker rm -f 379a06657ab0   #删除某个容器
    
    [root@localhost ~]# docker rm -f $(docker ps -a -q)  #删除所有容器

 

 

 

 


 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.6 保存容器和镜像

3.61 直接将容器保存成本地镜像

docker commit 
    docker commit --help
    Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    
    参数:
        -a : 作者
        -m : 提交时解释信息
        -p : 保存容器时,是否暂停运行容器

    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
    7390f1d18977   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   80/tcp    hungry_wright
    [root@localhost ~]# docker commit -a "Linux" -m 'init' -p hungry_wright test:v1

 

 

3.62 、将本地的容器保存成镜像压缩包

  1、保存容器为镜像压缩包

docker export 
    -o, --output string   Write to a file, instead of STDOUT
    [root@localhost ~]# docker export -o nginx.tar hungry_wright

2、解压容器压缩包成镜像

docker import 
    [root@localhost ~]# docker import nginx.tar test:v2
    [root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test         v2        152d9c19a28f   8 seconds ago    140MB

3.63、将本地的镜像保存成镜像压缩包

    1.保存镜像为镜像压缩包

    docker save 
    Options:
  -o, --output string   Write to a file, instead of STDOUT
    [root@localhost ~]# docker save -o nginxv1.tar python:3.6 nginx:latest

      2.解压镜像压缩包为镜像

docker load 
    Options:
  -i, --input string   Read from tar archive file, instead of STDIN
  -q, --quiet          Suppress the load output
    [root@localhost ~]# docker load -i nginxv1.tar 

3.64 save 和 export之间的区别

 1、针对的对象不一样
2、save保存的镜像更加完善

 

 

 

 

 

 

 虚悬镜像是仓库名和标签为none

 

 

 

 

 

 

 

 


 

 

 

 

 

 

posted @ 2021-12-28 11:19  甜甜de微笑  阅读(1127)  评论(0编辑  收藏  举报