🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# docker [参考文章1111](https://mp.weixin.qq.com/s/-HpOuI2Y-YMjK2IBnZo0CQ) [阮一峰教程docker](http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html) [参考222](http://www.cocoachina.com/articles/28320) [Windows下通过DockerToolbox安装Docker](https://baijiahao.baidu.com/s?id=1648265135539345290&wfr=spider&for=pc) [docker hub官网](https://hub.docker.com/) Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行。 **虚拟机**更擅长于**彻底隔离整个运行环境**。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。 而**Docker**通常用于**隔离不同的应用** ,例如前端,后端以及数据库。 ## **基本概念** - Docker的工作原理: 镜像(Image)、容器(Container)、仓库(Repository) - 镜像构建:-- **分层存储** > 一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 > > 删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。 - 镜像是静态的类,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。 容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录; - 仓库:把构建后的镜像上传到服务器 > 每个容器都在自己的命名空间中运行,但使用与所有其他容器完全相同的内核。 > 发生隔离是因为内核知道分配给进程的命名空间, > 并且在API调用期间确保进程只能访问其自己的命名空间中的资源。 - **Docker工作流程** ```javascript +--------+ docker build +-------+ docker run -dt +-------+ docker exec -it +------+ | Dockerfile | ---------> | Image | ---------> | Container | ----------> | Bash | ``` ## **Dockerfile** 一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明 FROM、ENV、RUN、ADD、CMD、EXPOSE(容器对外映射的本地端口)、 ```js // 基础源镜像 docker images -a |grep nginx 查看nginx的版本对应修改 FROM nginx:1.19.8 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ADD default.conf /etc/nginx/conf.d/ ADD dist/ /usr/share/nginx/html // -R “递归”放开权限! 否则可能出现404 RUN chmod -R 755 /usr/share/nginx/html // CMD -- 启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令 // daemon off是指nginx服务不运行在后端,即后台进程 守护进程,而是在前台运行 CMD ["nginx", "-g", "daemon off;"] ``` ## **Docker Compose** https://blog.csdn.net/weixin_47153988/article/details/108739622 实现对Docker容器集群的快速编排,需要多个容器相互配合来完成某项任务的情况,例如一个Web项目,还需要后端的数据库服务容器、负载均衡容器等。 Compose通过docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目 - 使用 Dockerfile 定义应用程序的环境。 - 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 - 最后,执行 docker-compose up 命令来启动并运行整个应用程序。 > build dockerfile context 指定Dockerfile文件名构建镜像上下文路径 > image 指定镜像 > command 执行命令,覆盖默认命令 > container name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale > deploy 指定部署和运行服务相关配置,只能在swarm模式适用 > environment 添加环境变量 > networks 加入网络 > ports 暴露容器端口,与-p相同,但端口不能低于60 > volumes 挂载宿主机路径或命令卷 > restart 重启策略,默认no,always,no-failure,unless-stoped > hostname 容器主机名 > Docker-Compose标准模板文件应该包含version、services、networks 三大部分 ```yaml // vim docker-compose.yml version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - 1111:80 - 2222:443 networks: - web volumes: - ./wwwroot:/usr/local/nginx/html tomcat: hostname: tomcat build: context: ./tomcat dockerfile: Dockerfile ports: - 9527:8080 networks: - web volumes: - ./ROOT:/usr/local/tomcat9/webapps/ROOT networks: web: ``` `docker-compose -f docker-compose.yml up -d '启动docker-compose'` - Docker Compose常用命令 | build | 重新构建服务 | | ------------------ | ---------------------------- | | ps | 列出容器 | | up | 创建和启动容器 | | exec | 在容器里面执行命令 | | scale | 指定一个服务容器启动数量 | | top | 显示容器进程 | | logs | 查看容器输出 | | down | 删除容器、网络、数据卷和镜像 | | stop/start/restart | 停止/启动/重启服务 | ## **基本命令** - 打镜像 ```js docker build -t hub.dw/library/my-vue-web:v1.0 . docker images -a |grep my-vue-web docker push hub.dw/library/my-vue-web:v1.0 // 如果打镜像和部署的服务器不在同一台 或者 yaml文件指定nodeName,并不是打镜像的这台服务器 docker save hub.dw/library/my-vue-web:v1.0 | gzip > my-vue-web:v1.0.tar.gz scp ./my-vue-web:v1.0.tar.gz apps@10.222.102.3:/home/apps/fuzuxian docker load -i my-vue-web:v1.0.tar.gz docker images -a |grep my-vue-web docker push hub.dw/library/my-vue-web:v1.0 // docker tag hub.dw/library/my-vue-web:v1.0 hub.dw/library/my-vue-web:v1.1 ``` - 容器生命周期管理:run、start/stop/restart、kill、rm、pause/unpause、create、exec - 容器操作:ps、inspect、top、attach、events、logs、wait、export、port - 容器rootfs命令:commit、cp、diff - 镜像仓库:login、pull、push、search - 本地镜像管理:images、rmi、tag、build、history、save、load、import ```js // docker run :创建一个新的容器并运行一个命令 // 以后台模式启动,并将容器命名为mynginx docker run --name mynginx -d nginx:latest // -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 // docker commit :从容器创建一个新的镜像。 // 将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。 docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1 // docker cp :用于容器与主机之间的数据拷贝。 // 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。 docker cp /www/runoob 96f7f14e99ab:/www/ ```