前端初识Docker

1,078 阅读6分钟

近几年docker在前端领域中也有着越来越广泛的应用,本文主要介绍docker基础指令以及如何在win10、linux上安装docker服务;其中也在网上借鉴了不少资料,通过自己一步步实践最终成功,谨以此篇记录自己学习的爬坑之路。

docker 是什么?

docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱;容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系

因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的,不会再有“在我的环境上可以运行的啊!!!”

docker 优点

  • 环境隔离('隔离,安全')
    Docker 实现了资源隔离,一台机器运行多个容器互无影响。

  • 更高效的资源利用(节约成本)
    Docker 容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。

  • 更快速的交付部署(敏捷)
    使用 Docker,开发人员可以利用镜像快速构建一套标准的研发环境,开发完成后,测试和运维人员可以直接通过使用相同的环境来部署代码。

  • 更易迁移扩展(可移植性)
    Docker 容器几乎可以在任意的平台上运行,包括虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性让用户可以在不同平台之间轻松的迁移应用。

  • 更简单的更新管理(高效)
    使用 Dockerfile,只需要很少的配置修改,就可以替代以往大量的更新工作。并且所有修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理。

docker基础指令

docker version 查看docker版本
docker info 查看docker详细信息
sudo service docker start 启动服务
sudo service docker stop 停止服务
sudo service docker restart 重启服务

docker镜像命令

docker images 查看docker镜像
docker images -a列出本地所有的镜像
docker images -p只显示镜像ID docker rmi imageid 删除镜像
docker build -t xxx . 打包镜像

docker镜像导入导出

如果网络不好或者pull不下来镜像,只能在其它网络比较好的机器上pull下来镜像,导出成一个文件,再下载上传到网络不好的机器上,然后再从文件中导出来,这样在网络不好的机器上也能使用docker镜像了 有两种方式,但是不可混用。

  • save/load (推荐)

    # docker save 根据 ID 将镜像打包
    docker save 0fdf2b4c26d3 > hangge_server.tar
    
    # 同时打包多个image,如将镜像 postgres 和 mongo
    docker save -o images.tar postgres:9.6 mongo:3.4
    
    # 导入
    docker load < images.tar
    
    
  • import/export

    # 根据指定镜像id导出成一个文件
    docker export eb516548c180 > coredns.tar
    
    # 导入
    docker import /usr/local/coredns.tar
    
  • 两种方式应用场景及区别

    docker save 的应用场景:

    如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

    docker export 的应用场景:

    主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境

    • 镜像是否重命名
      docker import 可以为镜像指定新名称
      docker load 不能对载入的镜像重命名

    • 文件大小
      export 导出的镜像文件体积小于 save 保存的镜像

    • 是否包含镜像历史
      export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。

      save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

docker容器命令

每一个容器其实就是一个linux系统可以执行linux命令。

  • 使用镜像启动容器
    新建并且启动一个容器: docker run -itd -p 5000:3000 test1:v1.0
    OPTIONS说明:

    • -i: 交互式操作
    • -t: 终端
    • -d: 后台运行
    • --name:指定容器的名称
    • -p: 表示指定端口映射,(5000:3000)表示(本机端口:容器端口)
    • 镜像名后面的:v1.0:表示打的tag号
    • -v: 文件映射,将主机本地的文件映射到容器中,这样我们本地修改文件内容,可以动态看到页面的变化了;windwos下需指定文件的绝对路径
  • 查看容器
    docker ps 列出当前所有正在运行的容器
    docker ps -a列出所有的容器
    docker logs 容器id 查看容器日志 docker ps -l列出最近创建的容器

  • 启动退出停止容器
    000参数:容器ID或容器名称
    exit 退出并停止容器
    Ctrl+p+q 只退出容器,不停止容器
    docker start 000 启动容器
    docker restart 000 重新启动容器
    docker stop 000 停止容器
    docker kill 000 强制停止容器

  • 删除容器
    docker rm 000删除容器
    docker rm -f 000强制删除容器
    docker rm -f $(docker ps -a -q)删除多个容器

  • docker容器文件拷贝到宿主机
    docker cp 容器ID:容器内的文件路径 宿主机路径 从容器内拷贝文件到宿主机
    如:docker cp f9e29e8455a5:/tmp/yum.log /root

  • 宿主机文件拷贝到docker容器
    docker cp 你的文件路径 容器ID:docker容器中路径
    如(注意.tar后面的.gz):
    docker cp D:\NDM下载\Compressed\nvm-0.39.2.tar.gz f9e29e8455a5:/home

  • cmd进入某个容器
    docker exec -it 容器id /bin/bash

win10 安装使用docker

windows系统直接在 官网 下载 docker desktop 客户端 安装使用。

win10家庭版安装最新版本docker,已经不再需要hyper-v虚拟机,也不用修改windows版本注册表,最新版windows docker采用了wsl容器(适用于 Linux 的 Windows 子系统)

安装完成后打开终端验证是否安装成功
docker -v

image.png

现在就可以打开上面安装好的docker客户端基于图形工具使用docker了,也可以在cmd终端操作docker

win10 安装子系统linux

因为想在linux上操作docker,但是用的是win10本,所以需要先想办法安装一个liunx(我这里安装的是ubuntu 20.04LTS)系统;
参考这篇文章完成安装 Windows10下开启第二个系统:Linux!_xffjs的博客-CSDN博客

linux 安装使用docker

通过上面的操作我们现在可以在win10上使用linux系统了,现在需要在linux上安装 linux版的docker 打开cmd输入bash进入linux 终端,或者直接在菜单就有Ubuntu的程序,点击进入。

image.png

linux安装docker服务

ps:注意如下命令都需要加 sudo

  • 查看当前linux系统是否有安装docker
    sudo systemctl start docker

    image.png 出现上图说明没有安装 System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down

  • 更新源
    sudo apt-get update

    image.png

  • 安装以下软件包 允许apt通过HTTPS使用存储库
    sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

    image.png

  • 添加Docker官方的GPG密钥

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    image.png

  • 安装stable存储库
    sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"

    image.png

    ps:这里需要注意网络不佳的情况会失败,多尝试几次

  • 查看docker-ce的版本
    apt-cache madison docker-ce

    image.png

  • 安装docker社区版 sudo apt-get install docker-ce

    image.png

  • 查看版本
    docker -v
    image.png

启动docker

  • 启动docker服务
    sudo service docker start

    image.png

  • 查看镜像
    docker images
    image.png

    至此我们完成了:
    在windows上安装客户端docker
    在windows上安装子系统linux -> 子系统安装docker

注意区分

此时我们电脑上有两个版本docker,如图所示cmd查看镜像时是基于客户端的docker,所以必须先双击启动docker程序才可操作。
而cmd通过bash进入子系统linux系统后操作的docker是属于子系统的

image.png

遇到问题

  • win10的linux子系统启动docker失败
    打开ubuntu 启动docker服务后,docker ps 报错如下:

“Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”

解决:
先确定Docker本身已经安装, docker -v

# 查看 docker daemon 是否在运行:  
ps aux | grep docker
# 再次查看
ps aux | grep docker
  • 先关闭docker服务
    service docker stop

  • 再重新启动docker
    service docker start

    image.png docker ps 查看时发现此时正常

如果文章对你有用辛苦点赞、收藏支持哈~
点击链接 学习交流群(前端微信群) - 掘金 (juejin.cn) 加vx拉你进 前端学习交流群