docker 学习笔记一(教程) 快速上手

之前在做机器学习开发的时候往往会采用virtual env 和 conda等环境管理工具,为了让开发和部署及环境的搭建更加方便,同时也方便在云上搭建开发及部署环境,打算使用docker提高开发效率,故把自己的学习过程整理成博客,方便记忆。本章涵盖了docker的基础命令及概念和用法,掌握本章内容就可以快速的上手了。

为什么要使用docker

  • 更高效的利用系统资源
  • 更快捷的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的迁移
  • 更轻松的维护和扩展

Docker的三个基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

Docker 仓库的命名方式

一个Docker Registry 中可以包含多个仓库Repository,每个仓库可以包含多个标签tag,每个标签对应一个镜像。

通常一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。可以通过仓库名<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认的标签。

仓库名经常以 两段式路径 形式出现,比如 insun/tensorflow ,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。


Docker 安装 Ubuntu18.04

Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE即企业版,强调安全,付费使用,支持周期 24 个月。Docker CE 分为 stable, test, 和 nightly 三个更新频道。每六个月发布一个 stable版本 (18.09, 19.03, 19.09…)。

  • 卸载旧版本
    sudo apt-get remove docker docker-engine docker.io

  • 下载必要的安装包

    sudo apt-get update

    sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

  • 使用脚本自动安装

    curl -fsSL get.docker.com -o get-docker.sh

    sudo sh get-docker.sh --mirror Aliyun

  • 启动Docker CE

    sudo systemctl enable docker

    sudo systemctl start docker

  • 建立docker用户组

    docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

    sudo groupadd docker # 创建docker用户组

    sudo usermod -aG docker $USER # 将当前用户添加到docker用户组

  • 验证docker是否安装成功

    docker run hello-world


使用docker镜像

  • 获取镜像

    docker pull [选项] [Docker Registry 地址[:端口号]/] 仓库名[:标签]

    docker pull ubuntu:18.04 # 默认的仓库地址是docker hub

  • 运行镜像

    docker run -it --rm ubuntu:18.04 bash

    ​ **-it:**这里是两个参数,一个是-i:交互式操作,一个是-t终端。

    ​ **–rm:**这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。

  • 退出容器

    exit

  • 列出镜像

    docker image ls

    docker system df # 便捷查看镜像/容器/数据卷所占用的空间

    docker image ls -f dangling=true # 列出虚悬镜像(dangling image)

    docker image prune # 删除虚悬镜像

    docker image ls --digests # 列出镜像摘要

  • 删除本地镜像

    docker image rm [选项] <镜像1> [<镜像2> …]

    <镜像> 可以是短ID , 长ID , 镜像名 , 或者镜像摘要

  • 利用commit来提交镜像

    docker run --name webserver -d -p 80:80 nginx

    ​ **-d:**后台运行容器,并返回容器id

    docker exec -it webserver bash

    … 在容器内做一些改动

    echo '

    Hello, Docker!

    ' > /usr/share/nginx/html/index.html

    docker diff webserver # 查看具体的改动情况

    docker commit --author “Insun <@qq.com>” --message “修改了网页内容” webserver nginx:v2 # 提交镜像


docker 容器

  • 启动容器

    docker run ubuntu:18.04 /bin/echo ‘Hello World’

    docker run -it ubuntu:18.04 /bin/bash

    ​ **-t:**让docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上

    ​ **-i:**让容器的标准输入保持打开

    使用docker run 创建容器时,docker在后台运行的标准操作包括:

    • 检查本地是否存在制定的镜像,不存在就从公有仓库下载
    • 利用镜像创建并启动一个容器
    • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
    • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
    • 从地址池配置一个ip地址给容器
    • 执行用户制定的应用程序
    • 执行完毕后容器被终止
  • 容器后台运行

    **-d:**如果使用该参数运行容器,此时容器会在后台运行,并不会把输出结果STDOUT打印到主机上(输出结果可以用docker logs 查看)docker container(Id/name) logs

  • 终止容器

    docker container(Id/name) stop

    docker container start # 重新启动容器

    docker container restart # 会将一个运行态的容器重新启动

  • 进入容器(exec attach)

    docker exec -it 69d1 bash

    当使用attach进入容器的时候,如果使用exit退出容器,那么同时也会终止容器。而采用attach方式则不会。

  • 导出容器 导入容器快照

    docker export 7612 > ubuntu.tar

    cat ubuntu.tar | docker import - test/ubuntu:v1.0

  • 删除容器

    docker container rm container(Id/Name)

  • 清理所有处于终止状态的容器

    docker container prune

  • 查看容器具体信息

    docker inspect container(id/name)

  • 重启容器
    docker container restart f2f


数据管理

  • 数据卷(Volumes)

    数据卷是一个可供一个或者多个容器使用的特殊目录,他绕过UFS,可以提供很多又用的特性:

    • 可以在容器之间共享和重用
    • 修改会立马生效
    • 对数据卷的更新,不会影响容器
    • 数据卷默认会一直存在,即使容器被删除

    docker volume create my-vol # 创建一个数据卷

    docker volume ls # 查看所有的数据卷

    docker volume inspect my-vol # 查看指定数据卷信息

    docker run -d -P --name web --mount source=my-vol,target=/webapp trainging/webapp python app.py

    docker inspect container(id/name) # 查看容器信息,也包括容器挂载的数据信息

    docker volume rm my-vol # 删除数据卷

    docker volume prune # 删除无主的数据卷

  • 挂载主机目录(Bind mounts)

    挂载主机目录的时候可以使用 --mount 也可以使用-v , 必须使用绝对路径,在使用-v参数的时候如果主机目录不存在会自动创建一个,–mount则会报错

    docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp training/webapp python app.py #

    docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly training/webapp python app.py

    docker run -d -P --name web -v /src/webapp/:/opt/webapp/:ro training/webapp python app.py

  • docker也可以挂载一个本地文件

    使用方式根挂载目录相同


参考:《docker practice》

你可能感兴趣的:(docker)