一、Docker概述
1.1.概念docker是一个开源的应用容器引擎,虚拟化软件,容器使用沙箱机制,相互之间不会有任何接口(可以解释为多个容器里面都部署了tomcat,且端口都是8080,只要宿主机容器软件端口映射,即可使用,多个容器里面的端口并不会冲突).
1.2.应用场景:
1)开发程序包可直接打包发布;
2)自动化测试环境组件安装可集成发布;
3)服务器环境部署,包括数据库或其他后台应用可直接打包,不需要每台机器都安装一次
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统
传统虚拟机:电脑主机—操作系统—虚拟机Vmware—创建虚拟服务器(基于硬件)–安装对应虚拟机重系统之上安装程序软件应用
Docker:电脑主机–操作系统—docker软件—Docker之上安装程序软件应用
Docker相较传统虚拟机的优势:启动速度快,占用体积小
Docker容器:docker容器类似虚拟机,可以执行包含启动,停止,删除等。每个容器间是相互隔离的。容器中会运行特定的运用,包含特定应用的代码及所需的依赖文件。可以把容器看作一个简易版的linux环境(包含root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
Docker镜像:docker 的镜像概念类似虚拟机的镜像。是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。( docker create <image -id > :为指定的镜像添加一个可读写层,构成一个新的容器;)镜像上安装了tomcat、或者nginx,称之为tomact镜像、或者nginx镜像
Docker仓库:
Docker客户端:与docker守护进程进行通信,实现对docker的管理操作,
镜像与容器的联系:容器 = 容器镜像 + 可读可写层;镜像是文件, 容器是进程。 容器是基于镜像创建的, 即容器中的进程依赖于镜像中的文件, 这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等
l Docker是一个应用容器引擎
l 应用场景:web的自动化打包发布;自动化测试、可持续集成;安装各种组件
l 与传统虚拟机比较:docker启动速度快,占用体积小
l 组成:docker守护进程;仓库;镜像;容器;docker客户端
1)、下载
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.1-ce.tgz2)、解压
tar -xvf docker-18.06.1-ce.tgz3)、将解压出来的docker文件内容移动到 /usr/bin/ 目录下
cp docker/* /usr/bin/4)、将docker注册为service
vi /etc/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity # Uncomment TasksMax if your systemd version supports it. # Only systemd 226 and above support this version. #TasksMax=infinity TimeoutStartSec=0 # set delegate yes so that systemd does not reset the cgroups of docker containers5)、启动
chmod +x /etc/systemd/system/docker.service #添加文件权限并启动docker systemctl daemon-reload #重新加载配置文件 systemctl start docker #启动Docker systemctl enable docker.service #设置开机自启6)、验证
systemctl status docker #查看Docker状态 docker -v #查看Docker版本 systemctl start docker #启动docker systemctl restart docker #重启dockerustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustcdockermirror的优势之一就是不需要注册,是真正的公共服务。https://lug.ustc.edu.cn/wiki/mirrors/help/docker
1、编辑文件/etc/docker/daemon.json 配置中国地区docker加速器
#执行如下命令: mkdir /etc/docker vi /etc/docker/daemon.json2、在文件中加入下面内容
{ "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] }3.docker启动与停止命令
#查看docker服务状态 systemctl status docker #启动docker服务 systemctl start docker #停止docker服务 systemctl stop docker #重启docker服务 systemctl restart docker #设置开机启动docker服务 systemctl enable dockerl 更新yum源为ustc
l 安装docker
l 更新docker的镜像源为ustc;
l 使用docker命令操作docker
需求更新yum源和镜像源安装docker;安装之后可以使用docker -v
| docker images #查看镜像
| ------------------------------------------------------------ | | docker search #搜索镜像 | ------------------------------------------------------------ | | docker pull 镜像名称:版本号(若不指定拉取最新) #拉取镜像 | | docker rmi #删除镜像 | | docker rmi ‘docker images –q’ #删除本地所有镜像 (慎用) |
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustcdockermirror的优势之一就是不需要注册,是真正的公共服务。https://lug.ustc.edu.cn/wiki/mirrors/help/docker
1、编辑文件/etc/docker/daemon.json 配置中国地区docker加速器
#执行如下命令: mkdir /etc/docker vi /etc/docker/daemon.json2、在文件中加入下面内容
{ "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] }3.docker启动与停止命令
#查看docker服务状态 systemctl status docker #启动docker服务 systemctl start docker #停止docker服务 systemctl stop docker #重启docker服务 systemctl restart docker #设置开机启动docker服务 systemctl enable docker命令:
docker run #参数说明: -i :表示运行容器 -t :表示容器启动后会进入其命令行,加入这两个参数后,容器创建就能登录进去,即分配一个伪终端。--name:为创建的容器命名 -v :表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i-t两个参数,创建后就会自动进去容器)。 -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射创建交互式容器:
docker run -it --name=mycentos7 centons:7 /bin/bash #创建交互式容器 exit 退出| docker run -it --name=mycentos7 centons:7 /bin/bash 创建交互式容器 exit 退出 |
| ------------------------------------------------------------ | | 小结:启动交互式容器之后是直接进入容器终端;可以查看容器的文件结构;使用exit命令则会退出终端并且停止容器。 |
创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器,命令如下:
目标:
1)创建并启动docker容器,可以在后台运行:
2)在创建交互式容器之后如果退出的话,容器处于停止状态,可以使用命令再次启动容器,使用命令进入容器并操作
#创建并启动守护式容器 docker run -di --name=mycentos2 centos:7 #启动容器后在进入容器 docker exec -it mycentos2 /bin/bash| 创建并启动守护式容器 docker run -di --name=mycentos2 centos:7
| ------------------------------------------------------------ | | 启动容器后在进入容器 docker exec -it mycentos2 /bin/bash | | 小结:守护式容器在启动之后会一直在后台运行,即使进入容器之后执行exit命令也不会停止容器; 适用于需要长期运行容器的情况 |
客户端电脑、宿主机、容器之间的联系
可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器时添加-v参数,后边为宿主机目录:容器目录,
例如:
docker run -di -v /usr/local/test/:/usr/local/test --name=mycentos3 centos:7 #创建1inux宿主机器要挂载的目录 mkdir /usr/1ocal/test #创建并启动容器mycentos3,并挂载1inux中的/usr/loca1/test目录到容器的/usr/local/test;也就是在Linux中的/usr/local/test中操作相当于对容器相应目录操作 docker run -di -v /usr/local/test/:/usr/local/test --name=mycentos3 centos:7 #在linux下创建文件 touch /usr/local/test/def.txt #进入容器 docker exec -it mycentos3 /bin/bash查看
可以通过以下命令查看容器运行的各种数据docker inspect容器名称(容器id)
#在linux宿主机下查看mycentos3的ip等详细信息 docker inspect mycentos3分析:
拉取mysql镜像
创建并启动守护式容器
在容器中操作mysql
使用图形界面工具(windows)操作在docker中的mysql,在创建mysql容器时使用-p指定端口映射试下链接
在创建容器的时候mysql的root用户可以指定远程访问的密码
出现如下错误解决方法:
这里提示网络不可用,所以宿主机无法连接数据库
#解决办法:现在输入这个命令 vi /usr/lib/sysctl.d/00-system.conf #在末尾添加这句: net.ipv4.ip_forward=1 #重启network服务: systemctl restart network #先把刚才那个mysql的容器删除,重新创建容器
参考:https://blog.csdn.net/qq_43301158/article/details/89363101
注意事项:
1)mysql密码在创建容器时已指定
2)连接失败
查看2章节操作
分析:
将项目文件上传到容器中的tomcat目录(webapps)
创建容器的手可以指定-v进行目录挂载,tomcat在容器中的目录(/usr/local/tomcat/webapps)
可以通过外部浏览器访问容器中的项目
创建容器的时候可以指定-p进行端口映射
http://192.168.253.176:9000
分析:
l nginx的默认访问端口是:80
l 在创建容器的时候需要进行端口映射,指定-p,映射的端口80
http://192.168.253.176
如果宿主机80端口被占用,那么在指定映射的时候可以改变宿主机的端口映射,在访问时也需要带端口号
分析:
拉取redis镜像
Redis默认端口是6379,如果需要外部访问则可以使用端口映射
连接redis:①使用命令行客户端②使用图形界面工具
1.1.概念
Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的docker应用工具。使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务。
1.2.组成
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container).Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例.
服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose所完成的任务.
项目(project):由一组关联的应用容器组成的一个完成业务单元,在docker-compose.yml中定义.即是Compose的一个配置文件可以解析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如:要部署一个Web项目,除了Web服务容器,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等
docker-compose可以实现一次启动多个容器;通过配置docker-compose模板文件(docker-compose.yml),在这个配置文件中配置哥哥容器及相关的依赖
1) 编写模板文件
2) 创建并启动docker-compose项目(模板文件所在的目录,docker-compose.yml)
3) 测试
编写模板文件
#建立目录: mkdir -p /usr/local/mycompose #创建模板文件: 注意 :和- 后面都要有一个空格 cd /usr/local/mycompose vi docker-compose.yml #模板文件 version: "3" services: redis1: image: redis ports: - "6379:6379" container_name: "redis1" networks: - dev mysql1: image: centos/mysql-57-centos7 environment: MYSQL_ROOT_PASSWORD: "root" ports: - "3306:3306" container_name: "mysql1" networks: - dev web1: image: tomcat ports: - "9090:8080" container_name: "web1" networks: - dev - pro networks: dev: driver: bridge pro: driver: bridge #启动:在当前目录下执行 docker-compose up -ddocker-compose可以配置一个模板文件实现一次可以启动多个容器,运行时候可以执行一个up 则会创建并启动模板文件中的各个服务
涉及命令有
docker commit将容器保存为镜像docker save将镜像备份为tar文件docker load根据tar文件恢复为镜像镜像保存及创建命令docker save -o tomcat.tar tomcat:latest在外网linux下拉取镜像之后,保存镜像到本地docker load -i tomcat.tar tomcat镜像创建(离线)容器创建镜像命令docker commit nginx nginx:test将名称为nginx的容器创建为版本为test的nginx的镜像前面的课程中已经知道了,要获得镜像,可以从Docker仓库中进行下载。那如果我们想自己开发一个镜像,那该如何做呢?答案是:Dockerfe
Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfie文件并根据Dockerfile文件的描述来构建镜像。
Dockerfile文件内容一般分为4部分:
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行的指令
分析:假设在centos7作为基础镜像上,添加jdk1.8并构建一个包含jdk1.8的centos7心镜像
–Dockerfile可以实现 ;Dockerfile是有一系列命令和参数构成的文本文件,在文件中可以指定各个组件资源和运行命令等
实现步骤
1) 拉取centos7镜像
2) 上次jdk1.8;
3) 编写Dockerfile文件;
4) 构建镜像
5) 测试(基于新镜像创建并运行容器,运行jave-version)
#创建目录: mkdir -p /usr/local/java cd /usr/local/java/ #下载jdk-8u162-linux-x64.tar.gz并上传至指定目录下 #在/usr/local/java目录下创建Dockerfile文件,内容如下 FROM centos:7 MAINTAINER WANGHUI WORKDIR /usr RUN mkdir /usr/local/java ADD jdk-8u162-linux-x64.tar.gz /usr/local/java ENV JAVA_HOME /usr/local/java/jdk1.8.0_162 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PAT #执行命令构建镜像 (不要忘记最后那个 . 代表当前目录) docker build -t='jdk1.8' .Docker官方的Dockerhub(https://hub.docker.om)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
私有仓库搭建步骤:
#拉取私有仓库镜像 docker pull registry #启动私有仓库容器 docker run –di --name=registry –p 5000:5000registry 打开浏览器输入地址 http://宿主机ip:5000/v2/_catalog, 看到 {"repositories":["1"]} 表示私有仓库搭建成功 #修改daemon.json vi /etc/docker/daemon.json #在上述文件中添加一个key,保存退出,此步用于让docker信任私有仓库地址, 注意将宿主机ip修改为本机真是ip "insecure-registries":["宿主机ip:5000"] #重启docker服务 systemctl restart docker #启动私有仓库容器 registry docker start registry小结:
拉取registry镜像;基于镜像创建私有仓库容器;需要修改docker的配置文件指定私有仓库地址在访问私有仓库http://ip:5000/v2/_catalog
操作步骤:
#标记镜像为私有仓库的镜像 docker tag jdk1.8 宿主机ip:5000/jdk1.8 #再次启动私有仓库容器 docker restart registry #上传标记的镜像 docker push 宿主机ip:5000/jdk1.8打开网址查看仓库效果
小结:
将本地镜像打标签(标记本地镜像为一个私有仓库中的镜像);将打了标签的镜像推送到私有仓库。
特殊:因为私有仓库所在的服务器已经存在相关镜像;所以先删除;请指定镜像名,而不是id
docker rmi 192.168.253.176:5000/jdk1.8 docker pull 192.168.253.176:5000/jdk1.8
私有仓库与拉取镜像的服务器是在同一台机器上:直接拉取镜像:docker pull 私有仓库地址/镜像名称
私有仓库与拉取镜像的服务器不在同一台机器上:需要去修改docker的配置文件,指定私有仓库;在执行拉取镜像的命令
如果本地存在同名的镜像需要先删除镜像后拉取
私有仓库与拉取镜像的服务器是在同一台机器上:直接拉取镜像:docker pull 私有仓库地址/镜像名称
私有仓库与拉取镜像的服务器不在同一台机器上:需要去修改docker的配置文件,指定私有仓库;在执行拉取镜像的命令
如果本地存在同名的镜像需要先删除镜像后拉取