目录

3.1.1.1 基础概念

1、docker定义

2、docker与传统虚拟机

 3、为什么要使用Docker

    3.1、Docker优势

    3.2、对比传统虚拟机总结

4、Docker架构

    4.1、Docker镜像

    4.2、Docker容器

    4.3、Docker仓库

3.1.1.2 安装

1、Dcoker版本命令

2、Dcoker安装

    2.1、CentOS安装Docker

    2.2、CentOS卸载Docker

    2.3、镜像加速器

    2.4、CentOS 7 配置镜像加速

    2.5、检查加速器是否生效

3.1.1.3 命令

 1、Docker镜像操作

    1.1、获取镜像

    1.2、运行镜像

     1.3、列出镜像

      1.4、删除本地镜像

2、Docker容器操作

    2.1、启动容器

    2.2、后台运行

    2.3、停止运行容器

    2.4、进入容器

    2.5、导出容器

    2.6、导入容器

     2.7、删除容器

3.1.1.4 构建私有镜像

1、使用Dockerfile定制镜像

    1.1、FROM指定基础镜像

    1.2、RUN执行命令

2、构建镜像

3、Dockerfile的其他指令

    3.1、COPY复制文件

    3.2、ADD更高级的复制文件

    3.3、CMD容器启动命令

    3.4、ENTRYPOINT入口点

    3.5、ENV设置环境变量

    3.6、ARG构建参数

    3.7、VOLUME定义匿名卷

    3.8、EXPOSE声明端口

    3.9、WORKDIR指定工作目录

    3.10、USER指定当前用户

    3.11、HEALTHCHECK健康检查

    3.12、ONBUILD为他人做嫁衣裳

4、其他制作镜像的方式

    4.1、docker save和docker load

3.1.1.5 运行Java程序

1、准备一个没有第三方依赖的java web项目,用IDEA打成war包

2、把war包上传到安装有docker软件的服务器上,在同级目录下创建Dockerfile

3、按照前面章节所学的Dockerfile定制镜像,来编写Dockerfile文件

4、执行构建

    docker build -t session-web:latest .

5、运行制作好的镜像

3.1.1.6 搭建docker私有仓库

1、Docker Hub

    1.1、注册登录

    1.2、拉取镜像

    1.3、推送镜像

 2、私有仓库

    2.1、安装运行docker-registry 

    2.2、在私有仓库上传、搜索、下载镜像


3.1.1.1 基础概念

1、docker定义

对进程进行封装隔离,属于操作系统层面的虚拟化技术
    由于隔离的进程独立于宿主和其它的隔离进程,因此也称为容器

Docker从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。
使得Docker技术比虚拟机技术更为轻便、快捷

虚拟机:可以理解为模拟运行的一整套操作系统(提供了运行态环境、其他系统环境)和跑在上面的应用。

2、docker与传统虚拟机

    传统虚拟机:是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行应用进程。
    容器:容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。
                  因此容器要比传统虚拟机更为轻便

docker win10旧版本 docker版本1.13_ubuntu

 3、为什么要使用Docker

    3.1、Docker优势

1、更高效的利用系统资源
        2、更快速的启动时间
        3、一致的运行环境
        4、持续交付和部署
        5、更轻松的迁移
        6、更轻松的维护和扩展

    3.2、对比传统虚拟机总结

docker win10旧版本 docker版本1.13_docker win10旧版本_02

4、Docker架构

    Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。
    Image:镜像,Docker镜像是创建Docker容器的模板
    Container:容器,Docker容器是独立运行的一个、或一组应用,以及它们的运行态环境。
    Registries Repository:注册 存储库,仓库 

docker win10旧版本 docker版本1.13_ubuntu_03

    4.1、Docker镜像

        操作系统分为内核用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。
        而Docker镜像(Image),就相当于是一个root文件系统。
        Docker镜像提供:容器运行时所需的程序、库、资源、配置等文件
                        还包含一些为运行时准备的一些配置参数(如:匿名卷、环境变量、用户等)
                        镜像不包含任何动态数据,其内容在构建之后也不会改变。 

    4.2、Docker容器

镜像是静态的定义,容器是镜像运行时的实体
        容器可以被创建、启动、停止、删除、暂停等。

    4.3、Docker仓库

        镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。
        一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

3.1.1.2 安装

1、Dcoker版本命令

    Docker在1.13版本之后,从2017年的3月1日开始,版本命名规则变为如下:
    同时Docker划分为CE和EE:
        CE社区版(免费,支持周期3个月)
        EE企业版(付费,强调安全)

docker win10旧版本 docker版本1.13_docker_04

2、Dcoker安装

        官方安装指南地址:https://docs.docker.com/engine/installation

    2.1、CentOS安装Docker

docker一些命令
docker运行容器时-p映射端口格式:-p 宿主机端口:容器端口,先宿主机再容器,eg:-p 8080:80
镜像体积:docker system df
删除镜像:docker rmi 镜像名称
显示正在运行的容器:docker ps
显示所有容器:docker ps -a
删除容器:docker rm 容器id
进入容器操作:docker exec -it 容器id /bin/bash
    eg:已经启动了一个tomcat,就是进入tomcat,可以对tomcat做相关的修改操作
 

        1、系统要求
            Docker CE支持64位版本CentOS 7,并且要求内核版本不低于3.10。
        2、卸载旧版本
            旧版本的Docker称为docker或者docker-engine,使用以下命令卸载旧版本
                sudo yum remove docker docker-common docker-selinux docker-engine
        3、使用yum安装
            sudo yum install docker-ce
        4、启动Docker CE
            设置开启启动:sudo systemctl enable docker
            sudo systemctl start docker
        5、建立docker用户组
    默认情况下,docker命令会使用Unix socket与Docker引擎通讯。而只有root用户和docker组的用户才可以访问Docker引擎的Unix socket。一般Linux系统上不会直接使用root用户进行操作。因此,需要将使用docker的用户加入docker用户组。
    建立docker组:sudo groupadd docker
    将当前用户加入docker组:sudo usermod -aG docker $USER
        6、测试Docker是否安装正确
    启动一个基于hello-world镜像的容器:docker run hello-world 
       方式一、yum安装操作步骤:
        1、查看内核版本:uname -r
        2、卸载旧版本:sudo yum remove docker
        3、安装:yum install docker-ce
            注意:如果安装的是centos7 minimal版本,执行安装会有如下提示,“没有可用软件包”,
                    No package docker-ce available.
                    Error: Nothing to do

                    这个时候需要安装必要的软件依赖及更新增加docker-ce yum源。
                1、安装依赖:sudo yum install -y yum-utils device-mapper-persistent-data lvm2
                2、加载docker-ce的yum源:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

docker win10旧版本 docker版本1.13_ubuntu_05


 然后再执行安装命令:yum install docker-ce

        4、启动Docker:systemctl start docker

        5、查看Docker启动信息:docker info

        6、启动一个基于hello-world镜像的容器:docker run hello-world

    若能正常输出Hello from Docker!等信息,则说明安装成功。

docker win10旧版本 docker版本1.13_ubuntu_06

        方式二、使用脚本安装:

    在测试或开发环境中Docker官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS系统上可以使用这套脚本安装:
        curl -fsSL https://get.docker.com -o get-docker.sh
        sudo sh get-docker.sh --mirror Aliyun
    执行这个命令后,脚本就会自动的将一切准备工作做好,并且把Docker CE的Edge版本安装在系统中。

    2.2、CentOS卸载Docker

1、删除docker安装包:sudo yum remove docker-ce
2、删除docker镜像:sudo rm rf /var/lib/docker

    2.3、镜像加速器

        国内从Docker Hub拉取镜像有时会遇到困难,此时可以配置镜像加速器。
        Docker官方和国内很多云服务商都提供了国内加速器服务
        eg:
            1、Docker官方提供的中国registry mirror
            2、阿里云加速器
            3、DaoCloud加速器
            4、163加速器

国内的一些公开云服务:阿里云镜像库、网易云镜像服务、DaoCloud镜像市场

    2.4、CentOS 7 配置镜像加速

        默认的镜像拉取地址可以通过docker info命令查看,
        默认的镜像拉取地址: https://index.docker.io/v1/(这个地址有的时候是比较慢的)
        对于使用systemd的系统,请在/etc/docker/daemon.json中写入如下内容
            (如果文件不存在请新建该文件)
{
    "registry-mirrors":[
        "http://hub-mirror.c.163.com","http://f1361db2.m.daocloud.io"
    ]
}
重新启动服务生效
先让daemon生效:sudo systemctl daemon-reload
再重启docker:sudo systemctl restart docker

docker win10旧版本 docker版本1.13_docker_07


列出所有容器:docker ps -a

删除docker容器:docker rm -f 容器ID

再删除容器:docker rmi hello-world

docker win10旧版本 docker版本1.13_ubuntu_08

    2.5、检查加速器是否生效

        配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行docker info,如果从结果中看到了如下内容,说明配置成功。

docker win10旧版本 docker版本1.13_ubuntu_09

3.1.1.3 命令

 1、Docker镜像操作

    docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,docker会从镜像仓库下载该镜像。

    1.1、获取镜像

        从docker镜像仓库获取镜像的命令是docker pull。
            docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
        具体的选项可以通过docker pull --help命令看到;
        Docker镜像仓库地址:地址的格式一般是<域名/IP>[:端口号]。默认地址是Docker Hub。
        仓库名:如之前所说,这里的仓库名是两段式名称:<用户名>/<软件名>。
        对于Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。
        eg:docker pull ubuntu:16.04            
            1、没有给出Docker镜像仓库地址,则从Docker Hub获取镜像
            2、ubuntu:16.04是镜像名称
            3、没有用户名,则从library/ubuntu仓库中获取标签为16.04的镜像。

    1.2、运行镜像

        有了镜像后,就能够以这个镜像为基础启动并运行一个容器。
            以上面的ubuntu:16.04为例,如果打算启动里面的bash并且进行交互式操作的话,可以执行下面的命令
        docker run -it --rm ubuntu:16.04 bash
            -it:这是两个参数,一个是-i:交互式操作,一个是-t终端。
            --rm:这个参数是说容器退出后随之将其删除。
            ubuntu:16.04:这是指用ubuntu:16.04镜像为基础来启动容器。
            bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是bash。
                最后通过exit退出这个容器。

docker win10旧版本 docker版本1.13_docker_10

     1.3、列出镜像

        1、要想列出已经下载下来的镜像(列出所有镜像),可以使用docker image ls(或docker images)命令。
            列表的分别是:仓库名、标签、镜像ID、创建时间、所占空间大小
        2、查看镜像、容器、数据卷所占用的空间
            docker system df
        3、仓库名、标签均为<none>的镜像,称为虚悬镜像(dangling image),显示虚悬镜像
            docker image ls -f dangling=true
        4、一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。
           删除虚悬镜像: docker image prune

构建一个虚悬镜像:

            1、创建一个Dockerfile文件:touch Dockerfile

            2、编辑Dockerfile文件:vim Dockerfile

           最好不要中文备注)

                FROM ubuntu:16.04#基础镜像

                

                CMD echo "study.163.com"#执行输出

            3、构建一个虚悬镜像docker build . 

docker win10旧版本 docker版本1.13_ubuntu_11

      1.4、删除本地镜像

        1、如果要删除本地的镜像,可以使用docker image rm命令
            其格式为:docker image rm [选项] <镜像1> [<镜像2>...]
            其中,<镜像>可以是镜像短ID、镜像长ID、镜像名 或者 镜像摘要
        2、使用docker image ls -q 来配合docker image rm,这样可以批量删除想要删除的镜像。
            删除所有仓库名为ubuntu的镜像:docker image rm $(docker image ls -q ubuntu)
        3、或者删除所有在ubuntu:16.04之前的镜像
            docker image rm $(docker image ls -q -f before=ubuntu:16.04)
        4、删除所有镜像:docker image rm $(docker image ls -q)
            如果镜像存在容器,是不能删除的

2、Docker容器操作

    2.1、启动容器

    因为Docker的容器是轻量级的,用户可以随时删除和新创建容器
        方式一:基于镜像新建一个容器并启动
            1、新建并启动【docker run】
                输出一个 “Hello World”,之后终止容器:docker run ubuntu:16.04 /bin/echo 'Hello World'
        方式二:启动已终止容器(将在终止状态(stopped)的容器重新启动

                docker container start(或者docker start)
                    启动一个bash终端,允许用户进行交互:
                    docker run -t -i ubuntun:16.04 /bin/bash(等价于:docker run -it ubuntu:16.04 bash)
                -t:让docker分配一个伪终端并绑定到容器的标准输入上
                -i:让容器的标准输入保持打开
                当利用docker run 来创建容器时,docker在后台运行的标准操作包括:
                    1、检查本地是否存在指定的镜像,不存在就从公有仓库下载
                    2、利用镜像创建并启动一个容器
                    3、分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
                    4、从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
                    5、从地址池配置一个ip地址给容器
                    6、执行用户指定的应用程序
                    7、执行完毕后容器被终止

    2.2、后台运行

        如果不使用-d参数运行容器,eg:docker run hello-world会把日志打印在控制台;
        如果使用了-d参数运行容器,eg:docker run -d hello-world不会输出日志,只会打印容器id(输出结果可以用docker logs <容器id>查看);
    注:容器是否会长久运行,是和docker run指定的命令有关,和-d参数无关。

    2.3、停止运行容器

docker container stop 容器ID
        查看终止状态的容器:docker container ls -a 容器ID
        重启终止状态的容器:docker container start 容器ID
        重启一个运行态的容器:docker container restart

    2.4、进入容器

        docker exec后边可以跟多个参数
        只用-i时:由于没有分配伪终端,界面没有我们熟悉的Linux命令提示符,但命令执行结果仍然可以返回。
        -i -t一起使用时:可以看到我们熟悉的Linux 命令提示符。
        docker exec -it 容器ID /bin/bash

docker win10旧版本 docker版本1.13_docker_12

    2.5、导出容器

        导出本地某个容器:docker export 容器ID > 导出文件名.tar

    2.6、导入容器

        1、从容器快照文件导入为镜像
            cat 导出文件名.tar | docker import - 镜像用户/镜像名:镜像版本
            eg:cat test_export_docker_1.tar | docker import - study/ubuntu:1.0
        2、也可以通过指定URL或者某个目录来导入
            docker import http://study.163.com/image.tgz example/imagerepo

docker win10旧版本 docker版本1.13_ubuntu_13

     2.7、删除容器

        1、删除一个处于终止状态的容器:docker container rm ubuntu:16.04
        如果要删除一个运行中的容器,可以添加-f参数。Docker会发送SIGKILL信号给容器。
        2、删除所有终止状态的容器:docker container prune

3.1.1.4 构建私有镜像

1、使用Dockerfile定制镜像

    1、镜像的定制实际上就是定制每一层所添加的配置、文件。
    2、我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,这个脚本就是Dockerfile。
        Dockerfile:是一个文本文件,包含一条条指令,每一条指令构建一层,
                    因此每一条指令的内容,就是描述该层应当如何构建。
        定制一个nginx镜像:
            1、创建目录:mkdir mynginx
            2、进入目录:cd mynginx
            3、创建一个Dockerfile文件:touch Dockerfile
            4、编辑Dockerfile文件:vim Dockerfile
            文件内容如下:
FROM nginx
RUN echo '<hl>Hello,Docker!</h1>' > /usr/share/nginx/html/index.html

    1.1、FROM指定基础镜像

            所谓定制镜像,一定是以一个镜像为基础,在其上进行定制。
        基础镜像必须指定,并且必须是Dockerfile中的第一条指令
            Docker Hub有很多高质量的官方镜像,eg:nginx、redis、mysql、tomcat等。
            Docker Hub还提供了基础操作系统镜像,eg:ubuntun、centos等
            Docker Hub还存在一个特殊的镜像:scratch
                这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
            如果以scrach为基础镜像的话,意味着不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。

    1.2、RUN执行命令

        RUN指令是用来执行命令行 命令的。
        RUN指令的两种格式
            shell格式:RUN <命令>
                eg:RUN echo '<hl>Hello,Docker!</h1>' > /usr/share/nginx/html/index.html
            exec格式:RUN ["可执行文件","参数1","参数2"]
                解压文件:RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
                编译:RUN make -C /usr/src/redis
                RUN make -C /usr/src/redis install 

每一个RUN都是启动一个容器、执行命令、然后提交存储层文件变更

2、构建镜像

在Dockerfile文件所在目录执行:docker build -t mynginx:1.0 .

3、Dockerfile的其他指令

    3.1、COPY复制文件

        格式:COPY <源路径>...<目标路径>
              COPY ["<源路径1>",..."<目标路径>"]
        eg:COPY package.json /usr/src/app
        源路径可以是多个,甚至可以是通配符
        eg:COPY hom* /mydir/
            COPY hom?.txt /mydir/

    3.2、ADD更高级的复制文件

        在COPY和ADD指令选择时,可遵循这样的原则:
            所有的文件复制均使用COPY,仅在需要自动解压缩的场合使用ADD

    3.3、CMD容器启动命令

        CMD指令的两种格式:
            shell格式:CMD <命令>
            exec格式:CMD ["可执行文件","参数1","参数2"]
            在指定了ENTRYPOINT指令后,再用CMD指定具体参数
        CMD指令就是用于指定默认的容器主进程启动命令的。

    3.4、ENTRYPOINT入口点

        ENTRYPOINT的目的和CMD一样。
        当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令
        变为:<ENTRYPOINT> "<CMD>"

    3.5、ENV设置环境变量

        两种格式:
            ENV <key> <value>
            ENV <key1>=<value1> <key2>=<value2>...
        eg:设置环境变量:ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"
            使用环境变量:$VERSION

    3.6、ARG构建参数

    3.7、VOLUME定义匿名卷

    3.8、EXPOSE声明端口

    3.9、WORKDIR指定工作目录

    3.10、USER指定当前用户

    3.11、HEALTHCHECK健康检查

    3.12、ONBUILD为他人做嫁衣裳

4、其他制作镜像的方式

    4.1、docker save和docker load

        现在不推荐使用

docker win10旧版本 docker版本1.13_ubuntu_14

3.1.1.5 运行Java程序

1、准备一个没有第三方依赖的java web项目,用IDEA打成war包

    session-web-0.0.1-SNAPSHOT.war

2、把war包上传到安装有docker软件的服务器上,在同级目录下创建Dockerfile

我这是上传到/root/test_project/java_web目录下

3、按照前面章节所学的Dockerfile定制镜像,来编写Dockerfile文件

Dockerfile文件内容如下:
#基础镜像使用tomcat:7.0.88-jre8
FROM tomcat:7.0.88-jre8

#作者
MAINTAINER allen <allen@163.com>

#定义环境变量
ENV TOMCAT_BASE /usr/local/tomcat

#复制war包
COPY session-web-0.0.1-SNAPSHOT.war $TOMCAT_BASE/webapps/

4、执行构建

    docker build -t session-web:latest .

这里构建需要下载tomcat可能会比较慢(大概有400多MB),可以多配置几个加速器、多试几次

docker win10旧版本 docker版本1.13_docker_15

docker win10旧版本 docker版本1.13_ubuntu_16

docker win10旧版本 docker版本1.13_ubuntu_17

5、运行制作好的镜像

docker run --name session-web -p 8888:8080 session-web:latest    #将容器里的8080端口映射到宿主机的8888端口
    在浏览器中访问http://192.168.3.32:8888可以访问到tomcat,访问http://192.168.3.32:8888/session-web/user/login就报404,在本机用tomcat启动也可以访问,不知道为啥

3.1.1.6 搭建docker私有仓库

1、Docker Hub

    目前docker官方维护了一个公共仓库Docker Hub

    1.1、注册登录

        可以在https://hub.docker.com免费注册一个Docker账号。
        在命令行执行docker login回车,输入用户名及密码来完成在命令行界面登录Docker Hub。
        可以通过docker logout退出登录

docker win10旧版本 docker版本1.13_Docker_18

    1.2、拉取镜像

        可以通过docker search命令来查找官方仓库中的镜像,并利用docker pull命令来将它下载到本地。

    1.3、推送镜像

        用户也可以在登录后通过docker push命令来将自己的镜像推送到Docker Hub。

docker win10旧版本 docker版本1.13_docker_19

 

docker win10旧版本 docker版本1.13_ubuntu_20

 2、私有仓库

    用户可以创建一个本地仓库供私人使用。eg:基于公司内部项目构建的镜像。
    docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。

    2.1、安装运行docker-registry 

        可以通过获取官方registry镜像来运行。
        默认情况下,仓库会被创建在容器的/var/lib/registry目录下。
        可以通过-v参数来将镜像文件存放在本地的指定路径。
docker run --name registry -d -p 5000:5000 --restart=always -v /opt/data/registry:/var/lib/registry registry
        将容器的/var/lib/registry目录挂载到宿主机的/opt/data/registry目录

docker win10旧版本 docker版本1.13_Docker_21

    2.2、在私有仓库上传、搜索、下载镜像

        可以使用docker tag来标记一个镜像,然后推送它到仓库。
        1、查看本机已有镜像:docker image ls
        2、使用docker tag将session-web:latest这个镜像标记为127.0.0.1:5000/session-web:latest
            eg:docker tag session-web:latest 127.0.0.1:5000/session-web:latest
        格式为:docker tag 镜像名称:版本 仓库IP地址:仓库端口/仓库名称:版本

docker win10旧版本 docker版本1.13_Docker_22


        3、使用docker push上传标记的镜像

            eg:docker push 127.0.0.1:5000/session-web:latest

         4、用curl查看仓库中的镜像

            curl 127.0.0.1:5000/v2/_catalog
            如果可以看到{"repositories":["session-web"]},表明镜像已经被成功上传了。
        5、先删除已有镜像,再尝试从私有仓库中下载这个镜像
            docker image rm 127.0.0.1:5000/session-web:latest
            docker pull 127.0.0.1:5000/session-web:latest
    注意:如果想让本网段的其他主机也能把镜像推送到这个仓库,就得报192.168.0.30:5000这样的内网地址作为私有仓库地址,这时发现无法成功推送镜像。
            这是因为Docker默认不允许非HTTPS方式推送镜像。可以通过Docker的配置选项来取消这个限制
            加速器地址:https://registry.docker-cn.com
            在/etc/docker/daemon.json中写入如下内容:宿主机IP 【我35、30机器都配了这个】
            "insecure-registries":[
                "192.168.0.30:5000"
            ]

docker win10旧版本 docker版本1.13_Docker_23

 

docker win10旧版本 docker版本1.13_docker win10旧版本_24