系统运输
一.前言
docker是一个开源APP应用程序容器引擎,它使开发人员能够将他们的APP应用程序打包到依赖的可移植容器中,并将其发布到流行的Linux计算机或进行虚拟化。 容器完全使用沙箱机制,相互之间没有接口。 几乎没有性能开销,可以在机器和数据中心上轻松运行。
二. Docker的基本构成
1 .镜像(图像)。
镜像是面向对象的类,相当于模板。 本质上,镜像相当于文件系统。 Docker镜像是一种特殊的文件系统,它提供运行容器所需的程序、库、资源和配置等文件,还包含运行时准备的配置参数,如匿名卷、环境变量和用户。 镜像不包含动态数据,并且在生成后其内容保持不变。
2 .容器)。
容器是类创建的实例,也是基于名为镜像的模板创建的实体。 容器的本质是进程,但与直接在主机上运行的进程不同,容器进程在自己的独立命名空间中运行。 因此,容器可以有自己的根文件系统、自己的网络配置、自己的进程空间,甚至还有自己的用户ID空间。 容器中的进程在隔离环境中运行,使用起来就像在独立于宿主的系统上运行一样。 与直接在主机上运行相比,此特性使应用容器包更安全。
3 .仓库(储存库)
从认知上看,仓库就像一个软件包上传站,上传了各种软件的不同版本供用户下载。 镜像生成完成后,可以在当前主机计算机上轻松运行,但如果需要在其他服务器上使用此镜像,则需要集中存储和分发镜像的服务。 文档注册表就是这样的服务。
文档生成器的优势
1 .更好地利用系统资源: Docker系统资源利用率较高,因为容器不需要额外的费用,如硬件虚拟化和运行完整的操作系统。 无论是执行APP复制的速度、内存丢失还是文件存储的速度,都比传统的虚拟机技术更高效。 因此,具有相同配置的主机往往能够执行比虚拟机技术更多的APP应用程序。
2 .更快的启动时间:传统的虚拟机技术通常需要几分钟来启动APP应用服务,但Docker容器APP应用直接在主机内核上执行,不需要启动完整的操作系统,甚至达到秒级。
3 .连贯执行环境:开发过程中的一个常见问题是环境一致性问题。 有些错误在开发过程中未被发现,因为开发环境、测试环境和生产环境不匹配。 Docker镜像提供了一个完整的非内核运行时环境,以确保APP应用程序运行时环境的一致性,从而避免了这种情况。
4 .连续交付和部署: Docker是一个build once,使用runeverywhere.docker,您可以通过定制APP融合镜像来实现连续集成、连续交付和部署。 开发人员可以通过Dockerfile构建镜像,并结合Continuous Integration系统进行集成测试。 另一方面,承运人可以直接快速将镜像部署到生产环境中。
5 .更轻松的迁移: Docker使用的分层存储和镜像技术使重复部分的重用变得更容易,APP应用的维护和更新也变得更容易,在基础镜像的基础上进一步扩展镜像也变得非常简单。
传统开发流程
文档环境开发流程
4 .与传统虚拟机的比较
五.文档命令
1 .创建镜像
1.1基于现有镜像容器创建
? docker commit [ options ] container [ repository [:tag ] ]
option:-a,--author=“”#作者信息
-m,--message=“” #提交信息
p, --pause=true #提交时暂停容器的运行
1.2基于本地模板导入创建
docker load ***.tar --本地模板文件tar
1.3基于文档文件生成镜像
文档构建器- t image-name basedir
2 .删除镜像
文档RMI图像#图像可以是标签或ID
docker RMIf image #强制删除镜像
注意:使用docker rmi命令删除镜像时,请先删除容器,然后再删除镜像。 否则,镜像将在容器中执行。
镜像管理命令
3 .创建/启动/停止/删除容器
在docker create image #中创建的容器处于停止状态
文档开始/停止容器_ id #启动/停止容器
创建和启动文档运行图像#容器
删除docker rm container_id #容器
创建容器的通用选项
集装箱管理的一般命令
4 .镜像与容器联系
镜像不是由单个文件组成,而是由多个层组成。 docker history ID/NAME允许您查看镜像中每个层的内容和大小。 每个层都对应于docker文件中的命令。 默认情况下,Docker镜像存储在/var/lib/docker/storage-driver中。
集装箱其实在后视镜的最上面加了读写层。 在运行容器时对文件所做的更改将写入此读写层。 如果容器被删除,最上面的读写层也会被删除,更改也会丢失。
Docker使用存储驱动程序管理容器层,该层镜像每个层的内容和可读写层。
5 .将主机数据装载到容器中
Docker通过三种不同的方法将数据从宿主机装载到容器中:卷、绑定装载和tmpfs。
volumes:Docker管理主机文件系统的一部分(/var/lib/docker/volumes )。
bind mounts :可以存储在主机系统的任意位置。
tmpfs装载到宿主机系统的内存中,而不写入宿主机的文件系统。
5.1体积
注意:
#如果未指定卷,则会自动创建。
建议使用--mount。 更一般。
5.2绑定装载
注意:
#如果源文件/目录不存在,则不会自动创建并抛出错误。
#如果挂载的目录在容器中不是空的,则会隐藏该目录的现有内容。
5.3 tmpfs
在容器中使用tmpfs :
# docker run-d-it-- name nginx-test-- mount type=tmpfs,destination=/usr/share/nginx/html nginx
# docker run-d-it---name nginx-test---tmpfs/usr/share/nginx/html nginx
注意:
# tmpfs方法仅存储在主机系统的内存中,不会写入主机的文件系统。
# tmpfs装载不能在容器之间共享。
# tmpfs仅在Linux容器上运行,在Windows容器上不起作用。
Docker实战构建-LNMP环境,构建WordPress博客
实验环境:
1 .安装文件库
首先安装依赖软件包
安装Docker (因为以前安装过,所以表示已经安装) )。
检查Docker是否已成功安装
启动Docker,添加启动自动启动
[ root @ localhost~] # systemctlstartdocker
[ root @ localhost~] #系统管理器
使用Dockerfile方法构建镜像
文档文件命令
环境说明:
在这篇文章中,我基于centos 7.5系统、nginx和php的源代码包构建。 如果不想使用源包,也可以用yum方式生成。
nginx是使用源包构建的。 版本为nginx-1.12.2.tar.gz,下载地址为http://nginx.org/en/download.html /
php由php-5.6.31.tar.gz和下载位置http://php.net/downloads.php的源软件包构建
创建镜像所需的文件
在Dockerfiles目录下创建了两个目录( nginx、php ),分别存储了Dockerfile文件和源文件包。 nginx目录包含nginx.conf配置文件,php目录也包含php.ini配置文件。 (在实际环境中,这两个文件需要频繁修改。 单独取出后,可以在启动容器时将其装载到容器上,以便于管理。 请参阅。
2.1构建nginx
文档文件内容:
让我们分析一下文档文件的内容。 生成镜像时,将根据组织的内容一步一步地执行,如果不执行任何步骤,生成将立即停止。 上面的大部分命令都很好理解。 可以对照上面的Dockerfile命令映射来理解。 详细说明最后的命令。 CMD [&; #039;/sbin/nginx&; #039;&; #039; -g&; #039;&; #039; 关闭日期; &; #039; ]
./sbin/nginx是正常启动nginx服务;
-g :设置配置文件外的全局指令。 也就是说,nginx启动时会设置daemon off参数。 缺省参数为on,表示是否将nginx作为守护进程运行。 守护进程是与终端分离并在后台运行的进程。 这里关闭,不要让它在后台运行。 为什么不在启动nginx容器时让其在后台运行呢? 默认情况下,docker容器将容器中的第一个进程(即pid=1的程序)作为docker容器是否正在运行的依据。 如果docker容器的pid挂起,docker容器将直接结束。
nginx.conf的内容
配置中主要添加了名为location ~ .php的部分的内容。 其中fastcgi_pass的lnmp_php,这是以后启动php容器时的名称。 如果符合php请求,则会将其转发到名为lnmp_php的容器php-fpm服务器进行处理。 通常,如果php服务不是在容器中运行,则lnmp_php内容通常会写php服务器的Ip地址。
build构建nginx镜像
切换到nginx目录:
内部版本:
[ root @ localhost nginx ] # docker build-t nginx:1.12.2
检查是否成功生成了镜像:
2.2构建PHP
文档文件内容
php.ini的内容( PHP的默认配置内容也可以。 真正找不到的东西请复印并粘贴) )。
[PHP]
engine=On
short_open_tag=Off
asp_tags=Off
precision=14
output_buffering=4096
zlib.output_compression=Off
implicit_flush=Off
unserialize_callback_func=
serialize_precision=17
disable_functions=
disable_classes=
zend.enable_gc=On
expose_php=On
max_execution_time=300
max_input_time=300
memory_limit=128M
error _ reporting=e _ all~e _ deprecated~e _ strict
display_errors=Off
display_startup_errors=Off
log_errors=On
log_errors_max_len=1024
ignore_repeated_errors=Off
ignore_repeated_source=Off
report_memleaks=On
track_errors=Off
html_errors=On
variables_order=GPCS
request_order=GP
register_argc_argv=Off
auto_globals_jit=On
post_max_size=32M
auto_prepend_file=
auto_append_file=
default_mimetype=text/html
always _ populate _ raw _ post _ data=-1
doc_root=
user_dir=
enable_dl=Off
file_uploads=On
upload_max_filesize=2M
max_file_uploads=20
allow_url_fopen=On
allow_url_include=Off
default_socket_timeout=60
CLI服务器
cli_server.color=On
[Date]
date.timezone=Asia/Shanghai
[filter]
[iconv]
[intl]
[sqlite]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_Mysql.cache_size=2000
pdo_MYSQL.default_socket=
[Phar]
[mail function]
SMTP=localhost
smtp_port=25
mail.add_x_header=On
[SQL]
sql.safe_mode=Off
[ODBC]
odbc.allow_persistent=On
odbc.check_persistent=On
odbc.max_persistent=-1
odbc.max_links=-1
odbc.defaultlrl=4096
odbc.defaultbinmode=1
[Interbase]
ibase.allow_persistent=1
ibase.max_persistent=-1
ibase.max_links=-1
ibase.timestamp format=% y-% m-% d % h:% m:% s
ibase.dateformat=%Y-%m-%d
ibase.timeformat=%H:%M:%S
[MySQL]
mysql.allow_local_infile=On
mysql.allow_persistent=On
mysql.cache_size=2000
mysql.max_persistent=-1
mysql.max_links=-1
mysql.default_port=
mysql.default_socket=
mysql.default_host=
mysql.default_user=
mysql.default_password=
mysql.connect_timeout=60
mysql.trace_mode=Off
[MySQLi]
mysqli.max_persistent=-1
mysqli.allow_persistent=On
mysqli.max_links=-1
mysqli.cache_size=2000
mysqli.default_port=3306
mysqli.default_socket=
mysqli.default_host=
mysqli.default_user=
mysqli.default_pw=
mysqli.reconnect=Off
[mysqlnd]
mysqlnd.collect_statistics=On
MySQL nd.collect _ memory _ statistics=off
[OCI8]
[PostgreSQL]
pgsql.allow_persistent=On
pgsql.auto _ reset _ persistent=off
pgsql.max_persistent=-1
pgsql.max_links=-1
pgsql.ignore_notice=0
pgsql.log_notice=0
[Sybase-CT]
sybct.allow_persistent=On
sybct.max_persistent=-1
sybct.max_links=-1
sybct.min_server_severity=10
sybct.min_client_severity=10
[bcmath]
bcmath.scale=0
[browscap]
[Session]
session.save_handler=files
session.use_strict_mode=0
session.use_cookies=1
session.use_only_cookies=1
session.name=PHPSESSID
session.auto_start=0
session.cookie_lifetime=0
session.cookie_path=/
session.cookie_domain=
session.cookie_httponly=
session.serialize_handler=php
session.gc_probability=1
session.gc_divisor=1000
session.gc_maxlifetime=1440
session.referer_check=
session.cache_limiter=nocache
session.cache_expire=180
session.use_trans_sid=0
session.hash_function=0
session.hash _ bits _ per _ character=5
url_rewriter.tags=a=href,area=href,frame=src,input=src,form=fakeentry
[MSSQL]
mssql.allow_persistent=On
mssql.max_persistent=-1
mssql.max_links=-1
mssql.min_error_severity=10
mssql.min_message_severity=10
mssql.compatibility_mode=Off
mssql.secure_connection=Off
[Assertion]
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output=Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir=/tmp
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit=5
[sysvshm]
[ldap]
ldap.max_links=-1
[mcrypt]
[dba]
[opcache]
[curl]
构建构建PHP镜像
准备好php源包、php.ini和docker文件后,让我们使用docker build构建此镜像。
切换到php目录:
构建php镜像:
[ root @ localhost PHP ] # docker build-tphp:5.6.31。
检查是否成功生成了镜像
3 .运行容器
3.1创建自定义网络lnmp
首先,创建一个在运行ningx、php等容器时加入lnmp网络的自定义网络。
#查看默认网络:
[ root @ localhost PHP ] # dockernetworkls
创建:
[ root @ localhost PHP ] # dockernetworkcreatelnmp
3.2创建PHP容器
创建容器:
[ root @ localhost PHP ] # docker run-itd-- namel NMP _ PHP-- network ln MP-v/app/wwwroot:/usr/local/nginx/htinx/HTP
参数说明:
-itd: #在容器中打开虚拟终端进行交互操作,并在后台执行;
--name: #为容器分配名称lnmp_php;
--network: #为lnmp网络指定容器的网络环境;
--mout: #在容器的/usr/local/nginx/html目录中挂载宿主机上的/app/wwwroot目录。 安装也相当于数据永久化
php:5.6.31: #使用刚才构建的php镜像启动容器;
检查php容器是否正在运行:
3.3创建nginx容器:
创建容器:
[ root @ localhost PHP ] # docker run-itd-- namel NMP _ nginx-- network ln MP-p80:80-v/app/ww root:/usr/local
检查容器是否正在运行:
3.4访问测试
index.html创建并访问静态页面。
[ root @ localhost WordPress ] # echodockerfilelnmptest/app/ww root/index.html
在浏览器中访问宿主机的IP :
创建另一个index.php文件并启动测试:
[root@localhost wordpress]# echo? phpinfo (; /app/wwwroot/index.php
访问PHP页面:
3.5创建MySQL容器:
[ root @ localhost~~ ] # docker run-itd-- network ln MP-p 3306:3306-- name MySQL-e MySQL _ root _ password=123456 mm
#如果本地没有mysql5.6镜像,则会自动从仓库中提取;
检查mysql容器是否已启动:
进入mysql容器并创建wordpress数据库:
确认wordpress是否成功创建:
Ctrl p还会导致Ctrl q退出mysql容器,返回到宿主机
3.6下载WordPress博客系统测试lnmp
将wordpress文件下载到/app/wwwroot目录中
wordpress文件下载地址: https://cn.WordPress.org/WordPress-4.7.4-zh _ cn.tar.gz
解压缩wordpress压缩包并访问测试:
root @ localhost~] # tar-zxvf WordPress-4.7.4-zh _ cn.tar.gz
打开浏览器访问:
http://容器宿主机IP/WordPress/WP-admin/setup-config.PHP
配置wordpress博客:
提交:
输入信息以安装Wordpress :
7 .文件迁移
要将镜像另存为tar文件,请使用docker save命令。
[ root @ localhost~] # dockersavenginx:1.12.2|gzip nginx1. 12.2.tar.gz
使用docker load命令导入:
[ root @ localhost~] # dockerloadnginx.1.12.2.tar.gz
详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn