Docker入门

1.Docker和传统虚拟机技术的不同

  • ​ 传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后再这个系统上安装和运行软件;
  • Docker容器内的应用直接运行在宿主机的内核上,容器是没有自己的内核的,也没用虚拟的硬件,所以是轻量级;
  • 且每个容器之间互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。

2.DevOps(开发、运维)

  • 应用更快速的交付和部署:

    传统:一堆帮助文档,安装程序

    Docker:打包镜像发布测试,一键运行

  • 更便捷的升级和扩容

  • 更简单的系统运维

  • 更高效的计算资源利用

3.安装Docker

环境准备

​ linux+centOs7+Xsheel

环境查看:

#系统内核为3.10以上
    uname -r
#系统版本
[root@centos701 ~]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

#1)卸载旧的版本:	
	yum remove docker  \
            docker-client \
            docker-client-latest \
            docker-common \
            docker-latest \
            docker-latest-logrotate \
            docker-logrotate \
            docker-engine
#2)需要的安装包:
    yum install -y yum-utils	
#3)设置镜像的仓库
    yum-config-manager \
    	--add-repo \
    	https://download.docker.com/linux/centos/docker-ce.repo  国外镜像仓库地址,很慢
    yum-config-manager \
    	--add-repo \
		https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4)更新软件索引
    yum makecache fast
#5)安装docker docker-ce 社区版,ce 企业版
	yum install docker-ce docker-ce-cli containerd.io
#)启动docker
	systemctl start docker
#6)查看docker版本
    docker version
#7)测试是否安装成功
    docker run hello-world
#8)查看下拉的镜像版本
    docker images
#9)卸载docker
#9.1)卸载依赖
    yum remove docker-ce docker-ce-cli containerd.io
#9.2)删除资源
    rm -rf /var/lib/docker
#/var/lib/docker docker的默认工作路径

docker运行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-08sDOPbm-1640831003010)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210122101833924.png)]

docker底层原理

​ docker是一个client-server结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问,dockerServer接收到dockerClient的指令,就会执行这个命令。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fDuS4vMA-1640831003011)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210122102352341.png)]

​ Docker为什么比linux快:

​ 1.docker有着比虚拟机更少的抽象层;

​ 2.docker是利用宿主机的内核,VM需要Guest OS;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-18jDCsDa-1640831003012)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210122102703780.png)]

​ 所以说,新建一个容器时,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,时间耗时在分钟级别,而docker是利用宿主机的内核,秒级;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KgPCsoL3-1640831003012)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210122102927813.png)]

4.Docker常用命令

4.1 镜像命令

#1)docker images 查看所有镜像 -a显示所有,-q只显示镜像id
	docker images -a -q
#2)docker search 搜索镜像 --filter搜索条件
	docker search mysql --filter=stars=3000 
#3)docker pull 镜像名[:tag] 下载镜像,默认最新版本,分层下载
	docker pull mysql:5.7
#4)docker rmi -f 镜像id 删除镜像
	docker rmi -f 
#5)删除所有镜像
	docker rmi -f $(docker images -aq)

4.2 容器命令

#1)下载centOS镜像测试
docker pull centos
#2)新建容器并启动
docker run [可选参数] image
#参数说明:
--name="name" #容器名称,用于区分容器
-d    		  #后台方式运行
-it			  #使用交互方式运行,进入容器查看内容
-p			  #指定容器的端口以及与主机映射端口 -p 8080:8080
-P			  #随机指定端口
#3)docker run -it centos /bin/bash  启动并进入容器
#4)exit 退出并停止容器
	Ctrl + P + Q 	#不停止,只退出容器
#5)docker ps 查看运行中的容器
	docker ps -a
#参数说明
	#不带参数代表列出所有正在运行的容器
-a	#代表列出所有正在运行的容器以及历史运行过的容器
-n=? #列出最近创建的容器,n限制个数
-q	#只显示容器的编号
#6)docker rm -f 容器id 删除容器 -f为强制删除
	docker rmi -f 
#5)删除所有容器
	docker rm -f $(docker ps -aq)
	docker ps -a -q|xargs docker rm
#6)容器启动/停止命令
	docker start 容器id
	docker restart 容器id
	docker stop 容器id
	docker kill 容器id

4.3 其它常用命令

#1)后台启动容器
	docker run -d 镜像名
	#问题:docker ps,发现容器立马停止了;
	#常见的坑:docker容器使用后台启动运行,就必须要有一个前台进程,当	#docker发现没有应用,就会自动停止;比如ngnix容器启动后,发现自己没		#有提供服务,就会立刻停止
#2)docker logs 查看日志
	docker logs -tf --tail num
	#参数说明:
	-t		#显示时间戳
	-f		#格式化
	--tail num		#显示日志行数
	#写shell脚本创建日志
	docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 1;done"

#3)docker top 容器id  查看容器中进程信息
#4) docker inspect 容器id		查看容器元数据
#5) docker exec -it 容器id bashShell		进入当前正在运行的容器
	docker exec -it a02da2f11a0d /bin/bash
	docker attach a02da2f11a0d
	#区别:
	#docker exec:进入容器后打开一个新的终端,可以执行其它操作
	#docker attach: 进入容器正在执行的终端,不会启动新的进程!
#6)docker cp 容器id  容器内路径  主机路径 	从容器内拷贝文件到主机上
#7) docker run -it --rm tomcat 用完即删
	

4.4 命令图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y5k4FL5a-1640831003013)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210122151817359.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHYGrgdC-1640831003014)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210122152012352.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2Bio3WV-1640831003014)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210122152049431.png)]

4.5 可视化

#portainer图形管理工具
docker run -d -p 8088:9000\
--restart=always -v /var/run/docker.sock:/var/run/docker.sock  --privileged=true portainer/portainer
#Rancher(适用于CI/CD)

5. Docker镜像

5.1 镜像定义

​ 镜像是一种轻量级、可独立运行的独立软件包,用于打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。

5.2 镜像加载原理

​ 1)UnionFS(联合文件系统)

​ Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于镜像基础(没有父镜像),可以制作各种具体的应用镜像。

​ 特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

​ 2)Docker镜像加载原理

​ docker镜像实际上是由一层层的文件系统组成,这种层级的文件系统叫做UnionFS。

​ bootfs(boot file system)主要包含bootloader和kernel,bootloader的主要作用是加载和引导kernel,Linux系统刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已经由bootfs转交给内核,此时系统也会卸载bootfs。

​ rootfs(root file system):在bootfs之上,包含的就是典型linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

5.3 commit镜像

#1)docker commit 提交容器成为新的一个镜像
#2)docker commit -m="注释" -a="作者名" 容器id 镜像名称:版本号

6.容器数据卷

6.1 定义

​ 需求:docker容器的数据可以持久化,容器之间可以有一个数据共享的技术,docker容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux中。也就是容器的持久化和同步操作,实现容器之间的数据共享。

6.2 使用数据卷

#1)直接使用命令来挂载 -v
	docker run -it -v 主机目录:容器内目录
	#测试mysql目录挂载
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

6.3 具名挂载和匿名挂载

# 匿名挂载  -v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx nginx
# 查看所有volume的情况
docker volume ls
# 具名挂载
docker run -d -P --name nginx02 -v 卷名:容器内路径 镜像名
# 查看卷
docker volume inspect 卷名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wsZBZK6q-1640831003014)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210126145955479.png)]

#所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data文件夹下面
#建议使用具名挂载
#如何确定是哪种方式挂载:
	-v  容器内路径 		 	   #匿名挂载
	-v  卷名:容器内路径		  #具名挂载
	-v	/宿主机路径:容器内路径:ro	#指定路径挂载,ro只读 readonly,一旦设置了权限,ro说明这个路径只能通过宿主机来操作,容器内部无法操作

6.4 Dockerfile

​ dockerfile就是用来构建docker镜像的构建文件,命令脚本,通过这个脚本可以生成镜像。

#1)编写dockerfile脚本命令,这里的每一行命令就是镜像的一层
FROM centos
volume ["volume01","volume02"]
CMD echo "----end---"
CMD /bin/bash
#2)执行脚本,生成镜像
docker build -f dockerfile路径 . -t 脚本名称:版本号
#经常使用该方式来在创建镜像的同时挂载卷,否则就需要手动挂载

6.5 数据卷容器

​ 容器之间进行数据共享以及同步:将子容器的目录挂载到父容器(数据卷容器)的目录中

#创建容器之间的数据卷挂载
docker run -it --name 子容器 --volumes--from 父容器 镜像名
	--volumes--from 			#就像extends一样,就算父容器被删除,子容器中的数据依旧持久化
	
#结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

7. dockerfile

7.1 dockerfile定义

​ dockerfile是用来构建docker镜像的文件,也是命令参数脚本!

​ 构建步骤:

  1. 编写一个dockerfile文件
  2. docker build构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库)

​ 基础知识:

  • ​ 每个保留关键字(指令)必须是大写字母;
  • ​ 执行顺序为从上到下;
  • ​ #表示注释;
  • ​ 每一个指令都会创建提交一个新的镜像层,并提交!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dh5OFUmE-1640831003015)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210126172810311.png)]dockerfile是面向开发的,项目发布、做镜像时就需要编写dockerfile文件。

步骤:开发、部署、运维

  • dockerfile:构建文件,定义了一切的步骤,源代码
  • dockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品;
  • docker容器:容器就是镜像运行起来提供服务器

7.2 dockerFile指令

FROM     			#基础镜像,一切从这里开始构建
MAINTAINER     		#镜像是谁写的,姓名+邮箱
RUN					#镜像构建时需要运行的命令
ADD					#步骤,添加内容文件,例如tomcat压缩包
WORKDIR				#镜像的工作目录
VOLUME				#挂载的目录
EXPOSE				#暴露的端口,跟-p一样
CMD					#指定容器启动时要运行的命令,只有最后一个生效,可被替代
ENTRYPOINT			#指定容器启动时要运行的命令,可以追加命令
ONBUILD				#当构建一个dockerfile时运行ONBUILD指令
COPY				#类似ADD,将文件拷贝到镜像中
ENV					#构建时设置环境变量
#自定义dockerfile文件构建centos镜像
FROM centos
MAINTAINER hjq<1111>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

#构建成功
Successfully built 3ab8f2e6d55e
Successfully tagged mycentos:latest

7.3 CMD和ENTRYPOINT的区别

CMD					#指定容器启动时要运行的命令,只有最后一个生效,可被替代
ENTRYPOINT			#指定容器启动时要运行的命令,可以追加命令

7.4 创建tomcat镜像

FROM centos
MAINTAINER hjq<152106>

COPY readme.txt /usr/local/readme.txt 

ADD jdk-8u241-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.30.tar.gz /usr/local/

RUN yum -y install vim
 
ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_241
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.30
ENV CATALINA_BASH /usr/loacl/apache-tomcat-9.0.30
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.30/bin/startup.sh  && tail -F /usr/local/apache-tomcat-9.0.30/logs/catalina.out 

V JAVA_HOME /usr/local/jdk1.8.0_241
ENV CLASSPATH J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/dt.jar: JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.30
ENV CATALINA_BASH /usr/loacl/apache-tomcat-9.0.30
ENV PATH P A T H : PATH: PATH:JAVA_HOME/bin: C A T A L I N A H O M E / l i b : CATALINA_HOME/lib: CATALINAHOME/lib:CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.30/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.30/logs/catalina.out


你可能感兴趣的:(容器,docker,docker,运维,linux)