快捷搜索:  汽车  科技

docker初学者指南(入门看这一篇就够了)

docker初学者指南(入门看这一篇就够了)链接:cnblogs.com/clsn/p/8410309.html来自:惨绿少年 | 责编:乐乐微笑并不总是说明你是快乐的,有的时候,它只说明你是很坚强。每日掏心话人生只要找到正确的方向,就不会迷茫。总会有一些时候,你跌落到谷底。总会有一些时候,你哭泣着睡着,胃拧着疼,心穿了孔。

点击上方 "程序员小乐"关注 星标或置顶一起成长

每天凌晨00点00分 第一时间与你相约

每日英文

Smiling doesn't always mean you're happy. In some cases it simply means that you're a strong girl.

微笑并不总是说明你是快乐的,有的时候,它只说明你是很坚强。

每日掏心话

人生只要找到正确的方向,就不会迷茫。总会有一些时候,你跌落到谷底。总会有一些时候,你哭泣着睡着,胃拧着疼,心穿了孔。

来自:惨绿少年 | 责编:乐乐

链接:cnblogs.com/clsn/p/8410309.html

docker初学者指南(入门看这一篇就够了)(1)

程序员小乐(ID:study_tech)第 926 次推文 图源:百度

往日回顾:再见,Navicat!这个IDEA的兄弟,真香!

正文


容器简介

什么是 Linux 容器

Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。

容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

docker初学者指南(入门看这一篇就够了)(2)

更加详细地来说,请您假定您在开发一个应用。您使用的是一台笔记本电脑,而且您的开发环境具有特定的配置。其他开发人员身处的环境配置可能稍有不同。您正在开发的应用依赖于您当前的配置,还要依赖于某些特定文件。

与此同时,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。

您希望尽可能多在本地模拟这些环境,而不产生重新创建服务器环境的开销。

因此,您要如何确保应用能够在这些环境中运行和通过质量检测,并且在部署过程中不出现令人头疼的问题,也无需重新编写代码和进行故障修复?答案就是使用容器。

容器可以确保您的应用拥有必需的配置和文件,使得这些应用能够在从开发到测试、再到生产的整个流程中顺利运行,而不出现任何不良问题。这样可以避免危机,做到皆大欢喜。

虽然这只是简化的示例,但在需要很高的可移植性、可配置性和隔离的情况下,我们可以利用 Linux 容器通过很多方式解决难题。

无论基础架构是在企业内部还是在云端,或者混合使用两者,容器都能满足您的需求。

容器不就是虚拟化吗

是,但也不竟然。我们用一种简单方式来思考一下:

虚拟化使得许多操作系统可同时在单个系统上运行。

容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。

docker初学者指南(入门看这一篇就够了)(3)

图 - 普通虚拟化技术和docker的对比

这意味着什么?首先,让多个操作系统在单个虚拟机监控程序上运行以实现虚拟化,并不能达成和使用容器同等的轻量级效果。

事实上,在仅拥有容量有限的有限资源时,您需要能够可以进行密集部署的轻量级应用。

Linux 容器可从单个操作系统运行,在所有容器中共享该操作系统,因此应用和服务能够保持轻量级,并行快速运行。

容器发展简史

docker初学者指南(入门看这一篇就够了)(4)

我们现在称为容器技术的概念最初出现在 2000 年,当时称为 FreeBSD jail,这种技术可将 FreeBSD 系统分区为多个子系统(也称为 Jail)。

Jail 是作为安全环境而开发的,系统管理员可与企业内部或外部的多个用户共享这些 Jail。

Jail 的目的是让进程在经过修改的 chroot 环境中创建,而不会脱离和影响整个系统 — 在 chroot 环境中,对文件系统、网络和用户的访问都实现了虚拟化。

尽管 Jail 在实施方面存在局限性,但最终人们找到了脱离这种隔离环境的方法。

但这个概念非常有吸引力。

2001 年,通过 Jacques Gélinas 的 VServer 项目,隔离环境的实施进入了 Linux 领域。

正如 Gélinas 所说,这项工作的目的是“在高度独立且安全的单一环境中运行多个通用 Linux 服务器 [sic]。”

在完成了这项针对 Linux 中多个受控制用户空间的基础性工作后,Linux 容器开始逐渐成形并最终发展成了现在的模样。

什么是 Docker?

“Docker” 一词指代多种事物,包括开源社区项目、开源项目使用的工具、主导支持此类项目的公司 Docker Inc. 以及该公司官方支持的工具。技术产品和公司使用同一名称,的确让人有点困惑。

我们来简单说明一下:

IT 软件中所说的 “Docker” ,是指容器化技术,用于支持创建和使用 Linux 容器。

开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益。

Docker Inc. 公司凭借 Docker 社区产品起家,它主要负责提升社区版本的安全性,并将改进后的版本与更广泛的技术社区分享。此外,它还专门对这些技术产品进行完善和安全固化,以服务于企业客户。

借助 Docker ,您可将容器当做重量轻、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境。

Docker 如何工作?

Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。

这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用程序,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。

容器工具(包括 Docker)可提供基于镜像的部署模式。这使得它能够轻松跨多种环境,与其依赖程序共享应用或服务组。Docker 还可在这一容器环境中自动部署应用程序(或者合并多种流程,以构建单个应用程序)。

此外,由于这些工具基于 Linux 容器构建,使得 Docker 既易于使用,又别具一格 —— 它可为用户提供前所未有的高度应用程访问权限、快速部署以及版本控制和分发能力。

Docker 技术是否与传统的 Linux 容器相同?

否。Docker 技术最初是基于 LXC 技术构建(大多数人都会将这一技术与“传统的” Linux 容器联系在一起),但后来它逐渐摆脱了对这种技术的依赖。

就轻量级 虚拟化 这一功能来看,LXC 非常有用,但它无法提供出色的开发人员或用户体验。除了运行容器之外,Docker 技术还具备其他多项功能,包括简化用于构建容器、传输镜像以及控制镜像版本的流程。

docker初学者指南(入门看这一篇就够了)(5)

传统的 Linux 容器使用 init 系统来管理多种进程。这意味着,所有应用程序都作为一个整体运行。与此相反,Docker 技术鼓励应用程序各自独立运行其进程,并提供相应工具以实现这一功能。这种精细化运作模式自有其优势。

docker的目标

docker的主要目标是"Build Ship and Run any App Angwhere" 构建,运输,处处运行

  • 构建:做一个docker镜像
  • 运输:docker pull
  • 运行:启动一个容器

每一个容器,他都有自己的文件系统rootfs.


安装Docker

环境说明

#需要两台几点进行安装 [root@docker01~]#cat/etc/redhat-release CentOSLinuxrelease7.2.1511(Core) [root@docker01~]#uname-r 3.10.0-327.el7.x86_64 [root@docker01~]#hostname-I 10.0.0.100172.16.1.100 [root@docker02~]#hostname-I 10.0.0.101172.16.1.101

两个节点上都进行操作

wget-O/etc/yum.repos.d/docker-ce.repohttps://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo sed-i's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g'/etc/yum.repos.d/docker-ce.repo yuminstalldocker-ce-y

修改在docker01配置:

#修改启动文件,监听远程端口 vim/usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd-Hunix:///var/run/docker.sock-Htcp://10.0.0.100:2375 systemctldaemon-reload systemctlenabledocker.service systemctlrestartdocker.service #ps-ef检查进行,是否启动

在docker02测试

[root@docker02~]#docker-H10.0.0.100info Containers:0 Running:0 Paused:0 Stopped:0 Images:0 ServerVersion:17.12.0-ce StorageDriver:devicemapper ···


Docker基础命令操作

查看docker相关信息

[root@docker01~]#dockerversion Client: Version:17.12.0-ce APIversion:1.35 Goversion:go1.9.2 Gitcommit:c97c6d6 Built:WedDec2720:10:142017 OS/Arch:linux/amd64 Server: Engine: Version:17.12.0-ce APIversion:1.35(minimumversion1.12) Goversion:go1.9.2 Gitcommit:c97c6d6 Built:WedDec2720:12:462017 OS/Arch:linux/amd64 Experimental:false

配置docker镜像加速

vi/etc/docker/daemon.json { "registry-mirrors":["https://registry.docker-cn.com"] }


启动第一个容器

[root@docker01~]#dockerrun-d-p80:80nginx Unabletofindimage'nginx:latest'locally latest:Pullingfromlibrary/nginx e7bb522d92ff:Pullcomplete 6edc05228666:Pullcomplete cd866a17e81f:Pullcomplete Digest:sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63d Status:Downloadednewerimagefornginx:latest 8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d #容器启动后,在浏览器进行访问测试

参数说明

docker初学者指南(入门看这一篇就够了)(6)

Docker镜像生命周期

docker初学者指南(入门看这一篇就够了)(7)

docker镜像相关操作

搜索官方仓库镜像

[root@docker01~]#dockersearchcentos NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED centosTheofficialbuildofCentOS.3992[OK] ansible/centos7-ansibleAnsibleonCentos7105[OK]

列表说明

docker初学者指南(入门看这一篇就够了)(8)

获取镜像

根据镜像名称拉取镜像

[root@docker01~]#dockerpullcentos Usingdefaulttag:latest latest:Pullingfromlibrary/centos af4b0a2388c6:Downloading34.65MB/73.67MB

查看当前主机镜像列表

[root@docker01~]#dockerimagelist REPOSITORYTAGIMAGEIDCREATEDSIZE centoslatestff426288ea903weeksago207MB nginxlatest3f8a4339aadd5weeksago108MB

拉第三方镜像方法

dockerpullindex.tenxcloud.com/tenxcloud/httpd


导出镜像

[root@docker01~]#dockerimagelist REPOSITORYTAGIMAGEIDCREATEDSIZE centoslatestff426288ea903weeksago207MB nginxlatest3f8a4339aadd5weeksago108MB #导出 [root@docker01~]#dockerimagesavecentos>docker-centos.tar.gz

删除镜像

[root@docker01~]#dockerimagermcentos:latest [root@docker01~]#dockerimagelist REPOSITORYTAGIMAGEIDCREATEDSIZE nginxlatest3f8a4339aadd5weeksago108MB

导入镜像

[root@docker01~]#dockerimageload-idocker-centos.tar.gz e15afa4858b6:Loadinglayer215.8MB/215.8MB Loadedimage:centos:latest [root@docker01~]#dockerimagelist REPOSITORYTAGIMAGEIDCREATEDSIZE centoslatestff426288ea903weeksago207MB nginxlatest3f8a4339aadd5weeksago108MB

查看镜像的详细信息

[root@docker01~]#dockerimageinspectcentos


容器的日常管理

容器的起/停

最简单的运行一个容器

[root@docker01~]#dockerrunnginx

创建容器,两步走(不常用)

[root@docker01~]#dockercreatecentos:latest/bin/bash bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204 [root@docker01~]#dockerstartstupefied_nobel stupefied_nobel

快速启动容器方法

[root@docker01~]#dockerruncentos:latest/usr/bin/sleep20;

容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!

查看正在运行的容器

[root@docker01~]#dockercontainerls 或 [root@docker01~]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 8708e93fd767nginx"nginx-g'daemonof…"6secondsagoUp4seconds80/tcpkeen_lewin

查看你容器详细信息/ip

[root@docker01~]#dockercontainerinspect容器名称/id

查看你所有容器(包括未运行的)

[root@docker01~]#dockerps-a CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 8708e93fd767nginx"nginx-g'daemonof…"4minutesagoExited(0)59secondsagokeen_lewin f9f3e6af7508nginx"nginx-g'daemonof…"5minutesagoExited(0)5minutesagooptimistic_haibt 8d8f81da12b5nginx"nginx-g'daemonof…"3hoursagoExited(0)3hoursagolucid_bohr

停止容器

[root@docker01~]#dockerstop容器名称/id 或 [root@docker01~]#dockercontainerkill容器名称/id

进入容器方法

启动时进去方法

[root@docker01~]# docker run -it #参数:-it 可交互终端 [root@docker01~]#dockerrun-itnginx:latest/bin/bash root@79241093859e:/#

退出/离开容器

ctrl p&ctrl q

启动后进入容器的方法

启动一个docker

[root@docker01~]#dockerrun-itcentos:latest [root@1bf0f43c4d2f/]#ps-ef UIDPIDPPIDCSTIMETTYTIMECMD root10015:47pts/000:00:00/bin/bash root131015:47pts/000:00:00ps-ef

attach进入容器,使用pts/0 ,会让所用通过此方法进如放入用户看到同样的操作。

[root@docker01~]#dockerattach1bf0f43c4d2f [root@1bf0f43c4d2f/]#ps-ef UIDPIDPPIDCSTIMETTYTIMECMD root10015:47pts/000:00:00/bin/bash root141015:49pts/000:00:00ps-ef

自命名启动一个容器 --name

[root@docker01~]#dockerattach1bf0f43c4d2f [root@1bf0f43c4d2f/]#ps-ef UIDPIDPPIDCSTIMETTYTIMECMD root10015:47pts/000:00:00/bin/bash root141015:49pts/000:00:00ps-ef

exec 进入容器方法(推荐使用)

[root@docker01~]#dockerexec-itclsn1/bin/bash [root@b20fa75b4b40/]#重新分配一个终端 [root@b20fa75b4b40/]#ps-ef UIDPIDPPIDCSTIMETTYTIMECMD root10016:11pts/000:00:00/bin/bash root130016:14pts/100:00:00/bin/bash root2613016:14pts/100:00:00ps-ef


删除所有容器

[root@docker01~]#dockerrm-f`dockerps-a-q` #-f强制删除

启动时进行端口映射

-p参数端口映射

[root@docker01~]#dockerrun-d-p8888:80nginx:latest 287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9

不同指定映射方法

docker初学者指南(入门看这一篇就够了)(9)

随机映射

dockerrun-P(大P)#需要镜像支持


Docker 数据卷的管理

挂载时创建卷

挂载卷

[root@docker01~]#dockerrun-d-p80:80-v/data:/usr/share/nginx/htmlnginx:latest 079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09

容器内站点目录: /usr/share/nginx/html

在宿主机写入数据,查看

[root@docker01~]#echo"http://www.nmtui.com">/data/index.html [root@docker01~]#curl10.0.0.100 http://www.nmtui.com

设置共享卷,使用同一个卷启动一个新的容器

[root@docker01~]#dockerrun-d-p8080:80-v/data:/usr/share/nginx/htmlnginx:latest 351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42 [root@docker01~]#curl10.0.0.100:8080 http://www.nmtui.com

查看卷列表

[root@docker01~]#dockervolumels DRIVERVOLUMENAME


创建卷后挂载

创建一个卷

[root@docker01~]#dockervolumecreate f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521 [root@docker01~]#dockervolumels DRIVERVOLUMENAME localf3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521

指定卷名

[root@docker01~]#dockervolumels DRIVERVOLUMENAME localclsn localf3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521

查看卷路径

[root@docker01~]#dockervolumeinspectclsn [{ "CreatedAt":"2018-02-01T00:39:25 08:00" "Driver":"local" "Labels":{} "Mountpoint":"/var/lib/docker/volumes/clsn/_data" "Name":"clsn" "Options":{} "Scope":"local" }]

使用卷创建

[root@docker01~]#dockerrun-d-p9000:80-vclsn:/usr/share/nginx/htmlnginx:latest 1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503 #宿主机测试 [root@docker01~]#echo'blog.nmtui.com'>/var/lib/docker/volumes/clsn/_data/index.html [root@docker01~]#curl10.0.0.100:9000 blog.nmtui.com

设置卷

[root@docker01~]#dockerrun-d-P--volumes-from079786c1e297nginx:latest b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb

查看使用的端口

[root@docker01~]#netstat-lntup ActiveInternetconnections(onlyservers) ProtoRecv-QSend-QLocalAddressForeignAddressStatePID/Programname tcp000.0.0.0:220.0.0.0:*LISTEN1400/sshd tcp0010.0.0.100:23750.0.0.0:*LISTEN26218/dockerd tcp600:::9000:::*LISTEN32015/docker-proxy tcp600:::8080:::*LISTEN31853/docker-proxy tcp600:::80:::*LISTEN31752/docker-proxy tcp600:::22:::*LISTEN1400/sshd tcp600:::32769:::*LISTEN32300/docker-proxy [root@docker01~]#curl10.0.0.100:32769 http://www.nmtui.com

手动将容器保存为镜像

本次是基于docker官方centos 6.8 镜像创建

官方镜像列表:

https://hub.docker.com/explore/

启动一个centos6.8的镜像

[root@docker01~]#dockerpullcentos:6.8 [root@docker01~]#dockerrun-it-p1022:22centos:6.8/bin/bash #在容器种安装sshd服务,并修改系统密码 [root@582051b2b92b~]#yuminstallopenssh-server-y [root@582051b2b92b~]#echo"root:123456"|chpasswd [root@582051b2b92b~]#/etc/init.d/sshdstart

启动完成后镜像ssh连接测试

将容器提交为镜像

[root@docker01~]#dockercommitbrave_mcclintockcentos6-ssh

使用新的镜像启动容器

[root@docker01~]#dockerrun-d-p1122:22centos6-ssh:latest/usr/sbin/sshd-D 5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094

在容器安装httpd服务

[root@5b8161fda2a9/]#yuminstallhttpd-y

编写启动脚本脚本

[root@5b8161fda2a9/]#catinit.sh #!/bin/bash /etc/init.d/httpdstart /usr/sbin/sshd-D [root@5b8161fda2a9/]#chmod xinit.sh #注意执行权限

再次提交为新的镜像

[root@docker01~]#dockercommit5b8161fda2a9centos6-httpd sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1

启动镜像,做好端口映射。并在浏览器中测试访问

[root@docker01~]#dockerrun-d-p1222:22-p80:80centos6-httpd/init.sh 46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c

Dockerfile自动构建docker镜像

官方构建dockerffile文件参考

https://github.com/CentOS/CentOS-Dockerfiles


Dockerfile指令集

dockerfile主要组成部分:

  • 基础镜像信息 FROM centos:6.8
  • 制作镜像操作指令RUN yum insatll openssh-server -y
  • 容器启动时执行指令 CMD ["/bin/bash"]

dockerfile常用指令:

  • FROM 这个镜像的妈妈是谁?(指定基础镜像)
  • MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
  • RUN 你想让它干啥(在命令前面加上RUN即可)
  • ADD 给它点创业资金(COPY文件,会自动解压)
  • WORKDIR 我是cd 今天刚化了妆(设置当前工作目录)
  • VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
  • EXPOSE 它要打开的门是啥(指定对外的端口)
  • CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)

dockerfile其他指令:

  • COPY 复制文件
  • ENV 环境变量
  • ENTRYPOINT 容器启动后执行的命令


创建一个Dockerfile

创建第一个Dockerfile文件

#创建目录 [root@docker01base]#cd/opt/base #创建Dcokerfile文件,注意大小写 [root@docker01base]#vimDockerfile FROMcentos:6.8 RUNyuminstallopenssh-server-y RUNecho"root:123456"|chpasswd RUN/etc/init.d/sshdstart CMD["/usr/sbin/sshd" "-D"]

构建docker镜像

[root@docker01base]#dockerimagebuild-tcentos6.8-ssh. -t为镜像标签打标签.表示当前路径

使用自构建的镜像启动

[root@docker01base]#dockerrun-d-p2022:22centos6.8-ssh-b dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a

使用Dcokerfile安装kodexplorer

Dockerfile文件内容

FROMcentos:6.8 RUNyuminstallwgetunzipphpphp-gdphp-mbstring-y&&yumcleanall #设置工作目录,之后的操作都在这个目录中 WORKDIR/var/www/html/ RUNwget-chttp://static.kodcloud.com/update/download/kodexplorer4.25.zip RUNunzipkodexplorer4.25.zip&&rm-fkodexplorer4.25.zip RUNchown-Rapache.apache. CMD["/usr/sbin/apachectl" "-D" "FOREGROUND"]

更多的Dockerfile可以参考官方方法。


Docker中的镜像分层

参考文档:

http://www.maiziedu.com/wiki/cloud/dockerimage/

Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。

docker初学者指南(入门看这一篇就够了)(10)

从上图可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

Docker 镜像为什么分层

镜像分层最大的一个好处就是共享资源。

比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。

可写的容器层

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

docker初学者指南(入门看这一篇就够了)(11)

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

容器层的细节说明

镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

文件操作的

docker初学者指南(入门看这一篇就够了)(12)

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

使用docker运行zabbix-server

容器间的互联

在运行zabbix之前务必要了解容器间互联的方法

#创建一个nginx容器 dockerrun-d-p80:80nginx #创建容器,做link,并进入容器中 dockerrun-it--linkquirky_brown:web01centos-ssh/bin/bash #在容器中访问nginx容器可以ping通 pingweb01

命令执行过程

#启动apache容器 [root@docker01~]#dockerrun-dhttpd:2.4 3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955 ^[[A[root@docker01dockerps-a CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 3f1f7fc55472httpd:2.4"httpd-foreground"6secondsagoUp5seconds80/tcpdetermined_clarke #拉取一个busybox镜像 [root@docker01~]#dockerpullbusybox #启动容器 [root@docker01~]#dockerrun-it--linkdetermined_clarke:webbusybox:latest/bin/sh /# #使用新的容器访问最初的web容器 /#pingweb PINGweb(172.17.0.2):56databytes 64bytesfrom172.17.0.2:seq=0ttl=64time=0.058ms ^C ---webpingstatistics--- 1packetstransmitted 1packetsreceived 0%packetloss round-tripmin/avg/max=0.058/0.058/0.058ms

启动zabbix容器

1、启动一个mysql的容器

dockerrun--namemysql-server-t\ -eMYSQL_DATABASE="zabbix"\ -eMYSQL_USER="zabbix"\ -eMYSQL_PASSWORD="zabbix_pwd"\ -eMYSQL_ROOT_PASSWORD="root_pwd"\ -dmysql:5.7\ --character-set-server=utf8--collation-server=utf8_bin

2、启动java-gateway容器监控java服务

dockerrun--namezabbix-java-gateway-t\ -dzabbix/zabbix-java-gateway:latest

3、启动zabbix-mysql容器使用link连接mysql与java-gateway。

dockerrun--namezabbix-server-mysql-t\ -eDB_SERVER_HOST="mysql-server"\ -eMYSQL_DATABASE="zabbix"\ -eMYSQL_USER="zabbix"\ -eMYSQL_PASSWORD="zabbix_pwd"\ -eMYSQL_ROOT_PASSWORD="root_pwd"\ -eZBX_JAVAGATEWAY="zabbix-java-gateway"\ --linkmysql-server:mysql\ --linkzabbix-java-gateway:zabbix-java-gateway\ -p10051:10051\ -dzabbix/zabbix-server-mysql:latest

4、启动zabbix web显示,使用link连接zabbix-mysql与mysql。

dockerrun--namezabbix-web-nginx-mysql-t\ -eDB_SERVER_HOST="mysql-server"\ -eMYSQL_DATABASE="zabbix"\ -eMYSQL_USER="zabbix"\ -eMYSQL_PASSWORD="zabbix_pwd"\ -eMYSQL_ROOT_PASSWORD="root_pwd"\ --linkmysql-server:mysql\ --linkzabbix-server-mysql:zabbix-server\ -p80:80\ -dzabbix/zabbix-web-nginx-mysql:latest

关于zabbix API

关于zabbix API可以参考官方文档:

https://www.zabbix.com/documentation/3.4/zh/manual/api

1、获取token方法

#获取token [root@docker02~]#curl-s-XPOST-H'Content-Type:application/json'-d' { "jsonrpc":"2.0" "method":"user.login" "params":{ "user":"Admin" "password":"zabbix" } "id":1 }'http://10.0.0.100/api_jsonrpc.php {"jsonrpc":"2.0" "result":"d3be707f9e866ec5d0d1c242292cbebd" "id":1}


docker 仓库(registry)

创建一个普通仓库

1、创建仓库

dockerrun-d-p5000:5000--restart=always--nameregistry-v/opt/myregistry:/var/lib/registryregistry

2、修改配置文件,使之支持http

[root@docker01~]#cat/etc/docker/daemon.json { "registry-mirrors":["https://registry.docker-cn.com"] "insecure-registries":["10.0.0.100:5000"] }重启docker让修改生效[root@docker01~]#systemctlrestartdocker.service

3、修改镜像标签

[root@docker01~]#dockertagbusybox:latest10.0.0.100:5000/clsn/busybox:1.0 [root@docker01~]#dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE centos6-sshlatest3c2b1e57a0f518hoursago393MB httpd2.42e202f4539406daysago179MB 10.0.0.100:5000/clsn/busybox1.05b0d590267298daysago1.15MB

4、将新打标签的镜像上传镜像到仓库

[root@docker01~]#dockerpush10.0.0.100:5000/clsn/busybox

带basic认证的仓库

1、安装加密工具

[root@docker01clsn]#yuminstallhttpd-tools-y

2、设置认证密码

mkdir/opt/registry-var/auth/-p htpasswd-Bbnclsn123456>/opt/registry-var/auth/htpasswd

3、启动容器,在启动时传入认证参数

dockerrun-d-p5000:5000-v/opt/registry-var/auth/:/auth/-e"REGISTRY_AUTH=htpasswd"-e"REGISTRY_AUTH_HTPASSWD_REALM=RegistryRealm"-eREGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswdregistry

4、使用验证用户测试

#登陆用户 [root@docker01~]#dockerlogin10.0.0.100:5000 Username:clsn Password:123456 LoginSucceeded #推送镜像到仓库 [root@docker01~]#dockerpush10.0.0.100:5000/clsn/busybox Thepushreferstorepository[10.0.0.100:5000/clsn/busybox] 4febd3792a1f:Pushed 1.0:digest:sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352dsize:527 #认证文件的保存位置 [root@docker01~]#cat.docker/config.json { "auths":{ "10.0.0.100:5000":{ "auth":"Y2xzbjoxMjM0NTY=" } "https://index.docker.io/v1/":{ "auth":"Y2xzbjpIenNAMTk5Ng==" } } "HttpHeaders":{ "User-Agent":"Docker-Client/17.12.0-ce(linux)" } }至此,一个简单的docker镜像仓库搭建完成


docker-compose编排工具

安装docker-compose

安装docker-compose

#下载pip软件 yuminstall-ypython2-pip #下载docker-compose pipinstalldocker-compose

国内开启pip 下载加速:

http://mirrors.aliyun.com/help/pypi

mkdir~/.pip/ cat>~/.pip/pip.conf<<'EOF' [global] index-url=https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com EOF

编排启动镜像

1、创建文件目录

[root@docker01~]#mkdir/opt/my_wordpress/ [root@docker01~]#cd/opt/my_wordpress/

2、编写编排文件

[root@docker01my_wordpress]#vimdocker-compose.yml version:'3' services: db: image:mysql:5.7 volumes: -/data/db_data:/var/lib/mysql restart:always environment: MYSQL_ROOT_PASSWORD:somewordpress MYSQL_DATABASE:wordpress MYSQL_USER:wordpress MYSQL_PASSWORD:wordpress wordpress: depends_on: -db image:wordpress:latest volumes: -/data/web_data:/var/www/html ports: -"8000:80" restart:always environment: WORDPRESS_DB_HOST:db:3306 WORDPRESS_DB_USER:wordpress WORDPRESS_DB_PASSWORD:wordpress

3、启动

[root@docker01my_wordpress]#docker-composeup   #启动方法:docker-compose up   #后台启动方法:docker-compose up -d

4、浏览器上访问http://10.0.0.100:8000

进行wordpress的安装即可


haproxy代理后端docker容器

1、修改编排脚本

[root@docker01my_wordpress]#catdocker-compose.yml version:'3' services: db: image:mysql:5.7 volumes: -/data/db_data:/var/lib/mysql restart:always environment: MYSQL_ROOT_PASSWORD:somewordpress MYSQL_DATABASE:wordpress MYSQL_USER:wordpress MYSQL_PASSWORD:wordpress wordpress: depends_on: -db image:wordpress:latest volumes: -/data/web_data:/var/www/html ports: -"80" restart:always environment: WORDPRESS_DB_HOST:db:3306 WORDPRESS_DB_USER:wordpress WORDPRESS_DB_PASSWORD:wordpress

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。欢迎加入程序员小乐技术交流群,在后台回复“加群”或者“学习”即可。

关注订阅号「程序员小乐」,收看更多精彩内容

嘿,你在看吗?

猜您喜欢: