共计 30118 个字符,预计需要花费 76 分钟才能阅读完成。
欢送微信搜寻公众号【java 版 web 我的项目】获取资源:java 学习视频 / 设计模式笔记 / 算法手册 /java 我的项目
容器简介
什么是 Linux 容器
Linux 容器是与零碎其余局部隔离开的一系列过程,从另一个镜像运行,并由该镜像提供反对过程所需的全副文件。
容器提供的镜像蕴含了利用的所有依赖项,因此在从开发到测试再到生产的整个过程中,它都具备可移植性和一致性。
更加具体地来说,请您假设您在开发一个利用。您应用的是一台笔记本电脑,而且您的开发环境具备特定的配置。其余开发人员身处的环境配置可能稍有不同。您正在开发的利用依赖于您以后的配置,还要依赖于某些特定文件。
与此同时,您的企业还领有标准化的测试和生产环境,且具备本身的配置和一系列反对文件。
您心愿尽可能多在本地模仿这些环境,而不产生从新创立服务器环境的开销。
因而,您要如何确保利用可能在这些环境中运行和通过品质检测,并且在部署过程中不呈现令人头疼的问题,也无需从新编写代码和进行故障修复?答案就是应用容器。
容器能够确保您的利用领有必须的配置和文件,使得这些利用可能在从开发到测试、再到生产的整个流程中顺利运行,而不呈现任何不良问题。这样能够防止危机,做到大快人心。
尽管这只是简化的示例,但在须要很高的可移植性、可配置性和隔离的状况下,咱们能够利用 Linux 容器通过很多形式解决难题。
无论基础架构是在企业外部还是在云端,或者混合应用两者,容器都能满足您的需要。
容器不就是虚拟化吗
是,但也不居然。咱们用一种简略形式来思考一下:
虚拟化使得许多操作系统可同时在单个零碎上运行。
容器则可共享同一个操作系统内核,将利用过程与零碎其余局部隔离开。
图 – 一般虚拟化技术和 Docker 的比照
这意味着什么?首先,让多个操作系统在单个虚拟机监控程序上运行以实现虚拟化,并不能达成和应用容器等同的轻量级成果。
事实上,在仅领有容量无限的无限资源时,您须要可能能够进行密集部署的轻量级利用。
Linux 容器可从单个操作系统运行,在所有容器中共享该操作系统,因而利用和服务可能放弃轻量级,并行疾速运行。
容器倒退简史
咱们当初称为容器技术的概念最后呈现在 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 技术还具备其余多项性能,包含简化用于构建容器、传输镜像以及管制镜像版本的流程。
传统的 Linux 容器应用 init 零碎来治理多种过程。这意味着,所有应用程序都作为一个整体运行。与此相反,Docker 技术激励应用程序各自独立运行其过程,并提供相应工具以实现这一性能。这种精细化运作模式自有其劣势。
docker 的指标
docker 的次要指标是 ”Build,Ship and Run any App,Angwhere”, 构建,运输,处处运行
- 构建:做一个 docker 镜像
- 运输:docker pull
- 运行:启动一个容器
每一个容器,他都有本人的文件系统 rootfs.
–
装置 Docker
环境阐明
# 须要两台几点进行装置
[root@docker01 ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@docker01 ~]# uname -r
3.10.0-327.el7.x86_64
[root@docker01 ~]# hostname -I
10.0.0.100 172.16.1.100
[root@docker02 ~]# hostname -I
10.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.repo
sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
批改在 docker01 配置:
# 批改启动文件,监听近程端口
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://10.0.0.100:2375
systemctl daemon-reload
systemctl enable docker.service
systemctl restart docker.service
# ps -ef 查看进行,是否启动
在 docker02 测试
[root@docker02 ~]# docker -H 10.0.0.100 info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.12.0-ce
Storage Driver: devicemapper
···
Docker 根底命令操作
查看 docker 相干信息
[root@docker01 ~]# docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:10:14 2017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:12:46 2017
OS/Arch: linux/amd64
Experimental: false
配置 docker 镜像减速
vi /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com"]
}
启动第一个容器
[root@docker01 ~]# docker run -d -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
e7bb522d92ff: Pull complete
6edc05228666: Pull complete
cd866a17e81f: Pull complete
Digest: sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63d
Status: Downloaded newer image for nginx:latest
8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d
# 容器启动后,在浏览器进行拜访测试
参数阐明
Docker 镜像生命周期
Docker 镜像相干操作
搜寻官网仓库镜像
[root@docker01 ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 3992 [OK]
ansible/centos7-ansible Ansible on Centos7 105 [OK]
列表阐明
获取镜像
依据镜像名称拉取镜像
[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Downloading 34.65MB/73.67MB
查看以后主机镜像列表
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
拉第三方镜像办法
docker pull index.tenxcloud.com/tenxcloud/httpd
导出镜像
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
# 导出
[root@docker01 ~]# docker image save centos > docker-centos.tar.gz
删除镜像
[root@docker01 ~]# docker image rm centos:latest
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3f8a4339aadd 5 weeks ago 108MB
导入镜像
[root@docker01 ~]# docker image load -i docker-centos.tar.gz
e15afa4858b6: Loading layer 215.8MB/215.8MB
Loaded image: centos:latest
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
查看镜像的详细信息
[root@docker01 ~]# docker image inspect centos
–
容器的日常治理
容器的起 / 停
最简略的运行一个容器
[root@docker01 ~]# docker run nginx
创立容器,两步走(不罕用)
[root@docker01 ~]# docker create centos:latest /bin/bash
bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
[root@docker01 ~]# docker start stupefied_nobel
stupefied_nobel
疾速启动容器办法
[root@docker01 ~]# docker run centos:latest /usr/bin/sleep 20;
容器内的第一个过程必须始终处于运行的状态,否则这个容器,就会处于退出状态!
查看正在运行的容器
[root@docker01 ~]# docker container ls
或
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8708e93fd767 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 -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8708e93fd767 nginx "nginx -g'daemon of…" 4 minutes ago Exited (0) 59 seconds ago keen_lewin
f9f3e6af7508 nginx "nginx -g'daemon of…" 5 minutes ago Exited (0) 5 minutes ago optimistic_haibt
8d8f81da12b5 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
进入容器办法
启动时进去办法
[root@docker01 ~]# docker run -it #参数:-it 可交互终端
[root@docker01 ~]# docker run -it nginx:latest /bin/bash
root@79241093859e:/#
退出 / 来到容器
ctrl+p & ctrl+q
启动后进入容器的办法
启动一个 docker
[root@docker01 ~]# docker run -it centos:latest
[root@1bf0f43c4d2f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:47 pts/0 00:00:00 /bin/bash
root 13 1 0 15:47 pts/0 00:00:00 ps -ef
attach 进入容器,应用 pts/0,会让所用通过此办法进如放入用户看到同样的操作。
[root@docker01 ~]# docker attach 1bf0f43c4d2f
[root@1bf0f43c4d2f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:47 pts/0 00:00:00 /bin/bash
root 14 1 0 15:49 pts/0 00:00:00 ps -ef
自命名启动一个容器 –name
[root@docker01 ~]# docker attach 1bf0f43c4d2f
[root@1bf0f43c4d2f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:47 pts/0 00:00:00 /bin/bash
root 14 1 0 15:49 pts/0 00:00:00 ps -ef
exec 进入容器办法(举荐应用)
[root@docker01 ~]# docker exec -it clsn1 /bin/bash
[root@b20fa75b4b40 /]# 重新分配一个终端
[root@b20fa75b4b40 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:11 pts/0 00:00:00 /bin/bash
root 13 0 0 16:14 pts/1 00:00:00 /bin/bash
root 26 13 0 16:14 pts/1 00:00:00 ps -ef
删除所有容器
[root@docker01 ~]# docker rm -f `docker ps -a -q`
# -f 强制删除
启动时进行端口映射
- p 参数端口映射
[root@docker01 ~]# docker run -d -p 8888:80 nginx:latest
287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9
不同指定映射办法
随机映射
docker run -P(大 P)# 须要镜像反对
Docker 数据卷的治理
挂载时创立卷
挂载卷
[root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
容器内站点目录: /usr/share/nginx/html
在宿主机写入数据,查看
[root@docker01 ~]# echo "http://www.nmtui.com" >/data/index.html
[root@docker01 ~]# curl 10.0.0.100
http://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:8080
http://www.nmtui.com
查看卷列表
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
创立卷后挂载
创立一个卷
[root@docker01 ~]# docker volume create
f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
local f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
指定卷名
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
local clsn
local 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:9000
blog.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 name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1400/sshd
tcp 0 0 10.0.0.100:2375 0.0.0.0:* LISTEN 26218/dockerd
tcp6 0 0 :::9000 :::* LISTEN 32015/docker-proxy
tcp6 0 0 :::8080 :::* LISTEN 31853/docker-proxy
tcp6 0 0 :::80 :::* LISTEN 31752/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 1400/sshd
tcp6 0 0 :::32769 :::* LISTEN 32300/docker-proxy
[root@docker01 ~]# curl 10.0.0.100:32769
http://www.nmtui.com
手动将容器保留为镜像
本次是基于 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
46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c
Dockerfile 主动构建 docker 镜像
官网构建 dockerffile 文件参考
https://github.com/CentOS/Cen…
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@docker01 base]# cd /opt/base
# 创立 Dcokerfile 文件,留神大小写
[root@docker01 base]# vim Dockerfile
FROM centos:6.8
RUN yum install openssh-server -y
RUN echo "root:123456" |chpasswd
RUN /etc/init.d/sshd start
CMD ["/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
应用 Dcokerfile 装置 kodexplorer
Dockerfile 文件内容
FROM centos:6.8
RUN 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.zip
RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip
RUN chown -R apache.apache .
CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]
更多的 Dockerfile 能够参考官网办法。
Docker 中的镜像分层
参考文档:
http://www.maiziedu.com/wiki/…
Docker 反对通过扩大现有镜像,创立新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中装置和配置须要的软件构建进去的。
从上图能够看到,新镜像是从 base 镜像一层一层叠加生成的。每装置一个软件,就在现有镜像的根底上减少一层。
Docker 镜像为什么分层
镜像分层最大的一个益处就是共享资源。
比如说有多个镜像都从雷同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保留一份 base 镜像;同时内存中也只需加载一份 base 镜像,就能够为所有容器服务了。而且镜像的每一层都能够被共享。
如果多个容器共享一份根底镜像,当某个容器批改了根底镜像的内容,比方 /etc 下的文件,这时其余容器的 /etc 是不会被批改的,批改只会被限度在单个容器内。这就是容器 Copy-on-Write 个性。
可写的容器层
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改变 – 无论增加、删除、还是批改文件都只会产生在容器层中。只有 容器层是可写的,容器层上面的所有镜像层都是只读的。
容器层的细节阐明
镜像层数量可能会很多,所有镜像层会联结在一起组成一个对立的文件系统。如果不同层中有一个雷同门路的文件,比方 /a,下层的 /a 会笼罩上层的 /a,也就是说用户只能拜访到下层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。
文件操作的
只有当须要批改时才复制一份数据,这种个性被称作 Copy-on-Write。可见,容器层保留的是镜像变动的局部,不会对镜像自身进行任何批改。
这样就解释了咱们后面提出的问题:容器层记录对镜像的批改,所有镜像层都是只读的,不会被容器批改,所以镜像能够被多个容器共享。
应用 docker 运行 zabbix-server
容器间的互联
在运行 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.4
3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955
^[[A[root@docker01 docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f1f7fc55472 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 web
PING web (172.17.0.2): 56 data bytes
64 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 loss
round-trip min/avg/max = 0.058/0.058/0.058 ms
启动 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
对于 zabbix API
对于 zabbix API 能够参考官网文档:
https://www.zabbix.com/docume…
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}
–
docker 仓库(registry)
创立一个一般仓库
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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6-ssh latest 3c2b1e57a0f5 18 hours ago 393MB
httpd 2.4 2e202f453940 6 days ago 179MB
10.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
带 basic 认证的仓库
1、装置加密工具
[root@docker01 clsn]# yum install httpd-tools -y
2、设置认证明码
mkdir /opt/registry-var/auth/ -p
htpasswd -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:5000
Username: clsn
Password: 123456
Login Succeeded
# 推送镜像到仓库
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox
The push refers to repository [10.0.0.100:5000/clsn/busybox]
4febd3792a1f: Pushed
1.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 镜像仓库搭建实现
docker-compose 编排工具
装置 docker-compose
装置 docker-compose
# 下载 pip 软件
yum install -y python2-pip
# 下载 docker-compose
pip install docker-compose
国内开启 pip 下载减速:
http://mirrors.aliyun.com/hel…
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@docker01 my_wordpress]# vim docker-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@docker01 my_wordpress]# docker-compose up
#启动办法:docker-compose up
#后盾启动办法:docker-compose up -d
4、浏览器上拜访 http://10.0.0.100:8000
进行 wordpress 的装置即可
haproxy 代理后端 docker 容器
1、批改编排脚本
[root@docker01 my_wordpress]# cat docker-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
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 ... done
Creating mywordpress_wordpress_2 ... done
3、装置 haproxy
[root@docker01 ~]# yum install haproxy -y
4、批改 haproxy 配置文件
对于配置文件的具体阐明,参考:
https://www.cnblogs.com/MacoL…
[root@docker01 ~]#cp /etc/haproxy/haproxy.cfg{,.bak}
[root@docker01 ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats level admin #反对命令行管制
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats
mode http
bind 0.0.0.0:8888
stats enable
stats uri /haproxy-status
stats auth admin:123456
frontend frontend_www_example_com
bind 10.0.0.100:8000
mode http
option httplog
log global
default_backend backend_www_example_com
backend backend_www_example_com
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP/1.0
balance roundrobin
server web-node1 10.0.0.100:32768 check inter 2000 rise 30 fall 15
server web-node2 10.0.0.100:32769 check inter 2000 rise 30 fall 15
5、启动 haproxy
systemctl start haproxy
systemctl enable haproxy
6、应用浏览器拜访 hapeoxy 监听的 8000 端口能够看到负载的状况
7、应用浏览器拜访
http://10.0.0.100:8888/haproxy-status
能够看到后端节点的监控情况,
装置 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>
重启 docker 服务,容器全副退出的解决办法
在启动是指定主动重启
docker run --restart=always
批改 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
Docker 网络类型
docker 的网络类型
Bridge 默认 docker 网络隔离基于网络命名空间,在物理机上创立 docker 容器时会为每一个 docker 容器调配网络命名空间,并且把容器 IP 桥接到物理机的虚构网桥上。
不为容器配置网络性能
此模式下创立容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全副须要本人去配置。
[root@docker01 ~]# docker run -it --network none busybox:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
与其余容器共享网络配置(Container)
此模式和 host 模式很相似,只是此模式创立容器共享的是其余容器的 IP 和端口而不是物理机,此模式容器本身是不会配置网络和端口,创立此模式容器进去后,你会发现里边的 IP 是你所指定的那个容器 IP 并且端口也是共享的,而且其它还是相互隔离的,如过程等。
[root@docker01 ~]# docker run -it --network container:mywordpress_db_1 busybox:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
105: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
应用宿主机网络
此模式创立的容器没有本人独立的网络命名空间,是和物理机共享一个 Network Namespace,并且共享物理机的所有端口与 IP,并且这个模式认为是不平安的。
[root@docker01 ~]# docker run -it --network host busybox:latest /bin/sh
查看网络列表
[root@docker01 ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
b15e8a720d3b bridge bridge local
345d65b4c2a0 host host local
bc5e2a32bb55 mywordpress_default bridge local
ebf76eea91bb none null local
用 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.zip
unzip master.zip
cp 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-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.100
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=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 1
PING 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.1
pipework br0 testduliip01 172.16.146.112/24@172.16.146.1
Dcoker 跨主机通信之 overlay 能够参考:
cnblogs.com/CloudMan6/p/7270551.html
Docker 跨主机通信之 macvlan
创立网络
[root@docker01 ~]# docker network create --driver macvlan --subnet 10.1.0.0/24 --gateway 10.1.0.254 -o parent=eth0 macvlan_1
33a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca
设置网卡为混淆模式
ip link set eth0 promisc on
创立应用 macvlan 网络容器
[root@docker02 ~]# docker run -it --network macvlan_1 --ip=10.1.0.222 busybox /b
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.tgz
tar xf harbor-offline-installer-v1.3.0.tgz
2、批改主机及 web 界面明码
[root@docker01 harbor]# vim harbor.cfg
···
hostname = 10.0.0.100
harbor_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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 5b0d59026729 8 days ago 1.15MB
10.0.0.100/clsn/centos6.8 1.0 6704d778b3ba 2 months ago 195MB
centos 6.8 6704d778b3ba 2 months ago 195MB
[root@docker02 ~]# docker login 10.0.0.100
Username: admin
Password:
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 界面里查看
应用容器的倡议
1. 不要以拆分形式进行应用程序公布
2. 不要创立大型镜像
3. 不要在单个容器中运行多个过程
4. 不要再镜像内保留凭证,不要依赖 IP 地址
5. 以非 root 用户运行过程
6. 不要应用“最新”标签
7. 不要利用运行中的容器创立镜像
8. 不要应用单层镜像
9. 不要将数据寄存在容器内
对于 Docker 容器的监控
容器的根本信息
- 包含容器的数量、ID、名称、镜像、启动命令、端口等信息
容器的运行状态
- 统计各状态的容器的数量,包含运行中、暂停、进行及异样退出
容器的用量信息
- 统计容器的 CPU 使用率、内存使用量、块设施 I / O 使用量、网络应用状况等资源的应用状况
参考文献
- 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
作者:惨绿少年
cnblogs.com/clsn/p/8410309.html