(内容为学习内容,不排除内容出错,若读者发现,可与作者沟通,谢谢)
Docker:Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
1. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 2.容器是完全使用沙箱机制,相互之间不会有任何接口
Docker 是一个开源的应用容器引擎。
让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
特性:
Docker怎么解决 不同系统 依赖关系复杂,不同组件依赖的兼容性问题?
Docker与虚拟机区别:
Docker将应用和函数库依赖等打包成镜像,(直接和内核交互),是一个系统进程;虚拟机是操作系统中的操作系统;
docker体积小、启动速度快、性能号;虚拟机体积大、启动速度慢、性能一般;
virtual machine: 在操作系统模拟硬件设备,然后运行另一个操作系统,利用技术Hypervisor
Docker架构——镜像、容器、镜像共享
1.镜像:将应用程序及其依赖、环境、配置打包在一起的行为(只可读 )
2.容器:镜像运行起来形成的 进程 就是容器(隔离,对外不可见),一个镜像可以有效多个容器。写数据时通过镜像共享的内容,copy到 容器 自己独立的文件系统中操作。
3.镜像共享——DockerHub
DockerHub,是Docker 镜像托管平台(镜像托管服务器)。(类似的镜像托管平台称为,Docker Registry)
国内类似于DockerHub的公开服务,如 网易云镜像服务 、 阿里云镜像库
Docker如何完成镜像操作/拉去镜像/运行容器:?
Docker结构(CS架构),两部分组成:server、client
client:通过命令或RestAPI向Dockers服务端发送指令。可在本地或远程向服务端发送命令
server: Docker daemon守护进程负责处理Docker指令,管理镜像、容器
本地发送命令:
命令:
构建镜像:docker build
拉去镜像:docker pull
运行镜像,创建容器:docker run
Centos7 安装卸载Docker:
0.1卸载旧版本或安装错误的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
0.2安装yum工具:
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
0.3#设置docker镜像源,将docker仓库repo配置为阿里云的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
1.安装命令: yum install -y docker-ce ( -y :安装时不询问 ,-ce社区版 ) 安装后打开firewall端口
2.查看是否安装成功:
docker info
2.启动:
systemctl start docker
3.查看是否正常运行
sysemctl status dockere
或者docker -v
4.重启:
system restart docker
5.查看版本
docker -v
配置镜像,镜像加速,此处使用阿里云:
阿里云加速器:注册阿里云开发账户(免费的)后,访问阿里的这个链接就注册看到加速器地址: https://cr.console.aliyun.com/#/accelerator
相关操作在该地址中也有
Docker基本操作:镜像操作、容器操作、数据卷(容器数据管理)
一 镜像操作
镜像命名: 命名规范repository:tag(镜像名称:镜像版本(latest最新))
镜像的CRUD
操作镜像方式
docker pull 具体镜像名
DockerHub镜像服务器地址:https://hub.docker.com/
镜像拉取:docker pull 镜像名:版本
详细命令,利用docker --help 在linux系统查看;
1.查看镜像:
docker images
2.删除镜像
docker rmi
3.分享镜像:
方式1:推送到公司的 私服:docker push
方式2:将镜像打包成压缩文件(U盘拷贝):
docker save -o 指定目录/压缩文件名 镜像名(nginx:具体版本)
(压缩前最好使用docker images 查看需要压缩的镜像)
加载压缩包为镜像:docker load -i 镜像压缩包名
容器相关命令
容器运行状态:运行、暂停、停止
创建并运行容器:docker run
暂停容器:docker pause 恢复运行:docker unpause
停止容器:docker stop 恢复运行:docker start
查看运行容器及状态:docker ps (参数 -a:可运行所有)
查看容器运行日志:docker logs
进入容器执行命令:docker exec 进入后退出:exit
删除指定容器:docker rm 具体容器名
暴漏外部端口例子:
$: docker run --name some-nginx -d -p 8080:80 some-content-nginx(基于镜像名称:版本(不写为最新版))
–name somenginx(指定容器名) -d:后台运行 -p :宿主端口于容器端口映射(宿主端口:容器端口)
案例:
docker exec -int mn bash
docker exec:截取容器内部执行一个命令 ; -it:给当前容器创建标准输入输出终端,运行于容器交互 ; mn:容器名称;
bash:此为linux系统终端交互命令
修改容器内文件:(此种做法不推荐,推荐的是使用 数据卷)
sed -i ‘s#原内容#替换内容#g’ 文件名
如:sed -i ‘s###g’ index.html
数据卷(volume)虚拟目录,指向宿主机 文件系统中的目录
容器与数据耦合问题:不便修改、数据不可复用、升级维护困难
volume,虚拟目录,指向宿主机 文件系统中的目录:/var/lib/docker/volumes/映射名
数据卷基本语法:docker volume 具体命令 (docker volume:操作数据卷 )具体使用,docker --help
具体命令:create:创建volume、 inspect:显示一个或多个volume信息
ls:列出volue prune:删除未使用的volue rm :删除指定范围的volue
数据卷的作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
将数据卷 与 日期目录 挂载
docker run /
--name docker容器名
-v 数据卷名:容器内需挂载文件全路径目录 \
-p 8080:80
nginx \
注:第3行:如果数据卷名未创建,则自动创建
查看volume数据卷信息,可以看到数据卷的具体目录(其实具体目录是宿主机/var/lib/docker/volumes/下的目录);
数据卷可以与容器挂载、 宿主目录 也可以 直接与容器挂载
宿主机目录与容器挂载:docker volume -v 宿主机目录/文件:容器内目录/文件
数据卷挂载和目录直接挂载的区别:
数据卷挂载:挂载耦合度低,由docke管理目录,单目录较深,不好找
目录直接挂载:耦合度高,自己管理目录,目录易查询
自定义镜像:
Dockerfile文件 自定义镜像
镜像:将应用程序及其所需要的系统函数库、环境、配置、依赖带包而成
镜像结构:
....
5Layer层:应用
4Layer层:Entrypoint入口 -> 定义镜像运行入口,一般是程序启动的脚本和参数
3Layer层:install 应用/配置配置文件
2Layer层:copy应用安装包
1Layer层:BaseImage层:基础镜像层 -> 系统依赖的函数库、环境、配置、文件等
Dockerfile,包含一条条指令(Instruction)的文本文件。每条指令(来说执行什么操作,来构建镜像)形成一个Layer层;
案例基于Ubuntu 镜像构建一个新镜像,允许Java项目:
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项目构建未镜像
# 指定基础镜像
FROM java:8-alpine
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
docker build -t 镜像名:版本 . (. :表是Dockfile所在的目录为 当前文件夹)
简化Dockerfile 文件,的镜像 Java:8-alpine
只需要 修改Dockerfile 的
微服务集群部署
集群部署——Docker Compose
DockerCompose,基于Compose文件快速的部署分布式应用,无需一个个创建和运行容器。
Compose文件,一个文本文件,通过指令定义集群中的每个容器如何运行;
具体官网查询:https://docs.docker.com/compose/compose-file/
version: "3.8" #语法版本
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ ROOT_ PASSWORD: 123
volumes: #数据卷
- /tmp/mysql/data:/var/1ib/mysqL
- /tmp/mysql/ conf/hmy. cnf:/etc/mysqL/ conf . d/hmy . cnf
web:
build: . #构建镜像,。从当前目录构建
ports: #构建容器
- 8090:8090
DockerCompose的下载安装:
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
可能出错,域名无法解析,执行以下命令后,再执行补全命令
echo "199.232.68.133" raw.githubusercontent.com" >> /etc/hosts
微服务集群部署——利用DockerCompose
部署命令:docker-compose up -d (进入到项目文件中(此文件是由各种微服务jar包及其依赖和compose文件组成的项目 ),docker-compose是命令)
可能出现服务先后问题,docker-compose restart 重启微服务
部署实现思路:
搭建 私有仓库:
Docker Registry镜像注册中心:
管理各镜像的地方——Docker镜像仓库(之一官方公共镜像仓库DockerHub)
公共仓库:国内:网易云镜像服务、DaoCloud镜像服务、阿里云镜像服务
搭建私有镜像仓库,镜像管理;
搭建镜像仓库基于官方提供的Docker Registry
地址:https://hub/docker.com/ /registry
一定位置 新建registry-ui 文件夹,新建docker-compose 文件:touch docker-compose.yml
内容下:
启动:docker-compose.yml