1. 基本概念
1.1 镜像
我们都知道,操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04就包含了完整的一套Ubuntu 18.04最小系统的root文件系统
镜像不包含任何动态数据,其内容在构建之后也不会被改变
1.2 容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样
每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失
1.3 仓库
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务
一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签
以Ubuntu镜像为例,ubuntu是仓库的名字,其内包含有不同的版本标签,如16.04, 18.04。我们可以通过ubuntu:16.04,或者ubuntu:18.04来具体指定所需哪个版本的镜像。如果忽略了标签,比如ubuntu,那将视为ubuntu:latest
2. 部署流程
2.1 获取镜像
从Docker镜像仓库获取镜像
sudo docker pull osgeo/gdal:ubuntu-small-latest
# 装有python3.8和GDAL包的Ubuntu镜像
列出已有的镜像
sudo docker image ls
列表包含了仓库名、标签、镜像ID、创建时间以及所占用的空间
REPOSITORY TAG IMAGE ID CREATED SIZE
osgeo/gdal ubuntu-small-latest b57b32798b00 11 days ago 271MB
2.2 启动容器
使用已有的镜像新建并启动容器
# 方法一
sudo docker run -i -t b57b32798b00 /bin/bash
# 方法二
sudo docker run -it osgeo/gdal:ubuntu-small-latest /bin/bash
其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i则让容器的标准输入保持打开
在交互模式下,用户可以通过所创建的终端来输入命令
root@7c2c1e445f00:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@7c2c1e445f00:/#
另外打开一个终端,查看容器的状态
eod@eod:~/Desktop$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c2c1e445f00 b57b32798b00 "/bin/bash" 41 seconds ago Up 40 seconds pensive_noyce
eod@eod:~/Desktop$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c2c1e445f00 b57b32798b00 "/bin/bash" 58 seconds ago Up 57 seconds pensive_noyce
eod@eod:~/Desktop$
其中sudo docker ps查看正在运行的容器,sudo docker ps -a查看所有的容器,包括已停止的容器
2.3 安装所需的包
在启动的容器中安装项目所需的相关包
2.4 重新制作镜像
在容器中安装好相应的包后,原有的镜像中并没有相应的包,当容器被删除时,原有的工作就白费了,可以将现有的容器制作成新的镜像,这样相应的包就会在新的镜像中
sudo docker commit 7c2c1e445f00 ubuntu:v6.0
其中7c2c1e445f00为容器ID,可以使用sudo docker ps查看,ubuntu:v6.0为自己定义的镜像名称
2.5 部署
(1) 启动容器
sudo docker run -p 81:81 -p 82:82 -p 83:83 -p 8005:8005 -p 8880:8880 -it -v /home/eod/Desktop/Product_Environment/:/home/eod/Desktop/Product_Environment/ -v /raid/proc/share18.04/Dev/static/:/raid/proc/share18.04/Dev/static/ ubuntu:v6.0 /bin/bash /home/eod/Desktop/Product_Environment/sh/deploy_start.sh
-p将容器中的端口与服务器的端口映射,-v将服务器中的目录挂载到相应的容器目录中
/home/eod/Desktop/Product_Environment/sh/deploy_start.sh表示容器启动之后就执行deploy_start.sh脚本
(2) 退出容器
root@9e7122b508b5:/# exit
(3) 启动已停止的容器
sudo docker start 9e7122b508b5
这样子项目就部署成功了
2.6 项目迭代
将新版本的项目代码从git拉取下来后,重新启动容器
sudo docker restart 9e7122b508b5