一、认识docker

  1. Docker是为开发人员和系统管理员提供容器构建,运行和共享应用程序的平台。使用容器来部署应用程序称为容器化。容器不是新的,但用于轻松部署应用程序的容器却是新的。<br />**优势:**
  • (1)有助于Microservices的落地和部署
  • (2)充分利用物理机资源,同时能够整合服务器资源
  • (3)提高开发效率,测试效率,部署效率,有利于DevOps的落地,CICD
  • (4)云原生落地,应用更好地迁移

    二、Docker安装(Centos7)与启动

    1. $ sudo yum install -y yum-utils \
    2. device-mapper-persistent-data \
    3. lvm2
    1. $ sudo yum-config-manager \
    2. --add-repo \
    3. https://download.docker.com/linux/centos/docker-ce.repo
    1. $ sudo yum install docker-ce docker-ce-cli containerd.io
    1. $ yum list docker-ce --showduplicates | sort -r
    2. $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
    3. $ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io
  • 启动docker

    1. $ sudo systemctl enable docker
    2. $ sudo systemctl start docker
  • 关闭docker

    1. $ sudo systemctl stop docker

    三、辅助命令

    1. docker version
    1. docker info
    1. docker --help

    四、容器和镜像概念

    1. **容器**是打包代码以及所有相关依赖项的软件标准单元,它可以使得应用从一个计算机环境快速可靠的移动到另外一个计算机环境去运行。
    2. **镜像**镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。

    容器和镜像的关系:简单来说可以这样去理解:一个软件包通过docker 构建之后成为一个image,而这个image在Docker Engine上运行时就变成了容器。每个容器都是相互隔离的,我们可以简单的把容器看作是一个建议版的Linux运行环境,Docker就是利用容器来运行应用的。

五、Docker镜像原理

docker的镜像实际是由一层一层的文件系统组成,像花卷一样,一层包着一层

Docker容器 - 图1

  • UnionFS(联合文件系统):
    Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 。
  • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
  • rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。

  • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。

六、Images 镜像命令

6.1 查看本机镜像

    docker images [options]    --------------------------    列出本地所有镜像
    docker image    -a           --------------------------    列出所有镜像(包含中间映像层)
  docker image    -q          --------------------------    只显示镜像id

6.2 搜索镜像

    docker search [options] 镜像名    -------------------    去dockerhub上查询当前镜像
        -s 指定值        列出收藏数不少于指定值的镜像
      --no-trunc      显示完整的镜像信息

6.3 拉取镜像

    docker pull 镜像名[:TAG|@DIGEST]    ----------------- 下载镜像
    docker pull 镜像名   (下载最新版)

6.4 删除镜像

docker rmi 镜像名    --------------------------  删除镜像
docker rmi  -f        强制删除

七、Container 容器命令

7.1 运行容器

docker run 镜像名    --------------------------    镜像名新建并启动容器
    --name                     别名为容器起一个名字
    -d                        启动守护式容器(在后台启动容器)
    -p                         映射端口号:原始端口号         指定端口号启动

    例:docker run -it --name myTomcat -p 8888:8080 tomcat
         docker run -d --name myTomcat -P tomcat

7.2 查看运行的容器

    docker ps                    --------------------------    列出所有正在运行的容器
    docker ps    -a            正在运行的和历史运行过的容器
    docker ps    -q            静默模式,只显示容器编号

7.3 停止|关闭|重启容器

    docker start   容器名字或者容器id  --------------- 开启容器
    docker restart 容器名或者容器id    --------------- 重启容器
    docker stop  容器名或者容器id         ------------------ 正常停止容器运行
    docker kill  容器名或者容器id      ------------------ 立即停止容器运行

7.4 挂载数据卷

    docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名
        注意: 
                1.如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
                2.如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中

7.5 查看容器的运行日志

    docker logs [OPTIONS] 容器id或容器名    ------------------ 查看容器日志
    -t             加入时间戳
    -f             跟随最新的日志打印
    --tail      数字    显示最后多少条

7.6 删除容器

    docker rm -f 容器id和容器名     
    docker rm -f $(docker ps -aq)        --------------------------    删除所有容器

7.7 进入容器内部

    docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令
        -i        以交互模式运行容器,通常与-t一起使用
    -t        分配一个伪终端    shell窗口   bash


# 9.容器和宿主机之间复制文件
    docker cp 文件|目录 容器id:容器路径           -----------------   将宿主机复制到容器内部
    docker cp 容器id:容器内资源路径 宿主机目录路径  -----------------   将容器内资源拷贝到主机上




# 5.查看容器内进程
    docker top 容器id或者容器名 ------------------ 查看容器内的进程

# 6.查看查看容器内部细节
    docker inspect 容器id         ------------------ 查看容器内部细节




# 11.打包镜像
        docker save 镜像名 -o  名称.tar

# 12.载入镜像
        docker load -i   名称.tar

# 13.容器打包成新的镜像
      docker commit -m "描述信息" -a "作者信息"   (容器id或者名称)打包的镜像名称:标签

八、DockerFile

Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件

Docker容器 - 图2

Dockerfile的保留命令

保留字 作用
FROM 当前镜像是基于哪个镜像的 第一个指令必须是FROM
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 构建镜像时需要运行的指令
EXPOSE 当前容器对外暴露出的端口号
WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY 类似于ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数

FROM 命令

  • 基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现
  • 语法:
    FROM  <image>
    FROM  <image>[:<tag>]     使用版本不写为latest
    FROM  <image>[@<digest>]  使用摘要
    

MAINTAINER 命令

  • 镜像维护者的姓名和邮箱地址[废弃]
  • 语法:
    MAINTAINER <name>
    

RUN 命令

  • RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步
  • 语法: ```dockerfile RUN (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows) RUN echo hello

RUN [“executable”, “param1”, “param2”] (exec form) RUN [“/bin/bash”, “-c”, “echo hello”]



<a name="7f437226"></a>
#### EXPOSE 命令

-  用来指定构建的镜像在运行为容器时对外暴露的端口 
-  语法: 
```dockerfile
EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
EXPOSE 80/udp

CMD 命令

  • 用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
  • 注意: Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
  • 语法:
    CMD ["executable","param1","param2"] (exec form, this is the preferred form)
    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
    CMD command param1 param2 (shell form)
    

WORKDIR 命令

  • 用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。
  • 语法: ```dockerfile WORKDIR /path/to/workdir

WORKDIR /a WORKDIR b WORKDIR c 注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对



<a name="38ee9d3b"></a>
#### ENV 命令

-  用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。 
-  语法: 
```dockerfile
ENV <key> <value>
ENV <key>=<value> ...

ADD 命令

  • 用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。
  • 语法:
    ADD hom* /mydir/       通配符添加多个文件
    ADD hom?.txt /mydir/   通配符添加
    ADD test.txt relativeDir/  可以指定相对路径
    ADD test.txt /absoluteDir/ 也可以指定绝对路径
    ADD url
    

COPY 命令

  • 用来将context目录中指定文件复制到镜像的指定目录中
  • 语法:
    COPY src dest
    COPY ["<src>",... "<dest>"]
    

VOLUME 命令

  • 用来定义容器运行时可以挂在到宿主机的目录
  • 语法:
    VOLUME ["/data"]
    

ENTRYPOINT命令

  • 用来指定容器启动时执行命令和CMD类似
  • 语法:
    ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2
    

    ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
    CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

springboot项目构建Dockerfile

FROM openjdk:8
MAINTAINER 842649759@qq.com
LABEL name="gper-mall-eureka-server" version="1.0" author="lyj"
WORKDIR /gper/base
EXPOSE 9090
ADD ./spring-cloud-eureka-server-0.0.1-SNAPSHOT.jar ./gper-mall-eureka-server.jar
ENTRYPOINT ["java","-jar","gper-mall-eureka-server.jar"]

九、Docker Compose

简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。其代码目前在 https://github.com/docker/compose 上开源。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

通过前面的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

安装与卸载

1.linux
  • 在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux 64 位系统上直接下载对应的二进制包。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

2.macos、window
  • Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用

3.bash命令补全
$ curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

4.卸载
  • 如果是二进制包方式安装的,删除二进制文件即可。
$ sudo rm /usr/local/bin/docker-compose

5.测试安装成功
$ docker-compose --version
 docker-compose version 1.25.5, build 4667896b

docker compose使用

高级网络配置


参考文章:

https://blog.csdn.net/moneywenxue/article/details/121287557

https://blog.csdn.net/qq_19734597/article/details/95880111

https://blog.csdn.net/lqpf199681/article/details/110518692