基础概念
container就是一个微型环境。
container是一层一层组成的,如果下载同一个container的新版本,并且本地存在旧版本,那就只会下载一些不同的层,从而减少下载时间,但是这并不重要。
image是在不运行时的那些包
container是在运行时装image的环境
操作系统分为内核态和用户态,可以直接地理解为是内核和应用两层,docker和虚拟机的虚拟程度不同,导致两者的兼容性不同,docker必须在对应的kernel上才能执行,虚拟机可以在任意地方执行。docker牺牲兼容性,换速度和内存大小。
docker基于的都是linux内核,导致docker在一些的windows或者mac上无法运行,下载docker toolbox。
从docker hub下载并运行container
以下载postgres的9.6版本为例
方法一
直接到docker desktop进行run
方法二
docker run postgres:9.6 冒号后面表示版本
例如下图表示6个不同的版本
查看正在运行的container
方法一
docker ps
方法二
常用命令
常见命令使用流程
image
下载image
docker pull image名:版本号
将image压缩并放到本地
docker save -o 压缩文件名.tar image名:tag
示例:docker save -o nginx.tar nginx:latest
将image压缩包加载为image
docker load -i 压缩文件名.tar
查看本地image
docker images
删除本地imag(remove image)
docker rmi image名:tag
举例:docker rmi nginx:latest
container
运行docker
docker run -d -p主机接口:container接口 --name 容器名称 镜像名称:tag
示例:docker run -d -p80:80 --name nginx nginx
- -d detached模式后台运行
- -p 设置主机的哪个接口对container的接口进行监听
- --name 容器别名
查看正在运行的container
docker ps
查看所有container(包括未运行的)
docker ps -a
暂停container
docker stop image的ID号
暂停以后启动container
docker start image的ID号
进入容器内部
docker exec -it container名字 /bin/bash
有时候是/bin/sh
退出容器内部
exit
删除容器
docker rm container名称 -f
- -f强制删除
volume
volume数据卷,在container中创建volume,在主机上也会创建,绑定后 就能同步修改
挂载数据卷
docker run -d -p主机接口:container接口 --name 容器名称 -v本地目录:容器内目录 镜像名称:tag
示例:docker run -d -p80:80 --name -v nginx nginx
查看数据卷
docker volume ls
查看数据卷详细信息(包括数据卷在哪)
docker volume inspect 数据卷名
自定义镜像
写requirements.txt
pip freeze > requirements.txt
docker network
处于同一network下的container可以仅使用container名进行通信,不用使用端口什么的,你就当作分组用就行
查看已有的docker newtwork
docker network ls
创建空的docker
docker network create 网络名
示例:docker network create mongo-network
运行docker并且将docker放入network中
docker run --network 网络名
docker compose
docker命令的自动化脚本,其中缩进很重要,你到vscode保存一下就行,下面展示如何将两个命令转化为compose。 你会发现没有设置docker network的机会,因为他会直接把compose下的container弄到同一个network下
用docker compose启动配置脚本
docker-compose -f mongo.yaml up -d 后台执行
用docker compose关闭配置脚本
docker-compose -f mongo.yaml down
docker run -d \ # 后台运行
-p 27017:27017 \ # 主机端口:服务器端口映射
--network mongo-network \ # 放到哪一个docker betwork
--name mongodb \ # container名字
-e MONGO_INITDB_ROOT_USERNAME=zhengzhouyi \ # 环境变量,管理员用户名
-e MONGO_INITDB_ROOT_PASSWORD=123 \ # 环境变量,管理员密码
mongo # image名
docker run -d \ # 后台运行
-p 8081:8081 \ # 主机端口:服务器端口映射
--network mongo-network \ # 放到哪一个docker betwork
--name mongo-express \ # container名字
-e ME_CONFIG_MONGODB_ADMINUSERNAME=zhengzhouyi \ # 环境变量,管理员用户名
-e ME_CONFIG_MONGODB_ADMINPASSWORD=123 \ # 环境变量,管理员密码
-e ME_CONFIG_MONGODB_SERVER=mongodb \ # 环境变量,数据库container名
-e ME_CONFIG_BASICAUTH_USERNAME=zhengzhouyi \ # 环境变量,用户名
-e ME_CONFIG_BASICAUTH_PASSWORD=123 \ # 环境变量,密码
mongo-express # image名
version: '3' # docker compose 版本
services:
mongodb: # container名字
image: mongo # image名
ports:
- 27017:27017 # 主机端口:服务器端口映射
environment:
- MONGO_INITDB_ROOT_USERNAME=zhengzhouyi # 环境变量,管理员用户名
- MONGO_INITDB_ROOT_PASSWORD=123 # 环境变量,管理员密码
mongo-express: # container名字
image: mongo-express # image名
ports:
- 8080:8081 # 主机端口:服务器端口映射
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=zhengzhouyi # 环境变量,管理员用户名
- ME_CONFIG_MONGODB_ADMINPASSWORD=123 # 环境变量,管理员密码
- ME_CONFIG_BASICAUTH_USERNAME=zhengzhouyi # 环境变量,用户名
- ME_CONFIG_BASICAUTH_PASSWORD=123 # 环境变量,密码
- ME_CONFIG_MONGODB_SERVER=mongodb # 环境变量,数据库container名
Dockerfile
Dockerfile内部文件
FROM node # 安装node的image,相当于你是基于别人的镜像开始搭建,而不是自己从空image开始搞
ENV MONGO_DB_USERNAME=admin \
MONGO_DB_PWD=password # 设置container里的环境变量,相当于设置默认的环境变量,也可以不写ENV
RUN mkdir -p /home/app # 在container里执行linux命令,可以执行一堆命令
COPY . /home/app # 将主机上当前路径的全部文件 放到 container的/home/app
CMD ["node","/home/app/server.js"] # 也是执行linux命令,一般当作启动命令用
启动Dockerfile
docker build -t my-app:1.0 . 使用当前文件夹下的Dockerfile创建名为my-app:1.0的image
上传image到docker hub
- 登陆
docker login - 修改名字
docker tag image名:版本号 用户名/image名:版本号 - 上传
docker pull 用户名/image名:版本号
例如:docker tag my-app:1.0 mzyzhouyi/my-app:1.0
docker pull mzyzhouyi/my-app:1.0