Docker使用教程

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值