docker简介

为什么我们需要docker

参考文章:什么是Docker?看这一篇干货文章就够了!

从开发到测试到运维,从头到尾搭建三套重复的运行环境,浪费时间和效率,还可能产生各种问题。

最初的解决方案:搭好一套虚拟机环境然后clone出来,但是存在很大的问题:每开发一个应用就需要部署一个新的虚拟机,且我们想要部署的是应用程序,虚拟机的操作系统所占用的资源是完全浪费掉的。

为了解决虚拟机存在的问题,诞生了容器技术。

docker的原理

与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。相比虚拟机,容器更加的轻量级且占用的资源更少

注意,容器是一种通用技术,docker只是其中的一种实现,可以让我们方便的创建和使用容器

docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系

dockerfile、image和container

docker中有这样几个概念,可以这样理解:

  • dockerfile:指定程序依赖
  • image:即可执行程序
  • container:运行起来的进程

写程序需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是"编译器"。

因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置,之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令,image运行起来后就是docker container。

docker安装

linux环境下的docker安装教程:史上最全Docker环境安装指南

windows:https://zhuanlan.zhihu.com/p/441965046

docker命令

启动docker服务:

1
systemctl start docker	

镜像命令

  1. 查看镜像

    1
    2
    #查看所有本地主机上的镜像
    docker images

    image-20240328154810691

  2. 下载镜像

    这里一般都是拉取https://hub.docker.com/上面封装好的镜像

    1
    docker pull 镜像名:版本号(默认为latest)

    例如:

    1
    2
    docker pull mysql:5.7
    docker pull docker.io/library/mysql:latest
  3. 删除镜像

    1
    2
    3
    4
    # 删除指定的镜像
    docker rmi -f 镜像id
    # 删除多个镜像
    docker rmi -f 镜像id 镜像id 镜像id 镜像id
  4. 镜像的导入导出

    1
    2
    3
    4
    5
    6
    # 讲本地镜像导出
    docker save -o 导出的路径 镜像id
    # 加载本地的镜像文件
    docker load -i 镜像文件
    # 修改镜像的名称
    docker tag 镜像id 新镜像名称:版本

容器命令

  1. 列出所有正在运行的容器

    1
    docker ps 
  2. 运行容器

    1
    2
    # 启动容器
    docker run 容器id
    • -v:指定本地项目目录与容器内的一个目录建立一个映射关系

      例如:可以通过容器的 /workspace 目录访问本地的 /path/to/your/project 目录下的资源文件

      1
      docker run --rm -v /path/to/your/project:/workspace -t linguist
    1
    2
    3
    4
    5
    6
    # 重启容器
    docker restart 容器id
    # 停止当前正在运行的容器
    docker stop 容器id
    # 强制停止当前容器
    docker kill 容器id
  3. 删除容器

    1
    2
    # 删除指定容器
    docker rm 容器id

    删除容器和删除镜像的区别:

    删除容器是删除运行时的实例,而删除镜像是删除用于创建容器的基础文件。在删除镜像之前,您需要确保没有任何容器(无论是运行中的还是已停止的)仍在使用该镜像。

Docker Compose

Docker Compose 是一个用于管理多容器 Docker 应用的工具,可以理解成是对 Docker 的进一步封装,帮助开发者以更简单的方式管理多个容器,适用于多服务应用。可以管理多个容器及其相互依赖性,一键配置所有服务,适合复杂开发环境。通常通过一个 docker-compose.yml 文件定义多容器的配置,包括镜像、网络、挂载卷、环境变量等。

安装

不能使用pip进行安装(版本过老,会与docker产生不兼容)、不能离线下载再上传到虚拟机(会产生segment error)

只能采用虚拟机直接在线下载安装的方式,参考:Docker Compose - 安装和基本使用

如果虚拟机下载速度太慢,可以考虑使用下面的代理镜像进行加速:

1
curl -SL https://mirror.ghproxy.com/https://github.com/docker/compose/releases/download/v2.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

命令

  1. 启动

    1
    docker-compose up -d
    • -d :让容器在后台运行,而不在当前终端显示容器的输出日志
  2. 停止

    1
    docker-compose down

通过dockerfile创建镜像

有的时候我们找到的开源项目在https://hub.docker.com/上面并没有封装好的镜像,但是我们可以在其项目目录里面找到 dockerfile ,说明其可以通过docker进行部署。

我们 git clone 下来项目之后,运行下面的命令根据当前目录下的dockerfile构建Docker镜像

1
docker build [OPTIONS] PATH | URL 
  • PATH | URL :表示dockerfile所在的路径
  • OPTIONS
    • -t:指定镜像的名字

构建容器的时候会依据dockerfile从Docker Hub上拉取对应的环境,所以我们并不需要提前搭建环境。

例如:

image-20240328161814685