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常用指令说明
指令类型 | 指令 | 截图所示 |
---|---|---|
系统信息:info | docker info | |
版本 Version | docker 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 |
运行的容器中执行命令:exec | docker exec [OPTIONS] CONTAINER COMMAND [ARG…] | docker exec -i -t mynginx /bin/bash |
列出所有容器:ps | docker ps [OPTIONS] 【docker ps -a】-a显示所有的容器包括未运行的。如果docker ps是只显示运行的容器 | |
显示容器资源情况:stats | docker stats -a | |
拉取镜像:pull | docker pull [OPTIONS] NAME[:TAG@DIGEST] | docker pull java 或者docker pull -a java |
镜像查看image ls/images | docker image ls或者docker images | |
容器日志:docker logs | 显示最新10条日志:docker logs --tailf 10 mysql-test、显示实时日志:docker logs -f mysql-test | |
查看端口映射:docker port | docker port mysql-test | |
导入镜向:load | docker load | docker 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.打包镜向
待续