作者:惨绿少年
1 容器简介1.1 什么是 Linux 容器
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像供应支持进程所需的全部文件。
容器供应的镜像包含了运用的所有依赖项,因而在从开拓到测试再莅临盆的全体过程中,它都具有可移植性和同等性。
更加详细地来说,请您假定您在开拓一个运用。您利用的是一台条记本电脑,而且您的开拓环境具有特定的配置。其他开拓职员身处的环境配置可能稍有不同。您正在开拓的运用依赖于您当前的配置,还要依赖于某些特定文件。
与此同时,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。
您希望尽可能多在本地仿照这些环境,而不产生重新创建做事器环境的开销。
因此,您要如何确保运用能够在这些环境中运行和通过质量检测,并且在支配过程中不涌现令人头疼的问题,也无需重新编写代码和进行故障修复?答案便是利用容器。
容器可以确保您的运用拥有必需的配置和文件,使得这些运用能够在从开拓到测试、再莅临盆的全体流程中顺利运行,而不涌现任何不良问题。这样可以避免危急,做到皆大欢畅。
虽然这只是简化的示例,但在须要很高的可移植性、可配置性和隔离的情形下,我们可以利用 Linux 容器通过很多办法办理难题。
无论根本架构是在企业内部还是在云端,或者稠浊利用两者,容器都能知足您的需求。
1.2 容器不便是虚拟化吗
是,但也不竟然。我们用一种大略办法来思考一下:
虚拟化使得许多操作系统可同时在单个别系上运行。
容器则可共享同一个操作系统内核,将运用进程与系统其他部分隔离开。
图 - 普通虚拟化技能和Docker的比拟
这意味着什么?首先,让多个操作系统在单个虚拟机监控程序上运行以实现虚拟化,并不能达成和利用容器同等的轻量级效果。
事实上,在仅拥有容量有限的有限资源时,您须要能够可以进行密集支配的轻量级运用。
Linux 容器可从单个操作系统运行,在所有容器中共享该操作系统,因此运用和做事能够保持轻量级,并行快速运行。
1.3 容器发展简史
我们现在称为容器技能的观点最初涌如今 2000 年,当时称为 FreeBSD jail,这种技能可将 FreeBSD 系统分区为多个子系统(也称为 Jail)。
Jail 是作为安全环境而开拓的,系统管理员可与企业内部或外部的多个用户共享这些 Jail。
Jail 的目的是让进程在经由修正的 chroot 环境中创建,而不会分开和影响全体系统 — 在 chroot 环境中,对文件系统、网络和用户的访问都实现了虚拟化。
只管 Jail 在履行方面存在局限性,但终极人们找到了分开这种隔离环境的方法。
但这个观点非常有吸引力。
2001 年,通过 Jacques Gélinas 的 VServer 项目,隔离环境的履行进入了 Linux 领域。
正如 Gélinas 所说,这项事情的目的是“在高度独立且安全的单一环境中运行多个通用 Linux 做事器 [sic]。”
在完成了这项针对 Linux 中多个受掌握用户空间的根本性事情后,Linux 容器开始逐渐成形并终极发展成了现在的样子容貌。
2 什么是 Docker?
“Docker” 一词指代多种事物,包括开源社区项目、开源项目利用的工具、主导支持此类项目的公司 Docker Inc. 以及该公司官方支持的工具。技能产品和公司利用同一名称,的确让人有点困惑。
我们来大略解释一下:
? IT 软件中所说的 “Docker” ,是指容器化技能,用于支持创建和利用 Linux 容器。
? 开源 Docker 社区致力于改进这类技能,并免费供应给所有用户,使之获益。
? Docker Inc. 公司凭借 Docker 社区产品起身,它紧张卖力提升社区版本的安全性,并将改进后的版本与更广泛的技能社区分享。此外,它还专门对这些技能产品进行完善和安全固化,以做事于企业客户。
借助 Docker ,您可将容器当做重量轻、模块化的虚拟机利用。同时,您还将得到高度的灵巧性,从而实现对容器的高效创建、支配及复制,并能将其从一个环境顺利迁移至另一个环境。
2.1 Docker 如何事情?
Docker 技能利用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。
这种独立性正是采取容器的目的所在;它可以独立运行多种进程、多个运用程序,更加充分地发挥根本举动步伐的浸染,同时保持各个独立系统的安全性。
容器工具(包括 Docker)可供应基于镜像的支配模式。这使得它能够轻松跨多种环境,与其依赖程序共享运用或做事组。Docker 还可在这一容器环境中自动支配运用程序(或者合并多种流程,以构建单个运用程序)。
此外,由于这些工具基于 Linux 容器构建,使得 Docker 既易于利用,又别具一格 —— 它可为用户供应前所未有的高度运用程访问权限、快速支配以及版本掌握和分发能力。
2.2 Docker 技能是否与传统的 Linux 容器相同?
否。Docker 技能最初是基于 LXC 技能构建(大多数人都会将这一技能与“传统的” Linux 容器联系在一起),但后来它逐渐摆脱了对这种技能的依赖。
就轻量级 虚拟化 这一功能来看,LXC 非常有用,但它无法供应出色的开拓职员或用户体验。除了运行容器之外,Docker 技能还具备其他多项功能,包括简化用于构建容器、传输镜像以及掌握镜像版本的流程。
传统的 Linux 容器利用 init 系统来管理多种进程。这意味着,所有运用程序都作为一个整体运行。与此相反,Docker 技能鼓励运用程序各自独立运行其进程,并供应相应工具以实现这一功能。这种风雅化运作模式自有其上风。
2.3 docker的目标
docker的紧张目标是\"大众Build,Ship and Run any App,Angwhere\"大众,构建,运输,处处运行
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器每一个容器,他都有自己的文件系统rootfs.
3 安装Docker
环境解释
# 须要两台节点进行安装[root@docker01 ~]# cat /etc/redhat-releaseCentOS Linux release 7.2.1511 (Core)[root@docker01 ~]# uname -r3.10.0-327.el7.x86_64[root@docker01 ~]# hostname -I10.0.0.100 172.16.1.100[root@docker02 ~]# hostname -I10.0.0.101 172.16.1.101
在两个节点上都进行操作
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.reposed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repoyum install docker-ce -y
修正在docker01配置:
# 修正启动文件,监听远程端口vim /usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://10.0.0.100:2375systemctl daemon-reloadsystemctl enable docker.servicesystemctl restart docker.service# ps -ef检讨进行,是否启动
在docker02测试
[root@docker02 ~]# docker -H 10.0.0.100 infoContainers: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 17.12.0-ceStorage Driver: devicemapper···
3.1 Docker根本命令操作查看docker干系信息
[root@docker01 ~]# docker version Client:Version: 17.12.0-ceAPI version: 1.35Go version: go1.9.2Git commit: c97c6d6Built: Wed Dec 27 20:10:14 2017OS/Arch: linux/amd64Server:Engine:Version: 17.12.0-ceAPI version: 1.35 (minimum version 1.12)Go version: go1.9.2Git commit: c97c6d6Built: Wed Dec 27 20:12:46 2017OS/Arch: linux/amd64Experimental: false
配置docker镜像加速
vi /etc/docker/daemon.json{\"大众registry-mirrors\"大众: [\公众https://registry.docker-cn.com\公众]}
3.2 启动第一个容器[root@docker01 ~]# docker run -d -p 80:80 nginxUnable to find image 'nginx:latest' locallylatest: Pulling from library/nginxe7bb522d92ff: Pull complete6edc05228666: Pull completecd866a17e81f: Pull completeDigest: sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63dStatus: Downloaded newer image for nginx:latest8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d# 容器启动后,在浏览器进行访问测试
参数解释
3.3 Docker镜像生命周期
4 docker镜像干系操作
4.1 搜索官方仓库镜像
[root@docker01 ~]# docker search centosNAME DESCRIPTION STARS OFFICIAL AUTOMATEDcentos The official build of CentOS. 3992 [OK]ansible/centos7-ansible Ansible on Centos7 105 [OK]
列表解释
4.2 获取镜像
根据镜像名称拉取镜像
[root@docker01 ~]# docker pull centosUsing default tag: latestlatest: Pulling from library/centosaf4b0a2388c6: Downloading 34.65MB/73.67MB
查看当前主机镜像列表
[root@docker01 ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZEcentos latest ff426288ea90 3 weeks ago 207MBnginx latest 3f8a4339aadd 5 weeks ago 108MB
拉第三方镜像方法
docker pull index.tenxcloud.com/tenxcloud/httpd
4.3 导出镜像[root@docker01 ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZEcentos latest ff426288ea90 3 weeks ago 207MBnginx latest 3f8a4339aadd 5 weeks ago 108MB# 导出[root@docker01 ~]# docker image save centos > docker-centos.tar.gz4.4 删除镜像
[root@docker01 ~]# docker image rm centos:latest[root@docker01 ~]# docker image listREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 3f8a4339aadd 5 weeks ago 108MB
4.5 导入镜像[root@docker01 ~]# docker image load -i docker-centos.tar.gz e15afa4858b6: Loading layer 215.8MB/215.8MBLoaded image: centos:latest[root@docker01 ~]# docker image listREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest ff426288ea90 3 weeks ago 207MBnginx latest 3f8a4339aadd 5 weeks ago 108MB
4.6 查看镜像的详细信息[root@docker01 ~]# docker image inspect centos
5 容器的日常管理5.1 容器的起/停最大略的运行一个容器
[root@docker01 ~]# docker run nginx
创建容器,两步走(不常用)[root@docker01 ~]# docker create centos:latest /bin/bashbb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204[root@docker01 ~]# docker start stupefied_nobelstupefied_nobel
快速启动容器方法
[root@docker01 ~]# docker run centos:latest /usr/bin/sleep 20;
容器内的第一个进程必须一贯处于运行的状态,否则这个容器,就会处于退出状态!
查看正在运行的容器
[root@docker01 ~]# docker container ls或[root@docker01 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8708e93fd767 nginx \公众nginx -g 'daemon of…\"大众 6 seconds ago Up 4 seconds 80/tcp keen_lewin
查看你容用具体信息/ip
[root@docker01 ~]# docker container inspect 容器名称/id
查看你所有容器(包括未运行的)
[root@docker01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8708e93fd767 nginx \"大众nginx -g 'daemon of…\"大众 4 minutes ago Exited (0) 59 seconds ago keen_lewinf9f3e6af7508 nginx \"大众nginx -g 'daemon of…\"大众 5 minutes ago Exited (0) 5 minutes ago optimistic_haibt8d8f81da12b5 nginx \公众nginx -g 'daemon of…\"大众 3 hours ago Exited (0) 3 hours ago lucid_bohr停滞容器
[root@docker01 ~]# docker stop 容器名称/id 或[root@docker01 ~]# docker container kill 容器名称/id
5.2 进入容器方法启动时进去方法[root@docker01 ~]# docker run -it #参数:-it 可交互终端[root@docker01 ~]# docker run -it nginx:latest /bin/bashroot@79241093859e:/#
退出/离开容器
ctrl+p & ctrl+q
启动后进入容器的方法
启动一个docker
[root@docker01 ~]# docker run -it centos:latest [root@1bf0f43c4d2f /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 15:47 pts/0 00:00:00 /bin/bashroot 13 1 0 15:47 pts/0 00:00:00 ps -efattach进入容器,利用pts/0 ,会让所用通过此方法进入用户看到同样的操作。
[root@docker01 ~]# docker attach 1bf0f43c4d2f[root@1bf0f43c4d2f /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 15:47 pts/0 00:00:00 /bin/bashroot 14 1 0 15:49 pts/0 00:00:00 ps -ef
自命名启动一个容器 --name
[root@docker01 ~]# docker attach 1bf0f43c4d2f[root@1bf0f43c4d2f /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 15:47 pts/0 00:00:00 /bin/bashroot 14 1 0 15:49 pts/0 00:00:00 ps -efexec 进入容器方法(推举利用)
[root@docker01 ~]# docker exec -it clsn1 /bin/bash [root@b20fa75b4b40 /]# 重新分配一个终端[root@b20fa75b4b40 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 16:11 pts/0 00:00:00 /bin/bashroot 13 0 0 16:14 pts/1 00:00:00 /bin/bashroot 26 13 0 16:14 pts/1 00:00:00 ps -ef
5.3 删除所有容器[root@docker01 ~]# docker rm -f `docker ps -a -q`# -f 逼迫删除
5.4 启动时进行端口映射-p参数端口映射
[root@docker01 ~]# docker run -d -p 8888:80 nginx:latest 287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9
不同指定映射方法
随机映射
docker run -P (大P)# 须要镜像支持
6 Docker 数据卷的管理6.1 挂载时创建卷挂载卷
[root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
容器内站点目录: /usr/share/nginx/html
在宿主机写入数据,查看
[root@docker01 ~]# echo \"大众http://www.nmtui.com\"大众 >/data/index.html[root@docker01 ~]# curl 10.0.0.100http://www.nmtui.com设置共享卷,利用同一个卷启动一个新的容器
[root@docker01 ~]# docker run -d -p 8080:80 -v /data:/usr/share/nginx/html nginx:latest 351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42[root@docker01 ~]# curl 10.0.0.100:8080http://www.nmtui.com
查看卷列表
[root@docker01 ~]# docker volume lsDRIVER VOLUME NAME
6.2 创建卷后挂载创建一个卷
[root@docker01 ~]# docker volume create f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521[root@docker01 ~]# docker volume lsDRIVER VOLUME NAMElocal f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
指定卷名
[root@docker01 ~]# docker volume ls DRIVER VOLUME NAMElocal clsnlocal f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
查看卷路径
[root@docker01 ~]# docker volume inspect clsn [{\公众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 ~]# docker run -d -p 9000:80 -v clsn:/usr/share/nginx/html nginx:latest 1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503# 宿主机测试[root@docker01 ~]# echo 'blog.nmtui.com' >/var/lib/docker/volumes/clsn/_data/index.html[root@docker01 ~]# curl 10.0.0.100:9000blog.nmtui.com
设置卷
[root@docker01 ~]# docker run -d -P --volumes-from 079786c1e297 nginx:latest b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb
查看利用的端口
[root@docker01 ~]# netstat -lntup Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN 1400/sshdtcp 0 0 10.0.0.100:2375 0.0.0.0: LISTEN 26218/dockerdtcp6 0 0 :::9000 ::: LISTEN 32015/docker-proxytcp6 0 0 :::8080 ::: LISTEN 31853/docker-proxytcp6 0 0 :::80 ::: LISTEN 31752/docker-proxytcp6 0 0 :::22 ::: LISTEN 1400/sshdtcp6 0 0 :::32769 ::: LISTEN 32300/docker-proxy[root@docker01 ~]# curl 10.0.0.100:32769http://www.nmtui.com
6.3 手动将容器保存为镜像本次是基于docker官方centos 6.8 镜像创建
官方镜像列表:
https://hub.docker.com/explore/
启动一个centos6.8的镜像
[root@docker01 ~]# docker pull centos:6.8[root@docker01 ~]# docker run -it -p 1022:22 centos:6.8 /bin/bash# 在容器种安装sshd做事,并修正系统密码[root@582051b2b92b ~]# yum install openssh-server -y[root@582051b2b92b ~]# echo \"大众root:123456\"大众 |chpasswd[root@582051b2b92b ~]# /etc/init.d/sshd start
启动完成后镜像ssh连接测试
将容器提交为镜像
[root@docker01 ~]# docker commit brave_mcclintock centos6-ssh
利用新的镜像启动容器[root@docker01 ~]# docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D 5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094
在容器安装httpd做事
[root@5b8161fda2a9 /]# yum install httpd -y
编写启动脚本脚本
[root@5b8161fda2a9 /]# cat init.sh #!/bin/bash/etc/init.d/httpd start/usr/sbin/sshd -D[root@5b8161fda2a9 /]# chmod +x init.sh# 把稳实行权限
再次提交为新的镜像
[root@docker01 ~]# docker commit 5b8161fda2a9 centos6-httpd sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1
启动镜像,做好端口映射。并在浏览器中测试访问
[root@docker01 ~]# docker run -d -p 1222:22 -p 80:80 centos6-httpd /init.sh 46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c7 Dockerfile自动构建docker镜像
官方构建dockerffile文件参考
https://github.com/CentOS/CentOS-Dockerfiles
7.1 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 容器启动后实行的命令
7.2 创建一个Dockerfile
创建第一个Dockerfile文件
# 创建目录[root@docker01 base]# cd /opt/base# 创建Dcokerfile文件,把稳大小写[root@docker01 base]# vim DockerfileFROM centos:6.8RUN yum install openssh-server -yRUN echo \"大众root:123456\公众 |chpasswdRUN /etc/init.d/sshd startCMD [\"大众/usr/sbin/sshd\"大众,\"大众-D\公众]
构建docker镜像
[root@docker01 base]# docker image build -t centos6.8-ssh . -t 为镜像标签打标签 . 表示当前路径
利用自构建的镜像启动
[root@docker01 base]# docker run -d -p 2022:22 centos6.8-ssh-b dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a
7.3 利用Dcokerfile安装kodexplorerDockerfile文件内容
FROM centos:6.8RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all# 设置事情目录,之后的操作都在这个目录中WORKDIR /var/www/html/RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zipRUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zipRUN chown -R apache.apache .CMD [\"大众/usr/sbin/apachectl\"大众,\公众-D\"大众,\"大众FOREGROUND\"大众]
更多的Dockerfile可以参考官方方法。
8 Docker中的镜像分层
参考文档:
http://www.maiziedu.com/wiki/cloud/dockerimage/
Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置须要的软件构建出来的。
从上图可以看到,新镜像是从 base 镜像一层一层叠加天生的。每安装一个软件,就在现有镜像的根本上增加一层。
8.1 Docker 镜像为什么分层
镜像分层最大的一个好处便是共享资源。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器做事了。而且镜像的每一层都可以被共享。
如果多个容器共享一份根本镜像,当某个容器修正了根本镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修正的,修正只会被限定在单个容器内。这便是容器 Copy-on-Write 特性。
8.2 可写的容器层
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层常日被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修正文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
8.3 容器层的细节解释
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也便是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。
文件操作的
只有当须要修正时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变革的部分,不会对镜像本身进行任何修正。
这样就阐明了我们前面提出的问题:容器层记录对镜像的修正,所有镜像层都是只读的,不会被容器修正,以是镜像可以被多个容器共享。
9 利用docker运行zabbix-server9.1 容器间的互联
在运行zabbix之前务必要理解容器间互联的方法
# 创建一个nginx容器docker run -d -p 80:80 nginx# 创建容器,做link,并进入容器中docker run -it --link quirky_brown:web01 centos-ssh /bin/bash# 在容器中访问nginx容器可以ping通ping web01命令实行过程
# 启动apache容器[root@docker01 ~]# docker run -d httpd:2.43f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955^[[A[root@docker01 docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3f1f7fc55472 httpd:2.4 \"大众httpd-foreground\"大众 6 seconds ago Up 5 seconds 80/tcp determined_clarke# 拉取一个busybox 镜像[root@docker01 ~]# docker pull busybox# 启动容器[root@docker01 ~]# docker run -it --link determined_clarke:web busybox:latest /bin/sh/ ## 利用新的容器访问最初的web容器/ # ping webPING web (172.17.0.2): 56 data bytes64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.058 ms^C--- web ping statistics ---1 packets transmitted, 1 packets received, 0% packet lossround-trip min/avg/max = 0.058/0.058/0.058 ms9.2 启动zabbix容器
1、启动一个mysql的容器
docker run --name mysql-server -t \-e MYSQL_DATABASE=\"大众zabbix\公众 \-e MYSQL_USER=\"大众zabbix\"大众 \-e MYSQL_PASSWORD=\"大众zabbix_pwd\公众 \-e MYSQL_ROOT_PASSWORD=\"大众root_pwd\"大众 \-d mysql:5.7 \--character-set-server=utf8 --collation-server=utf8_bin
2、启动java-gateway容器监控java做事
docker run --name zabbix-java-gateway -t \-d zabbix/zabbix-java-gateway:latest
3、启动zabbix-mysql容器利用link连接mysql与java-gateway。
docker run --name zabbix-server-mysql -t \-e DB_SERVER_HOST=\公众mysql-server\公众 \-e MYSQL_DATABASE=\公众zabbix\"大众 \-e MYSQL_USER=\"大众zabbix\公众 \-e MYSQL_PASSWORD=\"大众zabbix_pwd\"大众 \-e MYSQL_ROOT_PASSWORD=\"大众root_pwd\公众 \-e ZBX_JAVAGATEWAY=\"大众zabbix-java-gateway\"大众 \--link mysql-server:mysql \--link zabbix-java-gateway:zabbix-java-gateway \-p 10051:10051 \-d zabbix/zabbix-server-mysql:latest
4、启动zabbix web显示,利用link连接zabbix-mysql与mysql。
docker run --name zabbix-web-nginx-mysql -t \-e DB_SERVER_HOST=\"大众mysql-server\公众 \-e MYSQL_DATABASE=\"大众zabbix\"大众 \-e MYSQL_USER=\公众zabbix\公众 \-e MYSQL_PASSWORD=\"大众zabbix_pwd\"大众 \-e MYSQL_ROOT_PASSWORD=\公众root_pwd\"大众 \--link mysql-server:mysql \--link zabbix-server-mysql:zabbix-server \-p 80:80 \-d zabbix/zabbix-web-nginx-mysql:latest
9.3 关于zabbix API关于zabbix API可以参考官方文档:
https://www.zabbix.com/documentation/3.4/zh/manual/api
1、获取token方法
# 获取token[root@docker02 ~]# curl -s -X POST -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}
10 docker 仓库(registry)10.1 创建一个普通仓库1、创建仓库
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
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 ~]# systemctl restart docker.service
3、修正镜像标签
[root@docker01 ~]# docker tag busybox:latest 10.0.0.100:5000/clsn/busybox:1.0[root@docker01 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos6-ssh latest 3c2b1e57a0f5 18 hours ago 393MBhttpd 2.4 2e202f453940 6 days ago 179MB10.0.0.100:5000/clsn/busybox 1.0 5b0d59026729 8 days ago 1.15MB
4、将新打标签的镜像上传镜像到仓库
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox
10.2 带basic认证的仓库1、安装加密工具
[root@docker01 clsn]# yum install httpd-tools -y
2、设置认证密码
mkdir /opt/registry-var/auth/ -phtpasswd -Bbn clsn 123456 > /opt/registry-var/auth/htpasswd
3、启动容器,在启动时传入认证参数
docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e \"大众REGISTRY_AUTH=htpasswd\公众 -e \"大众REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm\"大众 -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
4、利用验证用户测试
# 上岸用户[root@docker01 ~]# docker login 10.0.0.100:5000Username: clsnPassword: 123456Login Succeeded# 推送镜像到仓库[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busyboxThe push refers to repository [10.0.0.100:5000/clsn/busybox]4febd3792a1f: Pushed1.0: digest: sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d size: 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镜像仓库搭建完成。
11 docker-compose编排工具11.1 安装docker-compose安装docker-compose
# 下载pip软件yum install -y python2-pip# 下载 docker-composepip install docker-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.comEOF
11.2 编排启动镜像1、创建文件目录
[root@docker01 ~]# mkdir /opt/my_wordpress/[root@docker01 ~]# cd /opt/my_wordpress/
2、编写编排文件
[root@docker01 my_wordpress]# vim docker-compose.ymlversion: '3'services:db:image: mysql:5.7volumes:- /data/db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresswordpress:depends_on:- dbimage: wordpress:latestvolumes:- /data/web_data:/var/www/htmlports:- \"大众8000:80\公众restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpress
3、启动
[root@docker01 my_wordpress]# docker-compose up#启动方法:docker-compose up#后台启动方法:docker-compose up -d
4、浏览器上访问http://10.0.0.100:8000
进行wordpress的安装即可
11.3 haproxy代理后端docker容器
1、修正编排脚本
[root@docker01 my_wordpress]# cat docker-compose.yml version: '3'services:db:image: mysql:5.7volumes:- /data/db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresswordpress:depends_on:- dbimage: wordpress:latestvolumes:- /data/web_data:/var/www/htmlports:- \"大众80\公众restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpress
2、同时启动两台wordpress
[root@docker01 my_wordpress]# docker-compose scale wordpress=2 WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.Starting mywordpress_wordpress_1 ... doneCreating mywordpress_wordpress_2 ... done
3、安装haproxy
[root@docker01 ~]# yum install haproxy -y
4、修正haproxy配置文件
关于配置文件的详细解释,参考:
https://www.cnblogs.com/MacoLee/p/5853413.html
[root@docker01 ~]#cp /etc/haproxy/haproxy.cfg{,.bak}[root@docker01 ~]# vim /etc/haproxy/haproxy.cfggloballog 127.0.0.1 local2chroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/stats level admin #支持命令行掌握defaultsmode httplog globaloption httplogoption dontlogoption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 3timeout http-request 10stimeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 3000listen statsmode httpbind 0.0.0.0:8888stats enablestats uri /haproxy-statusstats auth admin:123456frontend frontend_www_example_combind 10.0.0.100:8000mode httpoption httploglog globaldefault_backend backend_www_example_combackend backend_www_example_comoption forwardfor header X-REAL-IPoption httpchk HEAD / HTTP/1.0balance roundrobinserver web-node1 10.0.0.100:32768 check inter 2000 rise 30 fall 15server web-node2 10.0.0.100:32769 check inter 2000 rise 30 fall 15
5、启动haproxy
systemctl start haproxysystemctl enable haproxy
6、利用浏览器访问hapeoxy监听的8000端口可以看到负载的情形
7、利用浏览器访问
http://10.0.0.100:8888/haproxy-status
可以看到后端节点的监控状况,
11.4 安装socat 直接操作socket掌握haproxy
1、安装软件
yum install socat.x86_64 -y
2、查看帮助
[root@docker01 web_data]# echo \"大众help\"大众|socat stdio /var/lib/haproxy/stats
3、下线后端节点
echo \"大众disable server backend_www_example_com/web-node2\公众|socat stdio /var/lib/haproxy/stats
4、上线后端节点
echo \"大众enable server backend_www_example_com/web-node3\"大众|socat stdio /var/lib/haproxy/stats
5、编写php测试页,放到/data/web_data下,在浏览器中访问可以查看当前的节点
[root@docker01 web_data]# vim check.php<html><head><title>PHP测试</title></head><body><?php echo '<p>Hello World </p>'; ?><?php echo \公众访问的做事器地址是:\公众.\"大众<fontcolor=red>\"大众.$_SERVER['SERVER_ADDR'].\公众</font>\公众.\"大众<br>\公众;echo\"大众访问的做事器域名是:\"大众.\"大众<fontcolor=red>\"大众.$_SERVER['SERVER_NAME'].\"大众</font>\"大众.\"大众<br>\公众;?></body></html>12 重启docker做事,容器全部退出的办理办法
12.1 在启动是指定自动重启docker run --restart=always
12.2 修正docker默认配置文件# 添加高下面这行\"大众live-restore\公众: true
docker server配置文件 /etc/docker/daemon.json 参考
[root@docker02 ~]# cat /etc/docker/daemon.json {\公众registry-mirrors\"大众: [\公众https://registry.docker-cn.com\"大众],\公众graph\公众: \"大众/opt/mydocker\"大众, # 修正数据的存放目录到/opt/mydocker/,原/var/lib/docker/\"大众insecure-registries\"大众: [\"大众10.0.0.100:5000\"大众],\"大众live-restore\公众: true}
重启生效,只对在此之后启动的容器生效
[root@docker01 ~]# systemctl restart docker.service
13 Docker网络类型13.1 docker的网络类型
Bridge默认docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
13.2 不为容器配置网络功能
此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部须要自己去配置。
[root@docker01 ~]# docker run -it --network none busybox:latest /bin/sh / # ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueuelink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
13.3 与其他容器共享网络配置(Container)此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会创造里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是相互隔离的,如进程等。
[root@docker01 ~]# docker run -it --network container:mywordpress_db_1 busybox:latest /bin/sh / # ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueuelink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever105: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueuelink/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ffinet 172.18.0.3/16 brd 172.18.255.255 scope global eth0valid_lft forever preferred_lft forever
13.4 利用宿主机网络此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不屈安的。
[root@docker01 ~]# docker run -it --network host busybox:latest /bin/sh
13.5 查看网络列表[root@docker01 ~]# docker network list NETWORK ID NAME DRIVER SCOPEb15e8a720d3b bridge bridge local345d65b4c2a0 host host localbc5e2a32bb55 mywordpress_default bridge localebf76eea91bb none local
13.6 用PIPEWORK为docker容器配置独立IP参考文档:
blog.csdn.net/design321/article/details/48264825
官方网站:
github.com/jpetazzo/pipework
宿主环境:centos7.2
1、安装pipework
wget https://github.com/jpetazzo/pipework/archive/master.zipunzip master.zipcp pipework-master/pipework /usr/local/bin/chmod +x /usr/local/bin/pipework
2、配置桥接网卡
安装桥接工具
yum install bridge-utils.x86_64 -y
修正网卡配置,实现桥接
# 修正eth0配置,让br0实现桥接[root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0TYPE=EthernetBOOTPROTO=staticNAME=eth0DEVICE=eth0ONBOOT=yesBRIDGE=br0[root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0TYPE=BridgeBOOTPROTO=staticNAME=br0DEVICE=br0ONBOOT=yesIPADDR=10.0.0.100NETMASK=255.255.255.0GATEWAY=10.0.0.254DNS1=223.5.5.5# 重启网络[root@docker01 ~]# /etc/init.d/network restart
3、运行一个容器镜像测试:
pipework br0 $(docker run -d -it -p 6880:80 --name httpd_pw httpd) 10.0.0.220/24@10.0.0.254
在其他主机上测试端口及连通性
[root@docker01 ~]# curl 10.0.0.220<html><body><h1>It works!</h1></body></html>[root@docker01 ~]# ping 10.0.0.220 -c 1PING 10.0.0.220 (10.0.0.220) 56(84) bytes of data.64 bytes from 10.0.0.220: icmp_seq=1 ttl=64 time=0.043 ms
4、再运行一个容器,设置网路类型为none:
pipework br0 $(docker run -d -it --net=none --name test httpd:2.4) 10.0.0.221/24@10.0.0.254
进行访问测试
[root@docker01 ~]# curl 10.0.0.221<html><body><h1>It works!</h1></body></html>
5、重启容器后须要再次指定:
pipework br0 testduliip 172.16.146.113/24@172.16.146.1pipework br0 testduliip01 172.16.146.112/24@172.16.146.1
Dcoker跨主机通信之overlay可以参考:
cnblogs.com/CloudMan6/p/7270551.html
13.7 Docker跨主机通信之macvlan
创建网络
[root@docker01 ~]# docker network create --driver macvlan --subnet 10.1.0.0/24 --gateway 10.1.0.254 -o parent=eth0 macvlan_133a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca
设置网卡为殽杂模式
ip link set eth0 promisc on
创建利用macvlan网络容器
[root@docker02 ~]# docker run -it --network macvlan_1 --ip=10.1.0.222 busybox /b
14 docker企业级镜像仓库harbor容器管理
[root@docker01 harbor]# pwd/opt/harbor[root@docker01 harbor]# docker-compose stop
1、安装docker、docker-compose
下载 harbor
cd /opt && https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgztar xf harbor-offline-installer-v1.3.0.tgz
2、修正主机及web界面密码
[root@docker01 harbor]# vim harbor.cfg ···hostname = 10.0.0.100harbor_admin_password = Harbor12345···
3、实行安装脚本
[root@docker01 harbor]# ./install.sh
浏览器访问 http://10.0.0.11添加一个项目
4、镜像推送到仓库的指定项目
[root@docker02 ~]# docker tag centos:6.8 10.0.0.100/clsn/centos6.8:1.0[root@docker02 ~]#[root@docker02 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest 5b0d59026729 8 days ago 1.15MB10.0.0.100/clsn/centos6.8 1.0 6704d778b3ba 2 months ago 195MBcentos 6.8 6704d778b3ba 2 months ago 195MB[root@docker02 ~]# docker login 10.0.0.100Username: adminPassword:Login Succeeded
5、推送镜像
[root@docker02 ~]# docker push 10.0.0.100/clsn/centos6.8 The push refers to repository [10.0.0.100/clsn/centos6.8]e00c9229b481: Pushing 13.53MB/194.5MB
6、在web界面里查看
14.1 利用容器的建议
1. 不要以拆分办法进行运用程序发布
2. 不要创建大型镜像
3. 不要在单个容器中运行多个进程
4. 不要再镜像内保存凭据,不要依赖IP地址
5. 以非root用户运行进程
6. 不要利用“最新”标签
7. 不要利用运行中的容器创建镜像
8. 不要利用单层镜像
9. 不要将数据存放在容器内
14.2 关于Docker容器的监控容器的基本信息
包括容器的数量、ID、名称、镜像、启动命令、端口等信息
容器的运行状态
统计各状态的容器的数量,包括运行中、停息、停滞及非常退出
容器的用量信息
统计容器的CPU利用率、内存利用量、块设备I/O利用量、网络利用情形等资源的利用情形
15 参考文献
redhat.com/zh/topics/containers/whats-a-linux-container
redhat.com/zh/topics/containers/what-is-docker
blog.51cto.com/dihaifeng/1713512
cnblogs.com/Bourbon-tian/p/6867796.html
cnblogs.com/CloudMan6/p/6806193.html