2021-10-13Docker
一、简介
1.技术前提
了解linux
修改虚拟机ip为静态:
- vim /etc/sysconfig/network-scripts/ifcfg-ens33
- BOOTPROTO=“static”
- IPADDR=“192.168.188.107”
- NETMASK=255.255.255.0
- GATEWAY=192.168.188.2
- DNSI=192.168.188.2
- 重启网络服务:systemctl restart network
2.应用背景
软件在windows上开发完成后,把jar或war包交给运维,运维部署到linux或云服务器上时,可能会因为环境不同或配置不同,而导致不能正常工作。用docker就可能方便的解决该问题。
3. 工作原理
如果到宠物店只买回一条鱼,回家后可能因为环境不适应而死亡,而从宠物店买回的是带鱼缸和鱼这一整套环境就不会出问题。也就是从系统底层至上层整体打包成镜像文件,从而达到完全跨平台的到处运行。
4.Docker与虚拟机的区别
Docker是一个精简版的虚拟机,只是少了对操作系统和硬件的虚拟,所以启动速度是秒级的,而虚拟机的启动则是分钟级的
5.Docker的组成
镜像:相当于java中的类,如Person。应用程序和配置及依赖打包成一个可运行的环境,这个包就是镜像文件。
容器:相当于new Person产生对象,容器是以镜像为模板产生,可把容器看成镜像一个简化版的linux环境和若干运行在其中的应用程序。
仓库:是集中存放镜像的地方,docker三要素:镜像、容器、仓库
仓库注册服务器:放着多个仓库。
二、安装
1.下载Dcoker的依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2
2.指定Docker镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安装Docker
yum makecache fast #为加快安装速度,对缓存加速
yum -y install docker-ce
4.查看版本
docker version
5.启动Docker并测试
- 启动docker: systemctl start docker
- 重启: systemctl restart docker
- 卸载docker: yum remove docker
- 设置开机启动: systemctl enable docker
6. 云镜像仓库
是一个代理仓库,放了一些镜像,因为中央仓库https://hub.docker.com是国外网站,非常慢,有两个云可用,网易云和阿里云,推荐使用阿里云,更全面,其镜像地址:https://www.aliyun.com/product/acr
获取加速器地址的方法如下:
注册–>可使用淘宝帐号注册,搜索容器镜像服务
获取加速器地址:通过网址https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors获取
配置加速器
mkdir /etc/docker
vim /etc/docker/daemon.json
内容如下:每个帐号都不同,使用下面一个也可以。
{
"registry-mirrors": ["https://f1z25q5p.mirror.aliyuncs.com"]
}
使配置生效:
- systemctl daemon-reload
- systemctl restart docker
helloworld镜像生成容器:docker run hello-world,默认先从本地的镜像中找,没找到就从阿里云中找其镜像并拉取。
三、docker常用命令
1. 帮助命令
docker info—查看docker的总体信息
docker help—查看docker有哪些命令
2. 镜像操作
- 查看镜像
- docker images—查看有哪些镜像,repository表示镜像的仓库源,tag是版本,image id是镜像的唯一ID,created是创建时间,size是镜像大小。
- docker images -a—查看镜像及中间映像层,也就是一个表面镜像内部还包含了哪些镜像。
- docker images -q—只显示镜像ID
- 下载镜像 docker pull xxx
- docker pull nginx,相当于docker pull nginx:latest下载最新版本。
- docker pull tomcat:8.5.32
- 删除镜像 docker rmi xxx
- docker rmi hello-world—失败,因为提示说该镜像的容器正在运行,
- docker rmi -f hello-world—强制删除
3. 容器操作
3.1 创建并启动容器
以centos镜像为例演示
- docker pull centos—从阿里上拉取centos镜像
- docker run -it centos—创建容器,i为交换模式,t为使用终端,it常常一起使用表示使用终端进入交互模式,exit退出
- docker run -it --name mycts centos–启动并指定容器名称,上面没指定都会随机给个名字
3.2 查看有哪些容器
- docker ps ** 查看正在运行**的容器
- docker ps -q —只显示容器id
- docker ps -qa 查看所有,包括没有运行的容器
3.3 停止和启动容器
- exit—从终端退出并可能停止容器,ctrl+p+q退出但容器仍然运行。
- docker stop aea7a56b0c7d或容器名—停止容器
- docker start 容器名或容器id 重新启动被停止的容器
3.4 删除容器
不是停止,停止后容器还在,只是不运行了
- docker rm 容器id或名称—注意,必须先关闭容器才能删除,rmi是删除镜像
- docker rm -f $(docker ps -aq)—批量删除
3.5 进入容器的内部进行操作
docker exec -it 容器id bash
3.6 容器与宿主机间拷贝文件
从容器中拷贝到宿主机
docker run -it centos-->cd /tmp–>vi hello.txt—>ctrl+p+q–>docker ps–>docker cp 容器id:/tmp/hello.txt /opt
从宿主机拷贝到容器
docker cp /opt/a.txt 容器id:/tmp
四. 数据卷/目录挂载
1. 有什么用
目录映射:
为方便宿主机与容器间传递数据,产生目录映射,使两者共享同一目录。使用数据卷可将宿主机上的一个目录映射到容器的一个目录中。
持久化容器数据
容器运行中所产生的数据,如果不通过commit生成新镜像,当容器被删除后数据就丢失了。使用数据卷可在不产生新镜像的前提下保存数据在磁盘上,有点像redis中的持久化。
部署项目方便
为了部署项目,需要使用到cp命令将宿主机内的war包复制到容器内部。
使用数据卷可以在宿主机中操作目录中内容,那么容器内部映射的文件,也会跟着一起改变
2. 特点
- 数据卷可在容器之间共享
- 修改卷中数据可以直接生效,并且对卷的修改不会引起镜像的更新。
- 卷的生命周期一直持续到没有容器使用它为止。
3. 产生数据卷
docker run -di -v /myData:/myContainerData --name myc1 centos
参数说明:
- -di:产生交互式后台进程
- -v:目录挂载,myData是宿主机中目录,myContainerData是容器中目录
- –name:给容器启一名称为myc1
4. 测试
- vim /myData/a.txt
- docker exec -it myc1 bash
- cat /myContainerData/a.txt
五. docker应用部署
1. MYSQL部署
a. 拉取镜像
搜索mysql镜像:docker search mysql
拉取镜像:docker pull centos/mysql-57-centos7 ,镜像选择的是centos/mysql-57-centos7
b. 创建mysql容器
docker run -di --name=mysql5.7 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123 centos/mysql-57-centos7
注意:如果宿言主机上已经安装mysql,则这里宿主机就不能还使用3306
参数说明:
- -di: 以守护进程交互式启动容器
- –name: 给容器启名为mysql5.7
- -p: 端口映射,格式为:宿主机端口:容器端口,为什么要映射?因为容器的ip地址跟windows的ip不在一个网段,无法通信。从win7访问容器就只能通过win7访问宿主机(虚拟机)的ip+映射的端口。
- -e: 当从win7远程连接容器mysql时,要设置root帐号的密码,这里设置远程连接密码为root,但要注意:在进入容器内访问时,密码是空的。
- 最后一个参数:是上面下载的镜像名.
c. 连接mysql
1. 容器本地连接
docker exec -it -u root mysql5.7 bash
-u root:表示以root身份进入容器
mysql -uroot -p ,密码为空,回车
2. win7远程连接
mysql -uroot -p123 -h192.168.188.107,默认连接的是3306,如果映射的宿主机不是3306,则后面添加 -P3306
2. tomcat部署
2.1 拷贝war包
从宿主机上拷贝war包到容器中
运行tomcat8.5.32镜像
docker run -d --name mytom1 -p 9000:8080 tomcat:8.5.32
参数说明:
- -p是端口映射,9000为宿主机端口,8080为容器中tomcat端口,没办法直接访问容器的8080,就直接访问宿主机的9000,映射到容器的8080
- -d是后台启动,换成-it则是前台启动tomcat
- 测试tomcat:192.168.188.107:9000
直接拷贝war包到容器
docker cp /opt/data/day1.war 容器id:/usr/local/tomcat/webapps/
测试:192.168.188.107:9000/day1/showSuc
2.2 使用目录挂载
挂载命令
docker run -di -p 8888:8080 -v /opt/data:/usr/local/tomcat/webapps/ --name mytom2 tomcat:8.5.32
向/opt/data中放入day1.war
测试:192.168.188.107:8888/day1/showSuc
3. nginx部署
3.1 拉取镜像
docker pull nginx
3.2 创建容器
docker run -it --name mynginx1 -p 80:80 nginx bash
配置文件在/etc/nginx/nginx.conf,默认没有vi命令
拷贝nginx目录到宿主机:
- ctr+p+q
- docker ps
- docker cp mynginx1:/etc/nginx /opt/data
删除容器:docker rm -f mynginx1
启动容器并添加数据卷:
docker run -v /opt/data/nginx:/etc/nginx -di --name mynginx2 -p 80:80 nginx
3.3 测试
192.168.188.107/
4. redis部署
4.1. 拉取redis
docker pull redis
4.2 创建容器
以aof方式持久化,如果用rdb则不加–appendony yes
docker run -d --name myredis -p 6379:6379 redis --appendonly yes
4.3 进入redis容器
进入容器
docker exec -it myredis bash
启动客户端
- cd /usr/local/bin
- redis-cli
六、自定义镜像
##1.Dockerfile方式
###a. Dockerfile介绍
有什么用?
使用Dockerfile可以根据需求开发一个自定义的镜像,其实就是一个文本文件,由一系列命令和参数构成,Docker可读取这个文件构建一个镜像。
dockerfile常用指令
from 基于哪个镜像
MAINTAINER 作者
COPY 复制文件进入镜像(只能用相对路径,不能用绝对路径)
ADD 复制文件进入镜像(压缩包会解压)
WORKDIR 指定工作目录,不存在会创建路径
ENV 设置环境变量
EXPOSE 暴露容器端口
ENTRYPOINT 在容器启动的后执行,作用于容器层,dockerfile里有多条时只执行最后一条
RUN 构建镜像的时候执行其后的命令,作用于镜像层面,命令格式:
shell命令格式:RUN yum install -y net-tools
exec命令格式:RUN [“yum”,“install”,"-y",“net-tools”
###b. 创建jdk镜像
+ 向/opt/data/jdk目录添加jdk压缩文件
+ 在/opt/data/jdk目录中创建并编辑Dockerfile文件, vim Dockerfile ,添加下面内容:
```dockerfile
FROM centos:7
MAINTAINER lly
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk1.8.0_144.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAR_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
编译并构建镜像,镜像名为jdk1.8
docker build -t=‘jdk1.8’ ./
查看镜像
docker images
通过镜像jdk1.8创建容器myjdk
docker run -it --name myjdk jdk1.8 bash
###c. 微服务部署
上传jar包
在/opt/data/eureka目录中添加eureka_7001.jar
查找jdk镜像
docker search jdk 得到ascdc/jdk8镜像,也可使用前面创建的镜像jdk1.8
编辑Dockerfile
在/opt/data/eureka中创建并编辑Dockerfile文件
#基于哪个镜像
#FROM ascdc/jdk8
FROM jdk1.8
#目录挂载,将本地文件夹挂载到当前容器,这里用不着,了解
VOLUME /tmp
#将文件复制到容器指定目录
ADD eureka_7001.jar /usr/local/java/
#暴露服务的端口
EXPOSE 7001
#设置容器启动后要自动执行的命令
ENTRYPOINT ["java","-jar","/usr/local/java/eureka_7001.jar"]
生成镜像并测试
编译并创建镜像
docker build -t=‘eureka-server’ ./
查看生成的镜像:docker images
启动容器:
- 前台启动:docker run -p 7001:7001 eureka-server
- 后台启动:docker run -di -p 7001:7001 eureka-server
192.168.188.107:7001
2. commit方式
a. 创建使用redis的微服务
static 的js子目录下添加vue.js和axios.js
在static目录下添加下面两个前端页面,注意给每个页面导入vue和axios
login.html
<div id="d">
<input name="username" v-model='name'><br>
<button @click="f">登录</button>
</div>
<script>
new Vue({
el:"#d",
data:{
name:""
},
methods:{
f:function () {
axios.get('http://localhost/login',{
params:{
username:this.name
}
}).then(ret=> {
location.href='http://localhost/main.html'
});
}
}
});
</script>
main.html
<div id="d">
<h1>欢迎你:{{name}}</h1>
</div>
<script>
new Vue({
el:"#d",
data:{
name:""
},
mounted: function(){
axios.get(
'/getuserName'
).then(rs => {
if(rs.data){
this.name=rs.data;
}
});
}
});
</script>
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
配置类上添加redisSession的注解
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 300)
添加控制器类
@RestController
public class UserCtl {
@RequestMapping("/login")
public String login(HttpSession session, String username){
session.setAttribute("username",username);
System.out.println("name:"+username+",sessionID:"+session.getId());
return "success";
}
@RequestMapping("/getuserName")
public String getName(HttpSession session){
return (String)session.getAttribute("username");
}
}
b. 把容器生成新镜像
docker commit -a "lly" -m "注释" 容器id 镜像名:版本号,如
docker commit -a "lly" -m "这是运行了redis服务,tmp目录下存放微服务" myredis redis:1.0
2021-10-13Docker的更多相关文章
- Noip模拟70 2021.10.6
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- Burp Suite Pro 2021.10 Full (macOS, Linux) -- 查找、发现和利用漏洞
申明:底层组件来自网络论坛或开源社区的分享,本站所有软件免费分享,仅供学习和测试使用,严禁用于任何商业用途!!! 请访问原文链接:https://sysin.cn/blog/burp-suite-pr ...
- 2021.10.29 数位dp
2021.10.29 数位dp 1.数字计数 我们先设数字为ABCD 看A000,如果我们要求出它所有数位之和,我们会怎么求? 鉴于我们其实已经求出了0到9,0到99,0到999...上所有数字个数( ...
- 2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS)
2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS) 题意: 给一张n*n的图,起点为A,终点为 B,求从A到B转弯次数最少为多少. 分析: 是否存在 ...
- 每日总结:Number&Math类(2021.10.4)
Java语言为每一个内置数据类型提供了对应的包装类. 所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类 其中Integer 对应的基 ...
- Java初步学习——2021.10.11每日总结,第六周周一
(1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天继续学习菜鸟教程Java实例 字符串 9.字符串小写转大写--toUpperCase方法 public class Ma ...
- Noip模拟81 2021.10.20
T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...
- Noip模拟84 2021.10.27
以后估计都是用\(markdown\)来写了,可能风格会有变化 T1 宝藏 这两天老是会的题打不对,还是要细心... 考场上打的是维护\(set\)的做法,但是是最后才想出来的,没有维护对于是没有交. ...
- Noip模拟83 2021.10.26
T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #i ...
随机推荐
- NC65主键含义
最简单的办法,调用用友的类 import nc.jdbc.framework.generator.SequenceGenerator; IdGenerator idGenerator = new Se ...
- Python——第二章:字符串操作——索引和切片
索引: 按照位置提取元素 可以采用索引的方式来提取某一个字符(文字) s = "我叫周杰伦" print(s[3]) #程序员都是从0开始数,这里的3代表第4位,也就是" ...
- Kubernetes架构及安装
K8s架构 k8s内部是有几个组件的,分别是controller manager,api-server,scheduler,kubelet以及etcd,kube-proxy还有k8s客户端kubect ...
- 启动多个redis进程
启动时指定端口 启动时指定端口可在一台服务器启动多个redis进程 cd /opt/work/redis/bin./redis-server ../conf/redis.conf --port 638 ...
- 微服务架构下,DLI的部署和运维有何奥秘?
摘要:探讨DLI两个问题:如何在生产环境中部署与运维实现快速迭代上线,如何实现监控告警来提升整体运维能力. 华为云数据湖探索DLI是支持多模引擎的Serverless大数据计算服务,其很好的实现了Se ...
- 【云小课】版本管理发展史之Git+——代码托管
摘要:选择一款版本管理工具,已经被大多数企业作为项目的必要准备工作之一,相信没有一个开发者没有听过Git.SVN这些工具. 今天我们来寻根溯源,扒一扒版本管理的发展史. 版本管理工具之于软件开发,犹如 ...
- Redis Sentinel 源码:Redis的高可用模型分析
摘要:本文通过对Redis Sentinel源码的理解,详细说明Sentinel的代码实现方式. Redis Sentinel 是Redis提供的高可用模型解决方案.Sentinel可以自动监测一个或 ...
- 如何给MindSpore添加一个新的硬件后端?快速构建测试环境!
摘要:介绍如何给MindSpore添加一个新的硬件后端. 本文分享自华为云社区<如何给MindSpore添加一个新的硬件后端?快速构建测试环境!>,原文作者:HWCloudAI. Mind ...
- 如何使用参数化查询提高Cypher查询的性能
摘要:在DBMS中,参数化查询被视为一种有效预防SQL注入攻击的手段. 本文分享自华为云社区<使用参数化查询提高Cypher查询的性能:以华为云图引擎GES为例>,作者: 蜉蝣与海. 在D ...
- app上架一直显示审核中状态要怎么处理?
当你提交一个应用到App Store上时,它会经历一个审核过程.在这个过程中,苹果的审核人员会检查你的应用是否符合苹果的规定和标准.这个过程通常需要几天的时间,但是如果你的应用一直显示" ...