Docker知识点记录
一、docker是什么?
docker:是一个应用打包,发布,部署工具。
docker优势:跨平台部署,性能优越(按需分配),自动化部署,稳定性优越。
docker运行方式:Docker是C/S模式,以客户端和守护进程的方式来运行。
一个docker容器同时只能管理一个进程,这个进程退出后,容器也就退出了,当然一个容器里可以同时运行多个进程。当容器启动完后执行某脚本后,该进程结束了,其他进程也结束了,所以该容器自动退出了,解决方案:我们可以让该脚本一直运行不停止。 (知识来自博客:https://blog.csdn.net/zhuchunyan_aijia/article/details/81143481?utm_source=blogxgwz8)
docker怎么实现宿主机上的代码能够实时同步到docker ------>使用文件挂载方法(bind mount)
docker怎么能然数据持久化,不会随着容器的丢失而丢失,特别是容器运行过程中产生的数据 ----->使用文件挂载的方式(volume),容器创建在宿主机上的目录进行管理。
多容器通信:只需要将几个容器放入同一个网络中就可以;针对复杂的多个容器docker提供了docker-compose来管理。
怎么实现docker’数据的备份和迁移:bind mount方式可以直接拷贝宿主机上的数据;volume方式有容器创建和管理,可以借助Ubuntu容器将数据弄出来。详情见:https://docker.easydoc.net/doc/81170005/cCewZWoN/XQEqNjiu
docker三剑客
①. docker-machine:解决docker运行环境问题,一个linux的虚拟机。win10已经有hyper-v虚拟机,可以直接运行。(目前已经淘汰)
②. docker-componse:容器编排技术,例如:两个容器之间通信
③. docker-swarm:解决多主机多容器调度部署问题。(已经淘汰,目前用K8S代替。)run,cmd,endpoint三个指令的区别
①. run:用于镜像打包过程的命令,常用来安装软件包。
②. cmd:容器启动后执行的命令和参数,但是参数会被 docker run命令指定参数替代
③. endpoint:配置容器启动时执行的命令和参数,其参数不会被docker run命令指定的参数替代。
docker快速上手资料:https://docker.easydoc.net/doc/81170005/cCewZWoN/lTKfePfP
二、docker打包之dockerfile
docker file关键字于语法介绍:注意一点,写命令的时候要分清楚宿主机和容器的路径关系,以及运行时机
- FROM : 指定基础镜像,第一行书写
- MAINTAINER xxx 指定维护者
- ADD /mnt/disk/app /app 复制代码,将本地需要运行的执行文件拷贝到容器中
- COPY /mnt/disk/jslave/config.cfg /app 拷贝代码
- WORKDIR /app 设置容器启动后的默认目录
- LABLE name=‘username’ 为镜像添加元数据
- ENV python /user/bin/python3.8 设置镜像环境变量
- VOLUME /app 挂盘
- EXPOSE 8080 映射端口
- RUN pip install -r requirements.txt 运行pip操作,一般用来安装软件包
- CMD [‘python’, ‘/app/app.py’] 用来设置容器启动后默认执行的命令,但是CMD设置的命令会被docker run后面的命令参数替换
- ENTRYPOINT 配置容器启动时执行命令(一定会执行)
1. docker yaml文件之单双引号问题:
代码如下(示例):
# 基于基础镜像
FROM python:3.9.6
#维护者信息
MAINTAINER name xxxx
#将当前文件夹下的代码添加到镜像的 Code文件见
ADD ./docker_pywebio /code
#设置code文件夹是工作目录
WORKDIR /code
#安装支持依赖
RUN pip install -r requirements.txt
#docker 运行python程序
CMD ['python', 'code/pywebio_pyecharts_demo.py']
报错:启动容器报错:/bin/bash: 1: [python,:not found
报错分析:yaml中CMD 不能使用单引号,要用双引号
2. docker yaml文件之注释问题
代码如下(示例):
FROM python:3.9.6 #基础软件版本
MAINTAINER lwx333184 #维护者
ADD D:\01.WORKSPACE\01.docker\project_app /app #将本地文件拷贝到容器中,容器中目录自动创建
WORKDIR /app #指定容器工作区
RUN "mkdir -p /app/env" #在容器中新建env目录
COPY D:\01.WORKSPACE\01.docker\requriments.txt /app/env #将本地文件复制到容器目录中
ENV USERNAME=lwx333184 #传递环境变量
LABLE PASSWD=11111
RUN pips install -r /app/env/requriments.txt #RUN执行容器中的文件
VOLUME /app #数据持久,挂盘
EXPOSE 8080 #容器端口暴露给宿主机
CMD ["python", "/app/kunyi_docker.py"] #执行容器中的程序文件
报错:启动容器报错:failed to solve with frontend dockerfile.v0: failed to create LLB definition: dockerfile parse error line 1: FROM requires either one or three arguments
报错分析:yaml中会把在同一行的注释当成参数,所以注释必须单独为一行
3. docker yaml文件ADD、COPY不支持绝对路径
代码如下(示例):
#基础软件版本
FROM python:3.9.6
#维护者
MAINTAINER lwx333184
#将本地文件拷贝到容器中,容器中目录自动创建
ADD D:\01.WORKSPACE\01.docker\project_app /app
#指定容器工作区
WORKDIR /app
#在容器中新建env目录
RUN "mkdir -p /app/env"
#将本地文件复制到容器目录中
COPY D:\01.WORKSPACE\01.docker\requriments.txt /app/env
#传递环境变量
ENV USERNAME=lwx333184
#添加元数据
LABEL PASSWD=11111
#RUN执行容器中的文件
RUN pips install -r /app/env/requriments.txt
#数据持久,挂盘
VOLUME /app
#容器端口暴露给宿主机
EXPOSE 8080
#执行容器中的程序文件
CMD ["python", "/app/kunyi_docker.py"]
报错:容器build的时候报错,
failed to compute cache key: “/D:01.WORKSPACE01.dockerrequriments.txt” not found: not found
报错分析:docker file中 ADD,COPY只能使用build中PATH路径的相对路径,不能使用绝对路径。
4. docker yaml文件RUN shell脚本
代码如下(示例):
#基础软件版本
FROM python:3.9.6
#维护者
MAINTAINER lwx333184
#将本地文件拷贝到容器中,容器中目录自动创建
ADD ./project_app /app
#指定容器工作区
WORKDIR /app
#在容器中新建env目录
RUN "mkdir -p /app/env"
#将本地文件复制到容器目录中
COPY ./requriments.txt /app/env
#传递环境变量
ENV USERNAME=lwx333184
#添加元数据
LABEL PASSWD=11111
#RUN执行容器中的文件
RUN pips install -r /app/env/requriments.txt
#数据持久,挂盘
VOLUME /app
#容器端口暴露给宿主机
EXPOSE 8080
#执行容器中的程序文件
CMD ["python", "/app/kunyi_docker.py"]
报错:容器build的时候报错,
=> ERROR [4/6] RUN “mkdir -p /app/env”
#8 0.471 /bin/sh: 1: mkdir -p /app/env: not found
报错分析:docker file中 RUN语句常用来执行软件安装,容器未启动时,时无法创建文件夹的;其中CMD时容器启动后默认执行的参数,参数可以被docker build中的参数取代;ENTRYPOINT 时容器启动时的命令,一定会执行
5. 正确的dockerfile文件—打包python
正确较为全面的DockerFile文件
#基础软件版本
FROM python:3.9.6
#维护者
MAINTAINER lwx333184
#将本地文件拷贝到容器中,容器中目录自动创建
ADD ./project_app /app
#指定容器工作区
WORKDIR /app
#将本地文件复制到容器目录中
COPY ./requriments.txt /app
#传递环境变量
ENV USERNAME=lwx333184
#添加元数据
LABEL PASSWD=11111
#RUN执行容器中的文件
RUN pip install -r /app/requriments.txt
#数据持久,挂盘
VOLUME /app
#容器端口暴露给宿主机
EXPOSE 8080
#执行容器中的程序文件
CMD ["/bin/bash", "mkdir -p /app/env; mv /app/requriments.txt /app/env"]
CMD ["python", "/app/kunyi_docker.py"]
三、docker命令汇总
1. docker 下载命令
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
- OPTIONS:-a , Download all tagged images in the repository
-q, Suppress verbose output - 举个例子:下载mysql:【 docker pull mysql】【 docker pull mysql:5.7.20】
2. docker 打包命令
docker build [OPTIONS] PATH | URL | -
- OPTIONS:-f 指定dockerfile文件路径
-t 指定dockerImage的名字和版本号 - PATH|URL:给出命令执行的上下文。上下文可以是构建执行所在的本地路径,也可以是远程URL,如Git库、tarball或文本文件等。
3.docker 启动命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
options参数介绍:
- -d 后台运行
- -i 打开STDIN,以交互模式运行容器,通常与 -t 同时使用
- -t 分配一个伪tty,一般与 -i 连用
- -p 可以指定容器对宿主机暴露的端口
- -v 指定容器挂载方式(bind mount,volume, tmpfs mount)
常见的几个例子:
- 后台执行容器,能够登陆控制台管理: docker run -i -t -d image_name
- 为容器指定一个名字:docker run -d --name=my_container_name image_name
- 容器暴露80端口给宿主机:docker run -d --name=my_container_name -p 80:80 image_name
- 宿主机目录挂载到容器: docker run -d --name=my_container_name -v 绝对路径:容器目录 image_name
- 容器挂载目录在宿主机上:docker run -d --name=my_container_name -v 自定义取宿主机上挂载目录名字:容器目录 image_name
4.docker 查看命令
docker ps [OPTIONS]
- docker ps 查看当前正在运行的容器 ;
- docker ps -a 查看所有运行过,正在运行的容器详情
- docker ps -n 5 Show n last created containers
- docker ps -l Show the latest created container
docker images [OPTIONS] [REPOSITORY[:TAG]]
- docker images 查看所有docker镜像
- -a ,-f ,-q和docker ps一样
docker volume ls 查看volume列表
docker network ls 查看网络列表
docker exec -it container_id bash 进入容器
docker container attach contain_id 进入容器,当多个终端同时进入的时候,所有窗口会同步显示; 实际操作中改命令卡住,特别注意,推出的时候,容器会同步推出,所以需要用 Ctrl+P+Q来退出。
5.docker 操作命令
docker rm container-id 删除指定id的容器
docker rm container-id 删除指定id的容器
docker rmi image-id/image-name:version 删除指定id的镜像
docker stop/start container-id 停止/启动指定id的容器
6.docker 网络操作命令
docker network COMMAND
- connect:Connect a container to a network
- create:Create a network
- disconnect: Disconnect a container from a network
- inspect: Display detailed information on one or more networks
- ls:List networks
- prune: Remove all unused networks
- rm: Remove one or more networks
举个例子:应用要与数据库通信,则需要通过网络将应用和MySql建立通信,方法就是部署在同一个网络中。
- 创建网络:docker create network your_network_name
- 运行MySql在这个网络:docker run -d --name 容器别名 --network 网络名称 --network-alias 设置网络别名 -t 镜像名称:版本号
- 运行你的容器,指定相同的network:docker run -d -t 镜像:版本号
注意:若容器已经启动,则可以使用如下命令进行网络切换:docker network connect --alias mysql my-network mysql
7.docker 其他操作命令(docker --help)
docker [OPTIONS] COMMAND
总结
Docker 打包,发布,运行的方式极大的提升了应用程序的可移植性,是运维三板斧之一。
Docker知识点记录相关推荐
- javaweb基础知识点记录2
javaweb基础知识点记录 1.在service方法中,首先获得请求的方法名,然后根据方法名调用对应的doXXXX方法,比如说请求参数为GET,那么就会去调用doGet方法,请求参数为POST,那么 ...
- javaweb基础知识点记录1
javaweb基础知识点记录 1.当我们通过在浏览器的输入栏中直接输入网址的方式访问网页的时候,浏览器采用的就是GET方法向服务器获取资源. 2.我们可以将Servlet看做是嵌套了HTML代码的ja ...
- 一、docker临时记录
docker 临时记录(阿里云centos7.2.1511 ) 查看系统版本号 适用于Redhat/CentOS: [root@iz2zecm4ndtkaue32tynx5z ~]# cat /etc ...
- 毕业论文知识点记录(四)——MaxEnt模型
毕业论文知识点记录(四)--MaxEnt模型 0 序言 经过了几次文章分享,数据已经准备得差不多了,师姐说可以先利用现有数据跑一个结果,然后再逐步增加想要的环境数据,改善结果. 另外,谨记师姐的一句话 ...
- SpringMVC知识点记录
SpringMVC知识点记录 1. SpringMVC简介 2. 入门案例 3. @RequestMapping注解 3.1 @RequestMapping注解的功能 3.2 @RequestMapp ...
- 毕业论文知识点记录(六)——基于R语言优化maxent模型
毕业论文知识点记录(六)--基于R语言优化maxent模型 第一步:R安装 这个网上都有很多详细的步骤,就不再详细介绍了. 第二步:R安装包 因为优化maxent模型需要用到kuenm程序包,但是官网 ...
- 毕业论文知识点记录(三)——SPSS去相关
毕业论文知识点记录(三)--SPSS去相关 #(一)数据下载 1.草地贪夜蛾的发生记录,这个数据在前面文章中有描述.草地贪夜蛾发生记录下载 2.气候数据 数据来源:worldclim 我选择的分辨率是 ...
- docker 学习记录1
一. 1. Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到 ...
- 油猴脚本——掘金Markdown格式适配器知识点记录【油猴脚本、Markdown、浏览器文件读取、tooltip、SVG、、模拟用户输入、aria-xxxx属性、剪切板操作、】
油猴脚本--掘金Markdown格式适配器知识点记录 脚本更新日志 参考:掘金Markdown格式适配器更新日志 - 掘金 脚本地址: 更新:2021年9月3日19:57:35 参考:掘金Markdo ...
最新文章
- Unity自动保存场景脚本
- 1亿美元,苹果把网易投资的VR公司收了
- 转: mysql create view 创建视图
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )
- Python中局部变量和全局变量的详解
- autowired注入为 mapper为null_兰新高铁为区域经济发展注入活力
- linux中eclipse不运行,linux下启动不了eclipse
- ★LeetCode(1078)——Bigram 分词(JavaScript)
- [转]-Sublime Text 3最好的功能、插件和设置
- java 富文本 xss_Jsoup 防止富文本 XSS 攻击
- android 关于view的onTouch和onClick同时触发解决方案
- windows编译python扩展Unable to find vcvarsall
- stringify中文乱码?
- 2016.1云南之旅
- 全球及中国3,4-二氯异噻唑-5-羧酸行业研究及十四五规划分析报告
- hadoop命令无法创建目录
- golang+uniapp 开发的一套微信小程序电商系统
- 话费充值 php,首信易支付,电话费充值接口
- iframe 接班人-微前端框架 qiankun 在中后台系统实践
- flash php个人站_PHP Flash整站系统
热门文章
- Matlab证书过期的解决办法
- 论文:Super-Resolution Delay-Doppler Estimation for OFDM Passive Radar
- Linux C/C++编程之(十)动态库的制作和使用
- PHP Imagick添加文字水印
- [CF538F]A Heap of Heaps
- Ubuntu 下处理excel表格库xlslib和libxls的下载安装
- python动态横道图_python的matplotlib.pyplot绘制甘特图
- PS:自我提升开始了
- LILO-Linux引导程序
- 【深度学习】什么是互信息最大化?