Docker 学习笔记

Docker的简介与安装

Docker 是一个应用打包、分发、部署的工具
你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要,
而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。

跟普通虚拟机有支持系统多,性能好,命令快速部署,稳定性好的优点

打包,分发,部署

使用:就是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包,把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装,拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一摸一样的运行环境,不管是在 Windows/Mac/Linux,还能多版本软件共存

镜像加速源

镜像加速器 镜像加速器地址
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

docker安装软件

docker run -d -p 6379:6379 –name redis redis:latest

  • -d:后台运行容器,并返回容器ID
  • -p:会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
  • –name 取名
  • docker images 查看镜像信息列表 镜像是静态的

docker-compose up -d 根据docker-compose 文件来安装

制作自己的镜像

编写Dockerfile

FROM 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

#Build为镜像和运行
编译 docker build -t test:v1 .
-t 设置镜像名字和版本号
运行 docker run -p 8080:8080 --name test-hello test:v1
-p 映射容器内端口到宿主机
--name 容器名字
-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 查看网络列表

目录挂载

通过目录挂载可解决

  • 使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新buildrun,很是麻烦。
  • 容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了。

挂载方式

  • bind mount 直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上
  • volume 由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上
  • tmpfs mount 适合存储临时文件,存宿主机内存中。不可多容器共享。
bind mount` 方式用绝对路径 `-v D:/code:/app
volume` 方式,只需要一个名字 `-v db-data:/app
# 实例
docker run -p 8080:8080 --name test-hello -v D:/code:/app -d test:v1
docker run -d -v vol:/data --name temp-redis redis
自动挂载
docker run -d -v /data --name temp-redis redis
想要知道具体的宿主机目录可以使用:docker inspect 来查看
就可以对某个目录进行持久化

多容器通讯

我们把前面的 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
# 运行Web项目 使用同一个网络
docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1

这样我们就可以用多个容器去运行这个项目

Docker - Compose

如果你是安装的桌面版 Docker,不需要额外安装,已经包含了,docker-compose 把项目的多个服务集合到一起,一键运行。

要把项目依赖的多个服务集合到一起,我们需要编写一个docker-compose.yml文件,描述依赖哪些服务

version: "3.7"

services:
app:
build: ./
ports:
- 80:8080
volumes:
- ./:/app
environment:
- TZ=Asia/Shanghai
redis:
image: redis:5.0.13
volumes:
- redis:/data
environment:
- TZ=Asia/Shanghai

volumes:
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
进入容器命令行:docker-compose exec service-name sh
查看容器运行log:docker-compose logs [service-name]

发布镜像

  • 创建镜像库

  • 命令行登录账号:
    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 run -it : /bin/bash

  • 拉取镜像

    docker pull :

docker-compose 中也可以直接用这个镜像了

version: "3.7"

services:
app:
# build: ./
image: helloguguji/test:v1
ports:
- 80:8080
volumes:
- ./:/app
environment:
- TZ=Asia/Shanghai
redis:
image: redis:5.0.13
volumes:
- redis:/data
environment:
- TZ=Asia/Shanghai

volumes:
redis: