百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

windows下docker的安装与镜像的制作提交

wptr33 2024-11-12 14:21 18 浏览

前言:

作为一个开发人员,每每在更换电脑或重装系统时,要重新安装开发工具搭建开发环境。所以有的人会封装一下系统(这里指windows),将平时用到的环境和工具全安装在里面,改改OEM,以后换了电脑就直接拿封装的系统安装就方便很多。 同样但也不一样的,在开发完的应用程序在需要更换IDC或者部署分布式时。针对应用又要重新搭建环境,安装软件依赖等等。所以这时候可以将应用软件以及环境依赖一并作为docker镜像,部署的时候直接拉取镜像,启动后为容器就可以正常运行了。

Docker简介:

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker与虚拟机的区别:

上面系统封装与镜像制作,我说过两者有相同但也一点不同。所以就以我的理解简单介绍一下Docker与虚拟机的区别。网上也有很多详细介绍两者架构的原理及原理图,这里就略过原理直接说差异。

使用场景:Docker适合隔离应用,虚拟机能隔离用户(更能隔离应用),因为有独立完整的操作系统。

技术方面:虚拟机是通过虚拟化硬件并CPU要支持虚拟化技术,Docker容器只是在宿主操作系统上开启了Docker引擎,比如一个CentOS镜像是一套文件系统,引擎将容器放入到一个进程中并相互隔离。各个容器共用同一套操作系统资源,不需要虚拟化硬件,启动快速。

Docker的安装:

在windows下有两个工具, docker toolbox 针对win7, win8,工具集合了Virtual Box(虚拟机软件),Kitematic(docker图形化软件),和其他几个命令终端工具。针对win10的是 Docker for Windows Installer 。

安装完毕后点击Docker Quickstart启动 Docker Toolbox 终端。命令执行会先在Virtualbox创建一个名字为default的CentOS虚拟机并安装了Docker。CentOS默认账号docker, 密码tcuser,Ip在启动toolbox时在命令板上显示,可以通过Xshell连接。

镜像下载&容器使用

最简单的就是打开Kitematic工具,网络正常时会展示主流的镜像,选择其中一个点击“create”就会下载并在左侧栏启动容器。容器的启动和停止重启在图形化界面中也很方便地操作。下面就下载PHP和 Nginx并运行在浏览器打开。

1. nginx,php容器设置与使用

server {
	listen       80;
	server_name  localhost;

	#charset koi8-r;

	#access_log  logs/host.access.log  main;

	location / {
		root   /var/www;
		index  index.php index.html index.htm;
		
		if (!-e $request_filename) {
			rewrite ^/(.*)$ /index.php?/$1 last;
		}
	}
	
	location ~ \.php {
		 root          /var/www;
		 fastcgi_pass   192.168.99.100:9000;
		 fastcgi_index  index.php;
		 fastcgi_split_path_info ^(.+\.php)(.*)$;
		 fastcgi_param  PATH_INFO $fastcgi_path_info;
		 fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		 include        fastcgi_params;
	}

	#error_page  404              /404.html;

	# redirect server error pages to the static page /50x.html
	#
	error_page   500 502 503 504  /50x.html;
	location = /var/www/index.html {
		root   html;
	}

	# proxy the PHP scripts to Apache listening on 127.0.0.1:80
	#
	#location ~ \.php$ {
	#    proxy_pass   http://127.0.0.1;
	#}

	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	#
	#location ~ \.php$ {
	#    root           html;
	#    fastcgi_pass   192.168.99.100:9000;
	#    fastcgi_index  index.php;
	#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
	#    include        fastcgi_params;
	#}

	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
	#    deny  all;
	#}
}

2. 镜像的制作

镜像制作就需要使用 Dockerfile ,类似PHP项目中的composer.json,用于构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

这里仅讲解如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只要知道构建的流程即可。

(1)、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html



(2)、FROM 和 RUN 指令的作用

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

在 Dockerfile 文件的存放目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 nginx:test(镜像名称:镜像标签)。

:最后的 . 代表本次执行的上下文路径,下一节会介绍。

$ docker build -t nginx:test .

以上显示,说明已经构建成功。

$ docker build -t nginx:test .

镜像上传到远程镜像库

1. 首先在docker hub官网注册一个账号,然后可以正在登陆,Kitematic 也可以登陆试试。

2. 打开docker cli命令面板,输入docker login,输入docker hub账号密码后,显示login success后,就可以准备自己本地的镜像文件了。

3. docker images查看本地的所有镜像文件,记住镜像完整名称,然后给要提交的镜像加标签,这时会生成两个镜像ID一样的镜像文件。然后通过docker push 完整的镜像文件:包括标签名,最后就可以推送到自己的镜像库了。

上传至阿里云镜像库

1. 首先有阿里云账户,登录成功后开通"容器镜像服务",设置账号密码,并建立空间和仓库,点击管理可以看到登录,拉取,推送的命令。

2. 同样的方式打开docker cli命令面板或者xshell连接docker中登录阿里镜像账号,同样的方式找到本地做好的镜像然后推送。

3. 拉取docker hub和阿里镜像都通过 docker pull 完整的镜像名,就可以拉取到本地,然后通过docker images查看。

相关推荐

C++企业级开发规范指南(c++开发gui)

打造高质量、可维护的C++代码标准一、前言C++作为一门功能强大的系统级编程语言,被广泛应用于操作系统、游戏引擎、高性能服务器、数据库系统等领域。知名互联网公司(如Google、Microsoft、腾...

C++|整型的最值、上溢、下溢、截断、类型提升和转换

整数在计算机内以有限字长表示,当超出最值(有限字长)时,需要截断(溢出,求模)操作。不同字长的整型具有不同的值域,混合运算时,需要类型提升和转换。1整形最值在<limit.h>中有整型的...

C++|漫谈STL细节及内部原理(c++ std stl)

1988年,AlexanderStepanov开始进入惠普的PaloAlto实验室工作,在随后的4年中,他从事的是有关磁盘驱动器方面的工作。直到1992年,由于参加并主持了实验室主任BillWo...

C++11新特性总结 (二)(c++11新特性 pdf)

1.范围for语句C++11引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素vector<int>vec={1,2,3,4,5,6};f...

C++ STL 漫谈(c++中的stl到底指的什么)

标准模板库(StandardTemplateLibrary,STL)是惠普实验室开发的一个函数库和类库。它是由AlexanderStepanov、MengLee和DavidRMusser在...

C++学习教程_C++语言随到随学_不耽误上班_0基础

C++学习教程0基础学C++也可以,空闲时间学习,不耽误上班.2019年C语言新课程已经上线,随到随学,互动性强,效果好!带你征服C++语言,让所有学过和没有学过C++语言的人,或是正准备学习C++语...

C++遍历vector元素的四种方式(c++ 遍历vector)

vector是相同类型对象的集合,集合中的每个对象有个对应的索引。vector常被称为容器(container)。C++中遍历vector的所有元素是相当常用的操作,这里介绍四种方式。1、通过下标访问...

一起学习c++11——c++11中的新增的容器

c++11新增的容器1:array当时的初衷是希望提供一个在栈上分配的,定长数组,而且可以使用stl中的模板算法。array的用法如下:#include<string>#includ...

C++编程实战基础篇:一维数组应用之投票统计

题目描述班上有N个同学,有五位候选人“A,B,C,D,E”,请所有的同学投票并选举出班长,现在请你编写程序来他们计算候选人的得票总数,每位同学投票将以数字的形式投票“12345”分别代表五位候选人,...

C++20 新特性(6):new表达式也支持数组大小推导

new表达式也支持数组大小推导在C++17标准中,在定义并初始化静态数组时,是可以忽略数组大小,然后通过初始化数据来推导数组的大小。但使用new来定义并初始化动态数组时,并不支持这种自动推导数组大...

C++ 结构体(struct)最全详解(c++结构体用法)

一、定义与声明1.先定义结构体类型再单独进行变量定义structStudent{intCode;charName[20];charSex;intA...

自学 C++ 第 6 课 二维数组找最值

键盘输入一个m×n的二维数组,通过C++编程找出元素中的最大值,并输出其所在的位置坐标。例如,输入一个4×5的二维数组,数组元素分别为{{556623749},{578964563},...

从缺陷中学习C/C++:聊聊 C++ 中常见的内存问题

在写C/C++程序时,一提到内存,大多数人会想到内存泄露。内存泄露是一个令人头疼的问题,尤其在开发大的软件系统时。一个经典的现象是,系统运行了10天、1个月都好好的,忽然有一天宕机了:OOM(Out...

C++开发者都应该使用的十个C++11特性(上)

在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛。不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备。你也许看到过许多类似介绍各种C++11特性的文章。下...

深度解读C/C++指针与数组(c++指针和数组的区别)

指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。今天我们就来聊一聊数组和指针千丝万缕的关系;一维数组与...