Docker
安装
VScode中安装Docker扩展
Docker Desktop
任务栏搜索功能,启用"适用于Linux的Windows子系统" + "虚拟机平台"
# 管理员终端 wsl --set-default-version 2 wsl --update --web-download
下载Windows版本安装包,进入此项目的Release https://github.com/tech-shrimp/docker_installer/releases
start /w "" "Docker Desktop Installer.exe" install --installation-dir=D:\Docker // 指定安装位置
镜像加速源
// docker>设置>Docker Engine> "registry-mirrors": ["https://registry.docker-cn.com"] // "registry-mirrors": ["https://registry.docker-cn.com"],["https://docker.mirrors.ustc.edu.cn"]
镜像加速器 | 镜像加速器地址 |
---|---|
Docker 中国官方镜像 | https://registry.docker-cn.com |
DaoCloud 镜像站 | http://f1361db2.m.daocloud.io |
Azure 中国镜像 | https://dockerhub.azk8s.cn |
科大镜像站 | https://docker.mirrors.ustc.edu.cn |
阿里云 | https://ud6340vz.mirror.aliyuncs.com |
七牛云 | https://reg-mirror.qiniu.com |
网易云 | https://hub-mirror.c.163.com |
腾讯云 | https://mirror.ccs.tencentyun.com |
应用部署
在写好的应用根目录下创建一个Dockerfile
文件
FROM golang:1.13-alpine # // 指定之后所有Dockerfile命令都在/app目录下执行 WORKDIR /app # 将当前目录下的所有文件拷贝到/app目录下 # COPY . . COPY go.mod go.sum ./ # RUN go mod download,下载依赖包,创建镜像时使用 RUN go mod download # CMD 中指定运行的命令,运行容器时使用 CMD [ "go", "run", "main.go" ]
# -t指定镜像名 .dockerfile的路径 docker build -t my-finace . # 启动容器 -p容器端口映射到主机80是本地5000是容器上的端口 -d 后台运行 docker run -p 80:5000 -d my-finance
常用命令
// 例举所有的容器 docker ps // 停止容器 docker stop <容器ID> // 重启容器 docker restart <容器ID> // 删除容器,删除后之前的修改和新添加的数据会全部丢失 docker rm <容器ID> // 启动一个远程Shell docker exec -it <容器ID> /bin/bash
防丢失数据
-
删除容器,删除后之前的修改和新添加的数据会全部丢失
-
如果想保留容器中的数据,可使用
Docker
提供的volume
数据卷// 创建数据卷 docker volume create // 随后启动容器时 -v指定将数据卷挂载到容器的哪一个路径上 docker run -dp 80:5000 -v my-finance-data:/etc/finance my-finance // 把my-finance-data挂载到/etc/finance下
多个容器
-
创建一个
docker-compose.yml
文件# docker-compose.yml version: '3' # 通过services定义多个容器 services:web:build: .ports:- "80:5000"db:image: "mysql"environment:MYSQL_DATABASE: finance-db # 数据库名MYSQL_ROOT_PASSWORD: root # 数据库密码volumes:- my-finance-data:var/lib/mysql # 挂载数据卷,用来永久存放数据 volumes:my-finance-data:
// 运行所有容器 -d后台运行 docker compose up -d // 停止并删除所有的容器,新创建的数据卷需手动删除,除非在后面加 --volumes 参数 docker compose down .
<!-- -->
Docker
快速安装软件
Docker 安装 Redis
Docker 官方镜像仓库查找 Docker 镜像仓库
// cmd docker run -d -p 6379:6379 --name redis redis:latest
Docker 命令参考
Docker 安装 Wordpress
Docker 官方镜像仓库查找 Docker 镜像仓库
# docker-compose.yml version: '3.1'services:wordpress:image: wordpressrestart: alwaysports:- 8080:80environment:WORDPRESS_DB_HOST: dbWORDPRESS_DB_USER: exampleuserWORDPRESS_DB_PASSWORD: examplepassWORDPRESS_DB_NAME: exampledbvolumes:- wordpress:/var/www/htmldb:image: mysql:5.7restart: alwaysenvironment:MYSQL_DATABASE: exampledbMYSQL_USER: exampleuserMYSQL_PASSWORD: examplepassMYSQL_RANDOM_ROOT_PASSWORD: '1'volumes:- db:/var/lib/mysqlvolumes:wordpress:db:
// 在放docker-compose.yml的文件目录下打开cmd\Power Shell docker-compose up-d
更多相关命令
docker ps
查看当前运行中的容器docker images
查看镜像列表docker rm container-id
删除指定 id 的容器docker stop/start container-id
停止/启动指定 id 的容器docker rmi image-id
删除指定 id 的镜像docker volume ls
查看 volume 列表docker network ls
查看网络列表
制作自己的镜像
为自己的Web
项目构建镜像
示例项目代码
这是一个 Nodejs + Koa2 写的 Web 项目,提供了简单的两个演示页面。 软件依赖:nodejs 项目依赖库:koa、log4js、koa-router
1、在工程目录下编写 Dockerfile文件
// 工程目录/dockerfile FROM node:11 MAINTAINER easydoc.net // 复制当前代码到app目录下 ADD . /app // 设置容器启动后的默认运行目录 WORKDIR /app // 运行命令,安装依赖 // RUN 命令可以有多个,但是可以用 && 连接多个命令来减少层级。 // 例如 RUN npm install && cd /app && mkdir logs RUN npm install --registry=https://registry.npm.taobao.org // CMD 指令只能一个,是容器启动后执行的命令,算是程序的入口。 // 如果还需要运行其他命令可以用 && 连接,也可以写成一个shell脚本去执行。 // 例如 CMD cd /app && ./start.sh CMD node app.js
// 使用官方Node.js镜像作为基础镜像 FROM node:14 // 设置工作目录 WORKDIR /usr/src/app // 复制package.json和package-lock.json到工作目录 COPY package*.json ./ // 安装项目依赖 RUN npm install --registry=https://registry.npm.taobao.org // 复制项目文件到工作目录 COPY . . // 暴露端口 EXPOSE 3000 // 定义环境变量 ENV NAME World // 运行应用 CMD ["node", "app.js"]
Dockerfile文档
若写 Dockerfile 时遇到一些运行、依赖错误等,则可以直接运行一个依赖的底,然后进入终端进行配置环境,成功后再把做过的步骤命令写道 Dockerfile 文件中 例如上面的底是
node:11
,我们可以运行docker run -it -d node:11 bash
,跑起来后进入容器终端配置依赖的软件,然后尝试跑起来自己的软件,最后把所有做过的步骤写入到 Dockerfile 就好了
2、Build 为镜像(安装包)和运行
docker build -t test:v1 . // -t 设置镜像名字和版本号 // . 在当前目录 docker run -p 8080:8080 --name test-hello test:v1 // -p 映射容器内端口到宿主机 // --name 容器名字 // -d 后台运行
目录挂载
目录挂载解决的问题
-
使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新
build
和run
,很是麻烦 -
容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了
几种挂载方式
-
bind mount
直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上 -
volume
由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上 -
tmpfs mount
适合存储临时文件,存宿主机内存中。不可多容器共享。
文档参考
挂载演示
bind mount // 用绝对路径 -v D:/code:/app volume // 只需要一个名字 -v db-data:/app
// 示例 -d 镜像名:版本号 docker run -p 8080:8080 --name test-hello -v D:/code:/app -d test:v1
注意! 因为挂载后,容器里的代码就会替换为你本机的代码了,如果你代码目录没有
node_modules
目录,你需要在代码目录执行下npm install --registry=https://registry.npm.taobao.org
确保依赖库都已经安装,否则可能会提示“Error: Cannot find module ‘koa’” 如果你的电脑没有安装 nodejs,你需要安装一下才能执行上面的命令
多容器通信(放到同一个网络)
学习目标
项目往往需要数据库、缓存等配合运作 把前面的 Web 项目增加一个 Redis 依赖,多跑一个 Redis 容器,演示多容器之间的通信
创建虚拟网络
要想多容器之间互通,从 Web 容器访问 Redis 容器,我们只需要把他们放到同个网络中就可以了
文档参考
演示
# 创建一个名为 test-net 的网络 docker network create test-net # 运行 Redis容器 在 test-net 网络中,别名 redis docker run -d --name redis --network test-net --network-alias redis redis:latest
修改代码中访问redis
的地址为网络别名(演示)
运行 Web 项目,使用同个网络
# 修改代码后重新运行(目录挂载) docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1> # 查看数据 容器终端查看数据是否一致 > http://localhost:8080/redis
Docker-Compose(桌面版本自带)
Docker-Compose解决问题
如果项目依赖更多的第三方软件,需要管理的容器就更加多,每个都要单独配置运行,指定网络
这样非常麻烦,而 docker-compose可以把项目的多个服务集合到一起,一键运行
安装 Docker Compose
-
安装的桌面版 Docker,则不需要额外安装
-
若是(没图形界面的)服务器版 Docker,则需单独安装 安装文档
-
docker-compose // 检查是否安装成功
编写脚本
要把项目依赖的多个服务集合到一起,我们需要编写一个docker-compose.yml
文件,描述依赖哪些服务 参考文档
# 自动在同一个网络 # 版本号 version: "3.7"# 需要依赖的服务 services:app:# 直接从工程buildbuild: ./# 从容器8080中暴露80端口ports:- 80:8080# 挂载目录 当前目录挂载到app目录volumes:- ./:/app# 增加 TZ=Asia/Shanghai 可改为北京时间environment:- TZ=Asia/Shanghairedis:# 有镜像,不用build了image: redis:5.0.13# 挂载volumes:- redis:/data# 增加 TZ=Asia/Shanghai 可改为北京时间environment:- TZ=Asia/Shanghaivolumes:redis:
运行
// 在 docker-compose.yml 文件所在目录 docker-compose up/* 在后台运行只需要加一个 -d 参数 docker-compose up -d 查看运行状态 docker-compose ps 停止运行 docker-compose stop 重启 docker-compose restart 重启单个服务 docker-compose restart service-name service-name 是.yml定义的名字 进入容器命令行 docker-compose exec service-name sh 查看容器运行log docker-compose logs [service-name] */
命令参考
发布和部署
镜像仓库介绍
镜像仓库用来存储我们 build 出来的“安装包”,Docker 官方提供了一个 镜像库,里面包含了大量镜像,基本各种软件所需依赖都有,要什么直接上去搜索
我们也可以把自己 build 出来的镜像上传到 docker 提供的镜像库中 当然你也可以搭建自己的私有镜像库,或者使用国内各种大厂提供的镜像托管服务,例如:阿里云、腾讯云
上传镜像
-
首先你要先 注册一个账号
-
创建一个镜像库
// 命令行登录账号 docker login -u username // 新建一个tag,名字必须跟你注册账号一样 docker tag test:v1 username/test:v1 // 推上去 docker push username/test:v1 // 部署试下 docker run -dp 8080:8080 username/test:v1
docker-compose 中也可以直接用这个镜像了
version: "3.7"services:app: # build: ./image: helloguguji/test:v1ports:- 80:8080volumes:- ./:/appenvironment:- TZ=Asia/Shanghairedis:image: redis:5.0.13volumes:- redis:/dataenvironment:- TZ=Asia/Shanghaivolumes:redis:
阿里云容器托管
docker 官方的镜像托管有时候上传和下载都太慢了,如果你想要更快的速度,可以使用阿里云的免费镜像托管
备份和迁移数据
迁移方式介绍
容器中的数据,如果没有用挂载目录,删除容器后就会丢失数据。 前面我们已经讲解了如何 挂载目录 如果你是用bind mount
直接把宿主机的目录挂进去容器,那迁移数据很方便,直接复制目录就好了 如果你是用volume
方式挂载的,由于数据是由容器创建和管理的,需要用特殊的方式把数据弄出来
视频教程
备份和导入 Volume 的流程
备份:
-
运行一个 ubuntu 的容器,挂载需要备份的 volume 到容器,并且挂载宿主机目录到容器里的备份目录。
-
运行 tar 命令把数据压缩为一个文件
-
把备份文件复制到需要导入的机器
导入:
-
运行 ubuntu 容器,挂载容器的 volume,并且挂载宿主机备份文件所在目录到容器里
-
运行 tar 命令解压备份文件到指定目录
备份 MongoDB 数据演示
-
运行一个 mongodb,创建一个名叫
mongo-data
的 volume 指向容器的 /data 目录docker run -p 27018:27017 --name mongo -v mongo-data:/data -d mongo:4.4
-
运行一个 Ubuntu 的容器,挂载
mongo
容器的所有 volume,映射宿主机的 backup 目录到容器里面的 /backup 目录,然后运行 tar 命令把数据压缩打包docker run --rm --volumes-from mongo -v d:/backup:/backup ubuntu tar cvf /backup/backup.tar /data/
最后你就可以拿着这个 backup.tar 文件去其他地方导入了。
恢复 Volume 数据演示
-
运行一个 ubuntu 容器,挂载 mongo 容器的所有 volumes,然后读取 /backup 目录中的备份文件,解压到 /data/ 目录
docker run --rm --volumes-from mongo -v d:/backup:/backup ubuntu bash -c "cd /data/ && tar xvf /backup/backup.tar --strip 1"
注意,volumes-from 指定的是容器名字 strip 1 表示解压时去掉前面1层目录,因为压缩时包含了绝对路径