首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Docker学习

Docker学习

作者头像
用户11690639
发布2026-06-17 21:49:51
发布2026-06-17 21:49:51
920
举报

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启动一个进入容器的交互窗口

代码语言:javascript
复制
docker exec -it -t 7d5faa025aec /bin/bash
在这里插入图片描述
在这里插入图片描述

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

代码语言:javascript
复制
apt-get update
apt-get install telnet

如下图所示,安装成功:

在这里插入图片描述
在这里插入图片描述

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

代码语言:javascript
复制
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通数据库,果然不通。经了解,答案如下所示:

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

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

5.打包镜向 待续

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker认识
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档