有趣的地方

有趣的地方

Docker

1.Docker介绍

一. Docker基础

1.Docker是什么?

Docker是一款开源的应用容器引擎,由Docker Inc.公司开发,自推出以来迅速成为云计算领域中的关键技术之一。Docker利用Linux的内核特性如cgroups(Control Groups)和namespaces实现了资源隔离与限制,可以在同一主机系统上轻松地创建和管理多个容器实例,每个容器都像是一个轻量级的、独立运行的虚拟环境。

2. Docker的核心组成部分包括:

docker核

心组成.mp4(1.9 MB)

- 0%

  1. Docker Client(客户端):用户通过Docker CLI(命令行界面)与Docker守护进程交互,发送构建、运行、停止容器等相关命令。

  2. Docker Daemon(守护进程):在宿主机上持续运行的后台服务,负责接收客户端命令,管理容器、镜像和网络等核心组件。

  3. Docker Image(镜像):一种分层结构的只读模板,包含了运行应用程序所需的所有依赖文件和配置信息。用户可以根据基础镜像创建新的定制镜像,或者从Docker Hub这样的镜像仓库拉取现成的镜像。

  4. Docker Container(容器):基于镜像运行的可执行实例,容器之间相互隔离,各自拥有独立的文件系统、网络空间以及其他资源,可以快速启动、停止和迁移。

3. Docker的主要优势和特点包括:

  • 标准化和可移植性:容器化的应用可以在任何支持Docker的环境中运行,因为所有的依赖都被包含在镜像之中,大大简化了部署流程。

  • 轻量级虚拟化:相比传统的虚拟机技术,容器占用的资源更少,启动更快,因此可以更高效地利用硬件资源。

  • 资源隔离与安全性:通过内核提供的隔离机制,确保容器间互不影响,提供一定的安全保障。

  • DevOps友好:Docker促进了持续集成和持续部署(CI/CD)实践,有助于实现敏捷开发和运维自动化。

  • 容器编排:虽然Docker本身提供了容器的生命周期管理,但在大规模集群环境下,常常结合Kubernetes、Docker Swarm等容器编排工具来管理大量容器的调度、网络和服务发现等复杂需求。

综上所述,Docker已经成为现代软件开发、交付和部署流程中不可或缺的一部分,极大地提升了应用的构建、测试、分发和运行效率。

二.Docker与Virtual Machine区别

Docker与Virtual Machine(虚拟机)的主要区别在于它们的架构、资源使用、隔离程度以及启动和运行效率等方面:

  1. 架构和资源使用:

  2. Docker:基于容器技术,它不运行完整的操作系统,而是利用宿主机的操作系统内核,并通过命名空间(Namespace)、控制组(Cgroups)等内核特性进行隔离,使得不同的容器共享同一内核,但拥有独立的用户空间。因此,Docker容器相比虚拟机更加轻量级,启动更快,占用存储空间和内存较少。

  3. Virtual Machine:每个虚拟机运行在其自身的Guest OS(客户操作系统)之上,这个Guest OS位于一个名为Hypervisor(虚拟机管理程序)的底层软件之上,该软件模拟出一套完整的硬件环境供Guest OS使用。这意味着每个虚拟机都需要一个完整的操作系统副本,资源消耗较大,启动时间较长,存储和内存占用较多。

  4. 隔离程度:

  5. Docker:容器之间的隔离不如虚拟机彻底,尤其是在安全性和稳定性方面。容器共享内核,如果一个容器出现了内核漏洞或故障,可能影响到同一主机上的其他容器。

  6. Virtual Machine:虚拟机提供了较高的隔离级别,因为每个虚拟机都有独立的操作系统,即便一个虚拟机受到攻击或崩溃,也不会直接影响到其他虚拟机。

  7. 启动和运行效率:

  8. Docker:由于容器不需要加载和运行整个操作系统,所以能够实现秒级启动,运行时性能损失较小,接近于直接在宿主机上运行应用。

  9. Virtual Machine:虚拟机需要启动整个操作系统,包括内核引导和系统初始化等步骤,启动时间一般为分钟级别,运行时性能虽经过优化但仍低于直接在物理机上运行。

  10. 应用场景和灵活性:

  11. Docker:非常适合于服务部署、微服务架构、持续集成/持续部署(CI/CD)等场景,容器易于复制和移动,确保在不同环境下的部署一致性。

  12. Virtual Machine:适合于需要更高隔离度的场景,例如测试不同操作系统版本的应用、隔离不兼容的服务,以及硬件兼容性要求较高的传统应用。

  13. 管理和编排:

  14. Docker:具备良好的容器编排能力,通过Docker Compose、Kubernetes等工具可以轻松管理和调度大量容器。

  15. Virtual Machine:早期的虚拟机管理相对独立,但现在也有诸如VMware vSphere、OpenStack等平台支持大规模虚拟机的管理和编排。

VM技术和容器技术对比

面对上述几个问题,docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后一个标准化组件是用户的app)。这也就是基于docker的PaaS产品的原型。

三.Docker应用

- Docker在各种场景中都有广泛的应用,包括开发环境搭建、持续集成和部署、微服务架构等。

- Docker可以提供一致的开发和测试环境,简化了开发者之间的协作和应用的部署。

- 在CI/CD中,Docker可以用于构建和打包应用程序,以及自动化测试和部署。

- 在微服务架构中,Docker可以帮助实现服务的隔离、部署和扩展。

docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

2.Docker常用命令

1.docker 基础命令

启动docker

systemctl start docker

关闭docker

systemctl stop docker

重启docker

systemctl restart docker

docker设置随服务启动而自启动

systemctl enable docker

查看docker 运行状态

systemctl status docker

查看docker 版本号信息

docker version
docker info

docker 帮助命令

忘记了某些命令便可使用此进行查看与回顾

docker --help

比如 咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用

docker pull --help

2.镜像命令

查看镜像列表

docker images

拉取镜像

不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本

docker pull 镜像名 
docker pull 镜像名:tag

拉取最新版redis

删除镜像

------当前镜像没有被任何容器使用才可以删除

1.删除一个 (-f 强制删除)

docker rmi -f 镜像名/镜像ID

2.删除多个 其镜像ID或镜像用用空格隔开即可

docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID

3.删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID

docker rmi -f $(docker images -aq)

4.删除镜像

docker image rm 镜像名称/镜像ID

3.容器命令

1.查看正在运行容器列表

docker ps

2.查看所有容器 -----包含正在运行 和已停止的

docker ps -a

3.运行一个容器

-it 表示 与容器进行交互式启动

-d 表示可后台运行容器 (守护式运行)

--name 给要运行的容器 起的名字

/bin/bash 交互路径

必须练习:

docker run -it --name 要取的别名 镜像名:Tag /bin/bash 

例如我们要启动一个redis 把它的别名取为redis001 并交互式运行 需要的命令 —我这里指定版本号为7.2.4

#1. 拉取redis 镜像

docker pull redis:7.2.4

#2.命令启动

docker run -it -d --name redis001 redis:7.2.4 /bin/bash

#3.查看已运行容器

docker ps

4.停止容器

# 先停止咱之前运行的 redis 容器

docker stop 容器名/容器ID

5.删除容器

#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)

6.容器端口与服务器端口映射

命令:

-p 宿主机端口:容器端口   (注意是小写的p)
-P  (注意是大写P)  ? 为什么它知道容器的端口?

-p 9090:80 解析 将容器内部的 80端口与docker 宿主机(docker装在哪太服务器 那台服务器 )9090端口进行映射 那通过外部访问宿主机9090端口 即可访问到 docker 容器 80端口了

docker run -d --name nginx01 -p 9090:80  nginxdocker run -d --name nginx02 -p 9091:80  nginx

在Docker中, -p 和 -P 是用于映射容器端口到主机端口的两个选项。它们之间的区别如下:

1. -p 选项:这个选项用于映射指定的容器端口到主机的指定端口。例如,使用 -p 8080:80 将容器的80端口映射到主机的8080端口。你可以指定容器和主机的端口号。

2. -P 选项:这个选项用于自动将容器的所有暴露的端口映射到主机的随机端口。Docker会自动分配一个主机端口,并将容器端口映射到该主机端口上。类似 docker -p :80 你可以使用 docker port <container_name> 命令来查看容器的映射端口。

总结来说, -p 选项允许你手动指定容器和主机的端口映射关系,而 -P 选项则是自动将容器的所有暴露的端口映射到主机的随机端口上。

7.进入容器

这里咱就进入 前面的 nginx1 容器

docker exec -it 容器名/容器ID /bin/bash
#进入 前面的 nginx容器  
 docker exec -it nginx01 /bin/bash

8.退出容器

从容器内 退出到自己服务器中 需注意 两个退出命令的区别

#直接退出 未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭

exit

9.停止容器

docker stop 容器ID/容器名

10.重启容器

docker restart 容器ID/容器名

11.启动容器

docker start 容器ID/容器名

12.kill 容器

docker kill 容器ID/容器名

13.容器文件拷贝

docker cp 命令用于在容器和本地文件系统之间复制文件/文件夹。

#从主机上拷贝文件到容器内

docker cp 1.txt mycontainer:/1.txt

#从容器里面拷贝文件/目录到本地一个路径

docker cp 容器名称或id:/container_path to_path  例如:docker cp tomcat:usr/local/tomcat/README.md ./

14.查看容器日志

docker logs -f --tail=要查看末尾多少行 默认all 容器ID

15.容器自动重启

使用docker run命令时 添加参数--restart=always 便表示,该容器随docker服务启动而自动启动

docker run -d  -p 8888:80 --restart=always --name my-nginx nginx

16.数据挂载

简单来讲,就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!

命令:

-v 宿主机文件存储位置:容器内文件位置

如此操作,就将 容器内指定文件挂载到了宿主机对应位置,-v命令可以多次使用,即一个容器可以同时挂载多个文件

-v 宿主机文件存储位置:容器内文件位置  -v 宿主机文件存储位置:容器内文件位置  -v 宿主机文件存储位置:容器内文件位置 

Nginx实例:

6.环境变量

docker run -d -e name=heimi -e girl=canglaoshi nginx

7. --rm

在Docker中, --rm 标志用于在容器停止后自动删除容器。当使用该标志运行容器时,容器停止运行后会立即被删除,释放相关的资源。这对于临时性的容器和一次性任务非常有用,可以避免手动删除容器的麻烦。

 8. --network=host

docker run -d --network=host --name=nginx2  -v  /home/206/nginxhtml:/usr/share/nginx/html    nginx

在Docker中, --network 标志用于指定容器连接的网络模式。以下是一些常见的网络模式及其作用:

1. bridge (默认模式):在桥接网络中,每个容器都分配了一个IP地址,并且可以通过ip相互访问。这是最常用的网络模式,适用于大多数应用程序。

2. host :在主机网络模式下,容器与主机共享网络命名空间,即容器使用主机的网络栈。这使得容器可以直接使用主机的网络接口,无需进行端口映射。

3. none :在无网络模式下,容器不会连接到任何网络。这意味着容器无法通过网络与其他容器或外部进行通信。这种模式适用于某些安全性要求较高的容器。

4. container:<name|id> :在容器网络模式下,容器与另一个指定容器共享网络命名空间。这意味着两个容器可以通过本地主机进行通信,就像它们在同一主机上一样。

这些网络模式可以根据具体的应用场景和需求进行选择和配置。

dockerfile文件

1.标准格式

Dockerfile 是一个文本文件,开发者使用它来定义如何构建一个Docker镜像。它是自动化构建Docker镜像的标准方法,包含了用于构建镜像的一系列指令,这些指令会被Docker引擎按顺序逐行解析并执行。

dockerfile主要由一下几个部分组成 

1.基础镜像信息(FROM):dockerfile的第一行通常是以FROM开始的,用于指定构建镜像的基础信息

FROM ubuntu:latest

2.维护者信息(MAINTAINER):(现在已经弃用,推荐使用LABEL)可以添加镜像的维护者信息

LABEL maintainer ="Your Name"

3.工作目录设置(WORKDIR):设置Docker容器内的工作目录

WORkDIR /opt/wms-app/

4.复制文件到镜像(COPY or ADD):将宿主机上的文件或目录复制到镜像中

COPY . /app/source

5.运行命令(RUN):执行任意shell命令或命令列表来安装软件包或修改系统状态

RUN apt update && apt install -y some-package

6.设置环境变量(ENV):定义环境变量供后续构建步骤或容器的运行使用

ENV VAR_NAME=value

7.暴漏端口(EXPOSE):指定容器运行时应公开的网络端口

EXPOSE 80 

 构建镜像时,通过在命令行中运行 docker build 并指定Dockerfile所在的路径来创建镜像:

2.使用

2.1.准备一个java类文件

import java.util.Timer;
import java.util.TimerTask;
public class App {

    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("running");
            }
        },5000,5*1000);
        
    }

}


2.2 标准dockerfile文件格式

# 基础镜像
FROM openjdk:8
# 工作目录
WORKDIR /opt
# 拷贝文件
ADD wms-app-0.0.1-SNAPSHOT.jar app.jar
#配置容器的暴漏端口
EXPOSE 8080
# 信息详情
RUN ls -l
# 运行
ENTRYPOINT [ "java","-jar","app.jar" ]

这个示例Dockerfile的功能是构建一个基于OpenJDK 8镜像的Docker镜像。它的构建过程包括以下步骤:

1. 使用 FROM 指令指定基础镜像,这里使用的是OpenJDK 8镜像。

2. 使用 WORKDIR 指令设置工作目录为 /opt ,后续的操作都在这个目录下进行。

3. 使用 COPY 指令将当前目录下的所有文件复制到容器的 /opt 目录下。

4. 使用 RUN 指令在容器中执行命令,这里是使用javac编译App.java文件。

5. 使用 CMD 指令在容器启动时执行命令,这里是执行Java应用程序。

通过以上步骤,我们可以使用该Dockerfile构建一个包含Java应用程序的镜像,并在容器启动时执行Java应用程序。

2.3.构建镜像

当你有了上述的Dockerfile文件后,你可以使用 docker build 命令来构建Docker镜像。以下是使用 docker build 命令的示例:

1. 首先,打开终端并进入包含Dockerfile的目录。

2. 运行以下命令来构建镜像:

 docker build -t myapp:v1 .

解释:

-t myapp:v1 :指定构建的镜像名称为 myapp:v1 ,你可以自定义镜像名称。

. :表示Dockerfile所在的当前目录。

3. Docker引擎将会根据Dockerfile的指令和参数开始构建镜像。它会执行每个指令,并在构建过程中显示相应的输出信息。

4. 构建完成,你可以使用 docker images 命令来查看构建好的镜像列表:

docker images

2.4. CMD 与 ENTRYPOINT 区别

在Dockerfile中, CMD 和 ENTRYPOINT 都是用于定义容器启动时要执行的命令或脚本。它们之间有一些区别:

CMD 指令:

- CMD 指令用于设置容器启动时要执行的默认命令。它可以有多种形式:

- CMD ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。

- CMD command param1 param2 :使用命令格式,不推荐使用这种形式。

- 如果在运行镜像时指定了要运行的命令,那么 CMD 指令将被覆盖。 docker run app206:v1 /bin/bash

- CMD 指令可以被Dockerfile中的多个 CMD 指令覆盖,但只有最后一个 CMD 指令会生效。

ENTRYPOINT 指令:

- ENTRYPOINT 指令类似于 CMD ,用于设置容器启动时要执行的命令。它也可以有多种形式:

- ENTRYPOINT ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。

- ENTRYPOINT command param1 param2 :使用命令格式,不推荐使用这种形式。

- 与 CMD 不同的是, ENTRYPOINT 指令的参数不会被覆盖。如果在构建镜像时指定了要运行的命令,它将作为参数传递给 ENTRYPOINT 指令。

综上所述, CMD 指令用于设置默认的容器启动命令,而 ENTRYPOINT 指令用于设置始终执行的命令。 ENTRYPOINT 指令更适合用于定义容器的主要执行逻辑,而 CMD 指令则更适合用于提供默认参数或允许在运行容器时动态修改命令。

docker compose

1.概述

是 Docker 官方提供的一款开源工具,主要用于简化在单个主机上定义和运行多容器 Docker 应用的过程。它的核心作用是容器编排,使得开发者能够在一个统一的环境中以声明式的方式管理多容器应用的服务及其依赖关系。

也就是说Docker Compose是一个用于定义和运行多个Docker容器的工具。它使用YAML文件来定义应用程序的服务、网络和卷等配置,然后使用单个命令即可启动、停止和管理整个应用程序的多个容器。

2.使用Docker Compose的简要步骤如下:

1. 创建一个YAML文件(通常命名为 docker-compose.yml ),用于定义应用程序的服务、网络和卷等配置。

2. 在YAML文件中定义服务,包括容器的镜像、端口映射、环境变量、依赖关系等。

3. 运行 docker-compose up 命令,Docker Compose将根据YAML文件中的配置启动和管理容器。

4. 使用 docker-compose down 命令停止和删除由Compose创建的容器。

3.安装

Releases · docker/compose · GitHub

yum install docker-compose

以下是一个简单的Docker Compose示例:

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - 3888:80   
    volumes:
      - ./opt/wms-web/:/usr/share/nginx/html/
  db:
    image: mysql:latest
    ports:
      - 3999:3306
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./opt/db/:/var/lib/mysql/

在这个示例中,我们定义了两个服务: web 和 db 。

web 服务使用了 nginx:latest 镜像,并将主机的3888端口映射到容器的80端口。还定义了一个卷,将主机的 ./opt/wms-web 目录映射到容器的 /usr/share/nginx/html 目录。

db 服务使用了 mysql:latest 镜像,并设置了一个环境变量 MYSQL_ROOT_PASSWORD 。还定义了一个卷,将主机的 ./opt/db 目录映射到容器的 /var/lib/mysql 目录。

通过运行 docker-compose up 命令,Docker Compose将启动这两个容器,并根据定义的配置进行设置。这样,我们就可以同时运行和管理这两个容器,它们可以相互通信和交互。

3. Java项目基于Docker打包发布

1.打包应用

mvn clean package -DskipTests

2.新建dockerfile

FROM  openjdk:8
#设置工作目录
WORKDIR  /workspace

#COPY  wms-app-0.0.1-SNAPSHOT.jar /workspace/app.jar
ADD  wms-app-0.0.1-SNAPSHOT.jar  app.jar
#配置容器暴漏的端口
EXPOSE 8080
#查看是否已经copy进去
#RUN  ls 
#java App
ENTRYPOINT  ["java","-jar","app.jar"]

3.打包镜像

docker build -t mall:v1 .

4.测试运行

--rm 代表退出之后,容器移动删除

docker run -it --rm beimao:v1

5.阿里云免费私仓

容器镜像服务 (aliyun.com)

$ docker login --username=lewowo123 registry.cn-beijing.aliyuncs.com

$ docker tag [ImageId] registry.cn-beijing.aliyuncs.com/beiyou123/beimao:[镜像版本号]
$ docker push registry.cn-beijing.aliyuncs.com/beiyou123/beimao:[镜像版本号]

CoffeeScript

拉取镜像docker pull registry.cn-hangzhou.aliyuncs.com/206/beimao:[镜像版本号]

4.Vue前端项目打包

4.1 编译打包

npm run build

4.2 前端项目 nginx的配置文件default.conf 和 dockerfile

default.conf

upstream wms-app {
    server 192.168.11.51:3999;
}

server {
    listen       80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;#异常跳转
    }
     location /api {
        proxy_pass http://wms-app;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

1.root:设置静态根目录为 /usr/share/nginx/html

2. index:设置目录的默认文件为 index.html 、index.htm、index.php

3. try_files:设置文件查找规则为 $uri $uri/ /index.html。即3个规则,先从 $uri 查找,再从 u r i / 目录中查找,最后查找 / i n d e x . h t m l 。

dockerfile

FROM nginx
COPY  ./html /usr/share/nginx/html/
RUN rm -f /etc/nginx/conf.d/default.conf
COPY default.conf /etc/nginx/conf.d/default.conf

4.3 构建镜像

docker build -t web:v1 .                                                                                                        

4.4 运行

docker  run -it -p 8086:80  web:v1

发表评论:

Powered By Z-BlogPHP 1.7.3

© 2018-2020 有趣的地方 粤ICP备18140861号-1 网站地图