「学习笔记」docker部署开源hustoj

目录

一.相关学习

了解容器技术发展、特点,搭建容器环境并部署应用:
  1、阅读Docker官方文档,了解特性和基本概念
  2、搭建Dcoker环境,掌握Dcoker常用命令
  3、安装Dcoker-compose,理解作用,掌握语法
  4、利用docker-compose进行应用编排,自行选择应用进行部署

二.部署过程

1.阅读Docker官方文档,了解特性和基本概念

  打开浏览器,输入https://docs.docker.com/,进入docs官方文档,可以查看到很多关于docker的信息,在这里,我们可以知道如何docker如何安装,docker是什么,最近的更新等等。

docker docs

2.搭建Dcoker环境,掌握Dcoker常用命令

  通过网络上广泛的学习,了解到Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包应用程序以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。它与传统虚拟机技术的区别是:传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。下附图就能看出来:

docker和virtual machines的区别

学习了一些关于docker基础的命令,以及区别,具体如下:

(1)帮助命令
1.docker [命令] --help
2.docker -a

(2)镜像命令 Images: //查看本机镜像
1.docker images #查看本机所有镜像
2.docker images -a #列出所有镜像
3.docker images -q #列出所有镜像的id
Search: //去Hub上搜索镜像
1.docker search [内容]
2.docker search --filter=STARS=10000 #搜索出来镜像是STARS大于10000的
Pull: //去Hub上下载镜像(联合文件系统:下过的部分不会重复下)
1.docker pull 镜像名 #认下载最新版本
2.docker pull 镜像名:tag #下载指定版本
Rmi: //删除本地镜像
1.docker rmi -f [镜像id] #删除本地特定id的镜像
2.docker rmi -f [镜像id] [镜像id] [镜像id]… #删除多个镜像
3.docker rmi -f $(docker images -aq) #删除所有镜像

(3)容器命令 Run: //运行容器
1.docker run [可选参数] image
#参数说明
–name=”Name” 容器名字 tomcat1 tomcat2 用于区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 随机指定端口
-p 指定容器端口 -p 8080:8080(主机端口:容器端口)
Ps: //查看运行的容器
1.docker ps #查看正在运行的容器
2.docker ps -a #查看正在运行的容器+历史运行过的所有容器
#参数说明
-a -n=? #显示最近创建的容器
-q #只显示容器的编号
Exit //直接停止容器并退出 Ctrl+P+Q //退出但不停止容器
Rm //删除容器
1.docker rm 容器id #删除指定的容器,无法删除正在运行的容器,强制删加-f
2.docker rm -f $(docker ps -aq) #删除所有容器
Start //启动容器
1.docker start 容器id #启动
2.docker stop 容器id #停止
3.docker restart 容器id #重启
4.docker kill 容器id #强制停止当前容器

(4)常用其他命令 docker run -d 镜像名 //后台启动容器
#docker 容器使用后台运行,就必须有一个前台进程
Docker logs
1.docker logs -tf --tail [数量] 容器id #显式指定条数的容器日志
Top //查看容器内部进程信息
1.docker top 容器id
Inspect //查看元数据
1.docker inspect 容器id #查看指定容器的元数据
Exic/attach //进入正在运行的容器,修改一些配置
1.docker exic -it 容器id bashShell[/bin/bash] #进入容器后,开启一个新的终端,可以在里面操作
2.docker attach 容器id #进入容器正在执行的终端,不会启动新的终端
Cp //拷贝
1.docker cp 容器id:容器内路径 目的主机路径 #将容器内某路径文件拷贝到主机某路径下
  选择的系统是ubuntu 16.04,在官方文档可以看出这个版本是支持docker的。

在这里插入图片描述

  下面我们就根据这个文档对docker进行安装和部署:首先更新一下软件列表,先设置下软件源,为国内阿里云,然后开始下载docker引擎:

更新软件列表

下载docker引擎

  然后启动docker查看版本,可以看到版本是最新的:

启动docker查看版本

  然后开始测试,输入命令:docker run hello-world,这个步骤在下面可以清晰的看出:

在这里插入图片描述


  执行流程如下:

执行流程


  这里呢,我们的docker就安装完成了,下面通过命令:docker images查看运行启动的容器。

在这里插入图片描述

3.安装Dcoker-compose,理解作用,掌握语法

  Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  1. 使用 Dockerfile 定义应用程序的环境。
  2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  3. 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

  通过在终端输入:docker-compose --help,可以查看到很多相关的命令:

docker-compose 常用命令

下面是学习的 Docker-Compose.yml 文件常用的参数:

Image:指定镜像tag或者ID。
Build:用来指定一个包含Dockerfile文件的路径。一般是当前目录.。fig将build并生成一个随机命名的镜像。
Command:用来覆盖缺省命令。command也支持数组形式:
Links:用于链接另一容器服务,如需要使用到另一容器的MysqL服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run --link。
Ports:用于暴露端口。同docker run -p。
Expose:expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose。
Volumes:挂载数据卷。同docker run -v。
volumes_from:挂载数据卷容器,挂载是容器。同docker run --volumes-from。
Environment:添加环境变量。同docker run -e。可以是数组或者字典格式:
depends_on:使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。
external_links:链接搭配docker-compose.yml文件或者Compose之外定义的服务,通常是提供共享或公共服务。注意,external_links链接的服务与当前服务必须是同一个网络环境。
extra_hosts:添加主机名映射。
Extends:继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。
service必须有,file可选。service是需要继承的服务,例如web、database。
Net:设置网络模式。同docker的–net参数。
Dns:自定义DNS服务器

  下面,我们就尝试安装docker-compose:

安装docker-compose

4.利用docker-compose进行应用编排,对hustoj进行部署

  下面我们通过docker-compose来部署和运行hustoj,hustoj是一个开源oj系统,在gethub上可以查到这个项目:

在这里插入图片描述


  Docker-compose的难点在于yml文件的编写,我们在github上可以看到基于docker的安装:

在这里插入图片描述


  点击之后,我们可以找到基于docker安装的分布式:

在这里插入图片描述


  我们可以根据这个来写我们的docker-compose的yml文件,通过图中不难得知,部署hustoj需要MysqL服务和web服务,对于判题系统judge的话,已经集成所以我们不用处理,这样我们就可以得到初步编写的yml文件了:

yml文件的编写


  这个写完之后,我们就可以尝试提起我们的hustoj了,通过一条命令:docker-compose build,然后发现了报错:

build后报错


  通过报错信息得知,是版本号的原因,可能这个不支持3.0版本,那我们就改为2.0版本。

在这里插入图片描述


  再次尝试build,我们发现db和web使用的image skipping,这是因为linux文件系统为联合文件系统,所以下载过后不会再重复下,我们发现,好像没有什么问题:

mysql 部署成功


web端部署完毕


  开始创建:

在这里插入图片描述


  启动完成之后,我们可以通过命令:docker ps查看正在运行的容器,但是我们发现,MysqL的状态是restarting,在一直重启,为了查明原因,我们尝试查看日志:

查看正在运行的容器


  输入docker logs [容器id],可以查看到,是我们yml文件配置中缺少语句。

查看日志


  于是我们尝试添加这条语句,赋值为root:

在这里插入图片描述


修改完之后,我们先down一下,输入以下命令:docker-compose down,然后再启动,输入命令:docker-compose up -d,-d是后台运行,然后我们再次查询,看到MysqL容器状态正常:

在这里插入图片描述


  这个时候,我们就可以在浏览器输入网址,打开,开始注册,发现注册后,登陆不成功,意识到还是数据库的原因,于是就开始自己手动导入数据库和表:

注册


注册成功依然登陆失败


  尝试手动加数据,在github上找到sql文件的目录,找到并复制到我们的ubuntu的根目录下,修改名称我们自己设置的judge。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


复制在根目录下


  在我们ubuntu终端下载一个MysqL-client,手动将这个表导入到里面:

下载mysql-client


创建一个数据库为judge


  然后将db.sql文件拷贝到我们MysqL容器根目录下,使用命令:cp db.sql [容器id]

相关文章

Docker是什么Docker是 Docker.Inc 公司开源的一个基于 LXC技...
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng...
镜像操作列出镜像:$ sudo docker imagesREPOSITORY TAG IMA...
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p...
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改...
在Docker中,--privileged 参数给予容器内的进程几乎相同的权...