zoukankan      html  css  js  c++  java
  • docker镜像(1)

    一、docker基础

    Docker容器的特点

    • Docker主要是为了解决应用的库依赖和隔离应用
    • Docker相对于虚拟机比较轻量,易管理

    Doker和虚拟化区别

    doker是上层和宿主机使用同一套硬件,与宿主机使用同一个内核,仅在应用层实现了隔离。

    虚拟化里面的虚拟机,CPU和内存、硬盘等都是虚拟的,并不是和宿主机使用同一套硬件。

    容器的临时性:

    1. 容器里的操作当容器删除了就没了

    2. 最好不要把数据存储在容器里

    centos7安装docer

    //安装
    yum remove docker-common
    cd /etc/yum.repos.d/
    wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum install docker-ce -y
    systemctl enable docker
    systemctl restart docker
    docker version
    docker info
    
    //卸载
    yum remove docker -y
    
    m -rf /var/lib/docker/
    

    Docker镜像的分类

    1. 基础镜像,可以去docker.io上下载,也可以在国内的Docker仓库下载
    2. 自定义镜像,可以基于基础镜像实现镜像的自定义

    Docker镜像的相关命令

    //查看镜像,刚安装完是空的
    docker images
    
    //搜索与centos相关的镜像
    docker search centos
    
    //下载一个centos7的镜像,速度很慢,因为在国外,不用这种方式下载
    docker pull centos:7
    
    //Docker仓库的配置/etc/docker/daemon.json,重启Docker
    {
     "registry-mirrors": ["http://hub-mirror.c.163.com/"]
    }
    
    //重启docker
    systemctl restart docker
    
    //使用163的源进行下载
    docker pull hub-mirror.c.163.com/library/centos:7
    systemctl restart docker
    
    //再次查看,发现多了一个镜像
    

    img

    镜像导出备份,删除和导入

    重命名:docker tag hub-mirror.c.163.com/library/centos:7 centos:7
    导出镜像:docker save hub-mirror.c.163.com/library/centos:7 >/tmp/centos.tar
    删除镜像:docker rmi centos:7
    镜像导入:docker load < /tmp/centos7.tar
    

    Docker容器概念

    1. 可以使用镜像生成对应运行的容器,一个镜像可以生成多个容器
    2. Centos7镜像生成的容器系统是Centos7,Ubuntu镜像生成的容器系统是Ubuntu的

    容器说明

    容器里的系统跟宿主系统是独立的

    容器的删除、崩溃等不会影响到宿主系统

    使用Centos7镜像启动容器

    docker run -it centos:7 /bin/bash   #i表示交互式,t表示打开一个Shell窗口,会进入一个全新的系统
    

    宿主机上查看容器的相关操作

    docker ps:查看运行的容器,类似ifconfig
    docker ps -a:查看所有容器,类似ifconfig -a
    
    docker inspect eafaf794e11d:查看容器详细信息
    
    docker logs eafaf794e11d:查看容器日志
    
    //正在运行的容器无法删除,除非是在是处于停止(exited)状态的容器
    docker rm eafaf794e11d:删除容器
    docker rm -f eafaf794e11d :强制删除容器
    

    容器后台运行的特点

    如果没有永久运行的程序,终端一退出容器就会马上退出。

    容器永久运行的条件:需要有永久运行的程序,并且使用run -d后台启动容器。

    怎么样启动一个永久运行的容器

    //启动后台容器,docker log ID,就能查看到对外输出的
    docker run -d centos:7 /bin/bash -c "while true;do echo zhanghe; sleep 5; done"
    //查看日志
    [root@doker ~]# docker logs 2e8
    zhanghe
    zhanghe
    zhanghe
    
    进入后台容器:docker exec -it ID /bin/bash
    

    后台容器的停止

    停止后台容器:docker stop ID 或者 docker kill ID

    启动容器:docker start ID

    删除容器:docker rm ID

    批量删除容器:docker rm -f ID1 ID2

    因为容器删除后数据就会跟着消失的特性,所以不适合做存储方面的业务。

    刚起容器的时候发现不能上网,不能上网就无法安装软件,费劲的找了好我办法,没想到呀,没想到,竟然重启一下docker服务就可以了!!!!!

    二、自定义镜像

    为什么要自定义镜像呢?

    我们从仓库里面下载的镜像都是初始的系统,都是比较干净的,最小化的,里面没有任何的程序,并不能满足我们实际的要求,所以当我们下载完一个初始镜像之后,要做一些操作,比如我们要部署好一些基本工具:yum、net-tools之后,当当前的状态打包成为一个镜像,这样我们再起容器的时候,可以根据这个镜像起新的容器,这样看来,这有有点像是vmware的快照功能。制作镜像是非常重要的。

    自定义镜像有两种方式:commit方式和docerfile的方式,其中最常用的是dockerfile的方式。先讲一下commit这种方式。

    commit

    给基础镜像新增一个while程序

    [root@docker1 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              7                   5e35e350aded        2 months ago        203M
    
    docker run -it centos:7 /bin/bash
    
    root@3c9e1ec80d63 ~]# vi /usr/bin/while.sh 
    #!/bin/bash
    while true
    do
    	echo 123
    	sleep 3
    done
    
    //加执行权限
    [root@3c9e1ec80d63 ~]# chmod +x /usr/bin/while.sh 
    
    
    //暂时先不要退出容器,另开一个终端,通过ps -a发现有一个容器正在运行
    [root@docker1 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             
    3c9e1ec80d63        centos:7            "/bin/bash"         8 minutes ago     
    
    //就通过这个镜像制作模板镜像,镜像的名字就是centos:if
    [root@docker1 ~]# docker commit 3c9e1ec80d63 centos:if
    
    //查看时发现多了一个镜像
    [root@docker1 ~]# docker images  
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              if                  df01e399db22        37 seconds ago      203MB
    centos              7                   5e35e350aded        2 months ago        203MB
    //根据新的镜像再起容器就会发现已经有了while.sh
    [root@docker1 ~]# docker run -it centos:if /bin/bash
    

    dockerfile

    上面所演示的是commit的方式制作镜像,下面演示一下通过dockerfile的方式来制作镜像,这种制作镜像的方式比较主流, Dockerfile能把制作镜像的过程写入到配置文件中。

    Dockerfile使用说明

    1. FROM,基于哪个基础镜像
    2. MAINTAINER,代表维护者信息,填写个邮箱即可。
    3. COPY,往镜像里添加文件
    4. RUN,运行命令构建镜像
    5. ENTRYPOINT,镜像启动时运行的命令,不可替换
    6. CMD,镜像启动时运行的命令,可替换

    简单需求演示:

    替换Centos7基础镜像中的yum源为163的yum源

    Dockerfile配置文件实战:/docker/yum163/Dockerfile

    [root@docker1 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              if                  df01e399db22        26 minutes ago      203MB
    centos              7                   5e35e350aded        2 months ago        203MB
    [root@docker1 ~]# mkdir -p /docker/yum163/
    [root@docker1 ~]# vim /docker/yum163/Dockerfile
    FROM centos:7
    MAINTAINER zhanghehe 361589194@qq.com
    COPY CentOS-Base.repo /etc/yum.repos.d/  #这个文件要在当根目录/docker/yum163/下
    RUN yum -y install net-tools
    [root@docker1 ~]# cp /etc/yum.repos.d/CentOS-Base.repo /docker/yum163/
    [root@docker1 ~]# ls /docker/yum163/
    CentOS-Base.repo  Dockerfile
    
    
    //制作一个centos7:163的镜像,后面是根目录
    docker build -t centos7:163 /docker/yum163/
    
    //查看验证
    root@docker1 ~]# docker images;
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos7             163                 8d669991c3ee        8 minutes ago       203MB
    centos              if                  df01e399db22        39 minutes ago      203MB
    centos              7                   5e35e350aded        2 months ago        203MB
    
    //测试是否制作成功
    docker run -it centos7:163 /bin/bash
    

    三、定义nginx镜像

    定义一个nginx镜像其实很简单,但是有一些要注意的地方 ,比如nginx要在本地安装没有问题之后才能去docker里面安装。而且从nginx官网下载nginx有些慢,我们可以将nginx先在宿主机上安装,然后把nginx的安装包放在根目录里面,在容器里面通过wget直接从宿主的根目录里面下载。

    Nginx镜像启动注意

    1. 默认nginx以daemon的方式启动,无永久运行的程序,容器会马上退出:/usr/local/nginx/sbin/nginx

    2. Nginx使用永久运行的方式:/usr/local/nginx/sbin/nginx -g "daemon off;"

    Dockerfile文件/docker/nginx/Dockerfile

    [root@docker1 ~]# mkdir /docker/nginx
    [root@docker1 nginx]# vim Dockerfile
    FROM centos:7
    COPY install.sh /tmp/install.sh
    RUN sh /tmp/install.sh
    COPY run /usr/bin/run
    ENTRYPOINT ["run"]
    
    //Nginx安装脚本/docker/nginx/install.sh
    yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel lrzsz
    cd /usr/local/src
    wget 'http://192.168.80.61/nginx-1.14.2.tar.gz'
    tar -zxf nginx-1.14.2.tar.gz
    cd nginx-1.14.2
    ./configure --prefix=/usr/local/nginx && make && make install
    
    m -rf /usr/local/src/*
    [root@docker1 nginx]# chmod +x install.sh
    
    //编写启动脚本run,加执行权限
    [root@docker1 nginx]## vim run
    #!/bin/bash
    /usr/local/nginx/sbin/nginx -g "daemon off;" 
    [root@docker1 nginx]# chmod +x run 
    

    制作Nginx镜像

    docker build -t centos:nginx /docker/nginx/
    docker inspect centos:nginx
    

    后台启动容器测试

    docker run -d centos:nginx
    [root@docker1 nginx]# docker ps -a     
    fd415027a7bd        centos:nginx        "run"               5 seconds ago       Up 5 
    docker exec -it fd415027a7bd /bin/bash
    

    默认Docker网络是在内网的,外面无法访问,后面会专门介绍网络

    四、定义redis镜像

    定义redis镜像的思路与定义nginx镜像的思路是一样的。

    [root@docker1 ~]# mkdir /docker/redis
    [root@docker1 ~]# cd /docker/redis
    
    //Redis安装脚本/docker/redis/install.sh,增加权限
    
    yum install -y wget gcc gcc-c++ make tar openssl openssl-devel cmake
    cd /usr/local/src
    wget 'http://192.168.80.61/redis-4.0.9.tar.gz'
    tar -zxf redis-4.0.9.tar.gz
    cd redis-4.0.9
    make && make PREFIX=/usr/local/redis install
    mkdir -pv /usr/local/redis/conf/
    cp redis.conf /usr/local/redis/conf/
    
    m -rf /usr/local/src/*
    
    //编写启动脚本/docker/redis/sjgrun,加执行权限
    
    #!/bin/bash
    /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
    
    //Redis镜像制作配置文件/docker/redis/Dockerfile
    FROM centos7:163
    COPY install.sh /tmp/install.sh
    RUN sh /tmp/install.sh
    COPY sjgrun /usr/bin/sjgrun
    CMD ["sjgrun"]
    
    //构建Redis镜像
    docker build -t centos:redis /docker/redis/
    
    [root@docker1 redis]# docker run -d centos:redis
    7e8ff4a98eb21451eb3a7eb373c09429d7148f31b5d3da1dd0beb4bea39b6457
    [root@docker1 redis]# docker ps -a
    7e8ff4a98eb2        centos:redis        "sjgrun"            13 seconds ago      Up 13 
    [root@docker1 redis]# docker exec -it 7e8 /bin/bash
    [root@7e8ff4a98eb2 /]# ps auxfww | grep redis
    /usr/local/redis/bin/redis-server 127.0.0.1:6379
    

    五、定义nginx+redis镜像

    多进程镜像需求

    1. Docker容器启动一个进程对于微服务是比较有用的

    2. 但有时候Docker容器需要负责一个业务,一个业务往往有多个进程

    [root@docker1 ~]# mkdir /docker/multiproc
    [root@docker1 ~]# cd /docker/multiproc
    
    //Nginx安装脚本/docker/multiproc/install_nginx.sh
    
    yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
    cd /usr/local/src
    wget 'http://192.168.80.61/nginx-1.14.2.tar.gz'
    tar -zxf nginx-1.14.2.tar.gz
    cd nginx-1.14.2
    ./configure --prefix=/usr/local/nginx && make && make install
    
    m -rf /usr/local/src/*
    
    //Redis安装脚本/docker/multiproc/install_redis.sh
    
    yum install -y wget gcc gcc-c++ make tar openssl openssl-devel cmake
    cd /usr/local/src
    wget 'http://192.168.80.61/redis-4.0.9.tar.gz'
    tar -zxf redis-4.0.9.tar.gz
    cd redis-4.0.9
    make && make PREFIX=/usr/local/redis install
    mkdir -pv /usr/local/redis/conf/
    cp redis.conf /usr/local/redis/conf/
    
    m -rf /usr/local/src/*
    
    //Dockerfile配置:/docker/multiproc/Dockerfile
    
    FROM centos:163
    COPY install_nginx.sh install_redis.sh /tmp/
    RUN sh /tmp/install_nginx.sh
    RUN sh /tmp/install_redis.sh
    COPY sjgrun /usr/bin/
    RUN sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/g' /usr/local/redis/conf/redis.conf
    ENTRYPOINT ["sjgrun"]
    
    //编写启动脚本/docker/multiproc/sjgrun,加执行权限
    #!/bin/bash
    /usr/local/nginx/sbin/nginx
    /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
    
    [root@docker1 multiproc]# chmod +x install_nginx.sh install_redis.sh sjgrun 
    [root@docker1 multiproc]# ls
    Dockerfile  install_nginx.sh  install_redis.sh  sjgrun
    

    Nginx+Redis镜像构建

    docker build -t centos:web /docker/multiproc/
    
    //测试Nginx+Redis镜像
    docker run -d centos:web
    docker ps -a
    docker exec -it e1f /bin/bash
    ps auxfww | grep -E "nginx|redis"
    
  • 相关阅读:
    Asp.Net api接口
    Android Studio 插件官网
    Android官方培训课程中文版(v0.9.5)
    asp.net:验证控件中ValidationExpression的写法
    asp.net:录入数据库的中文变问号
    asp.net:repeater嵌套(常用于新闻等在首页归类显示)
    asp.net:用类来后台绑定数据源
    代码编写横屏的UIView
    MFC去掉win7玻璃效果
    iOS UITableView
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/12197522.html
Copyright © 2011-2022 走看看