docker从入门到精通,docker从入门到实战
chanong
|作者:悲惨绿孩
博客园文章地址:cnblogs.com/clsn/p/8410309.html
容器概述什么是Linux 容器? Linux 容器是一组与系统其余部分隔离的文件,从单独的映像运行,并包含支持映像提供的进程所需的所有文件。这就是过程。
容器提供的映像包含应用程序的所有依赖项,使它们从开发到测试再到生产都可移植且一致。
为了进一步详细说明,假设您正在开发一个应用程序。您使用的是笔记本电脑,并且您的开发环境具有特定的配置。其他开发人员的环境配置可能略有不同。您正在开发的应用程序取决于您当前的配置,还取决于某些文件。
同时,企业还拥有标准化的测试和生产环境,有自己的配置和一套支持文件。
我想在本地模拟尽可能多的这些环境,而不会产生重新创建服务器环境的开销。
那么,如何确保您的应用程序在这些环境中运行,通过质量检查,并且可以在没有任何麻烦、重新编码或错误修复的情况下进行部署呢?答案是使用容器。
容器确保您的应用程序拥有从开发到测试再到生产顺利运行所需的配置和文件。通过这样做,你可以避免危机并让每个人都高兴。
尽管这只是一个简化的示例,但Linux 容器可以通过多种方式用于解决需要高水平可移植性、可组合性和隔离性的难题。
无论您的基础设施是在本地、在云中还是两者的混合,容器都可以满足您的需求。
容器不就是虚拟化吗?是的,但不完全是。让我们简单地思考一下。
虚拟化允许多个操作系统在一个系统上同时运行。
容器共享相同的操作系统内核,并且可以将应用程序进程与系统的其余部分隔离。
图-普通虚拟化技术与Docker 的比较
这意味着什么?首先,在单个虚拟机管理程序上运行多个操作系统来实现虚拟化并不能提供与使用容器相同的轻量级优势。
事实上,当你的容量和资源有限时,你需要可以密集部署的轻量级应用程序。
Linux 容器在所有容器之间共享的单个操作系统上运行,因此应用程序和服务是轻量级的,并且可以快速并行运行。
容器发展简史
现在所谓的容器技术的概念首次出现于2000 年的FreeBSD 监狱中。这是一种将FreeBSD 系统划分为多个子系统(也称为监狱)的技术。
Jail 被开发为一个安全的环境,系统管理员可以与企业内外的多个用户共享。
Jail 的目的是允许在修改后的chroot 环境中创建进程,而不会中断和影响整个系统。 chroot 环境虚拟化文件系统、网络和用户访问。
监狱的实施有其局限性,但最终人们找到了摆脱这种孤立的方法。
然而,这个概念非常吸引人。
2001 年,Jacques Glinas 的VServer 项目将隔离环境实现引入了Linux 世界。
Glinas 表示,这项工作的目标是“在一个独立且安全的环境中运行多个通用Linux 服务器[原文如此]”。
在Linux 的多个受控用户空间的基础工作完成后,Linux 容器开始成形并最终演变成今天的样子。
什么是Docker?术语“Docker”指的是开源社区项目、开源项目中使用的工具、领导该项目支持的公司(称为Docker Inc.)以及该公司正式支持的工具。它指的是各种事情,例如。当技术产品和公司同名时,会有点令人困惑。
我简单解释一下:
在IT软件中,“Docker”指的是一种支持Linux容器创建和使用的容器化技术。
Docker 社区致力于改进此类技术,并使其免费供所有用户从中受益。
Docker Inc. 从Docker Community 产品开始,该产品提高了社区版本的安全性,并与更广泛的技术社区共享改进的版本。此外,我们专注于完善和安全巩固这些技术产品,以服务我们的企业客户。
Docker 允许您使用容器作为轻量级、模块化的虚拟机。它还使您能够灵活地高效地创建、部署、复制容器以及将容器从一种环境迁移到另一种环境。
Docker 是如何工作的? Docker 技术利用Linux 内核以及Cgroup 和命名空间等内核功能来隔离进程并允许它们彼此独立运行。
这种独立性就是容器的用途;容器允许多个进程和多个应用程序独立,同时保持每个独立系统的安全性并更充分地发挥基础设施的作用。您可以通过以下方式运行它:
Docker等容器工具提供了基于镜像的部署模型。这使得应用程序或服务组可以在多个环境(包括其依赖程序)之间轻松共享。 Docker 还可以在该容器环境中自动部署应用程序(或组合多个进程来构建单个应用程序)。
此外,由于这些工具构建在Linux 容器之上,Docker 易于使用、独一无二,并为用户提供了前所未有的应用程序访问、快速部署、版本控制和分发功能。
Docker 技术和传统的Linux 容器一样吗? Docker 技术最初构建于LXC 技术(大多数人将其与“传统”Linux 容器联系在一起),但后来摆脱了这种依赖。
LXC 作为轻量级虚拟化功能非常有用,但它并没有为开发人员或用户提供出色的体验。除了运行容器之外,Docker技术还提供了许多其他功能,例如简化容器构建过程、传输镜像、控制镜像版本等。
传统的Linux容器使用init系统来管理各种进程。这意味着所有应用程序作为一个整体运行。相比之下,Docker技术鼓励并为应用程序独立运行自己的进程提供工具。这种成熟的运营模式有其自身的优势。
Docker 的主要目标是“在任何地方构建、发布和运行任何应用程序。”您可以在任何地方构建、发布和运行。
Build:创建docker镜像Transport:docker pull run:启动容器
每个容器都有自己的文件系统rootfs。
Docker环境安装步骤
#需要两个安装点[root@docker01~]#cat /etc/redhat-releaseCentOSLinuxrelease7.2.1511(Core)[root@docker01~]#uname-r3.10.0-327.el7.x86_64[root@docker01~ ]#主机名-I10.0.0.100172.16.1.100[root@docker02~]#主机名-I10.0.0.101172.16.1.101
在两个节点上操作
wget -O/etc/yum.repos.d/docker-ce.repohttp://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.reused-i's#download.docker.com#mirrors.ustc。 edu.cn/docker-ce#g'/etc/yum.repos.d/docker-ce.repoyuminstalldocker-ce-y
更改docker01 配置。
#修改启动文件,监听远程端口vim /usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd-Hunix:///var/run/docker.sock-Htcp://10.0.0.100:2375 检查是否systemctldaemon-reloadsystemctlenabledocker .servicesystemctlrestartdocker.service#ps-ef 启动
使用docker02 测试
[root@docker02~]#docker-H10.0.0.100infoContainers:0Running:0Paused:0Stopped:0Images:0ServerVersion:17.12.0-ceStorageDriver:devicemapperDocker基本命令操作参考docker相关信息
[root@docker01~]#dockerversionClient:Version:17.12.0-ceAPIversion:1.35Goversion:go1.9.2Gitcommit:c97c6d6Built:WedDec2720:10:142017OS/Arch:linux/amd 6 4 Server:Engine:Version:17.12.0-ceAPIversion:1.35(最低版本1.12)Goversion:go1.9.2Gitcommit:c97c6d6Built:WedDec2720:12:462017OS/Arch3336 0 lin ux/amd64实验:假
配置Docker镜像加速
vi /etc/docker/daemon.json{'registry-mirrors':['http://registry.docker-cn.com']} 启动第一个容器[root@docker01~]#dockerrun-d-p80:80nginxUnabletofindimage 'nginx:latest' 本地latest:Pullingfromlibrary/nginxe7bb5 22d92ff: 拉取完成6edc05228666: 拉取完成cd866a17e81f: 拉取完成摘要:sha256:285b49d42c703fdf257d1e2422765c4ba9 d3e37768d6ea8 3d7fe2043d ad6e63dStatus:Downloadednewerimagefornginx:latest8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d#启动容器后在浏览器中运行访问测试我将
参数说明
Docker 镜像生命周期
Docker镜像相关操作搜索官方仓库镜像[root@docker01~]#dockersearchcentosNAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDcentosTheofficialbuildofCentOS.3992[OK]ansible/centos7-ansibleAnsibleonCentos7105[OK]
列表说明
获取Image 根据镜像名称拉取镜像
[root@docker01~]#dockerpullcentosUsingdefaulttag:latestlatest:Pullingfromlibrary/centosaf4b0a2388c6:下载34.65MB/73.67MB
显示当前主机镜像列表
[root@docker01~]#dockerimagelistREPOSITORYTAGIMAGEIDCREATEDSIZEcentoslatestff426288ea903weeksago207MBnginxlatest3f8a4339aadd5weeksago108MB
如何获取第三方图片
dockerpullindex.tenxcloud.com/tenxcloud/httpd 导出镜像[root@docker01~]#dockerimagelistREPOSITORYTAGIMAGEIDCREATEDSIZEcentoslatestff426288ea903weeksago207MBnginxlatest3f8a4339aadd5weeksago108MB#Export[root@docker01~]#dockerimagesavecentosdocker-centos.tar.g z 删除镜像[root@docker01 ~]#dockerimagermcentos:latest[root@docker01~ ] #dockerimagelistREPOSITORYTAGIMAGEIDCREATEDSIZEnginxlatest3f8a4339aadd5weeksago108MB 导入镜像[root@docker01~]#dockerimageload-idocker-centos.tar.gze15afa4858b6:Loadinglayer215.8MB/215.8MBLoadedimage:centos3336 0latest[root @docker01~] ]#dockerimagelistREPOSITORYTAGIMAGEIDCREATEDSIZEcentoslatestff426288ea903weeksago207MBnginxlatest3f8a4339aadd5weeksago108MB 显示镜像详细信息[root@docker01~]#dockerimageinspectcentos 容器日常生活管理启动/停止容器是运行容器的最简单方法
[root@docker01~]#dockerrunnginx 分两步创建容器(不常用)
[root@docker01~]#dockercreatecentos:latest/bin/bashbb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204[root@docker01~]#dockerstartstupefied_nobelstupefied_nobel快速启动容器方法
[root@docker01~]#dockerruncentos:latest/usr/bin/sleep20;容器内的第一个进程必须始终运行。否则,容器将处于终止状态。
显示正在运行的容器
[root@docker01~]#dockercontainerls 或[root@docker01~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES8708e93fd767nginx'nginx-g'daemonof…'6 秒sagoUp4 秒80/tcpkeen_lewin
显示内部容器详细信息/IP
[root@docker01~]#dockercontainerinspect 容器名称/ID
显示所有容器(甚至是那些未运行的容器)
[root@docker01~]#dockerps-aCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES8708e93fd767nginx'nginx-g'daemonof.'4 分钟西米完成(0) 59 秒sagokeen_lewinf9f3e6af7508nginx'nginx-g'daemonof.'5 分钟西米完成(0) 5 分钟sagooptim istic_hai bt8 d8 f81da12b5nginx' nginx -g'daemonof.' 结束于3 小时前(0) 3 小时前lucid_bohrStop 容器
输入[root@docker01~]#dockerstop 容器名称/id 或[root@docker01~]#dockercontainerkill 容器名称/id 容器方法,并在启动时输入方法
[root@docker01~]# docker run -it #参数:-it 交互终端[root@docker01~]#dockerrun-itnginx:latest/bin/bashroot@79241093859e:/#
退出/离开容器
Ctrl+pctrl+q
启动后如何进入容器
启动码头工人
[root@docker01~]#dockerrun-itcentos:latest[root@1bf0f43c4d2f/]#ps-efUIDPIDPPIDCSTIMETTYTIMECMDroot10015:47pts/000:00:00/bin/bashroot131015:47pts/000:00 33 3 6000ps-efattach 进入容器并使用pts/0。这允许用户通过该方法进入容器。这是同样的操作。
[root@docker01~]#dockerattach1bf0f43c4d2f[root@1bf0f43c4d2f/]#ps-efUIPIDPPIDCSTIMETIMETIMECMDroot10015:47pts/000:00:00/bin/bashroot141015:49pts/000: 00333 6000ps-ef
使用自身名称--name 启动容器
[root@docker01~]#dockerattach1bf0f43c4d2f[root@1bf0f43c4d2f/]#ps-efUIPIDPPIDCSTIMETIMETIMECMDroot10015:47pts/000:00:00/bin/bashroot141015:49pts/000: 00333 6000ps-efexec 进入容器方法(推荐)
[root@docker01~]#dockerexec-itclsn1/bin/bash[root@b20fa75b4b40/]#重新分配终端[root@b20fa75b4b40/]#ps-efUIDPIDPPIDCSTIMETTYTIMECMDroot10016:11pts/000:00:00/bin/bashroot130016 :1 4pts/100:00:00/bin/bashroot2613016:14pts/100:00:00ps - ef删除所有容器[root@docker01~]#dockerrm-f`dockerps-a-q`#-f 启动时强制删除端口映射-p 参数端口映射
[root@docker01~]#dockerrun-d-p8888:80nginx:latest287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9 指定的映射方式不同
随机映射
dockerrun -P (big P)# 当镜像需要支持Docker 数据卷的管理挂载时创建卷挂载卷。
[root@docker01~]#dockerrun-d-p80:80-v/data:/usr/share/nginx/htmlnginx:latest079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
容器: 中的站点目录/usr/share/nginx/html
在主机上写入并显示数据
[root@docker01~]#echo'http://www.nmtui.com'/data/index.html[root@docker01~]#curl10.0.0.100http://www.nmtui.com 设置共享卷并使用相同的卷创建新容器
[root@docker01~]#dockerrun-d-p8080:80-v/data:/usr/share/nginx/htmlnginx:latest351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42[root@do cker 01~] #curl10.0.0.100:8080http://www.nmtui.com 显示音量列表
[root@docker01~]#dockervolumesDRIVERVOLUMENAME 创建卷并挂载创建卷
[root@docker01~]#dockervolumecreatef3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521[root@docker01~]#dockervolumesDRIVERVOLUMENAMElocalf3b95f7bd17da220e63d4e708 50b8d7 fb3e20f8ad02043423a39fdd072b83521
请指定卷名称
[root@docker01~]#dockervolumesDRIVERVOLUMENAMElocalclsnlocalf3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
显示卷路径
[root@docker01~]#dockervolumeinspectclsn[{'CreatedAt':'2018-02-01T00:39:25+08:00','驱动程序':'本地','标签':{},'安装点':'/var/lib/docker /volumes/clsn/_data','Name':'clsn','Options':{},'Scope':'local'}] 使用卷创建
[root@docker01~]#dockerrun-d-p9000:80-vclsn:/usr/share/nginx/htmlnginx:latest1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503#主机测试[root@docker01~]#e cho'blog.nmtui.com'/var/lib/docker/volumes/clsn /_data/index.html[root@docker01~]#curl10.0.0.100:9000blog.nmtui.com设置音量
[root@docker01~]#dockerrun-d-P--volumes-from079786c1e297nginx:latestb54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb 显示使用的端口
[root@docker01~]#netstat-lntupActiveInternetconnections (仅服务器)ProtoRecv-QSend-QLocalAddressForeignAddressStatePID/程序名称tcp000.0.0.0:220.0.0.0:*LISTEN1400/sshdtcp0010.0.0.100:23750.0 . 0.0333 60*LISTEN26218/dockerdtcp600:9000:*LISTEN32015/docker-proxytcp600:8080:* LISTEN318 5 3/docker -proxytcp600:80:*LISTEN31752/docker-proxytcp600:22:*LISTEN1400/sshdtcp60 0:333 60 33 36032769:*LISTEN32300/docker-proxy[root@docker01~]#curl10.0.0.100:32769http://www.nmtui.com 手动将容器另存为镜像。这次将在官方Centos 6.8 镜像上基于Docker 创建。
官方镜像列表:
http://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-D5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094
在容器中安装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-httpdsha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1
启动镜像并进行端口映射。在浏览器中测试访问
[root@docker01~]#dockerrun-d-p1222:22-p80:80centos6-httpd/init.sh46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c








