docker教程
基本
常用命令:
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
查看网络列表
compose相关命令:
docker-compose up -d
在后台运行只需要加一个 -d 参数docker-compose ps
查看运行状态docker-compose stop
停止运行docker-compose restart
重启docker-compose restart service-name
重启单个服务:docker-compose exec service-name sh
进入容器命令行docker-compose logs [service-name]
查看容器运行log
制作镜像
编写Dockerfile
Dockerfile reference | Docker Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18FROM node:11
MAINTAINER easydoc.net
# 复制代码
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编译
docker build -t test:v1 .
-t
设置镜像名字(test)和版本号(v1)
命令参考:docker build | Docker Documentation运行
docker run -p 8080:8080 --name test-hello test:v1
-p
映射容器内端口到宿主机--name
容器名字-d
后台运行
命令参考文档:Docker run reference | Docker Documentation
目录挂载
解决问题:
- 使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新
build
和run
,很是麻烦。 - 容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了。
挂载方式:
bind mount
直接把宿主机目录映射到容器内
适合挂代码目录和配置文件。
可挂到多个容器上
命令,用绝对路径
-v D:/code:/app
volume
由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效。
Linux 文件系统,适合存储数据库数据。
可挂到多个容器上
命令,取个别名
-v db-data:/app
tmpfs mount
适合存储临时文件,存宿主机内存中。不可多容器共享。(不常用)
示例:docker run -p 8080:8080 --name test-hello -v D:/code:/app -d test:v1
多容器通信
容器之间有依赖,需要放在同一个网络下实现通信。
例如web项目一个容器,redis一个容器,web容器依赖redis容器。
docker network | Docker Documentation
创建一个名为
test-net
的网络:docker network create test-net
运行 Redis 在
test-net
网络中,redis容器在网络中的别名是redis
docker run -d --name redis --network test-net --network-alias redis redis:latest
修改代码中访问
redis
的地址为网络别名let rds = redis.createClient({url: "redis://redis:6379"});
运行 Web 项目,使用同个网络
docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1
Docker-Compose
docker-compose 把项目的多个服务集合到一起,一键运行,各容器都在同一网络。
linux上安装
编写配置脚本
把项目依赖的多个服务集合到一起,写一个
docker-compose.yml
,描述依赖哪些服务Overview of Docker Compose | Docker Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22version: "3.7"
services:
app:
build: ./
ports:
- 80:8080
volumes:
- ./:/app
environment:
- TZ=Asia/Shanghai
#容器默认时间不是北京时间,增加 TZ=Asia/Shanghai 可以改为北京时间
redis:
image: redis:5.0.13
volumes:
- redis:/data
environment:
- TZ=Asia/Shanghai
volumes:
redis:
ogvolume01: {}运行
在
docker-compose.yml
文件所在目录,执行:docker-compose up
就可以跑起来了。
备份和迁移
对于目录挂载中,选择 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层目录,因为压缩时包含了绝对路径