Docker
因玩,需要在云服务器安装mongodb环境,又常听后端小伙伴说docker怎么怎么好,于是学习一波,后将mongodb装在docker的容器中,看看它有多好。
1、概念
ps: 概念方面写多是自己的白话理解,直观、方便理解记忆。
Docker就像个虚拟机,与主机环境分割,且能像应用程序安装包(.exe/.dmg)一样方便地打包、卸载、重装。其试错成本低、一致性高,无论是新手用于捣鼓服务器、还是老手用于做镜像备份都大有裨益。这也是我了解Docker以后决定使用它的原因。
1.1 容器 container
被主机所有其他进程隔离的单独进程,也是镜像运行后的实例,类比虚拟机。每个容器有自己的环境。一般不相互影响。
1.2 镜像 image
只读,类似安装包。可从镜像生成容器,也可从自定义的环境生成镜像,用于部署类似环境的其他容器。
1.3 仓库 docker hub
类似git,用于镜像的工作流管理。
2、命令
2.1 启动容器
getting-started
是docker官方的一个教程向的镜像,启动之后可以跟着教程学习docker的相关知识(英文)。
# 从镜像getting-started启动容器
$ docker run -dp 80:90 getting-started
# -d 以分离模式在后台运行
# -p port1:port2 映射主机port1端口到容器的port2端口
# 查看 docker 容器状态
$ docker ps
# 停止容器
$ docker stop <the-container-id>
# 删除容器
$ docker rm <the-container-id>
# 查看本地镜像
$ docker image ls
2.2 构建docker镜像
假设项目目录为/app
新建文件/app/Dockerfile
FROM node:12-alpine
# 添加构建工具确保 yarn install 可以在 苹果芯片或arm64机器上可以运行
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
# 指定容器启动后的命令
CMD [ "node","src/index.js" ]
打包
# 打包镜像
$ docker build -t <image-name> .
# -t 镜像命名
# . Dockefile所在目录
与dockerhub交互
# 登录到dockerhub
$ docker login -u YOUR-USER-NAME
# 给仓库加<tag>
$ docker <tag> <tag-name> YOUR-USER-NAME/<respository-name>
# push镜像到仓库
$ docker push YOUR-USER-NAME/<respository-name>[<tag>]
# 运行仓库镜像
$ docker run -dp port-host:post-container USER-NAME/<respository-name>
2.3 Volumes
卷。用以在主机中存储数据。可分为 Named Volumes 和 Bind Mounts。
Named Volumes
可用于持久化数据、共享容器数据。
# 创建命名卷
$ docker volume create <volumn-name>
# 连接命名卷启动容器
$ docker run -dp <port-host>:<port-container> -v <volume-name>:<container-path> <image-name>
Bind Mounts
可关联host文件与container,可用于本地开发docker时的热重载。
考虑暂不使用,浅尝辄止,略。
3、Docker Compose
用于管理多容器应用的工具。
由项目根目录的YAML(.yml)文件声明。
# docker-compose.tml
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
4、涉及构建镜像最佳实践的其他命令
浅尝辄止,暂不深入
# 安全扫描
$ docker scan <image-name>
# 查看镜像层(命令、大小)
$ docker image history <image-name>
# .dockerignore
node_modules