带你了解docker是什么----进阶篇

53 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

docker工作流程

实际上docker使用了常见的CS架构,也就是client-server模式,docker client负责处理用户输入的各种命令,比如docker build、docker run,真正工作的其实是server,也就是docker demon,值得注意的是,docker client和docker demon可以运行在同一台机器上。

  1. docker build
    当我们写完dockerfile交给docker“编译”时使用这个命令,那么client在接收到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出“可执行程序”image。
  2. docker run
    有了“可执行程序”image后就可以运行程序了,接下来使用命令docker run,docker daemon接收到该命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container。
  3. docker pull
    docker build和docker run是两个最核心的命令,会用这两个命令基本上docker就可以用起来了,剩下的就是一些补充。 那么docker pull是什么意思呢?
    我们之前说过,docker中image的概念就类似于“可执行程序”,我们可以从哪里下载到别人写好的应用程序呢?很简单,那就是APP Store,即应用商店。与之类似,既然image也是一种“可执行程序”,那么有没有"Docker Image Store"呢?答案是肯定的,这就是Docker Hub,docker官方的“应用商店”,你可以在这里下载到别人编写好的image,这样你就不用自己编写dockerfile了。
    docker registry 可以用来存放各种image,公共的可以供任何人下载image的仓库就是docker Hub。那么该怎么从Docker Hub中下载image呢,就是这里的docker pull命令了。
    因此,这个命令的实现也很简单,那就是用户通过docker client发送命令,docker daemon接收到命令后向docker registry发送image下载请求,下载后存放在本地,这样我们就可以使用image了。

dockerfile

是一个自动化脚本,主要是用来创建镜像的。

如下为一个文件样例: from python:3.8-slim-buster workdir /app copy .. run pip install -r requirments.txt cmd ["python","app.py"]

  1. from 指定一个基础镜像
  2. workdir 指定了之后所有docker命令的工作路径。是这个命令之后的所有命令。如果不存在docker会帮你自动创建。
  3. 通用copy 命令将所有的程序拷贝到docker镜像中。copy<本地路径><目标路径> 。第一个参数的.代表程序根目录下的所有文件,第二个参数的.点代表当前的工作路径,也就是之前创建的/app
  4. run 允许我们在创建镜像时运行任意的shell 命令。
  5. cmd 用来指定当docker容器运行起来之后要执行的命令。

docker build

之后就可以通过docker build 来创建镜像 docker build -t my-finance .

  1. -t 指定镜像的名称
  2. . 代表在当前目录下寻找dockerfile 文件

第一次调佣docker build 会比较慢,因为需要下载必要的镜像文件,然后一行一行的执行文件中的命令。不过之后调佣的话就会快上很多。因为docker会缓存之情的过程。

docker run

使用docker run来创建容器。 docker run -p 80:5000 -d myfinace

  1. -p 会将容器上的某一个端口映射到本地主机上,这样你才能从主机上访问容器的web应用。80 是主机上的端口 ,5000是容器上的端口
  2. -d 代表容器在后台运行,这样容器的输出不会直接显示在控制台上。

volumes

docker 提供的 volumes 数据卷 可以把它看成一个在本地主机和不同容器中共享的文件夹。比如你在某个容器中修改了某一个volums 中的数据,它会同时发映在其他的容器上。

通过 docker volume create my-finnace-data来创建一个数据卷。

之后再启动容器的时候就可以通过-v参数指定将这个数据卷挂载到容器中的哪一个路径上, docker run -p 80:5000 -v my-finance-data:/etc/finance -d myfinace

如上,将my-finance-data 挂载到了/etc/finance这个路径下,那么向这个路径下写入的任何数据会被永久保存到这个数据卷中。

docker compose

创建一个docker-compose.yml 文件,在这个文件下可以通过services 来定义多个comtainer

vesion :"3" services: web: build: . ports: - "80:5000" db: image:"mysql" environment: mysql_databade:finance-db mysql_root_password:secret volumes: -my-finance-data:/var/lib/mysql volumes:my-finance-data

之后使用 docker compose up -d来运行所有的容器。