做背景音乐的版权网站,临沂网站制作计划,深圳网站专业建设公司,上市公司网站建设评价文章目录 初识 DockerDocker 介绍Docker与虚拟机Docker架构安装 Docker Docker 基本操作镜像相关命令容器相关命令数据卷 Dockerfile 自定义镜像镜像结构Dockerfile DockerComposeDockerCompose介绍安装DockerCompose Docker镜像仓库常见镜像仓库服务私有镜像仓库 初识 Docker … 文章目录 初识 DockerDocker 介绍Docker与虚拟机Docker架构安装 Docker Docker 基本操作镜像相关命令容器相关命令数据卷 Dockerfile 自定义镜像镜像结构Dockerfile DockerComposeDockerCompose介绍安装DockerCompose Docker镜像仓库常见镜像仓库服务私有镜像仓库 初识 Docker
Docker 介绍
大型项目组件较多运行环境也较为复杂部署时会碰到一些问题
依赖关系复杂容易出现兼容性问题开发、测试、生产环境有差异 Docker如何解决依赖的兼容问题的
将应用的Libs函数库、Deps依赖、配置与应用一起打包将每个应用放到一个隔离容器去运行避免互相干扰 内核与硬件交互提供操作硬件的指令 系统应用封装内核指令为函数便于程序员调用 用户程序基于系统函数库实现功能 Ubuntu和CentOS都是基于Linux内核只是系统应用不同提供的函数库有差异 Docker如何解决不同系统环境的问题
Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包Docker运行到不同操作系统时直接基于打包的库函数借助于操作系统的 Linux 内核来运行 Docker如何解决大型项目依赖关系复杂不同组件依赖的兼容性问题
Docker允许开发中将应用、依赖、函数库、配置一起打包形成可移植镜像Docker应用运行在容器中使用沙箱机制相互隔离
Docker如何解决开发、测试、生产环境有差异的问题
Docker镜像中包含完整运行环境包括系统函数库仅依赖系统的Linux内核因此可以在任意Linux操作系统上运行 Docker与虚拟机
虚拟机virtual machine是在操作系统中模拟硬件设备然后运行另一个操作系统比如在 Windows 系统里面运行 Ubuntu 系统这样就可以运行任意的Ubuntu应用了。 Docker和虚拟机的差异
docker是一个系统进程虚拟机是在操作系统中的操作系统docker体积小、启动速度快、性能好虚拟机体积大、启动速度慢、性能一般
Docker架构
镜像和容器
镜像ImageDocker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起称为镜像。 容器Container镜像中的应用程序运行后形成的进程就是容器只是Docker会给容器做隔离对外不可见。 Docker和DockerHub
DockerHubDockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。国内也有类似于DockerHub 的公开服务比如 网易云镜像服务、阿里云镜像库等。 Docker是一个CS架构的程序由两部分组成
服务端(server)Docker守护进程负责处理Docker指令管理镜像、容器等客户端(client)通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。 镜像
将应用程序及其依赖、环境、配置打包在一起
容器
镜像运行起来就是容器一个镜像可以运行多个容器
Docker结构
服务端接收命令或远程请求操作镜像或容器客户端发送命令或者请求到Docker服务端
DockerHub
一个镜像托管的服务器类似的还有阿里云镜像服务统称为DockerRegistry
安装 Docker
Docker 分为 CE 和 EE 两大版本。CE 即社区版免费支持周期 7 个月EE 即企业版强调安全付费使用支持周期 24 个月。
Docker CE 分为 stable test 和 nightly 三个更新频道。
官方网站上有各种环境下的 安装指南这里主要介绍 Docker CE 在 CentOS上的安装。
CentOS安装Docker
Docker CE 支持 64 位版本 CentOS 7并且要求内核版本不低于 3.10 CentOS 7 满足最低内核的要求所以我们在CentOS 7安装Docker。
卸载可选
如果之前安装过旧版本的Docker可以使用下面命令卸载
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce安装docker
首先需要大家虚拟机联网安装yum工具
yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken然后更新本地镜像源
# 设置docker镜像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i s/download.docker.com/mirrors.aliyun.com\/docker-ce/g /etc/yum.repos.d/docker-ce.repoyum makecache fast然后输入命令
yum install -y docker-cedocker-ce为社区免费版本。稍等片刻docker即可安装成功。
启动docker
Docker应用需要用到各种端口逐一去修改防火墙设置。非常麻烦因此建议大家直接关闭防火墙
启动docker前一定要关闭防火墙后
启动docker前一定要关闭防火墙后
启动docker前一定要关闭防火墙后
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld通过命令启动docker
systemctl start docker # 启动docker服务systemctl stop docker # 停止docker服务systemctl restart docker # 重启docker服务然后输入命令可以查看docker版本
docker -v如图 配置镜像加速
docker官方镜像仓库网速较差我们需要设置国内镜像服务
参考阿里云的镜像加速文档https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
CentOS 7 安装DockerCompose
下载
Linux下需要通过命令下载
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m /usr/local/bin/docker-compose如果下载速度较慢或者下载失败可以使用课前资料提供的docker-compose文件 上传到/usr/local/bin/目录也可以。
修改文件权限
修改文件权限
# 修改权限
chmod x /usr/local/bin/docker-composeBase自动补全命令
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose /etc/bash_completion.d/docker-compose如果这里出现错误需要修改自己的hosts文件
echo 199.232.68.133 raw.githubusercontent.com /etc/hostsDocker镜像仓库
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址https://hub.docker.com/_/registry
简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库具备仓库管理的完整功能但是没有图形化界面。
搭建方式比较简单命令如下
docker run -d \--restartalways \--name registry \-p 5000:5000 \-v registry-data:/var/lib/registry \registry命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry命令如下
version: 3.0
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE传智教育私有仓库- REGISTRY_URLhttp://registry:5000depends_on:- registry配置Docker信任地址
我们的私服采用的是http协议默认不被Docker信任所以需要做一个配置
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容
insecure-registries:[http://192.168.150.101:8080]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart dockerDocker 基本操作
镜像相关命令
镜像名称一般分两部分组成[repository]:[tag]。在没有指定tag时默认是latest代表最新版本的镜像 docker build 构建镜像docker push 推送镜像到服务docker pull 从服务拉取镜像docker images 查看镜像docker rmi 删除镜像docker save 保存镜像为一个压缩包docker load 加载压缩包为镜像 从DockerHub中拉取一个nginx镜像并查看
首先去镜像仓库搜索nginx镜像比如DockerHub: 根据查看到的镜像名称拉取自己需要的镜像通过命令docker pull nginx 通过命令docker images 查看拉取到的镜像 利用 docker save 将 nginx 镜像导出磁盘然后再通过load加载回来
步骤一利用 docker xx --help 命令查看 docker save 和 docker load 的语法
步骤二使用 docker save 导出镜像到磁盘
步骤三使用 docker load 加载镜像
镜像操作有哪些
docker imagesdocker rmidocker pulldocker pushdocker savedocker load
去 DockerHub 搜索并拉取一个 Redis 镜像
去DockerHub搜索Redis镜像查看Redis镜像的名称和版本利用docker pull命令拉取镜像利用docker save命令将 redis:latest打包为一个redis.tar包利用docker rmi 删除本地的redis:latest利用docker load 重新加载 redis.tar文件
容器相关命令 创建运行一个Nginx容器
步骤一去 docker hub 查看 Nginx 的容器运行命令
docker run --name mn -p 80:80 -d nginx命令解读
docker run 创建并运行一个容器--name : 给容器起一个名字比如叫做mn-p 将宿主机端口与容器端口映射冒号左侧是宿主机端口右侧是容器端口-d后台运行容器nginx镜像名称例如nginx 通过映射端口访问容器 docker run 命令的常见参数有哪些
--name指定容器名称-p指定端口映射-d让容器后台运行
查看容器日志的命令
docker logs添加 -f 参数可以持续查看日志
查看容器状态
docker ps
进入Nginx容器修改HTML文件内容添加“xm欢迎您”
步骤一进入容器。进入我们刚刚创建的nginx容器的命令为
docker exec -it mn bash
命令解读
docker exec 进入容器内部执行一个命令-it : 给当前进入的容器创建一个标准输入、输出终端允许我们与容器交互mn 要进入的容器的名称bash进入容器后执行的命令bash是一个linux终端交互命令
步骤二进入 nginx 的 HTML 所在目录 /usr/share/nginx/html
cd /usr/share/nginx/html
步骤三修改 index.html 的内容
sed -i s#Welcome to nginx#xm欢迎您#g index.html
sed -i s#head#headmeta charsetutf-8#g index.html修改成功 查看容器状态
docker ps 添加 -a 参数查看所有状态的容器
删除容器
docker rm不能删除运行中的容器除非添加 -f 参数
进入容器
命令是 docker exec -it [容器名] [要执行的命令]exec 命令可以进入容器修改文件但是在容器内修改文件是不推荐的
创建并运行一个 redis 容器并且支持数据持久化
步骤一到 DockerHub 搜索 Redis 镜像 步骤二查看 Redis 镜像文档中的帮助信息 步骤三利用 docker run 命令运行一个Redis容器
docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes步骤一进入redis容器
docker exec -it redis bash 步骤二执行 redis-cli 客户端命令
redis-cli 步骤三设置数据 num666
set num 666 数据卷
容器与数据耦合的问题 数据卷volume 是一个虚拟目录指向宿主机文件系统中的某个目录。 数据卷操作的基本语法如下
docker volume [COMMAND]docker volume 命令是数据卷操作根据命令后跟随的command来确定下一步的操作
create 创建一个volumeinspect 显示一个或多个volume的信息ls 列出所有的volumeprune 删除未使用的volumerm 删除一个或多个指定的volume
创建一个数据卷并查看数据卷在宿主机的目录位置
创建数据卷
docker volume create html
查看所有数据
docker volume ls 查看数据卷详细信息卷
docker volume inspect html 数据卷的作用
将容器与数据分离解耦合方便操作容器内数据保证数据安全
数据卷操作
docker volume createdocker volume lsdocker volume inspectdocker volume rmdocker volume prune
我们在创建容器时可以通过 -v 参数来挂载一个数据卷到某个容器目录
docker run \--name mn \-v html:/root/html \-p 8080:80nginx \docker run 就是创建并运行容器 -- name mn 给容器起个名字叫mn -v html:/root/htm 把html数据卷挂载到容器内的/root/html这个目录中 -p 8080:80 把宿主机的8080端口映射到容器内的80端口 nginx 镜像名称 创建一个nginx容器修改容器内的html目录内的index.html内容
需求说明上个案例中我们进入nginx容器内部已经知道nginx的html目录所在位置/usr/share/nginx/html 我们需要把这个目录挂载到html这个数据卷上方便操作其中的内容。 提示运行容器时使用 -v 参数挂载数据卷
步骤
创建容器并挂载数据卷到容器内的HTML目录
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx进入html数据卷所在位置并修改HTML内容
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html数据卷挂载方式
-v volumeName: /targetContainerPath如果容器运行时volume不存在会自动被创建出来
创建并运行一个MySQL容器将宿主机目录直接挂载到容器
提示目录挂载与数据卷挂载的语法是类似的
-v [宿主机目录]:[容器内目录]-v [宿主机文件]:[容器内文件]
实现思路如下
在将课前资料中的 mysql.tar 文件上传到虚拟机通过 load 命令加载为镜像或者直接通过 docker pull mysql 命令远程拉取创建目录 /tmp/mysql/data创建目录 /tmp/mysql/conf将课前资料提供的 hmy.cnf 文件上传到 /tmp/mysql/conf去 DockerHub 查阅资料创建并运行MySQL容器要求 1挂载 /tmp/mysql/data 到 mysql 容器内数据存储目录 2挂载 /tmp/mysql/conf/hmy.cnf 到 mysql 容器的配置文件 3设置 MySQL 密码
docker pull mysql
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD123 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ # 挂载配置文件
-v /tmp/mysql/data:/var/lib/mysql \ # 挂载数据文件
-d \
mysql:latest使用 nv 连接成功 数据卷挂载的方式对比数据卷挂载/目录挂载 docker run的命令中通过 -v 参数挂载文件或目录到容器中 1-v volume名称:容器内目录 2-v 宿主机文件:容器内文件 3-v 宿主机目录:容器内目录数据卷挂载与目录直接挂载的 1数据卷挂载耦合度低由docker来管理目录但是目录较深不好找 2目录挂载耦合度高需要我们自己管理目录不过目录容易寻找查看
Dockerfile 自定义镜像
镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层结构每一层称为一个Layer
BaseImage层包含基本的系统函数库、环境变量、文件系统Entrypoint入口是镜像中应用启动的命令其它在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
Dockerfile
Dockerfile 就是一个文本文件其中包含一个个的指令(Instruction)用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层 Layer。 更新详细语法说明请参考官网文档 https://docs.docker.com/engine/reference/builder
基于Ubuntu镜像构建一个新镜像运行一个java项目
步骤1新建一个空文件夹 docker-demo 步骤2拷贝课前资料中的 docker-demo.jar 文件到 docker-demo 这个目录 步骤3拷贝课前资料中的 jdk8.tar.gz 文件到 docker-demo 这个目录 步骤4拷贝课前资料提供的 Dockerfile 到 docker-demo 这个目录 步骤5进入 docker-demo 步骤6运行命令
docker build -t javaweb:1.0 .查看文件
通过 Dockerfile 构建镜像
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量JDK的安装目录
ENV JAVA_DIR/usr/local# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar# 安装JDK
RUN cd $JAVA_DIR \ tar -xf ./jdk8.tar.gz \ mv ./jdk1.8.0_144 ./java8# 配置环境变量
ENV JAVA_HOME$JAVA_DIR/java8
ENV PATH$PATH:$JAVA_HOME/bin# 暴露端口
EXPOSE 8090
# 入口java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar启动容器 访问容器运行的服务 基于 java:8-alpine 镜像将一个 Java 项目构建为镜像
实现思路如下
新建一个空的目录然后在目录中新建一个文件命名为Dockerfile拷贝课前资料提供的 docker-demo.jar 到这个目录中编写Dockerfile文件 基于java:8-alpine作为基础镜像 将app.jar拷贝到镜像中 暴露端口 编写入口ENTRYPOINT使用docker build命令构建镜像使用docker run创建容器并运行 Dockerfile的本质是一个文件通过指令描述镜像的构建过程Dockerfile的第一行必须是FROM从一个基础镜像来构建基础镜像可以是基本操作系统如Ubuntu。也可以是其他人制作好的镜像例如java:8-alpine DockerCompose
DockerCompose介绍
Docker Compose 可以基于 Compose 文件帮我们快速的部署分布式应用而无需手动一个个创建和运行容器 Compose 文件是一个文本文件通过指令定义集群中的每个容器如何运行。 DockerCompose的详细语法参考官网https://docs.docker.com/compose/compose-file/
安装DockerCompose
CentOS7安装DockerCompose
下载
Linux下需要通过命令下载
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m /usr/local/bin/docker-compose如果下载速度较慢或者下载失败可以使用课前资料提供的docker-compose文件 上传到/usr/local/bin/目录也可以。
修改文件权限
修改文件权限
# 修改权限
chmod x /usr/local/bin/docker-composeBase自动补全命令
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose /etc/bash_completion.d/docker-compose如果这里出现错误需要修改自己的hosts文件
echo 199.232.68.133 raw.githubusercontent.com /etc/hostsDockerCompose有什么作用
帮助我们快速部署分布式应用无需一个个微服务去构建镜像和部署。
将之前学习的cloud-demo微服务集群利用DockerCompose部署
实现思路如下
1查看课前资料提供的cloud-demo文件夹里面已经编写好了docker-compose文件 2修改自己的cloud-demo项目将数据库、nacos地址都命名为docker-compose中的服务名 3使用maven打包工具将项目中的每个微服务都打包为app.jar 4将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中 5将cloud-demo上传至虚拟机利用 docker-compose up -d 来部署
docker-compose.yml
version: 3.2services:nacos:image: nacos/nacos-serverenvironment:MODE: standaloneports:- 8848:8848mysql:image: mysql:5.7.25environment:MYSQL_ROOT_PASSWORD: 123volumes:- $PWD/mysql/data:/var/lib/mysql- $PWD/mysql/conf:/etc/mysql/conf.d/userservice:build: ./user-serviceorderservice:build: ./order-servicegateway:build: ./gatewayports:- 10010:10010Docker镜像仓库
常见镜像仓库服务
镜像仓库 Docker Registry 有公共的和私有的两种形式
公共仓库例如Docker官方的 Docker Hub国内也有一些云服务商提供类似于 Docker Hub 的公开服务比如 网易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等。除了使用公开仓库外用户还可以在本地搭建私有 Docker Registry。企业自己的镜像最好是采用私有Docker Registry来实现。
私有镜像仓库
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址https://hub.docker.com/_/registry
简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库具备仓库管理的完整功能但是没有图形化界面。
搭建方式比较简单命令如下
docker run -d \--restartalways \--name registry \-p 5000:5000 \-v registry-data:/var/lib/registry \registry命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录这是私有镜像库存放数据的目录。
访问 http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry命令如下
version: 3.0
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE传智教育私有仓库- REGISTRY_URLhttp://registry:5000depends_on:- registry配置Docker信任地址
我们的私服采用的是http协议默认不被Docker信任所以需要做一个配置
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容
insecure-registries:[http://192.168.150.101:8080]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker在私有镜像仓库推送或拉取镜像
推送镜像到私有镜像服务必须先tag步骤如下
重新tag本地镜像名称前缀为私有仓库的地址192.168.150.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0 推送镜像
docker push 192.168.150.101:8080/nginx:1.0 拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0 推送本地镜像到仓库前都必须重命名(docker tag)镜像以镜像仓库地址为前缀镜像仓库推送前需要把仓库地址配置到docker服务的daemon.json文件中被docker信任推送使用docker push命令拉取使用docker pull命令