工控智汇

工控智汇

Docker 入门看这一篇就够了

admin 21 52

原文:/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/
{
"registry-mirrors":[""]
}
3.2启动第一个容器
[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删除镜像

[root@docker01~]dockerimagelist
REPOSITORYTAGIMAGEIDCREATEDSIZE
nginxlatest3f8a4339aadd5weeksago108MB

4.5导入镜像
[root@docker01~]dockerimagelist
REPOSITORYTAGIMAGEIDCREATEDSIZE
centoslatestff426288ea903weeksago207MB
nginxlatest3f8a4339aadd5weeksago108MB

4.6查看镜像的详细信息

[root@docker01~]dockerrunnginx


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

[root@docker01~]dockerstartstupefied_nobel
stupefied_nobel

快速启动容器方法

[root@docker01~]dockercontainerls

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


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

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

[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-ef
5.3删除所有容器
[root@docker01~]-f强制删除

5.4启动时进行端口映射

-p参数端口映射

[root@docker01~]需要镜像支持
6Docker数据卷的管理6.1挂载时创建卷

挂载卷

[root@docker01~]echo""/data/
[root@docker01~]dockerrun-d-p8080:80-v/data:/usr/share/nginx/htmlnginx:latest
351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42
[root@docker01~]dockervolumels
DRIVERVOLUMENAME
6.2创建卷后挂载

创建一个卷

[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镜像

[root@docker01base]dockerrun-d-p2022:22
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a

7.3使用Dcokerfile安装kodexplorer

Dockerfile文件内容

FROMcentos:6.8
RUNyuminstallwgetunzipphpphp-gdphp-mbstring-yyumcleanall
创建一个nginx容器
dockerrun-d-p80:80nginx
在容器中访问nginx容器可以ping通
pingweb01

命令执行过程

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/busybox


10.2带basic认证的仓库

1、安装加密工具

[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:wordpress


3、启动

[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:wordpress

2、同时启动两台wordpress

[root@docker01my_wordpress]yuminstallhaproxy-y

4、修改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/stats

3、下线后端节点

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":true

dockerserver配置文件/etc/docker/参考

[root@docker02~]修改数据的存放目录到/opt/mydocker/,原/var/lib/docker/
"insecure-registries":["10.0.0.100:5000"],
"live-restore":true
}

重启生效,只对在此之后启动的容器生效

[root@docker01~]dockerrun-it--networknonebusybox:latest/bin/sh
/dockerrun-it--networkcontainer:mywordpress_db_1busybox:latest/bin/sh
/dockerrun-it--networkhostbusybox:latest/bin/sh


13.5查看网络列表
[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//networkrestart

3、运行一个容器镜像测试:

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.043ms

4、再运行一个容器,设置网路类型为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.5MB


6、在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