教你做吃的网站,通信工程建设网站,房屋3d设计软件,ios网站开发工具前言
在微服务大量应用的互联网时代#xff0c;经常能看到docker的身影。作为docker的爱好者#xff08;在服务器安装MySQL#xff0c;Redis。。。我用的都是docker#xff09;#xff0c;我也会持续深入学习和认识docker。
本篇博客再次介绍docker的基本概念#xff0…
前言
在微服务大量应用的互联网时代经常能看到docker的身影。作为docker的爱好者在服务器安装MySQLRedis。。。我用的都是docker我也会持续深入学习和认识docker。
本篇博客再次介绍docker的基本概念拆解docker的结构介绍常用的相关命令给出了制作镜像的两种方式并给出操作案例。
其他相关的docker的博客文章如下
Docker——认识Docker 常用命令 Linux中安装docker 常见问题及其解决SpringBoot项目部署Docker——通过Dockerfile将打包好的jar包创建成镜像 在IDEA中配置docker一键启动容器 用swagger进行测试 目录 前言引出一、认识Docker1、docker的概念2、Linux中安装Docker3、docker相关概念 二、Docker相关命令1、进程命令2、镜像容器命令 三、Docker镜像结构1、Linux文件系统组成2、Docker镜像原理 四、Docker镜像制作1、普通方式案例一制作centos-java镜像1、首先创建一个centos容器2、安装JDK3、配置/etc/bashrc4、制作镜像 2、dockerfile方式案例一自定义centos7镜像案例二定义dockerfile文件构建镜像发布springboot项目 总结 引出 1.介绍docker的基本概念拆解docker的结构 2.常用的相关命令进程命令和容器镜像命令 3.制作镜像的两种方式并给出操作案例。
一、认识Docker
1、docker的概念
1、Docker 是一个开源的应用容器引擎 2、诞生于 2013 年初基于 Go 语言实现 dotCloud 公司出品后改名为Docker Inc 3、Docker 是一个可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器引擎好比汽车发动机然后发布到任何流行的 Linux 机器上。 4、容器是完全使用沙箱机制相互隔离 5、容器性能开销极低。 6、Docker 从 17.03 版本之后分为 CECommunity Edition: 社区版 和 EEEnterprise Edition: 企业版 docker扮演的是图中鲸鱼的角色而鲸鱼之上的集装箱就是一个个容器容器中是我们开发的应用程序不仅限于web应用每个容器都有自己独立的环境环境设置、网络、文件系统…互不干扰。而每个箱子又可以打包成一个新的镜像放到其它服务器的docker环境中直接运行不再需要重复安装程序运行环境
2、Linux中安装Docker
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上 官网https://www.docker.com
可以参考以下博客文章
Docker——认识Docker 常用命令 Linux中安装docker 常见问题及其解决
#yum 包更新到最新
yum update -y
#安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/dockerce.
repo
# 安装docker
yum install -y docker-ce
#查看docker版本验证是否验证成功
docker -v3、docker相关概念 镜像ImageDocker 镜像Image就相当于是一个 root 文件系统。比如官方镜像ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器Container镜像Image和容器Container的关系就像是面向对象程序设计中的类和对象一样镜像是静态的定义容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。仓库Repository仓库可看成一个代码控制中心用来保存镜像。
二、Docker相关命令
1、进程命令
systemctl start docker #启动docker服务
systemctl stop docker #停止docker服务
systemctl restart docker #重启docker服务
systemctl status docker #查看docker服务状态
systemctl enable docker #开机启动docker服务2、镜像容器命令
(1)docker pull
拉取镜像:从Docker仓库下载镜像到本地镜像名称格式为 名称:版本号如果版本号不指定则是最新的版本如果不知道镜像版本可以去docker hub 搜索对应镜像查看。
#docker pull 镜像名称:版本号
docker pull redis:5.0
docker pull centos:7
docker pull mysql:5.6 | docker pull mysql:8.0.25
docker pull tomcat:8
docker pull nginx2docker run docker run -i以交互模式运行容器-t为容器重新分配一个伪输入终端—name :容器名称—privileged: 设置容器公开权限默认为true-p :映射端口 linux端口: 容器内置端口(mysql默认端口为3306)-v : linux挂载文件夹/文件和容器内路径的映射-e: 容器的环境变量设置mysql默认用户名密码)-d: 后台运行容器并返回容器ID 修改时区,日志正常-v /etc/localtime:/etc/localtime \ docker run -it \
--name redis_6389 \
--privileged \
-p 6389:6379 \
--network pet_docker_net \
--ip 172.18.12.80 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/software/6389/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/software/6389/data/:/data \
-v /usr/local/software/6389/log/redis.log:/var/log/redis.log \
-d redis \
/usr/local/etc/redis/redis.conf
3日志查看
# docker logs --tail 行数 -f 容器名 #查看某个容器末尾300行的日志内容
docker logs --tail 300 -f app-jar4文件拷贝
#将主机/root/123.war文件拷贝到容器96f7f14e99ab的/root目录下
docker cp /root/123.war 96f7f14e99ab:/root/
#将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中
docker cp 96f7f14e99ab:/root /tmp/三、Docker镜像结构
1、Linux文件系统组成
Linux文件系统组成由bootfs和rootfs两部分
bootfs包含bootloader引导加载程序和 kernel内核rootfs root文件系统包含的就是典型 Linux 系统中的/dev/proc/bin/etc等标准目录和文件不同的linux发行版bootfs基本一样而rootfs不同如ubuntucentos等
Linux——认识Linux的目录结构 常用命令 vim命令 权限及其控制 防火墙命令 自定义命令
思考 Docker 镜像本质是什么
Docker 中一个centos镜像为什么只有200MB而一个centos操作系统的iso文件要几个个GDocker 中一个tomcat镜像为什么有500MB而一个tomcat安装包只有70多MB
2、Docker镜像原理
Docker镜像是由一层一层的文件系统叠加而成最底端是 bootfs并使用宿主机的bootfs 第二层是 root文件系统rootfs称为base image然后再往上可以叠加其他的镜像文件这种层级的文件系统被称之为UnionFS统一文件系统Union File System技术能够将不同的层整合成一个文件系统为这些层提供了一个统一的视角这样就隐藏了多层的存在在用户的角度看来只存在一个文件系统
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像最底部的镜像成为基础镜像当从一个镜像启动容器时Docker会在最顶层加载一个读写文件系统作为容器 Docker 镜像本质是一个分层文件系统我们下载tomcat镜像大小是600MB是因为里面还包含了jdk和centos这两个镜像层所以很大另外需要注意一点的是这个tomcat镜像里面包含了jdk镜像和centos基础镜像为什么基础镜像是centos而不是ubuntu呢这是由做这个tomcat镜像的发行商决定的。我们下载centos镜像很小是因为而centos镜像层复用了宿主机的bootfs下载的只有rootfs所以centos是很小的 说明docker内核和宿主机共内核也就是bootfs至于rootfs发行版本可以使和宿主机一样是centos、也可以是ubuntu或者其他的如docker pull centos然后做一个容器那么docker的发行版本是centos进入docker容器通过输入命令 cat /etc/redhat-release 可以查看 docker pull ubuntu然后做一个容器则发行版本是ubuntu 四、Docker镜像制作 1、普通方式
将新的镜像转成压缩文件给测试人员测试人员把我们的压缩文件还原成一个新的镜像
docker commit 容器id 镜像名称:版本号 #把容器做成镜像
docker save -o 压缩文件名称 镜像名称:版本号 #把镜像做成压缩包放到宿主机的某个位置
docker load –i 压缩文件名称 #别人测试人员加载镜像压缩包注意事项容器转为镜像如果容器有挂载的内容做成新镜像的时候挂载的内容是不会载入到镜像里面的 案例一制作centos-java镜像
1、首先创建一个centos容器
docker pull centos:7.9.2009
docker run -it --namecentos centos:7.9.2009 /bin/bash2、安装JDK
下载jdk-8u151-linux-x64.tar.gz到容器的home目录里面
wget http://xxx/jdk-8u151-linux-x64.tar.gz
tar -xzvf jdk-8u151-linux-x64.tar.gz
vi /etc/profile在最下面加上
export JAVA_HOME/home/jdk1.8.0_151
export CLASSPATH.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools
.jar
export PATH$PATH:$JAVA_HOME/bin使配置生效
source /etc/profile检查jdk
java -version3、配置/etc/bashrc
重启后环境变量仍生效在/etc/bashrc最下面加上
export JAVA_HOME/home/jdk1.8.0_371
export CLASSPATH.:$JAVA_HOME/lib
export PATH$PATH:$JAVA_HOME/bin由于每次启动终端的时候都会执行 /etc/bashrc 所以可以把source /etc/profile 命令写入到 /etc/bashrc 文件中实现环境变量立刻全面生效的效果。
退出容器
exit4、制作镜像
把centos7容器做成镜像
docker commit 6598a89db5f6 centos7-java8:1.0
docker images #可以查看到centos7-java8:1.0镜像把镜像做成压缩包 放到宿主机的某个位置
docker save -o centos7-java8.tar centos7-java8:1.0
#-o:output 压缩文件保存到/root目录下把压缩文件载入镜像第三方载入该压缩包
docker load -i centos7-java8.tar #镜像加载 -i input
docker images用centos7-java8:1.0镜像做容器
docker run -id --namecentos7-java8 centos7-java8:1.0
docker exec -it centos7-java8 /bin/bash #进入容器
#或者启动并进入容器
docker run -it --namecentos7-java8 centos7-java8:1.0 /bin/bash2、dockerfile方式
它是用来制作docker镜像的一个文本文件,文件包含了一条条的指令每一条指令构建一层基于基础镜像最终构建出一个新的镜像
对于开发人员可以为开发团队提供一个完全一致的开发环境对于测试人员可以直接拿开发时所构建的镜像或者用Dockerfile文件构建一个新的镜像开始工作了对于运维人员在部署时可以实现应用的无缝移植
关键字作用备注FROM指定父镜像指定dockerfile基于那个image构建MAINTAINER作者信息用来标明这个dockerfile谁写的LABEL标签用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看RUN执行命令执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]CMD容器启动命令提供启动容器时候的默认命令 和ENTRYPOINT配合使用 格式CMD command param1 param2 或者 CMD [“command” ,“param1”,“param2”]ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用COPY复制文件build的时候复制文件到image中ADD添加文件build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务, ADD 源路径 目标路径ENV环境变量指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV namevalueARG构建参数构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数VOLUME定义外部可以挂载的数据卷指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]EXPOSE暴露端口定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露 端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udpWORKDIR工作目录指定容器内部的工作目录 如果没有创建则自动创建 如果指定 使用的是绝对地址 如果不是 / 开头那么是在上一条workdir的路径的相对路径USER指定执行用户指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户HEALTHCHECK健康检查指定监测当前容器的健康监测的命令 基本上没用 因为很多时候应用本身有健康监测机制ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行 FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像用处也不怎么大STOPSIGNAL发送信号量到宿主机该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell
案例一自定义centos7镜像
1、默认登录路径为 /usr 2、可以使用vim 步骤1创建centos-dockerfile文件
mkdir docker-file
cd docker-file
[rootlocalhost docker-file]# vim centos-dockerfile步骤2文件内容如下
FROM centos:7 #原镜像
MAINTAINER tianju tianjutianju.cn
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash说明 定义父镜像FROM centos:7 定义作者信息MAINTAINER tianju tianjutianju.cn 执行安装vim命令 RUN yum install -y vim 定义默认的工作目录WORKDIR /usr 定义容器启动执行的命令CMD /bin/bash
步骤3通过dockerfile文件构建镜像 语法docker build –f dockerfile的文件路径 –t 镜像名称:版本 . docker build -f ./centos-dockerfile -t my_centos:1 .
docker images注意事项 利用当前centos-dockerfile文件构建镜像 -t my_centos:1 指定新镜像的名称和版本, 后面的 . 不能省略 参数-f 表示dockerfile -t 表示tag 案例二定义dockerfile文件构建镜像发布springboot项目
步骤1创建dockerfile文件并编写内容
vim springboot-dockerfile编写如下内容
FROM java:8
MAINTAINER woniuwoniuwoniu.cn
ADD springboot.jar app.jar
CMD java -jar /app.jar说明 ADD springboot.jar app.jar 表示把宿主机的springboot.jar复制到镜像里并更名为app.jar,当用镜像做容器时app.jar默认在容器的根目录
步骤2通过dockerfile构建镜像
docker build -f ./springboot-dockerfile -t springboot-app:1.0 .步骤3通过springboot-app:1.0镜像创建容器
docker run -it --nameapp -p 8080:8080 springbootapp:1.0
docker logs --tail 100 -f app #查看app容器的日志末尾100行总结
1.介绍docker的基本概念拆解docker的结构 2.常用的相关命令进程命令和容器镜像命令 3.制作镜像的两种方式并给出操作案例。