原文:/clsn/p/8410309.html
1容器简介1.1什么是Linux容器Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。
容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

更加详细地来说,请您假定您在开发一个应用。您使用的是一台笔记本电脑,而且您的开发环境具有特定的配置。其他开发人员身处的环境配置可能稍有不同。您正在开发的应用依赖于您当前的配置,还要依赖于某些特定文件。
与此同时,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。
您希望尽可能多在本地模拟这些环境,而不产生重新创建服务器环境的开销。
因此,您要如何确保应用能够在这些环境中运行和通过质量检测,并且在部署过程中不出现令人头疼的问题,也无需重新编写代码和进行故障修复?答案就是使用容器。
容器可以确保您的应用拥有必需的配置和文件,使得这些应用能够在从开发到测试、再到生产的整个流程中顺利运行,而不出现任何不良问题。这样可以避免危机,做到皆大欢喜。
虽然这只是简化的示例,但在需要很高的可移植性、可配置性和隔离的情况下,我们可以利用Linux容器通过很多方式解决难题。
无论基础架构是在企业内部还是在云端,或者混合使用两者,容器都能满足您的需求。
1.2容器不就是虚拟化吗是,但也不竟然。我们用一种简单方式来思考一下:
虚拟化使得许多操作系统可同时在单个系统上运行。
容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。

图-普通虚拟化技术和Docker的对比
这意味着什么?首先,让多个操作系统在单个虚拟机监控程序上运行以实现虚拟化,并不能达成和使用容器同等的轻量级效果。
事实上,在仅拥有容量有限的有限资源时,您需要能够可以进行密集部署的轻量级应用。
Linux容器可从单个操作系统运行,在所有容器中共享该操作系统,因此应用和服务能够保持轻量级,并行快速运行。
1.3容器发展简史
我们现在称为容器技术的概念最初出现在2000年,当时称为FreeBSDjail,这种技术可将FreeBSD系统分区为多个子系统(也称为Jail)。
Jail是作为安全环境而开发的,系统管理员可与企业内部或外部的多个用户共享这些Jail。
Jail的目的是让进程在经过修改的chroot环境中创建,而不会脱离和影响整个系统—在chroot环境中,对文件系统、网络和用户的访问都实现了虚拟化。
尽管Jail在实施方面存在局限性,但最终人们找到了脱离这种隔离环境的方法。
但这个概念非常有吸引力。
2001年,通过JacquesGélinas的VServer项目,隔离环境的实施进入了Linux领域。
正如Gélinas所说,这项工作的目的是“在高度独立且安全的单一环境中运行多个通用Linux服务器[sic]。”
在完成了这项针对Linux中多个受控制用户空间的基础性工作后,Linux容器开始逐渐成形并最终发展成了现在的模样。
2什么是Docker?“Docker”一词指代多种事物,包括开源社区项目、开源项目使用的工具、主导支持此类项目的公司DockerInc.以及该公司官方支持的工具。技术产品和公司使用同一名称,的确让人有点困惑。
我们来简单说明一下:
🎍IT软件中所说的“Docker”,是指容器化技术,用于支持创建和使用Linux容器。
🎍开源Docker社区致力于改进这类技术,并免费提供给所有用户,使之获益。
🎍DockerInc.公司凭借Docker社区产品起家,它主要负责提升社区版本的安全性,并将改进后的版本与更广泛的技术社区分享。此外,它还专门对这些技术产品进行完善和安全固化,以服务于企业客户。
借助Docker,您可将容器当做重量轻、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境。
2.1Docker如何工作?Docker技术使用Linux内核和内核功能(例如Cgroups和namespaces)来分隔进程,以便各进程相互独立运行。
这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用程序,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。
容器工具(包括Docker)可提供基于镜像的部署模式。这使得它能够轻松跨多种环境,与其依赖程序共享应用或服务组。Docker还可在这一容器环境中自动部署应用程序(或者合并多种流程,以构建单个应用程序)。
此外,由于这些工具基于Linux容器构建,使得Docker既易于使用,又别具一格——它可为用户提供前所未有的高度应用程访问权限、快速部署以及版本控制和分发能力。
2.2Docker技术是否与传统的Linux容器相同?否。Docker技术最初是基于LXC技术构建(大多数人都会将这一技术与“传统的”Linux容器联系在一起),但后来它逐渐摆脱了对这种技术的依赖。
就轻量级虚拟化这一功能来看,LXC非常有用,但它无法提供出色的开发人员或用户体验。除了运行容器之外,Docker技术还具备其他多项功能,包括简化用于构建容器、传输镜像以及控制镜像版本的流程。

传统的Linux容器使用init系统来管理多种进程。这意味着,所有应用程序都作为一个整体运行。与此相反,Docker技术鼓励应用程序各自独立运行其进程,并提供相应工具以实现这一功能。这种精细化运作模式自有其优势。
2.3docker的目标docker的主要目标是"Build,ShipandRunanyApp,Angwhere",构建,运输,处处运行
构建:做一个docker镜像
运输:dockerpull
运行:启动一个容器
每一个容器,他都有自己的文件系统rootfs.
3安装Docker环境说明
cat/etc/redhat-release
(Core)
[root@docker01~]hostname-I
10.0.0.100172.16.1.100
[root@docker02~]'/etc//
yuminstalldocker-ce-y
修改在docker01配置:
ps-ef检查进行,是否启动
在docker02测试
[root@docker02~]dockerversion
Client:
Version:17.12.0-ce
APIversion:1.35
Goversion:
Gitcommit:c97c6d6
Built:WedDec2720:10:142017
OS/Arch:linux/amd64
Server:
Engine:
Version:17.12.0-ce
APIversion:1.35()
Goversion:
Gitcommit:c97c6d6
Built:WedDec2720:12:462017
OS/Arch:linux/amd64
Experimental:false
配置docker镜像加速
vi/etc/docker/3.2启动第一个容器
{
"registry-mirrors":[""]
}
[root@docker01~]容器启动后,在浏览器进行访问测试
参数说明

3.3Docker镜像生命周期

4docker镜像相关操作
4.1搜索官方仓库镜像[root@docker01~]dockerpullcentos
Usingdefaulttag:latest
latest:Pullingfromlibrary/centos
af4b0a2388c6:/73.67MB
查看当前主机镜像列表
[root@docker01~]dockerimagelist
REPOSITORYTAGIMAGEIDCREATEDSIZE
centoslatestff426288ea903weeksago207MB
nginxlatest3f8a4339aadd5weeksago108MB
4.4删除镜像
4.5导入镜像[root@docker01~]dockerimagelist
REPOSITORYTAGIMAGEIDCREATEDSIZE
nginxlatest3f8a4339aadd5weeksago108MB
4.6查看镜像的详细信息[root@docker01~]dockerimagelist
REPOSITORYTAGIMAGEIDCREATEDSIZE
centoslatestff426288ea903weeksago207MB
nginxlatest3f8a4339aadd5weeksago108MB
[root@docker01~]dockerrunnginx
创建容器,两步走(不常用)
[root@docker01~]dockerstartstupefied_nobel
stupefied_nobel
快速启动容器方法
[root@docker01~]dockercontainerls
或
[root@docker01~]dockercontainerinspect容器名称/id
查看你所有容器(包括未运行的)
[root@docker01~]dockerstop容器名称/id5.3删除所有容器
或
[root@docker01~]dockerrun-itdockerrun-itnginx:latest/bin/bash
root@79241093859e:/dockerrun-itcentos:latest
[root@1bf0f43c4d2f/]dockerattach1bf0f43c4d2f
[root@1bf0f43c4d2f/]dockerattach1bf0f43c4d2f
[root@1bf0f43c4d2f/]dockerexec-itclsn1/bin/bash
[root@b20fa75b4b40/]ps-ef
UIDPIDPPIDCSTIMETTYTIMECMD
root10016:11pts/000:00:00/bin/bash
root130016:14pts/100:00:00/bin/bash
root2613016:14pts/100:00:00ps-ef5.4启动时进行端口映射[root@docker01~]-f强制删除-p参数端口映射
6Docker数据卷的管理6.1挂载时创建卷[root@docker01~]需要镜像支持挂载卷
6.2创建卷后挂载[root@docker01~]echo""/data/
[root@docker01~]dockerrun-d-p8080:80-v/data:/usr/share/nginx/htmlnginx:latest
351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42
[root@docker01~]dockervolumels
DRIVERVOLUMENAME创建一个卷
[root@docker01~]dockervolumels
DRIVERVOLUMENAME
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~]宿主机测试
[root@docker01~]:9000设置卷
[root@docker01~]netstat-lntup
ActiveInternetconnections(onlyservers)
ProtoRecv-QS-QLocalAddressForeignAddressStatePID/Programname
:220.0.0.0:*LISTEN1400/sshd
: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~]dockerpullcentos:6.8
[root@docker01~]在容器种安装sshd服务,并修改系统密码
[root@582051b2b92b~]echo"root:123456"|chpasswd
[root@582051b2b92b~]dockercommitbrave_mcclintockcentos6-ssh
使用新的镜像启动容器[root@docker01~]yuminstallhttpd-y编写启动脚本脚本
[root@5b8161fda2a9/]!/bin/bash
/etc//httpdstart
/usr/sbin/sshd-D
[root@5b8161fda2a9/]注意执行权限再次提交为新的镜像
[root@docker01~]dockerrun-d-p1222:22-p80:80centos6-httpd/
46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c
7Dockerfile自动构建docker镜像官方构建dockerffile文件参考
7.1Dockerfile指令集dockerfile主要组成部分:
基础镜像信息FROMcentos:6.8
制作镜像操作指令RUNyuminsatllopenssh-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文件
cd/opt/base
vimDockerfile
FROMcentos:6.8
RUNyuminstallopenssh-server-y
RUNecho"root:123456"|chpasswd
RUN/etc//sshdstart
CMD["/usr/sbin/sshd","-D"]构建docker镜像
7.3使用Dcokerfile安装kodexplorer[root@docker01base]dockerrun-d-p2022:22
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7aDockerfile文件内容
FROMcentos:6.8
RUNyuminstallwgetunzipphpphp-gdphp-mbstring-yyumcleanall
创建一个nginx容器
dockerrun-d-p80:80nginx
在容器中访问nginx容器可以ping通
pingweb01
命令执行过程10.2带basic认证的仓库dockerrun-dhttpd:2.4
3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955
^[[A[root@docker01dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
3f1f7fc55472httpd:2.4"httpd-foreground"6secondsagoUp5seconds80/tcpdetermined_clarke
dockerpullbusybox
dockerrun-it--linkdetermined_clarke:webbusybox:latest/bin/sh
/使用新的容器访问最初的web容器
/获取token
[root@docker02~]cat/etc/docker/
{
"registry-mirrors":[""],
"insecure-registries":["10.0.0.100:5000"]
}重启docker让修改生效
[root@docker01~]dockertagbusybox::5000/clsn/busybox:1.0
[root@docker01~]:5000/clsn/busybox1、安装加密工具
[root@docker01clsn]登陆用户
[root@docker01~]推送镜像到仓库
[root@docker01~]认证文件的保存位置
[root@docker01~]下载pip软件
yuminstall-ypython2-pip
mkdir/opt/my_wordpress/
[root@docker01~]
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:
deps_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:wordpress3、启动
[root@docker01my_wordpress]启动方法:docker-composeup
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:
deps_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:wordpress2、同时启动两台wordpress
[root@docker01my_wordpress]yuminstallhaproxy-y4、修改haproxy配置文件
关于配置文件的详细说明,参考:
[root@docker01~]vim/etc/haproxy/
global
chroot/var/lib/haproxy
pidfile/var/run/
maxconn4000
userhaproxy
grouphaproxy
daemon
statssocket/var/lib/haproxy/statsleveladminecho"help"|socatstdio/var/lib/haproxy/stats3、下线后端节点
echo"disableserverback_www_example_com/web-node2"|socatstdio/var/lib/haproxy/stats
4、上线后端节点
echo"enableserverback_www_example_com/web-node3"|socatstdio/var/lib/haproxy/stats
5、编写php测试页,放到/data/web_data下,在浏览器中访问可以查看当前的节点
[root@docker01web_data]添加上下面这行
"live-restore":truedockerserver配置文件/etc/docker/参考
[root@docker02~]修改数据的存放目录到/opt/mydocker/,原/var/lib/docker/
"insecure-registries":["10.0.0.100:5000"],
"live-restore":true
}重启生效,只对在此之后启动的容器生效
13.5查看网络列表[root@docker01~]dockerrun-it--networknonebusybox:latest/bin/sh
/dockerrun-it--networkcontainer:mywordpress_db_1busybox:latest/bin/sh
/dockerrun-it--networkhostbusybox:latest/bin/sh[root@docker01~]修改eth0配置,让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
/etc//networkrestart3、运行一个容器镜像测试:
pipeworkbr0$(dockerrun-d-it-p6880:80--namehttpd_pwhttpd)10.0.0.220/24@10.0.0.254
在其他主机上测试端口及连通性
[root@docker01~]
(10.0.0.220)56(84)bytesofdata.
64:icmp_seq=1ttl=64time=0.043ms4、再运行一个容器,设置网路类型为none:
pipeworkbr0$(dockerrun-d-it--net=none--nametesthttpd:2.4)10.0.0.221/24@10.0.0.254
进行访问测试
[root@docker01~]/24--=eth0macvlan_1
33a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca设置网卡为混杂模式
iplinkseteth0promiscon
创建使用macvlan网络容器
[root@docker02~]pwd
/opt/harbor
[root@docker01harbor]
···
hostname=10.0.0.100
harbor_admin_password=Harbor12345
···3、执行安装脚本
[root@docker01harbor]dockertagcentos:6.810.0.0.100/clsn/:1.0
[root@docker02~]dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
10.0.0.100/clsn/
[root@docker02~]/clsn/
Thepushreferstorepository[10.0.0.100/clsn/]
e00c9229b481:/194.5MB6、在web界面里查看
14.1使用容器的建议
1.不要以拆分方式进行应用程序发布
2.不要创建大型镜像
3.不要在单个容器中运行多个进程
4.不要再镜像内保存凭证,不要依赖IP地址
5.以非root用户运行进程
6.不要使用“最新”标签
7.不要利用运行中的容器创建镜像
8.不要使用单层镜像
9.不要将数据存放在容器内
14.2关于Docker容器的监控容器的基本信息包括容器的数量、ID、名称、镜像、启动命令、端口等信息
容器的运行状态
统计各状态的容器的数量,包括运行中、暂停、停止及异常退出
容器的用量信息
统计容器的CPU使用率、内存使用量、块设备I/O使用量、网络使用情况等资源的使用情况
15参考文献/zh/topics/containers/whats-a-linux-container
/zh/topics/containers/what-is-docker
/dihaifeng/1713512
/Bourbon-tian/p/6867796.html
/CloudMan6/p/6806193.html






