本文共 5368 字,大约阅读时间需要 17 分钟。
一款产品从开发到上线,从操作系统,到运行环境、在到应用配置。作为开发和运维人员之间的这些工作是许多公司经常面临的问题。还有在产品后期不断有不同版本的迭代,这些不同版本环境的兼容,都是问题。
通俗讲:就是开发人员将代码、配置、开发的环境、数据等等都封装为一个个体(术语叫镜像),这样给运维去部署。通过docker安装tomcat镜像心得:(1)首先docker会有daemon.json文件问题(一般是没有这个文件,加上就可以了);(2)docker启动后访问拒绝;一般是操作系统的权限不够,简单就是直接su进入管理员权限(3)下面就是镜像的下载和启动,docker中容器启动后,由于是封闭的,所以注意容器端口、虚拟机端口、虚拟机外部端口这端口如果开通;(4)上面端口一般虚拟机端口和容器端口是没有打开关联,还有就是虚拟机端口和虚拟机外部端口没有打开关联(5)虚拟机端口和容器端口是没有打开关联——通过docker启动命令关联,但是注意先关闭防火墙,然后再启动docker,否则会有端口关联问题。
一些小问题:(1)docker启动会遇到提示没有daemon.json文件;所以在: https://blog.csdn.net/weixin_45496075/article/details/109123709 cd /etc/docker 目录下创建一个daemon.json文件 然后编辑该文件: { "registry-mirrors": ["https://registry.docker-cn.com"]}或者阿里镜像库{ "registry-mirrors": ["https://679xpnpz.mirror.aliyuncs.com"]}就可以了.(2)会提示permission denied———— https://www.cnblogs.com/informatics/p/8276172.htmldocker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。需要进入root用户: su 直接进入root账户。就可以了
上面基础问题解决了:还有一些如防火墙、端口、容器启停、容器内部目录的进入等问题;
nmap localhost 可以查看本地虚拟机对外暴露了那些端口。
docker三要素:仓库、镜像、容器。docker是一个解决运行环境、配置和应用容器虚拟化技术。docker就是将代码和运行环境,配置封装为一个个体(术语是镜像)的引擎技术。
docker特点: 应用之间耦合度很低:每个个体(镜像)都有自己的文件系统,所以相互之间是互不会影响。 docker既然可以将应用和该应用所需的环境绑定成一个镜像,所以docker虚拟化过程中环境只绑定自己需要的那些包,而共用的那些系统内核可以使用宿主机的内核。物尽其用。仓库:就是docker的镜像的集合
镜像:就是封装应用和环境的一个模板。类似于java的类。镜像是应用和该应用运行环境和配置信息的封装个体的抽象状态。 容器:是镜像的一个个实例。类似于java类创建的对象。容器也通常是镜像的运行实例,如一个镜像运行了三次,就创建了三个该镜像的容器。首先使用yum安装epel仓库,因为docker是由epel发布的,类似于java运行mysql,需要驱动包一样。安装docker所需要的依赖库epel
(1)yum install -y epel-release; 注意!! 如果安装不成功的话,提示不能检索到epel,需要修改:/etc/yum.repos.d/epel.repo文件中将第三行baseurl放开,将第四行注释centos系统版本太低升级方式: 1.yum update;
:因为docker是2014年才出现的技术,一些centos上不支持该技术服务。所以可以升级一下centos的内核版本(6.5以上都可以)。
上面安装失败终极大招:
yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm另一种方式(1)curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun另一种(2)curl -sSL https://get.daocloud.io/docker | sh然后如果显示错误:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?解决方式: 顺序执行下面两条然后就OK了。 systemctl daemon-reload systemctl restart docker
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://2d6k7x7j.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reload sudo systemctl restart docker(1)配置好后,重新启动docker服务:service docker restart; (2)查看镜像是否改变:ps -ef | grep docker; 该命令会显示指定服务的进程状态,会有指向阿里云的提示。 (3)uname -r 查看系统内核版本; docker -v查看docker的版本。
docker原理是:dcoker也是client-server结构系统。docker客户端的命令,操作服务端,如docker客户端运行docker run 镜像。这样服务端会运行该镜像,就生成一个容器了。docker客户端一般就在虚拟机的doc窗口,但是加了docker表示是docker的命令行命令。如linux下的ps查看linux的进程,而docker ps 是查看docker服务端的进程命令。
本质:docker的命令通过客户端接收,然后服务器上的守护进程接收到客户端命令后,真正使该服务器运行。简单分类:帮助命令、容器命令、镜像命令;
docker version(docker版本信息),docker info(docker的详细信息),docker --help;
-p 宿主机端口:容器服务的默认端口;如tomcat容器—— -p 1111:8080表示实际虚拟的物理端口是1111,映射为tomcat容器的默认端口8080; 前面1111端口是docker所在的虚拟机的物理端口,而后面8080是docker镜像的逻辑端口
docker run -it centos ;表示在docker上运行一个centos的实例(镜像),此时需要返回一个命令终端,用于和这个centos交互。
(1)docker run -it centos;表示后台启动centos容器,且会返回一个前台终端命令窗口,用于和centos容器交互。
docker run -d centos表示只是后台启动centos容器,前台没有交互窗口。docker 的机制默认如果容器没有前台命令交互就会立即关闭该后台服务(容器后台运行,就必须有一个前台进程)。所以docker ps 查看docker是否有进程是显示没有运行的进程的。 (2)查看docker上运行容器这个容器服务的日志 (3)查看某个容器内的进程:docker top 容器id。区别于docker ps 这个是docker内运行的那些容器进程。而这边docker top 容器id表示容器这个服务自己内部运行的自己服务的进程。应用容器虚拟化,核心在于容器自己提供的服务奥! (4)查看容器服务内部细节:docker inspect 容器id; (5)进入运行的容器的交互终端界面——上面运行容器同时以终端交互方式运行,然后exit、ctrl+p+q退出容器这个服务的终端窗口,如果再次进入呢?——docker exec -it 容器id bin/bash,docker exec -t表示在docker终端执行容器终端命令用于交互,然后进入容器的bin/bash。还有一种简单的直接进入容器终端——docker attach 容器id。 (6)将容器内的文件迁移到容器外的宿主机上;——docker cp 容器id:容器资源位置(源资源位置) 宿主机的资源位置(目的位置)。小结:
镜像构建一个容器实例后,可以对容器进行(1)启动、(2)停止、(3)重启、(4)通过终端进入容器交互、(5)查看运行的容器进程等操作。背景:启动一个远程下载的tomcat镜像,并启动该镜像为一个运行的容器,修改这个tomcat容器,删除这个tomcat的一个文档,然后制作成没有文档的tomcat镜像。
构建一个新的docker镜像docker commit -a="作者" -m="对新镜像的描述" 父镜像id(也即是当前修改的镜像) 新镜像名称(其中可用自定义版本号,但需要用冒号标识开:)
能干嘛?——容器中数据的持久化、容器间数据的共享。
创建容器数据卷的方式:docker run -it -v 宿主机目录A:容器中指定目录B centos【镜像名】表示启动一个镜像为容器,然后这个容器中目录B和外面的宿主机上的目录A是相通的。其中-v volume卷的意思上面是容器的持久化,那么容器间的数据共享呢?通过继承的设置实现容器间共享文件的功能容器A --volumn-from 容器B 表示容器A继承了容器B的数据卷关系。dockerFile是镜像模板的描述文件,类似于shell中脚本语言,通过脚本语言将镜像表示功能的逻辑过程以命令描述但它是用docker的语法来对docker镜像的描述文件。案例: