如何使用 Docker 部署容器
设想,为了推出一个网站,您不必从裸机安装一个完整的服务器。 而不是安装操作系统,然后安装服务器软件,然后部署精心设计的应用程序或站点,您可以简单地在一个独立的包中开发所有内容,并使用单个命令将其推出。
这是使用容器的众多好处之一。它们使开发和部署周期变得异常高效。但是你如何部署这些容器?我想在这里指导你完成这个过程。我们将专注于在Ubuntu Server 1804上部署基本的NGINX Web服务器作为容器。所有这一切都将在Docker的帮助下完成。
为了成功将NGINX部署为容器,您需要具备以下条件:
- 一个安装了Docker的Ubuntu Server 1804的运行实例。
- 一个docker 用户组的成员用户
是的,有了这两部分,你就准备好了。
您部署的每个容器都将基于从DockerHub中提取的镜像。 您可以下拉单个镜像并根据需要随时使用。 DockerHub上还有许多镜像用于单个应用程序或平台。 以NGINX为例。 如果你在DockerHub上搜索NGINX,你会得到大约56,172个条目。 这并不意味着每个条目都是您可以使用的可用图像。
图像命名如下:
例如,对于NGINX,您可能会找到一个名字为的镜像:
或许你可能找到:
您也看到了,有几乎所有需要的镜像。
在使用图像之前,必须将其保存在本地驱动器上。 有两种方法可以做到这一点:
- 直接使用pull命令
- 间接地,在容器部署过程中。
要从DockerHub中拉取图像,您将打开一个终端窗口并发出命令:
如果你想拉取Ingress图像,该命令是:
当你拉取你需要的图像之后,你可以使用命令确认是否存在:
上面的命令将列出你拉取的所有镜像(图A)。
拉取随意图像时要谨慎。 为什么? 因为你永远不知道创造它们的原因。 容器可能包含恶意代码,可能会对您的网络或数据造成严重破坏。 因此,最好只使用官方图像(例如NGINX图像)。
现在该部署容器了, 如果您尚未拉取镜像,则在部署阶段将下拉所需要的镜像。 由于我们拉取官方NGINX图像,我们将使用它。
要部署容器,请使用docker命令,如下所示:
备注:
- NAME等于您要为容器提供的名称(这可以是任何内容,例如nginx-webserver)。
- PORTS您要使用的端口(以NETWORK PORT:CONTAINER PORT形式)。
- IMAGE用于容器的图像(例如nginx)。
因此,部署NGINX容器的基本命令是:
容器将要部署,NGINX Web服务器将在端口80上可用于本地网络。但是,如果已在服务器上使用端口80来部署容器,该怎么办? 您可以将其部署在网络端口8080上,如下所示:
此时,您可能会看到下一个问题。 运行上述命令之一后,不返回bash提示符(图B)。
你如何运行一个容器,并获得你的bash提示? 为此,您必须以分离模式运行容器。 在此之前,您必须使用键盘组合[Ctrl] +终止当前容器。 该组合将返回提示并杀死容器。
要确定容器是否运行,使用命令:
将列出所有容器及其状态(图C)。
如果容器仍在运行,我们必须在同一端口部署另一个容器之前将其终止(否则端口会发生冲突,从而阻止容器部署)。 要杀死正在运行的容器,首先需要Container ID(随机字符串)。 发出docker ps -a命令时会显示此字符串。 要终止正在运行的容器,使用命令:
其中CONTAINER_ID是相关容器的ID。
然后,您可以使用以下命令删除容器:
其中CONTAINER_ID是相关容器的ID。
请注意,您不必输入完整的Container ID,字符串的前四个字符就足够了。
现在,要以分离模式部署容器,命令是:
这次你不仅会得到你的提示,而且Docker会为你显示容器ID(图D)。
如果你想在正在运行的容器上工作怎么办? 假设您想对NGINX进行更改甚至开始开发它将显示的网站? 因此,您必须访问容器。 因此,您需要Container ID。 使用ID,发出命令:
其中CONTAINER_ID是容器的ID。
您现在应该处于运行容器提示符(图E)中,您可以在其中开始处理NGINX服务器。
要退出容器,只需键入命令exit。
七、比你想象的容易
希望到现在为止,您看到容器部署并不像您想象的那样具有挑战性。 在Docker的帮助下,您可以在几分钟内推出专业版的应用和服务。
原文链接:
作者 | 天元浪子
来源 | CSDN博客
想要真正理解Docker,就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代,目前已经进入到了容器化时代。可以说,Docker是虚拟化技术不断发展的必然结果。
那么,什么是容器呢?容器和虚拟机有什么不同?Docker和容器又是什么关系呢?搞明白这几个问题,Docker的概念就清晰了。
11 虚拟机和容器
借助于VMWare等软件,可以在一台计算机上创建多个虚拟机,每个虚拟机都拥有独立的操作系统,可以各自独立的运行程序。这种分身术虽然隔离度高(操作系统级),使用方便(类似物理机),但占用存储资源多(GB级)、启动速度慢(分钟级)的缺点也是显而易见的。
相较于虚拟机,容器(Container)是一种轻量型的虚拟化技术,它虚拟的是最简运行环境(类似于沙盒)而非操作系统,启动速度快(秒级)、占用存储资源少(KB级或MB级),容器间隔离度为进程级。在一台计算机上可以运行上千个容器,这是容器技术对虚拟机的碾压式优势。
12 容器、镜像和Docker
Docker是一个开源的应用容器引擎,可以创建容器以及基于容器运行的程序。Docker可以让开发者打包他们的应用和依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
听起来很简单,但是在Docker和容器之间,还隐藏着一个镜像的概念,令初学者颇感困惑。本质上,Docker镜像是一个特殊的文件系统,它提供容器运行时所需的程序、库、资源、配置等文件。Docker镜像类似于一个py文件,它需要Docker的运行时(类似于Python解释器)运行。镜像被运行时,即创建了一个镜像的实例,一个实例就是一个容器。
13 Docker 和 k8s
作为容器引擎,Docker为容器化的应用程序提供了开放的标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付、测试和部署代码。随着容器的大量使用,又产生了如何协调、调度和管理容器的问题,Docker的容器编排应运而生。
k8s是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理,是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的应用简单并且高效,k8s提供了应用部署、规划、更新、维护的一种机制。
Docker和k8sr都是以containerd(容器化标准)作为运行时,因此使用Docker创建的镜像完全可以在k8s中无障碍的使用。
21 在ubuntu中安装
在linux系统中安装Docker非常简单,官方为我们提供了一键安装脚本。这个方法也适用于Debian或CentOS等发行版。
安装过程如果出现超时,不要灰心,多试几次,总会成功的。安装完成后,Docker只能被root用户使用,可以使用下面的命令取消权限限制:
然后,重启docker服务:
最后,关闭当前的命令行,重新打开新的命令行就可以了。
顺便提一下,如果在CentOS下安装,可能会出现一堆类似于下面的错误:
这是由于docker和Podman冲突造成的,需要先卸载Podman:
22 在Win10中安装
Docker的运行,依赖linux的环境,官方提供了Docker Desktop for Windows,但是它需要安装Hyper-V,Hyper-V是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10。这个虚拟机一旦启用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本将无法使用!如果你必须在电脑上使用其他虚拟机(例如开发 Android 应用必须使用的模拟器),请不要使用 Hyper-V!
我的电脑是win10家庭版,不能直接安装hyper-v,需要将下面的命令保存到cmd文件中:
然后在cmd文件上点击右键,选择使用管理员运行。执行完毕后会重启,在重启的过程中进行安装。
23 Hello world
docker服务启动的情况下,运行下面的命令:
此命令的含义是:
第一次运行时,因为本地没有ubuntu:2004镜像,docker会自动从镜像服务器下载。下载过程可能需要多试几次,只要成功一次,以后执行就不再需要下载了。
docker官方还提供了一个hello-world镜像,可以直接运行:
此命令省略了镜像版本和运行参数,docker使用latest作为版本,即最新版本。
从hello world的例子中,也可以体验到,docker实例的运行是非常快的。
docker官方的镜像库比较慢,在进行镜像操作之前,需要将镜像源设置为国内的站点。
新建文件/etc/docker/daemonjson,输入如下内容:
然后重启docker的服务:
31 列出本地所有镜像
执行命令 docker images 可以查看
当前我本地只有刚才安装的两个镜像。
32 从镜像库中查找镜像
执行命令 docker search 镜像名称可以从docker镜像库中查找镜像。
最好选择官方(OFFICIAL)的镜像,这样的镜像最稳定一些。
33 下载新的镜像
执行命令docker pull 镜像名称:版本号即可下载新的镜像。
镜像下载后,就可以使用镜像来创建容器了。
41 启动容器
执行命令docker run即可启动容器,也就是创建某个镜像的实例。docker run命令非常复杂,可以先执行一个docker run --help来查看帮助:
比如我们要执行python的shell,需要添加-it参数,即:docker run -it python:38
42 将宿主机的文件挂载到容器
docker容器与宿主机是隔离的,要想让容器内的程序能访问宿主机上的文件,需要通过-v参数将宿主机的文件挂载到容器中。
比如我们在宿主机上有一个hellopy,可以打印hello,想要在python容器中执行,就需要进行挂载。-v后还需要接两个参数,分别是宿主机的目录和容器内的目录,两者使用:分隔,路径必须都是绝对路径。
我的hellopy保存在主目录的/docker_test目录中,将这个目录挂载到容器的/docker_test目录,然后在容器内执行python /docker_test/hellopy:
43 容器的端口映射
我们修改一下hellopy,创建一个socket服务端,并监听5000端口,当有客户端连接时,打印客户端的地址,先客户端发送hello,然后关闭连接:
在容器内执行:
接下来,尝试用telnet命令连接,结果却是失败的。原因是,127001是宿主机的ip地址,5000是容器的端口,这与我们的习惯稍微有些不同。事实上,docker的容器是非常轻量的,它并没有自己的网络,要想访问容器的端口,需要进行端口映射,将容器的某端口映射到宿主机的端口,客户端连接时,只要与宿主机的端口进行连接就可以了。
需要注意的是,上面的代码创建的服务器,无论如何也不可能被客户端连接,因为代码中绑定了127001的ip,在容器中运行时,需要绑定所有ip,即0000。
然后,再使用-p参数,-p还需要三个参数,即宿主机的ip地址、宿主机的端口、容器的端口,三者之间使用:分隔。一般的,可以将宿主机的ip地址省略,只写宿主机的端口:容器的端口即可。
这样,就将容器的5000端口映射到了宿主机的5001端口,使用:
即可与容器中的服务器进行连接。
44 容器管理
上面的服务运行之后,可以使用docker ps命令,查看运行中的容器:
显示的内容有下面几列:
要想结束容器,可以使用docker kill 容器ID命令。
一般而言,当我们的程序开发完成后,会连同程序文件与运行环境一起制作成一个新的镜像。
要制作镜像,需要编写Dockerfile。DockeFile由多个命令组成,常用的命令有:
注意,Docker镜像中有一个层的概念,每执行一个RUN命令,就会创建一个层,层过多会导致镜像文件体积增大。尽量在RUN命令中使用&&连接多条shell命令,减少RUN命令的个数,可以有效减小镜像文件的体积。
51 自制显示文本文件内容镜像
编写catpy,接收一个文件名,由python读取文件并显示文件的内容:
这个例子比较简单,缩写Dockerfile如下:
这个Dockerfile的含义是:
需要说明的是,ENTRYPOINT有两种写法:
这里采用第二种写法,是因为我们要在外部给容器传递参数。执行命令编译Docker镜像:
这个命令中,-t的含义是目标,即生成的镜像名为hello,版本号为10,别忘了最后那个,这叫到上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
这样,我们的第一个镜像就制作完成了,使用下面的命令执行它:
即可看到~/docker_test/cat/files/testtxt的内容。
52 自制web服务器镜像
我们使用tornado开发一个网站,而python的官方镜像是没有tornado库的,这就需要在制作镜像时进行安装。
测试的wspy如下:
编写Dockerfile文件如下:
在此我们验证一下CMD与ENTRYPOINT的区别。在Dockerfile所在有目录下执行如下命令:
执行完成后,再使用docker images使用就可以看到生成的镜像了,然后使用下面的命令运行:
在浏览器中输入宿主机的ip和8000端口,就可以看到页面了。
在这个例子中,我使用的运行命令是CMD,如果在docker run中指定的其他的命令,此命令就不会被执行,如:
此时,容器中被执行的是python命令,而不是我们的服务。在更多情况下,我们希望在docker run命令中为我们的服务传参,而不是覆盖执行命令,那么,我们应该使用ENTRYPOINT而不是CMD:
上面这种写法,是不支持传递参数的,ENTRYPOINT和CMD还支持另一种写法:
使用这种写法,docker run命令中的参数才可以传递给hellopy:
这个命令中,--port=9000被作为参数传递到hellopy中,因此容器内的端口就成了9000。
在生产环境中运行时,不会使用-it选项,而是使用-d选项,让容器在后台运行:
这种方式下,即使当前的控制台被关闭,该容器也不会停止。
53 自制apscheduler服务镜像
接下来,制作一个使用apscheduler编写的服务镜像,代码如下:
Dockerfile也是信手拈来:
生成镜像:
应该可以运行了,文件复制需要两个目录,在运行时,可以使用两次-v来挂载不同的目录:
前面用到的官方python镜像大小足足882MB,在这个基础上,再安装用到的第三方库,添加项目需要的等资源,大小很容易就超过1个G,这么大的镜像,网络传给客户非常的不方便,因此,减小镜像的体积是非常必要的工作。
docker hub上有个一python:38-alpine镜像,大小只有445MB。之所以小,是因为alpine是一个采用了busybox架构的操作系统,一般用于嵌入式应用。我尝试使用这个镜像,发现安装一般的库还好,但如果想安装numpy等就会困难重重,甚至网上都找不到解决方案。
还是很回到基本的路线上来,主流的操作系统镜像,ubuntu的大小为729MB,centos的大小为209MB——这也算是我更喜欢使用ubuntu的一个重要原因吧!使用ubuntu作为基础镜像,安装python后的大小为139MB,再安装pip后的大小一下子上升到了407MB,要是再安装点其他东西,很容易就赶上或超过python官方镜像的大小了。
看来,寻常路线是很难压缩镜像文件体积了。幸好,还有一条曲线救国的路可走,这就是多阶段构建法。
多阶段构建的思想其实很简单,先构建一个大而全的镜像,然后只把镜像中有用的部分拿出来,放在一个新的镜像里。在我们的场景下,pip只在构建镜像的过程中需要,而对运行我们的程序却一点用处也没有。我们只需要安装pip,再用pip安装第三方库,然后将第三方库从这个镜像中复制到一个只有python,没有pip的镜像中,这样,pip占用的268MB空间就可以被节省出来了。
1、在ubuntu镜像的基础上安装python:
然后运行:
这样,就生成了python:38-ubuntu镜像。
2、在python:38-ubuntu的基础上安装pip:
然后运行:
这样,就生成了python:38-ubuntu-pip镜像。
3、多阶段构建目标镜像:
这个dockerfile需要解释一下了,因为它有两个FROM命令。
第一个是以python:38-ubuntu-pip镜像为基础,安装numpy,当然,在实际应用中,把所有用到的第三方库出写在这里。
第二个FROM是以FROM python:38-ubuntu镜像为基础,将第三方库统统复制过来,COPY命令后的–from=0的意思是从第0阶段进行复制。实际应用中再从上下文中复制程序代码,添加需要的ENTRYPOINT等。
最后,再运行:
这然,用于我们项目的镜像就做好了。比使用官方python镜像构建的版本,小了大约750MB。
到此,我们的镜像已经制作好了,可是,镜像文件在哪,如何在生产环境下运行呢?
刚才使用docker images命令时,已经看到了生成的镜像:
我们可以使用docker save命令将镜像保存到指定的文件中,保存的文件是一个tar格式的压缩文件:
将hellotar复制到生产环境的机器上,然后执行导入命令:
就可以使用了。
需要使用docker在后台运行一个nginx服务器需要docker容器部署方式。方法如下:
1、docker构建mysql环境+docker构建项目自身环境。
2、Vue项目:使用docker启动nginx服务器方式代理部署。
3、项目使用mysql80作为数据源,部署时需要使用docker构建mysql环境及项目自身环境。
4、连接出现1251错误时:将项目进行打包:“mumu-001-SNAPSHOTjar到此,springboot项目采用docker”方式运行部署结束。
5、使用docker容器方式运行nginx服务器即可。
curl -fsSL https://getdockercom | bash -s docker --mirror Aliyun
# 报错:curl: (6) Could not resolve host: getdockercom; 未知的错误
# 解决:cat /etc/resolvconf 里加了个 nameserver 8888
sudo curl -L "https://githubcom/docker/compose/releases/download/1262/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证安装:docker-compose --version
# compose 那个亚马逊的老是下载不了,可换对应地址:
sudo curl -L https://getdaocloudio/docker/compose/releases/download/1262/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
查看docker版本: docker --version
启动docker: systemctl start docker 或者 service docker start
停止docker: systemctl stop docker
查看docker镜像文件: docker images
查看docker内容器: docker ps -a
修改 /etc/dockers 文件下的配置文件 daemonjson (配置作用参考附录)
操作完成后需要重启docker: systemctl restart docker
服务端安装git:yum install git
拉取一下文件和命令:git clone http://17216135/demo/demo-dockersgit
查看本地和远端版本:git branch -a
切换本地分支为dev:git checkout -b dev origin/dev
启动docker:service docker start
后 执行文件中的shell:/initsh all (包含:mysql,mongo,redis,solr,activemq,tomcat)
删除多下载的镜像:docker rmi --force 3068f6bb852e
容器列表: docker ps -a
进入某个容器:docker exec -it [CONTAINER ID] /bin/bash
查看某个容器进程:docker top [NAMES]
查看 demo-dockers 目录下 java-runtime 文件位置下有对应几个项目配置文件 application-alphayml
修改配置文件后,需要重新启动对应java项目,执行启动脚本 /init-java-runtimesh + [项目名或者all]
获取镜像文件的地址:http://172185112:5001/repository/demo/ 查找对应需要的镜像包
更换镜像文件: vi java-runtimeyml 内,image后的对应项目后跟的包名中
重启对应项目: /init-java-runtimesh [项目名]
查看对应项目启动log: docker logs -f --tail 500 [生成的容器名称]
(容器重启:docker restart [容器id或名称])
{
"authorization-plugins": [],//访问授权插件
"data-root": "",//docker数据持久化存储的根目录
"dns": [],//DNS服务器
"dns-opts": [],//DNS配置选项,如端口等
"dns-search": [],//DNS搜索域名
"exec-opts": [],//执行选项
"exec-root": "",//执行状态的文件的根目录
"experimental": false,//是否开启试验性特性
"storage-driver": "",//存储驱动器
"storage-opts": [],//存储选项
"labels": [],//键值对式标记docker元数据
"live-restore": true,//dockerd挂掉是否保活容器(避免了docker服务异常而造成容器退出)
"log-driver": "",//容器日志的驱动器
"log-opts": {},//容器日志的选项
"mtu": 0,//设置容器网络MTU(最大传输单元)
"pidfile": "",//daemon PID文件的位置
"cluster-store": "",//集群存储系统的URL
"cluster-store-opts": {},//配置集群存储
"cluster-advertise": "",//对外的地址名称
"max-concurrent-downloads": 3,//设置每个pull进程的最大并发
"max-concurrent-uploads": 5,//设置每个push进程的最大并发
"default-shm-size": "64M",//设置默认共享内存的大小
"shutdown-timeout": 15,//设置关闭的超时时限(who)
"debug": true,//开启调试模式
"hosts": [],//监听地址()
"log-level": "",//日志级别
"tls": true,//开启传输层安全协议TLS
"tlsverify": true,//开启输层安全协议并验证远程地址
"tlscacert": "",//CA签名文件路径
"tlscert": "",//TLS证书文件路径
"tlskey": "",//TLS密钥文件路径
"swarm-default-advertise-addr": "",//swarm对外地址
"api-cors-header": "",//设置CORS(跨域资源共享-Cross-origin resource sharing)头
"selinux-enabled": false,//开启selinux(用户、进程、应用、文件的强制访问控制)
"userns-remap": "",//给用户命名空间设置 用户/组
"group": "",//docker所在组
"cgroup-parent": "",//设置所有容器的cgroup的父类()
"default-ulimits": {},//设置所有容器的ulimit
"init": false,//容器执行初始化,来转发信号或控制(reap)进程
"init-path": "/usr/libexec/docker-init",//docker-init文件的路径
"ipv6": false,//开启IPV6网络
"iptables": false,//开启防火墙规则
"ip-forward": false,//开启netipv4ip_forward
"ip-masq": false,//开启ip掩蔽(IP封包通过路由器或防火墙时重写源IP地址或目的IP地址的技术)
"userland-proxy": false,//用户空间代理
"userland-proxy-path": "/usr/libexec/docker-proxy",//用户空间代理路径
"ip": "0000",//默认IP
"bridge": "",//将容器依附(attach)到桥接网络上的桥标识
"bip": "",//指定桥接ip
"fixed-cidr": "",//(ipv4)子网划分,即限制ip地址分配范围,用以控制容器所属网段实现容器间(同一主机或不同主机间)的网络访问
"fixed-cidr-v6": "",//(ipv6)子网划分
"default-gateway": "",//默认网关
"default-gateway-v6": "",//默认ipv6网关
"icc": false,//容器间通信
"raw-logs": false,//原始日志(无颜色、全时间戳)
"allow-nondistributable-artifacts": [],//不对外分发的产品提交的registry仓库
"registry-mirrors": [],//registry仓库镜像
"seccomp-profile": "",//seccomp配置文件
"insecure-registries": [],//非https的registry地址
"no-new-privileges": false,//禁止新优先级()
"default-runtime": "runc",//OCI联盟(The Open Container Initiative)默认运行时环境
"oom-score-adjust": -500,//内存溢出被杀死的优先级(-1000~1000)
"node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],//对外公布的资源节点
"runtimes": {//运行时
"cc-runtime": {
"path": "/usr/bin/cc-runtime"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"–debug"]
}
}
}
服务端安装git:yum install git
拉取一下文件和命令:git clone http://17216135/gchat/gaga-dockersgit
指定分支克隆git clone -b dev-1 http://17216135/gchat/gaga-dockersgit
查看本地和远端版本:git branch -a
切换本地分支为dev:git checkout -b dev origin/dev
启动docker:service docker start
后 执行文件中的shell:/initsh all (顺序:mysql,mongo,redis,solr,activemq,tomcat)
删除多下载的镜像:docker rmi --force 3068f6bb852e
容器列表: docker ps -a
进入某个容器:docker exec -it [CONTAINER ID] /bin/bash
查看某个容器进程:docker top [NAMES]
# 查看是否安装了tomcat: rpm -qa | grep tomcat
# 查找文件:find / -name tomcat
# 切换Tomcat目录:cd /usr/local/tomcat/bin
# 关闭Tomcat:/shutdownsh
# 查看docker中的java版本:docker exec container_name java -version
git拉代码:git clone git@17216135:gchat/gaga-servergit
查看远端分支:git branch -r
创建本地dev分支 并切换到dev分支:git checkout -b dev origin/dev
查看本地分支:git branch
切换回眸分支:git checkout master
查看所有JDK在系统中位置:/usr/libexec/java_home -V
参考地址: https://wwwrunoobcom/docker/docker-command-manualhtml
查找docker 安装包:yum list installed | grep docker
停掉docker:systemctl stop docker
删除对应文件:yum remove dockerx86_64 docker-clientx86_64 docker-commonx86_64 -y
查看下docker rpm源:rpm -qa | grep docker
删除对应路径:rm -rf /var/lib/docker
注释:
本次也是由于业务需要,需要重新搭建新的测试服务器,这也是搭建中的一个插曲,后续会使用 Jenkins 进行相关的持续集成,大家一起学习分享!~
Mailu
单纯的邮件服务器,开源,自带汉化,没有日历和通讯录功能,
有WEB界面,支持手机浏览器,不支持LDAP,有官方Docker镜像
测试地址:
Webmail : https://testmailuio/webmail/
Admin UI : https://testmailuio/admin/
用户名 : admin@testmailuio
密码 : letmein
SOGo
Groupware级产品,开源,自带汉化,支持日历和通讯录,CalDAV,ActiveSync等等
有WEB界面,支持手机浏览器,支持LDAP,无官方Docker镜像
测试地址:
http://demosogonu/SOGo/
三个测试帐号,用户名与密码相同: sogo1 sogo2 sogo3
Roundcube
跟SOGo差不多,Web界面有点类似旧版的Outlook(我倒是满喜欢的),同样支持LDAP,日历和通讯录
IRedMail
一套邮件服务器整体解决方案,包含邮件服务器(可选SOGo或Roundcube),Fail2Ban,AWStat等功能,自带汉化,高级功能需付费(付费后可获得源码)
MailCow
与IRedMail类似,全开源,集成SOGo以及其它一些后端功能,并以多个独立Docker镜像的形式来发布,目前无汉化(有接口可自己实现)
1 运行一个Docker实例
Docker首先会尝试从本地取得并运行所需的镜像,如果在本地主机上没有发现,它就会从Docker公共注册中心拉取。这里,我们将会拉取镜像并在 Docker 容器中创建一个Fedora实例,并连接到它的 tty 上的bash shell。
# docker run -i -t fedora bash
2安装Apache网络服务器
现在,在我们的Fedora基本镜像实例准备好后,我们将会开始交互式地安装Apache网络服务器,而不是为它创建Dockerfile。为了做到这点,我们需要在终端或者shell运行以下命令。
# yum update
# yum install httpd
退出容器的 tty。
# exit
3保存镜像
现在,我们要去保存在Fedora实例里做的修改。要做到这个,我们首先需要知道实例的容器ID。而为了得到ID,我们又需要运行以下命令(LCTT 译注:在容器外执行该命令)。
# docker ps -a
然后,我们会保存这些改变为一个新的镜像,请运行以下命令。
# docker commit c16378f943fe fedora-httpd
这里,修改已经通过使用容器ID保存起来了,镜像名字叫fedora-httpd。为了确认新的镜像是否在运行,我们将运行以下命令。
# docker images
4 添加内容到新的镜像
我们自己新的Fedora Apache镜像正成功的运行,现在我们想添加一些我们网站的网页内容到Apache网络服务器,使得网站能够开箱即用。为做到这点,我们需要创建一个新的Dockerfile,它会处理从复制网页内容到启用80端口的所有操作。要达到这样的目的,我们需要使用我们最喜欢的文本编辑器创建Dockerfile文件,像下面演示的一样。
# nano Dockerfile
现在,我们需要添加以下的命令行到文件中。
FROM fedora-httpd
ADD mysitetar /tmp/
RUN mv /tmp/mysite/ /var/www/html
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/httpd" ]
CMD [ "-D", "FOREGROUND" ]
这里,上述的Dockerfile中,放在mysitetar里的网页内容会自动解压到/tmp/文件夹里。然后,整个站点会被移动到Apache的网页根目录/var/www/html/,命令expose 80会打开80端口,这样网站就能正常访问了。其次,入口点放在了/usr/sbin/https里面,保证Apache服务器能够执行。
5 构建并运行一个容器
现在,我们要用刚刚创建的Dockerfile创建我们的容器,以便将我们的网站添加到上面。为做到这,我们需要运行以下命令。
# docker build -rm -t mysite
建立好我们的新容器后,我们需要要用下面的命令来运行容器。
# docker run -d -P mysite
1、打开控制面板,选择并进入“程序”,双击“打开或关闭Windows服务”,在弹出的窗口中选择“Internet信息服务”下面所有地选项,点击确定后,开始更新服务。
2、更新完成后,打开浏览器,输入“http://localhost/”回车,如果此时出现IIS7欢迎界面,说明Web服务器已经搭建成功。
3、当web服务器搭建成功后,我们下一步所要做的就是把我们开发的网站安装到Web服务器的目录中。一般情况下,当Web服务器安装完成后,会创建路径“%系统根目录%inetpub/wwwroot”,将我们开发的网站COPY到该路径下。即可实现本地访问该网站。
4、设置防火墙,让局域网当其它计算机也能访问本地网站资源。具体方法:打开控制面板,选择“系统和安全”,点击“允许程序通过Windows防火墙”,在弹出的对话框中勾选“万维网服务HTTP”右侧的两个复选框,最后点击确定退出。
5、在局域网中其它计算机上,打开浏览器,输入 “http://Web服务器的IP地址/”按回车键,就可以访问服务器上的资源”。 经过以上步骤的设置,局域网中的其它用户就可以通过浏览器访问你所共享的web资源了!
扩展资料:
入门级服务器所连的终端比较有限(通常为20台左右),况且在稳定性、可扩展性以及容错冗余性能较差,仅适用于没有大型数据库数据交换、日常工作网络流量不大,无需长期不间断开机的小型企业。
不过要说明的一点就是目前有的比较大型的服务器开发、生产厂商在后面我们要讲的企业级服务器中也划分出几个档次,其中最低档的一个企业级服务器档次就是称之为"入门级企业级服务器",这里所讲的入门级并不是与我们上面所讲的"入门级"具有相同的含义,不过这种划分的还是比较少。
还有一点就是,这种服务器一般采用Intel的专用服务器CPU芯片,是基于Intel架构(俗称"IA结构")的,当然这并不是一种硬性的标准规定,而是由于服务器的应用层次需要和价位的限制。
随着项目上容器技术的广泛应用,我也加入了Docker容器技术的学习。首先初学Docker,我的想法很简单。创建一个SpringBoot项目,如何将SpringBoot项目打包成容器镜像,然后推送至远程的Docker服务上部署。带着这个目的查阅了一些资料后,整体的实现思路如下:
环境描述:
准备一台阿里云服务器,已经完成Docker服务安装,后续将会在该服务器上进行搭建Docker私有镜像仓库。本地准备一个SpringBoot项目,至少编写一个Controller,保证本地SpringBoot项目启动后能够正常访问到Contriller。
由于私有镜像仓库是部署在阿里云上,要确保私有仓库的安全性,需要一个安全认证证书,防止发生意想不到的事情。所有需要在搭建私有仓库的Docker主机上先生成自签名证书。
生成自签名证书:
通过openssl命令先生成自签名证书,运行命令后需要填写一些证书信息。其中Common Name填写的xx96104xxx是最关键的信息,这里填写的是私有仓库的地址:
Country Name:国家
State or Province Name:州或省
Locality Name:城市
Organization Name :机构名称
Organizational Unit Name :组织单位名称
Common Name:hostname域名
Email Address:邮箱地址
页面访问:
页面访问: http://xx96194xxx:7001/
页面访问Spring Boot项目
参考:Docker 私有镜像仓库的搭建及认证
参考:Spring Boot 多样化构建 Docker 镜像
参考:registry-web集成安全认证
0条评论