记录一份

Docker

一、什么是Docker?
	Docker是一项容器技术,是一个开源的应用容器引擎。
	可以让开发者打包自己的软件以及相关依赖到一个
	可移植的容器中,然后发布到Docker仓库上面。
	运维工作人员从中下载获取镜像,通过Docker程序
	运行这个镜像,生成容器,就可以获取相同的软件环境。
	实现了“一次构建,处处运行”。
	解决了开发者和运维者在开发时和部署时因项目环境不同
	而导致的各种矛盾,从而影响业务进度,使得业务不能适应
	快速变化的市场。
	
可以简单地把Docker理解为是一个虚拟机
Docker是基于UnionFS联合文件系统,是一种分层的结构
分层结构:共享资源,便于复用(很多镜像都是基于一个Base基础镜像构建而来)
	
二、Docker与传统虚拟软件的区别
	传统虚拟软件:
		模拟一个完整的操作系统,首先虚拟出一套硬件,
		再安装操作系统,再运行各种软件。
		更偏向硬件方向的运营
		
	Docker容器技术:
		不是模拟一个完整的操作系统,也没有进行硬件虚拟。
		而是对进程进行隔离,封装成容器,容器内的应用程序
		直接使用宿主机的内核资源,且容器采用沙箱机制,
		互相隔离,彼此独立,是安全的。
		更偏向软件方向的运营
		
三、术语
	1)Docker主机(Host)
		安装了Docker程序的主机
		
	2)Docker镜像(Image)
		就是一个将软件环境打包好的模板,
		用来创建容器。
		一个镜像可以创建多个容器
		
	3)Docker容器(Container)
		就是镜像运行后的实例,可以启动、停止、删除等等
		容器采用沙箱机制,互相隔离,彼此独立,是安全的。
		可以简单地把容器看作是一个简易版的linux环境。
		
	4)Docker仓库(Repository)
		用来存放镜像,每一个镜像都有一个标签
		
Docker
	(1)安装
		前提:对于Linux, 64位linux操作系统,内核3.10以及以上
		Step1:
				yum remove docker \
		>                   docker-client \
		>                   docker-client-latest \
		>                   docker-common \
		>                   docker-latest \
		>                   docker-latest-logrotate \
		>                   docker-logrotate \
		>                   docker-engine
		 
				yum install -y yum-utils \
		>   device-mapper-persistent-data \
		>   lvm2
		
				yum-config-manager \
		>     --add-repo \
		>     https://download.docker.com/linux/centos/docker-ce.repo
		
		 yum install -y docker-ce docker-ce-cli containerd.io
		 
	 (2)验证
		docker version
		docker info
	
	 (3)启动
		systemctl enable docker
		systemctl start docker
		
	 (4)镜像加速
		https://hub.daocloud.io/
		--->
		加速器
		--->
		curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
		
		systemctl daemon-reload
		systemctl restart docker
		
		docker -H IP  # 连接指定主机的docker
		
Docker操作:
	一、镜像操作
	查找		docker search 关键字					在DockerHub上面查找关于该关键字的详细信息
	拉取		docker pull 镜像名称:tag    			tag就是版本,不指定就拉取最新latest的版本
	查看		docker images						查看所有镜像
	元信息		docker inspect 镜像名称or镜像id     	查看对应镜像的元信息
	删除		docker rmi -f 镜像名称or镜像id ...    删除一个或多个镜像,选项-f表示强制删除
	变更历史	    docker history 镜像名称or镜像id			查看对应镜像的变更历史
	导出镜像    docker save [-o] [xx.tar] 镜像名称orID ...  导出一个或多个镜像到一个tar文件
				docker save -o nginx.tar nginx:v1 34df
					or
				docker save > nginx.tar nginx:v1 34df 
	导入镜像    docker load [-i] tar文件                导入tar包中的镜像(会保留历史记录)
	            docker load -i nginx.tar                # 不能重新命名
				            -q                          # 安静
					or
				docker load < nginx.tar
	二、容器操作
	运行		docker run --name <容器名字> 镜像名称orID [sh cmd][args]   # 可以不指定,会自动命名
	                       -t                 			# 分配一个伪终端,用来执行命令
						   -i                 			# 以交互模式运行容器
						   [sh cmd] 是指在容器运行时执行的shell命令,想让这个命令正常工作,不能以-d模式启动
						   [args]  可以指定sh cmd需要的参数
						   -d                 			# 以守护进程方式在后台运行
						   -p 主机端口:容器端口 		# 指定端口映射,将主机端口映射到容器内的端口(容器内的APP端口可以通过元信息获取)            
						   -v 主机路径:容器路径:权限 	# 指定挂载,将主机路径挂载到容器内路径,默认权限为rw(表示容器对此目录可读可写)
						                                # 既可以以文件形式挂载,也可以以目录形式挂载
						   -e MY_PASSWORD=root			# 指定环境变量
														# -v 参数可以有多个
    停止		docker stop 容器名字or容器id ...	    # 停止正在运行的一个或多个容器(优雅退出)
	启动		docker start 容器名字or容器id ...		# 启动一个或多个容器
	重启        docker restart 容器名字or容器ID ...     # 重启一个或多个容器
	重命名      docker rename 容器名字orID NEW_NAME     # 重命名容器名字
	杀死        docker kill 容器名字orID ...            # 杀死一个或多个容器(暴力退出)
	查看		docker ps -q -a 						# 查看容器,默认只查看正在运行的容器
	                                                    # -a 表示查看所有的容器
														# -q 表示只显示容器id
	元信息		docker inspect 容器名称or容器id			# 查看容器元信息
	查看日志	docker logs	容器名称or容器id			       # 查看容器运行日志
	查看版本    docker version                          # 查看docker版本信息
	查看详细信息  docker info                           # 查看操作系统以及docker使用的信息
	执行命令    docker exec -it 容器名称or容器id 命令   # 往容器内执行Shell命令
	                                                    # 如果想进入容器内,命令为/bin/bash,而且必须带有-it选项
														# 如果不想进入容器,执行一般命令,可以不用加-it
	拷贝文件	docker cp 主机文件路径 容器名称orID:容器路径  # 将主机中的文件拷贝到容器内
	                     or
						  容器名称orID:容器路径 主机文件路径  # 将容器内的文件拷贝到主机内
	导出容器    docker export [-o] [xx.tar] container   # 导出容器到一个tar文件,但最后会恢复成镜像
					or                                  # 不会保留历史记录
				docker export -o nginx.tar nginx
				docker export nginx > nginx.tar 
	导入容器    docker import nginx.tar nginx:tmp       # 导入容器,可以重新命名
	            cat nginx.tar | docker import - nginx:tmp 
				
	三、创建镜像
		(1)更新镜像
			基于已有的基础镜像运行的容器实例,对其进行修改,然后commit成新的镜像
			docker commit -a "hardy9sap@163.com # Author" -m "Comment message" 容器名称orID itany/nginx:v1.0
			说明:
				-a -m 都是可选的
				itany/nginx:v1.0 中的itany/ 可选,表示命名空间;:v1.0 可选,表示版本tag
				整体itany/nginx:v1.0 都是可选的,那么默认镜像名字以及标签都为<none>
		(2)构建镜像
			基于Dockerfile,对已有镜像进行修改,然后build成新的镜像
			Dockerfile是一个包含创建镜像所需的所有指令的文本文件
			docker build -f Dockerfile -t itany/nginx:v2.0 .
			说明:
				-f 指定Dockerfile路径,默认就是当前路径下的Dockerfile
				-t 指定新镜像名称和版本
				.  表示上下文,一般就是.表示当前路径

Docker镜像为什么那么大?
	因为镜像是包含了所有了运行该软件的所有环境,
	所以那么大。
	每一层镜像只会在本地保留一份。
	再拉取一个镜像的时候,如果所需的镜像层已经在本地有了,
	就不需要再拉取一遍。
				
	四、Dockfile指令
		规则:
			1. 全部指令以大写字母书写
			2. 以FROM指令开头
			3. 从上往下执行
			4. # 表示注释
			5. 每执行一条命令,就增加一层镜像层
			
		常用指令:
			FROM               			指定基础镜像
				FROM itany/nginx:v2.0
			ENV							定义环境变量
				ENV	MYPATH /usr/local   
			RUN 						运行一条指令
				RUN yum install -y vim 
				使用 && 来执行多条
				RUN mkdir -p /usr/src/things \
				&& curl -SL http://example.com/big.tar.xz \
				| tar -xJC /usr/src/things \
				&& make -C /usr/src/things all
			CMD							在镜像生成容器时指定的命令(也就是run命令)
				CMD ["/bin/bash"]       # CMD指令虽然可以有多个,但是以最后一个CMD指令为准
				CMD ["/bin/ls", "/"]    # 可以为主命令指定参数
				                        # CMD指令会被run时指定的命令覆盖掉
			VOLUME						指定挂载目录,(实现资源共享,数据持久化)
										只能指定镜像中的目录,
										无法指定宿主机的目录,宿主机的目录是自动生成的,可通过容器元信息获得
				VOLUMN ["/data1", "/data2"]
			WORKDIR						指定当登录容器后,进入的工作目录,
			                            不指定,默认为/目录
				WORKDIR $MYPATH
			MAINTAINER					维护者(作者)
				MAINTAINER hardy9sap@163.com
			ENTRYPOINT					与CMD类似,
                                        # ENTRYPOINT指令也可以有多个,也是以最后一个指令为准
                                        # 可以为主命令指定参数
                                        # ENTRYPOINT指令不会覆盖run时指定的命令,而是会当作ENTRYPOINT指令的参数,组成新的指令
                                        # 就理解为拼接在了一起
					关于执行指令:
					如果最后一条指令不是/bin/bash的话
					指定你指定的命令后,容器退出,
					之后再怎么重启容器都不会生效。
					只能删除,再次启动并且指定/bin/bash(当然ENTRYPOINT会把它当做参数,所以要留意一点)
			EXPOSE						# 暴露端口
			    # EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开!
				# 如果你不用-p或者-P(随机选主机的一个端口进行映射)中指定要映射的端口,你的容器是不会映射端口出去的,
				EXPOSE 8080 8090
			COPY						# 拷贝主机文件到镜像中,(不能拷贝目录,如果指定目录则是把目录中的所有内容拷贝过去)
				COPY <src> <dst>
				COPY file.txt /usr/local
				COPY和ADD所拷贝的文件必须跟Dockerfile保持在同一目录下
				(因为build时,默认指定的上下文就是当前目录,也就是我们写的那个.)
				(当然你可以改变上下文,例如:/etc/local)
				可以使用通配符* 和 ?
				
			ADD							# 拷贝主机文件到镜像中,(不能拷贝目录,如果指定目录则是把目录中的所有内容拷贝过去)
			                            # 如果是压缩文件直接解压
				ADD <src> <dst>
				ADD nginx.tar.gz /usr/local/nginx
				
	五、发布镜像到阿里云开发者平台
		Step1: https://homenew.console.aliyun.com/
		
		Step2: 创建命名空间
		
		Step3: 创建镜像仓库
				摘要:仓库的摘要
				描述:镜像的描述
				
		Step4: 管理 --> 操作指南
			将镜像推送到Registry
			# 登录阿里云Docker Registry
				docker login --username=空灵飘渺之旅sap registry.cn-shenzhen.aliyuncs.com
				             --password=密码(太复杂的密码不适用)
							 -u
							 -p
			# 创建指定镜像的tag,归入某个仓库
				docker tag [ImageID] registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
			# 推送
				docker push registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
				
			    选择合适的镜像仓库地址
				从ECS推送镜像时,可以选择使用镜像仓库内网地址。
				推送速度将得到提升并且将不会损耗您的公网流量。

				如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为Registry的域名登录,并作为镜像命名空间前缀。
				公网地址 
				registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos

				专有网络 
				registry-vpc.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos

				经典网络 
				registry-internal.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos
			
			#从Registry拉取镜像
				docker pull registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
				
			# 退出登录
				docker logout [registry.cn-shenzhen.aliyuncs.com/]  # 不指定默认登出DockerHub

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐