Docker学习

Docker认识

终于有点时间可以学习下docker了,想了解下这货是干嘛用的呢?

1.docker概念理解

  • 开源应用容器引擎,Go语言编写,遵从Apache2.0协议开源。
  • “一种轻量级、进程级VM”,对于这名话我个人理解:可以认为他是一个特别的VM,特别之处再于它不需要有自己的操作系统,是用的主机层面自有的操作系统,这也是为什么说他是进程级的VM,也是轻量级所在。

2.docker应用场景

  • WEB应用的自动化打包和发布
  • 自动测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其他的后台应用
  • 从头编译或者扩展现有的OpenShift 或 Clound Foundry 平台来搭建自己的PaaS环境。
    以上内容摘抄自菜鸟教程

一个实际应用场景:比如我们开发完应用后需要移交给测试同学进行测试,那么我们需要一套测试环境,并把相应的环境依赖都复制到测试环境上(JDK、数据库、中间件、WEB应用等),即我们本地有一套开发环境,测试人员还得再装一套测试环境,如果将来上生产还得搞一套生产环境出来。那可不可像VM一样,我们把自己的开发环境都装在VM上,然后把VM 拷贝出来一份扔到测试环境里。再copy一份扔到生产环境中,这就需要用docker来实现了。VM不香吗?VM的操作系统是占用硬件资源的,docker可以基于主机的操作系统当成进程一样可以打包移植。如果上面的内容大家没懂,那再想一下这样的场景:安装MYSQL需要几步呢?(1)找到Mysql官网 (2)找到下载资源 (3)选择需要的版本 (4)下载本地并安装;如果用docker呢?直接用docker命令拉取、运行即可了。工作简单了不少吧。它最大的好处就是快速化部署。

3.docker必要了解的概念

这一小节建议大家先去官网了解下相关概念,下面从我个人的理解角度来归纳下,如有不准确的请大家指教

  • 镜像(image):可简单理解成一个可执行的程序;
  • 容器(Container):一个进程,运行起来的境像;活着的镜像
  • 仓库(Repository):存镜像的仓库,可以简单理解成应用市场(Docker Hub就是一个仓库 ),仓库里有很多个版本(Tag)的镜像.
  • dockerfile:用于构建镜像的文件文件,里面包含了一条条构建镜像所需的指令和说明。

4.docker常用指令说明

指令类型指令截图所示
系统信息:infodocker info在这里插入图片描述
版本 Versiondocker version在这里插入图片描述
停止容器:stop(start\restart)docker stop在这里插入图片描述
删除容器:rm (与kill的区别:1)rm会删除容器运行产生的数据,而kill不会删除容器运行中产生的数据; 2)rm可以删除一一个或多个容器,kill通过信号量删除一个)docker rm [OPTIONS] CONTAINER [CONTAINER…]在这里插入图片描述
创建容器并执行命令:run【-p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -itd:启动守护进程执行交互命令】docker run [OPTIONS] IMAGE [COMMAND] [ARG…]注:docker安装完后通过mysql -hlocalhost -P3206 -uroot -proot 登陆时会报2059,需要登陆客户端连接后执行以下命令:(1)ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘root’ (2) flush PRIVILEGES在这里插入图片描述在这里插入图片描述
运行的容器中执行命令:execdocker exec [OPTIONS] CONTAINER COMMAND [ARG…]docker exec -i -t mynginx /bin/bash
列出所有容器:psdocker ps [OPTIONS] 【docker ps -a】-a显示所有的容器包括未运行的。如果docker ps是只显示运行的容器在这里插入图片描述
显示容器资源情况:statsdocker stats -a
拉取镜像:pulldocker pull [OPTIONS] NAME[:TAG@DIGEST]docker pull java 或者docker pull -a java
镜像查看image ls/imagesdocker image ls或者docker images在这里插入图片描述
容器日志:docker logs显示最新10条日志:docker logs --tailf 10 mysql-test、显示实时日志:docker logs -f mysql-test在这里插入图片描述
查看端口映射:docker portdocker port mysql-test在这里插入图片描述
导入镜向:loaddocker loaddocker load与docker import 区别:前者是导入镜向到本f 镜像库,docker import 导入一个容器快照到本地镜向库;docker pull是从网络下载镜向,即如果可连外网直接用pull,如果是内网使用load

5.容器内命令安装
想试下xxl-job,于是按教程下载镜向,并启动容器,但发现数据库连接不上。windows操作系统, Docker desktop玩的docker,本地命令可以直接telnet通数据库;会不会是容器启动后无法连接了(其实本地可以telnet通,docker容器就可以)?
抱着试试的想法分步操作。先通过docker ps查看一下容器信息,如下所示:
在这里插入图片描述

(1)通过exec启动一个进入容器的交互窗口

docker exec -it -t 7d5faa025aec /bin/bash

在这里插入图片描述
(2)apt-get安装命令
telnet 一下数据库信息发现没有telnet命令,去yum发现没有yum命令,百度了一下,windows的docker desktop可以用apt-get安装相应命令,先按一个telnet吧

apt-get update
apt-get install telnet

如下图所示,安装成功:
在这里插入图片描述
安装成功后发现可以用telnet命令了,可以telnet通,虽没解决我的问题,但是docker进入容器进行交互,容器中下载命令学会了。
4.doker网络问题
上一小节中xxl-job启动了N次容器,登陆就是不成功,提示数据库连接失败,终于发现原因了。启动容器脚本如下所示:

docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=root" -p 9000:8080 -v /tmp:/data/applogs --name xxl-job-admin --privileged=true -d xuxueli/xxl-job-admin:2.4.0

检查了N遍数据库都正常,用户名、密码、权限都正常,就是连不上,后来想着进入容器,看下能否telnet通数据库,果然不通。经了解,答案如下所示:

docker容器启动后也会拥有一个默认ip。
docker在启动成功后会有一个自己的ip,这个ip和本机的ip不是同一个ip,所以在写代码的时候,一定要注意localhost、127.0.0.1这样的命名,最好写一个指定的ip。为了安全起见,小编推荐使用内网ip,这样也会避免来自外网的网络攻击行为。

按上述,改成了宿主机内网IP成功了

5.打包镜向
待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值