Doker是什么?有什么作用?
Doker是什么:当我们在开发环境开发完毕代码需要上传到测试环境却发现在我们开发环境代码运行的好好的,但是到了测试环境下bug频出,这是怎么回事呢?就是因为每个电脑的环境都是不一样的,所以可能会出现bug,那么这时候有没有可能,当我们写完代码了也没有问题在开发环境,那么上传的时候把代码所依赖我们电脑种的环境一并上传到测试环境内。然后测试环境直接就可以把这个运行,并且在测试环境不会依赖测试环境而是单独隔离起来依赖他自己所带的化境呢?
这个时候就要使用Doker了,Doker是可以完成这个功能的。也就是将环境和代码一起打包成为镜像
Doker是可以一起运行多次镜像,运行一次镜像就会形成一个容器,每个容器是相互隔离的,这个也就是Doker的一个特性----沙箱机制
Doker还有一个优点就是可以直接去拉去镜像,比如我们需要使用一个jdk的镜像,那么我们难道就要自己做吗?这时候就会有一个别人写好的镜像在仓库中,然后我们直接就可以去卡区镜像,然后就可以直接使用。
个人理解Doker: 比如我们有rides1在ubuntu操作系统上,而想要把他迁移到centos上使用,那么这时候docker是怎么做到的呢?因为这两个操作系统都是基于Linux内核的,所以我们在使用ubuntu的时候比如,我们所输入的ubuntu指令其实就是ubuntu根据指令去他的函数库解析然后再去解析出来Linux内核指令让Linux去做,这时候docker就是直接跳过操作系统,他的镜像运行完以后有一个容器,里面有函数库,然后这个容器其实就相当于是一个小型的虚拟机系统,只不过是阉割版的系统,比如在Linux有一个redis容器,其实就相当于是一个操作系统只不过是安装了redis而已,这样就可以得到和Linux内核交互的指令了,如下图:
不使用docker:
使用docker:
直接穿透操作系统去访问Linux内核
当我们在使用软件是,都在我们一个系统上边,这些软件都是使用的同一个函数库和依赖
而我们使用docker就可以避免这个问题
镜像是什么:
镜像就是将我们的应用程序和应用程序的依赖,环境,配置,函数库一起打包,成为镜像
容器是什么:
容器就是将镜像运行了以后就是容器,容器可以运行多次镜像形成多个容器,比如redis镜像我们可以运行两次,那么这时候就有两个redis运行,容器就是沙箱机制,相互隔离
例如你下载了一个QQ,如果我们将QQ在磁盘上的运行文件及其运行的操作系统依赖打包,形成QQ镜像。然后你可以启动多次,双开、甚至三开QQ,跟多个妹子聊天
DockerHub
地址:https://cr.console.aliyun.com/
https://c.163yun.com/hub
这个就是一个镜像的网址,就相当于是对于maven来说是一个jar包私服,而dockerHub对于Docker就是一个远程仓库,因为我们在使用镜像时候,有别人写好的那么就可以去这些远程长裤拉去,流程如图:
Linux安装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 \
xxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
yum install -y docker-ce
最后一步启动docker:
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙!!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalldsystemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
然后就一可以输入docker -v去查看docker的版本了
镜像命令:
镜像:
docker images 查看docker里面所有的镜像的信息
docker pull 镜像名:tag 拉去这个镜像名的tag版本
docker rmi 镜像名:tag 删除指定镜像名的tag版本
docker save -o Xxx.tar 镜像名:tag 镜像名:tag 保存多个指定镜像指定版本到Xxx.tar文件
docker load -i Xxx.tar 将Xxx.tar中的镜像加载到docker
docker build -t 镜像名:tag . 建造一个镜像,名称为-t后面的镜像名 版本为自己指定
容器:
docker run \
--name 容器名 \
-d \
-p 宿主机端口:容器内软件端口 \
-v 数据卷名:/容器内的目录 \
-v /文件夹:/容器内的文件夹 \
-v /文件:/容器内的文件 \
镜像名:tag 运行镜像成为容器,并且命名容器 挂在数据卷 指定端口号
docker ps 查看开启的容器
docker ps -a 查看所有的容器
docker logs 容器名 查看日志
docker stop 容器名 停止指定容器
docker start 容器名 开始指定容器
docker rm 容器名 删除指定容器
docker rm -f 容器名 强制删除指定容器,不带-f就是容器在运行时不能删除,带上-f时不管运没运行都删除
docker update --restart=always 容器名 修改以后自动重启这个指定名称的容器
数据卷:
docker volume create 数据卷名 生成一个数据卷
docker volume ls 查看所有的数据卷
docker volume rm 数据卷名 删除指定数据卷
docker volume prune 删除此时没有启动的数据卷
docker volume inspect 查看数据卷详情
网络:
docker network create 网络名称
docker network ls
docker network rm 网络名称
docker network prune
docker network inspect
数据卷:
当我们想要改变容器中谭健的配置时,还需要使用很麻烦的命令,这时候我们可以在运行时绑定数据卷来达到本地就可以使用数据卷
当使用数据卷的时候要保证本地的文件是可读权限不然例如nginx就会访问不了
创建数据卷:
docker volume create html
查看所有数据
docker volume ls
查看数据卷详细信息卷
docker volume inspect html
改在数据卷步骤:
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
这个时候-v的冒号前边 html就是我们宿主机的html目录绑定了容器的root/html目录,这时候实现了两个目录的双向绑定,修改宿主机的目录就可以实现修改容器的内容
案例:
需求:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
docker run \ // 创建容器
--name mysql \ // 给容器起名
-e MYSQL_ROOT_PASSWORD=root \ // 设置root账户密码
-p 3306:3306 \ // 端口映射
-d \ // 后台运行
-v /tmp/mysql/data:/var/lib/mysql \ // 绑定宿主机上的文件夹
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/my.cnf \ // 绑定宿主机上的文件
--privileged \ // 设置超级管理员远程访问权限
mysql:5.6 // 镜像名称
自定义镜像:
镜像结构:
命令:
其实这些命令就是写在一个文件中,文件的名称是固定的:Dockerfile
例如我们将java成一个镜像:
将Java这个项目的jar包放到文件夹中,因为Java需要jdk,所以可以将jdk包放到文件夹中,具体如下:
# 指定基础镜像
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
然后将这个文件夹上传到虚拟机中,进入上传到虚拟机的这个文件夹中:
将准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下
运行命令:
docker build -t javaweb:1.0 .
这样一个镜像就制作完成,其中上边命令的 javaweb就是这个镜像的名称 1.0为版本号
其实上边还有一个更简单的方法,因为上边是将jdk打包进来的,但是我们可以从仓库拉下来jdk别人写好的镜像,这时候Dockerfile可以改为:
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar
安装DockerCompose
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行,也就是说可以通过这个软件然后我们自己写compose的文件,然后直接运行这个文件就可以直接运行起来多个容器,一般都是来搭建集群。格式如下:
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
web:
build: .
ports:
- "8090:8090"
上面的Compose文件就描述一个项目,其中包含两个容器:
mysql:一个基于
mysql:5.7.25
镜像构建的容器,并且挂载了两个目录web:一个基于
docker build
临时构建的镜像容器,映射端口时8090
DockerCompose的详细语法参考官网:Compose specification | Docker Documentation
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
安装完毕以后修改文件权限
# 修改权限
chmod +x /文件路径/docker-compose
ln -s /文件路径/docker-compose /usr/bin/docker-compose
编写docker-compose文件例子:
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
可以看到,其中包含5个service服务:
nacos
:作为注册中心和配置中心
image: nacos/nacos-server
: 基于nacos/nacos-server镜像构建
environment
:环境变量
MODE: standalone
:单点模式启动
ports
:端口映射,这里暴露了8848端口
mysql
:数据库
image: mysql:5.7.25
:镜像版本是mysql:5.7.25
environment
:环境变量
MYSQL_ROOT_PASSWORD: 123
:设置数据库root账户的密码为123
volumes
:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据
userservice
、orderservice
、gateway
:都是基于Dockerfile临时构建的