Docker学习

90 阅读5分钟

基础概念

container就是一个微型环境。
container是一层一层组成的,如果下载同一个container的新版本,并且本地存在旧版本,那就只会下载一些不同的层,从而减少下载时间,但是这并不重要。
image是在不运行时的那些包 container是在运行时装image的环境
操作系统分为内核态和用户态,可以直接地理解为是内核和应用两层,docker和虚拟机的虚拟程度不同,导致两者的兼容性不同,docker必须在对应的kernel上才能执行,虚拟机可以在任意地方执行。docker牺牲兼容性,换速度和内存大小。
docker基于的都是linux内核,导致docker在一些的windows或者mac上无法运行,下载docker toolbox。

image.png

从docker hub下载并运行container

以下载postgres的9.6版本为例

方法一

直接到docker desktop进行run image.png

方法二

docker run postgres:9.6 冒号后面表示版本
例如下图表示6个不同的版本 image.png

查看正在运行的container

方法一

docker ps

方法二

image.png

常用命令

常见命令使用流程

image.png

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

  1. -d detached模式后台运行
  2. -p 设置主机的哪个接口对container的接口进行监听
  3. --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

  1. -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

  1. 登陆docker login
  2. 修改名字docker tag image名:版本号 用户名/image名:版本号
  3. 上传docker pull 用户名/image名:版本号

例如:docker tag my-app:1.0 mzyzhouyi/my-app:1.0
docker pull mzyzhouyi/my-app:1.0