docker学习

一、介绍

  • docker容器是一种轻量级、可移植、自包含的软件打包技术,是一种应用程序,可以在几乎任何地方以相同的方式运行。
  • 下载安装地址:

  • 修改默认安装路径(安装前操作)

    • docker的默认安装路径为‘C:\Program Files\Docker’,会占用系统盘空间
    • 我们修改默认安装路径,比如'D:\Softwares\Docker'
      • 首先需要创建目录‘D:\Softwares\Docker’
      • C盘下的Docker目录一定不要事先创建
      • 管理员身份打开cmd窗口,运行以下命令创建软链接
        mklink /j "C:\Program Files\Docker" "D:\Softwares\Docker"
      • 运行.exe程序进行安装,会自动安装到“D:\Softwares\Docker”下
    • windows下安装使用可能会有一些问题,参照弹出的链接,按照指引即可解决
  • 配置国内镜像源:

    • 具体镜像源可参考:

      "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.ccs.tencentyun.com",
        "https://reg-mirror.qiniu.com"
      ]

二、容器操作

  • 运行容器

    • docker run 容器名

      上述这是运行容器最简单的命令

    • 常用参数
      • -d:后台运行并返回ID名
      • -it:以交互的模式打开容器
      • -p:指定端口,比如-p 8888:3333,即暴露宿主机的8888端口,连接到docker容器的3333端口
      • -v:目录挂载,用法(-v 宿主机绝对路径:docker中的路径),可以使用多个-v来挂载多个目录
      • --name:指定容器名,否则会随机生成一个容器名
      • --rm:运行完毕即删除该容器(通常用于测试)
      • --network:指定网络
      • --network-alias:给指定网络取别名
    • 运行一个较复杂的容器示例
      docker run -it -d --name test_web -p 5555:5555 -v /tmp/docker_mount:/code myweb python3 web.py
      • -it:交互模式
      • -d:后台运行
      • --name test_web:指定容器名test_web
      • -p 5555:5555:指定端口映射
      • -v /tmp/docker_mount:/code:挂载宿主机目录/tmp/docker_mount中的内容到容器/code目录,好处之一就是可以在本地动态修改容器中的代码
      • myweb:镜像名
      • python3 web.py:运行容器后,在终端运行命令'python3 web.py'
  • 查看容器

    docker ps -a  #查看所有容器及其运行状态
    docker ps -l  #查看最近创建的容器及其运行状态
    docker ps -q  #仅显示容器的id
  • 启动容器

    docker start 容器id/name
  • 停止容器

    docker stop/kill 容器id/name
  • 重启容器

    docker restart 容器id/name

    经历stop和start两个过程

  • 暂停容器

    docker pause 容器id/name

    不会占用cpu

  • 暂停后恢复运行容器

    docker unpause 容器id/name
  • 删除容器

    docker rm 容器1,容器2,......
  • 批量删除已退出容器

    docker rm -v $(docker ps -aq -f status=exited)
  • 查看容器中文件及目录变化

    docker diff 容器id/name
  • 从容器复制文件到本地

    docker cp 容器id/名:容器中文件名 宿主机绝对路径
  • 进入容器内部

    • exec(方式一)

      docker exec -it 容器名/id bash

      无法看到启动命令的输出,输入exit退出终端,容器依旧在后台运行

    • attach(方式二)
      docker attach 容器名/id

      能够在终端中查看启动命令的输出,按ctr+c退出attach终端

    • 两者区别
      • attach启动命令的终端,不会启动新的进程
      • exec则是在容器中打开新的终端,并且可以启动新的进程
      • 想在终端查看启动命令的输出用attach,其它均用exec

三、镜像操作

  • 查看镜像

    docker images
  • 搜索镜像

    docker search 镜像名
  • 删除镜像

    docker rmi 镜像名
  • 下拉镜像

    docker pull 镜像名
  • 查看镜像中的历史操作

    docker history 镜像名
  • 制作镜像

    • 编写Dockerfile文件
      FROM python:3.7.16-alpine
      MAINTAINER eliwang
      COPY . /code
      WORKDIR /code
      RUN pip install -r requirements.txt
      CMD ["python", "spider.py"]
      • FROM:指定基础镜像,并且必须是第一条指令。
      • MAINTAINER:作者
      • COPY:将指定目录下的文件/目录,复制到容器中的指定目录下,目录不存在则自动创建
      • WORKDIR:指定容器中的工作目录,容器开启后,默认在该目录下
      • RUN:执行命令行命令(在docker build时运行)
      • CMD:类似于RUN,执行时机不同(在docker run时运行)
      • 其它常用命令:
        • ADD:用法同COPY,在不解压的前提下,无法复制 tar 压缩文件,同种需求下推荐使用COPY
        • EXPOSE:声明端口
        • ENV:添加环境变量
    • 创建镜像
       docker build -t python:v1 .

      -t参数指定(镜像名:tag),后面的"."不要忘了,表示Dockerfile文件所在目录

  • 直接部署镜像到远程服务器

    • 镜像打包
      docker save python:v1 -o python_v1.tar

      语法:docker save 镜像名:tag -o 镜像包名.tar

    • 利用scp将打包后镜像传到远程服务器
      scp .\python_v1.tar 用户名@ip:/tmp/python_v1.tar

      语法:scp 镜像包名.tar 用户名@ip:远程压缩包绝对路径

    • 服务器端加载镜像
      docker load -i python_v1.tar

      语法:docker load -i 镜像包名.tar

    • 验证镜像是否加载
      docker images
  • 发布镜像到docker hub

    • 注册账号、创建仓库
      • 在docker hub上创建一个账号,然后创建一个测试仓库python
    • docker中登录账号
      docker login -u 用户名

      然后输入密码

    • 标记镜像
      docker tag python:v1 elitewang/python:v1

      语法:docker tag 镜像名:tag 账号/仓库:tag

    • 发布镜像
      docker push elitewang/python:v1

    • 下拉自己发布的镜像并使用

      docker pull elitewang/python:v1

四、不同docker容器之间联通(以redis镜像和python爬虫镜像演示)

  • 创建网络

    docker network create mynet

    指定网络名:mynet

  • 网络中开启redis

     docker run -d --name redis --network mynet --network-alias redis redis:7.0-alpine

    通过--network指定网络,同时通过--network-alias给网络取别名,这样就可以在爬虫项目中指定host为该别名即可连接redis数据库

  • 网络中开启爬虫项目

     docker run --name myspider --network mynet -it -d -v E:\ProgramFiles\python_project\just_test\docker_test:/code python:v1

    通过--network指定网络,通过-v挂载本地目录,可以同步修改项目中的改动

 五、docker-compose多容器打包

  • 用途

    • 一个项目依赖多个docker容器时,可以利用docker-compose将多个容器进行打包执行
  • 使用:(以上述redis和爬虫项目为例)

    • 编写Dockerfile
      FROM python:3.7.16-alpine
      MAINTAINER eliwang
      COPY . /code
      WORKDIR /code
      RUN pip install -r requirements.txt
    • 编写docker-compose.yml
      version: "2"
      
      services:
        myredis:
          image: redis:7.0-alpine
          networks:
            - mynet
      
        myspider:
          build: .
          volumes:
            - .:/code
          networks:
            - mynet
          links:
            - myredis
          tty: true
      
      networks:
        mynet:
          driver: bridge
      • version:版本号,通常写“2”
      • services:下边列出容器
        • myredis容器:
          • 通过redis:7.0-alpine这个镜像创建
          • networks指定了网络mynet,这个必须与最下面networks声明的网络名一致
        • myspider容器:
          • build:指定了Dockerfile所在的路径
          • volumes:挂载的目录
          • networkds:指定所处的网络
          • links:多容器连接别名,指定了上述myredis容器,所以在爬虫项目中,host需要指向"myredis"
          • tty:保持后台运行不退出
    • 创建并开启多容器(需要在docker-compose.yml所在目录下执行)
      docker-compose up -d

      -d参数可以让其在后台运行,不占用终端

    • 停止并删除容器、网络
      docker-compose down

六、修改docker镜像安装目录

  • 简介

    • docker镜像默认会下载安装到C盘,占用C盘空间,我们可以手动修改其默认下载目录
  • 操作

    wsl --shutdown
    
    wsl --export docker-desktop-data E:\ProgramFiles\Docker\docker-desktop-data.tar
    
    wsl --export docker-desktop E:\ProgramFiles\Docker\docker-desktop.tar
    
    wsl --unregister docker-desktop-data
    
    wsl --unregister docker-desktop
    
    wsl --import docker-desktop-data E:\ProgramFiles\Docker\image E:\ProgramFiles\Docker\docker-desktop-data.tar
    
    wsl --import docker-desktop E:\ProgramFiles\Docker\bin E:\ProgramFiles\Docker\docker-desktop.tar

    以修改后的镜像存放目录 E:\ProgramFiles为例,首先在该目录下新建文件夹Docker,然后按照上述命令依次执行即可

  • 重启docker

    • 执行
      wsl -l -v

      正常显示则表示迁移成功

七、后续使用中出现的问题及解决方案

  • 问题描述

    • 个人win11系统,突然打开Docker Desktop后就出现xxx stopping提示,然后就自动关闭窗口
    • 在命令行终端输入 ‘wsl -l -v’ 也无法显示版本号
  • 解决办法

    • 打开电脑搜索框,搜索‘启用或关闭windows功能’
    • 勾选上‘适用于Linux的Windows子系统’ 和 ‘虚拟机平台’复选框

      注意:‘虚拟机平台’这个选项开启后,后续如果使用安卓模拟器,会出现无法正常启动的现象;因此在使用安卓模拟器时出现无法开机情况,可以先通过检查是否打开了虚拟机平台选项来进行排查

posted @ 2022-12-16 03:09  eliwang  阅读(82)  评论(0编辑  收藏  举报