文章目录
Docker简单了解
原来我们在Linux上总会配置一大堆的环境,如果要启动多个,启动所要消耗的时间也很长,而且应用在服务器上的迁移麻烦,开发测试上线环境的不同也会导致一些未知的问题,为了解决这些个问题,因而诞生了Docker引擎。只需在物理机/虚拟机上安装Docker,通过别人打包好传过来的Docker镜像,可以立刻运行。
一、安装准备
1、首先说明我用的是CentOS7。如果是Ubuntu或者别的,下边的操作会有所不同。
2、保证成功联网。
二、Docker的安装
1、查看CentOS内核版本
uname -r # 这里需要内核版本不低于3.10
yum update # 如果低于3.10才使用该指令
2、在线安装docker
yum install docker # 一路按y
3、开启docker
systemctl start docker
4、查看docker版本
docker --version #如果出现版本信息,则说明安转成功
5、docker自启动
systemctl enable docker #以后一开虚拟机就会启动该服务 ,不用每次都start
6、停止docker
systemctl stop docker
三、获取镜像
1、搜索要导入的镜像软件
docker search 软件名 #例如tomcat、mysql
2、拉取镜像文件到本地
docker pull 软件名:版本号 # 例如tomcat:latest
这里提一下,如果不配置阿里云镜像加速,可能会拉不动
阿里云镜像加速配置方法:
前往 www.aliyun.com → 注册登录,前往控制台 → 产品与服务 → 容器镜像服务 → 镜像加速器
按照阿里云官方操作文档进行操作即可。
镜像配置:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://c68mgirk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3、docker所有本地镜像查看
docker images
4、docker删除镜像
docker rmi 镜像id/镜像名
四、Docker容器启动
1、docker第一次启动容器
docker run --name 自取容器名 -d -p 主机端口:容器内部端口 镜像软件名:版本号 --restart always
# 例如 docker run --name mytomcat -d -p 8081:8080 tomcat:latest
# --name docker容器名 (自己取名)
# -d 后台运行
# -p 指定端口映射 例子中的意思是从主机端口映射到docker容器的端口,因为应用运行于容器中,要实现容器端口和主机端口的对接
# --restart always 启动docker即启动容器服务
** 这里注意安装不同的应用,需要指定的参数不尽相同,详见docker hub**
2、docker查看所有容器
docker ps -a
查看正在运行的容器
docker ps
3、docker停止运行中的容器
docker stop 容器id/容器名
4、docker启动已有的容器
docker start 容器id/容器名
5、docker删除容器
docker rm 容器id/容器名
6、docker容器的日志显示
docker logs 容器id
7、docker指定容器进入交互模式
docker exec -it 容器id /bin/bash
8、docker 挂载(实现本地文件和容器内部文件的数据共享方式其一,详见第六章)
docker run 添加-v 本地目录文件:容器内部目录配置文件 ...
9、docker 容器内外部文件互相拷贝
docker cp 本地文件 容器id:容器内部文件(记得docker restart 容器id/容器名,否则不生效)
docker cp 容器id:容器内部文件 本地文件
10、docker 查看镜像/容器的信息
docker inspect 镜像id/容器id
五、Docker安装常见应用(单机安装采坑)
1、安装elasticsearch
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" -d -p 9200:9200 -p 9300:9300 --name 容器名 镜像id
# 指定占用内存大小为256m,服务启动需要等待一定时间
跨域设置(防止数据交互被阻止)
# 进入交互模式
# 修改config下的elasticsearch.yml
vi config/elasticsearch.yml
# 添加如下代码
http.cors.enabled: true
http.cors.allow-origin: "*"
2、安装nginx
docker run -d -p 80:80 --name 容器名 镜像id
** 配置文件修改**
方法一
# 进入交互模式,进入 /etc/nginx
# 发现vim/vi指令失效,解决办法:
apt-get update
apt-get install vim
方法二
docker run 添加-v 本地目录文件:容器内部目录配置文件 ...
注意!
添加反向代理后需要开启本地防火墙端口(例如tomcat的8080端口),原来docker自己做端口映射是不需要自己手动开启防火墙端口的,这里需要自己手动开启。补充一下端口开放
# 查看防火墙信息
firewall-cmd --list-all
# 添加
firewall-cmd --zone=public --add-port=8080/tcp --permanent (permanent代表永久生效,没有此参数重启后失效)
# 重新载入
firewall-cmd --reload
#删除
firewall-cmd --zone= public --remove-port=8080/tcp --permanent
3、安装redis
考虑到小伙伴们要使用客户端工具连接到远端redis,如果直接拉取redis安装的话远端无法直接访问,再加上为了安全起见,访问redis最好加上密码,下面会基于这一点进行配置:
首先从 http://download.redis.io/redis-stable/redis.conf 把 redis.conf 配置文件拿下来,对里面的参数进行修改
1、把里面的 bind 127.0.0.1给注解掉
2、把protected-mode yes 设置为protected-mode no
注意: 如果开启守护线程的话运行容器会秒退
docker run -p 6379:6379 --name redis01 -v /usr/local/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/data:/data -d 镜像id redis-server /etc/redis/redis.conf --appendonly yes
# 这里/usr/local/redis/redis.conf是我自己存放配置文件的地方,把修改好的配置放粘进去就好,/usr/local/redis/data的话自己建个文件夹放数据
4、安装rabbitmq
参考地址:https://www.cnblogs.com/angelyan/p/11218260.html
#指定版本,该版本包含了web控制页面,否则无法通过ip:15672访问到web视图界面
docker pull rabbitmq:management
#方式一:默认guest 用户,密码也是 guest
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management
#方式二:设置用户名和密码
docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management
六、Docker数据共享
相信到这里小伙伴已经对docker已经有了初步的认知,但是正如我们所知道的,如果在虚拟机或者物理机上直接安装某个应用,修改配置文件非常的方便,可是docker下我们怎么修改容器内部的配置文件呢(当然比较笨的办法是通过docker cp用本地方法覆盖容器内部方法)。容器与宿主机之间的数据如何达到共享,亦或者是容器与容器之间的如何达到数据共享,下面介绍常用的办法。(可以查看官方对于容器数据卷概念的解释)
1、容器与宿主机数据共享
①、在docker运行容器的时候挂载本地的文件/目录
通过-v 的方式实现本地文件和容器内部文件的数据共享,无论是修改容器内外哪一方的文件内容,另一方都会生效,数据共享生效。
docker run -v 本地文件:容器内部文件 ... 镜像id
当然也可以设置权限,设置为容器内只读(read-only)
docker run -v 本地文件:容器内部文件:ro ... 镜像id
②、使用dockerFile
编写dockerFile脚本,通过构建dockerFile来实现目录的挂载,挂载后宿主机文件的位置可以通过docker inspect 在数据卷位置(Volumn)查看详细的路径,dockerFile详细将在第七章展开。
2、容器与容器数据共享
通过–volumns-from 的方式达成容器间数据的共享
docker run ... --volumn-from 容器id(基于哪一个容器) 镜像id
相当于说基于一个镜像模板创建多个容器实例,而容器实例间实现了一种连线式的传递过程。那么考虑一个问题,如果创建多个容器相互之间,其中一个容器被销毁了,那么它是基于别的容器也好,还是被别的容器基于,在同一个镜像下所创建的一系列容器的数据共享是否会发生断开? 不会! 只要通过数据卷依赖方式,有使用这个镜像的容器存在,数据就能保证实时共享。
七、DockerFile
首先,dockerfile本身是一个文本文件,它的目的是用来创建镜像的。
通过下面这张图,我们能够很快的知道dockerfile的构建过程:dockerfile通过build命令来构建镜像,而build内部发生了如下操作:
1、运行镜像生成容器
2、执行一条dockerfile指令
3、打包容器变为镜像
重复以上操作直到所有的指令执行完毕。
dockerfile指令具体可以参考官方文档,或者以下参考博客,写的还是非常不错的:
https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html
这里直接举个例子,基于dockerfile完成对springboot的jar包部署:
1、springboot的jar包部署
①、拉取java8镜像
# 拉取java8,我们以java -jar方式运行
docker pull java:8
②、编写dockerfile
# 基于java8构建镜像
FROM java:8
# 作者
MAINTAINER Jc2hen
# 添加jar包,并且改名,前后者分别是改名前后的路径
ADD jar/test.jar /usr/local/docker_test/mytest.jar
# 运行jar包,nohup后台运行,java -jar xxx.jar
ENTRYPOINT ["nohup","java","-jar","/usr/local/docker_test/mytest.jar"]
③、构建镜像
-t 构建后的镜像名
-f dockerfile路径,指定到文件
最后这个 . 表示当前目录,即上下文环境,如果不在当前目录下,需要把 . 替换指定,比如 /usr/local/docker_test
# 注意:最后那个点不要忘了
docker build -t myslot -f /usr/local/docker_test/dockerfile/ .
④、运行镜像
docker run -d -p 8080:8080 --name boot_slot 镜像id
至此,springboot的应用部署完毕,war包默认还会带项目名(当然可以通过删除ROOT去掉),运行jar不会给额外带上项目名。
这里的 VOLUME 指令用的也非常多,可以指定共享数据卷,有点类似于 -v 操作,可以实现宿主机与容器内部数据的共享,当然指定容器目录,不指定宿主机目录的情况下,宿主及目录docker也会自动帮你创建,可以通过inspect命令查看,有兴趣的可以自己去探索。