[296]docker安装及使用教程

Docker简介

简而言之,Docker 是一个可供开发者通过容器(container)来构建,运行和共享应用(application)的平台。用容器来部署应用被称为集装箱化(containerization)。

想了解更多信息可到docker官网查看。

Docker安装

Windows安装

1、开启Hyper-V

2、下载Docker Desktop:Get Started with Docker

下载完成后,按照引导提示一步步安装完即可。

3、使用阿里云镜像加速
注册一个阿里云阿里云账号,进入管理控制台界面
点击左上角的菜单栏,选择产品与服务->弹性计算->容器镜像服务,复制加速器地址。

打开安装好的docker的主界面:在设置界面找到Docker Engin,将复制好的加速器地址填入即可。
加速器地址:https://aqeauzet.mirror.aliyuncs.com

4、启动Docker
windows下启动docker打开桌面的docker图标启动即可。
启动成功后,在Win + R 输入cmd进入windows命令行界面,
输入docker -v,查看docker版本:

C:\Users\lynnh>docker -v
Docker version 19.03.12, build 48a66213fe

Linux安装

CentOS安装

1、卸载老的版本

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、安装yum工具包

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

3、配置仓库源

# 1. 默认使用国外源,非常非常非常慢!
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 2. 推荐用国内源,丝滑!
$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

# 3. 阿里镜像源
yum-config-manager --add--repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 设置ustc的镜像
 vim /etc/docker/daemon.json

{
    "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

4、安装Docker Engine

sudo yum install docker-ce docker-ce-cli containerd.io

这时可能会报一个containerd.io版本过低的错误,这时执行以下命令安装containerd.io

yum install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

5、启动Docker
root权限启动,非root权限,请假sudo

//启动
systemctl start docker
//查看状态
systemctl status docker
//停止
systemctl stop docker
//重启
systemctl restart docker
//设置开机自启
systemctl enable docker
//查看概要信息
docker info
//查看docker帮助文档
docker --help

若不报错,说明启动成功。

简单说一下linux下切换用户权限:输入以下命令即可切换到root用户。

$ su root
Ubuntu安装

1、卸载老的版本

$ sudo apt-get remove docker docker-engine docker.io containerd runc

2、更新apt包索引

$ sudo apt-get update

3、安装必要工具包

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

4、添加Docker GPG秘钥

# 1. 默认使用国外源,非常非常非常慢!
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 2. 推荐使用国内源,顺畅!
$ sudo curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

5、配置仓库源

# 1. 默认使用国外源,非常非常非常慢!
$ sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
# 2. 推荐使用国内源,顺畅!
$ sudo add-apt-repository \
      "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
      $(lsb_release -cs) \
      stable"

6、安装Docker Engine

# 更新apt包索引
$ sudo apt-get update

# 安装docker
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

7、启动Docker

sudo systemctl enable docker
sudo systemctl start docker
离线包下载安装
  • 官方 rpm 包下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
  • 二进制下载地址:https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/
  • 阿里镜像下载地址:https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

我docker用的是18.09版本分别下载:docker-ce-18.09.9-3.el7.x86_64.rpm、docker-ce-cli-18.09.8-3.el7.x86_64.rpm、containerd.io

安装包解释:
  • docker-ce-18.09.9-3.el7.x86_64.rpm:这是 Docker Community Edition(CE)的 RPM 包,提供 Docker 引擎的核心功能。Docker 引擎是一个用于构建和运行容器化应用程序的开源平台。它包含了用于管理容器的核心组件,例如容器的创建、启动、停止、删除等。
  • docker-ce-cli-18.09.8-3.el7.x86_64.rpm:这是 Docker CE 的命令行客户端(CLI)的 RPM 包。Docker CLI 提供了用户与 Docker 引擎进行交互的命令行界面。通过 Docker CLI,用户可以执行各种 Docker 操作,例如构建、运行、管理容器、镜像等。
  • containerd.io:Containerd 是一个用于管理容器生命周期的守护进程,是一个底层的容器运行时。Docker 引擎实际上使用 containerd 来运行容器。containerd.io 包含了 containerd 守护进程以及与 Docker 引擎集成所需的库和工具。
离线包安装Docker
cd  ~  #回到主目录把包拉进来
docker-ce-18.09.9-3.el7.x86_64.rpm、docker-ce-cli-18.09.8-3.el7.x86_64.rpm、containerd.io
 
yum -y install ./*.rpm  #安装
 
#如果提示 container-selinux版本过低执行以下命令
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
 
yum update container-selinux

docker version #查看版本

docker info #验证docker
 
systemctl enable --now docker  #启动docker并加入开机自启
网络源下载安装Docker
cd /etc/yum.repos.d/ #进入到yum源配置目录
 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #寻找docker网络源
 
yum list docker-ce --showduplicates |sort -r #列出可用包
 
yum -y install docker-ce- #这里自己选择你要安装的版本
 
yum info  #查看详细信息
 
docker version #查看版本
 
#如果提示 container-selinux版本过低执行以下命令
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
 
yum update container-selinux
配置镜像加速

国内下载国外的镜像有时候会很慢,因此可以更改 docker 配置文件添加一个加速器,可以通过加速器达到加速下载镜像的目的。

mkdir -p /etc/docker  #创建docker目录
vim /etc/docker/daemon.json #创建文件并编辑;#注意配置文件逗号不能少!
 
{
    "registry-mirrors": [ "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",  
    "https://docker.mirrors.ustc.edu.cn",
    "https://reg-mirror.qiniu.com" 
}
 
systemctl reload docker  #重载配置文件
systemctl restart docker #重新启动docker

验证安装是否成功

  • 永远的hello-world!

在docker启动的前提下,在命令行输入以下指令:

docker run hello-world

Linux中同理。

C:\Users\lynnh>docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:7f0a9f93b4aa3022c3a4c147a449bf11e0941a1fd0bf4a8e6c9408b2600777c5
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

输出以上信息,说明docker安装成功!

  • 简单解释该指令的作用

docker run hello-world会先从本地搜索名为hello-world的镜像,若没有找到,则先从docker hub中pull该镜像,拉取镜像到本地成功后,再通过run指令来启动容器运行该镜像。

Docker 镜像 (Docker Images)

镜像简介

镜像是一种轻量级、 可执行的独立软件包,来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

镜像操作常用指令

声明:后面提到的指令若无特殊说明,说明在windows和linux下都是一样的,除非指明在linux使用。

  • 搜索镜像
//搜索镜像
docker search 镜像名称
  • 获取镜像docker pull

docker pull 用于从仓库(例如,Docker Hub)中拉去镜像到本地。现在我们尝试获取一个pytorch的镜像:
到Docker Hub中搜索pytorch,这里我们就尝试获取一个pytorch1.4, cuda10.1的镜像。

在命令行中输入:docker pull pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime
docker pull 是通过分层机制进行镜像下载:

C:\Users\lynnh>docker pull pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime
1.4-cuda10.1-cudnn7-runtime: Pulling from pytorch/pytorch
2746a4a261c9: Pull complete
4c1d20cdee96: Pull complete
0d3160e1d0de: Pull complete
c8e37668deea: Pull complete
32fa2b829f7e: Pull complete
318af50219b4: Pull complete
bf0f45e8a37a: Pull complete
5e1bc716e4bb: Pull complete
358186ffb22b: Pull complete
Digest: sha256:ee783a4c0fccc7317c150450e84579544e171dd01a3f76cf2711262aced85bf7
Status: Downloaded newer image for pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime
docker.io/pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime
  • 查看镜像docker imagesdocker image ls
C:\Users\lynnh>docker images
REPOSITORY          TAG                           IMAGE ID            CREATED             SIZE
centos              centos8                       0d120b6ccaa8        9 days ago          215MB
pytorch/pytorch     1.4-cuda10.1-cudnn7-runtime   37b81722dadc        7 months ago        4.16GB
hello-world         latest                        bf756fb1ae65        7 months ago        13.3kB

C:\Users\lynnh>docker image ls
REPOSITORY          TAG                           IMAGE ID            CREATED             SIZE
centos              centos8                       0d120b6ccaa8        9 days ago          215MB
pytorch/pytorch     1.4-cuda10.1-cudnn7-runtime   37b81722dadc        7 months ago        4.16GB
hello-world         latest

参数解释:

# REPOSITORY :镜像名称
# TAG        :镜像标签(版本)
# IMAGE ID   :镜像ID
# CREATED    :创建时间
# SIZE       : 镜像大小
  • 启动镜像 docker run

启动镜像可以通过docker run 镜像名:tag或者 docker run 镜像id
现在我们来启动刚刚下载的pytorch镜像吧。

C:\Users\lynnh>docker run -it 37b81722dadc /bin/bash
root@8cd9c9935d2a:/workspace# cd /
root@8cd9c9935d2a:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  workspace
root@8cd9c9935d2a:/# exit
exit

C:\Users\lynnh>

解释:

# -it是-i和-t的合并,表示通过交互式启动进入容器内部进行操作
# /bin/bash 表示启动的容器基于bash命令行进行操作
# 8cd9c9935d2a 为启动镜像后生成的容器id,每个镜像启动后都会有相应的容器
# 容器用来将镜像内部的环境和外部进行隔离,因此我们可以同时启动多个镜像,而相互之间不受影响
# 在容器中输入exit即可退出容器
  • 删除镜像 docker rmi
docker rmi -f 镜像id # 删除指定镜像, -f表示强制删除
docker rmi -f 镜像id 镜像id 镜像id # 同时删除多个镜像
# 骚操作,linux下有效
docker rmi -f $(docker images -aq) # 全部删除
  • 镜像tag

为了方便后续工作中使用特定的镜像,还可以使用docker tag命令来为本地的镜像添加标签。

格式:docker tag [镜像ID] [别名]:[版本号]
例如:docker tag 5d0da3dc9764 nginx:latest

  • 查看镜像历史

格式: docker history [镜像名称或ID]
作用: 查看镜像构建步骤。
注意: 有些构建信息过长,可以使用--no-trunc选项来输出完整信息。

Docker 容器

容器简介

容器是打包代码及其所有依赖项的软件的标准单元,因此应用程序可以从一个计算环境快速可靠地运行到另一个计算环境。Docker容器映像是一个轻量级的,独立的,可执行的软件软件包,其中包含运行应用程序所需的一切:代码,运行时,系统工具,系统库和设置。

镜像在运行时会成为容器,对于Docker容器,镜像会在Docker Engine上运行时成为容器。不论基础架构如何,容器化软件都可用于基于Linux和Windows的应用程序,始终运行相同。容器将软件与其环境隔离开来,并确保尽管开发和登台之间存在差异,但软件仍可以均匀运行。

容器操作常用指令

前面说过,启动镜像的时候会生成相应的容器

  • 查看容器 docker ps
C:\Users\lynnh>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

C:\Users\lynnh>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
8cd9c9935d2a        37b81722dadc        "/bin/bash"         14 minutes ago      Exited (0) 9 minutes ago                       jolly_jennings
45ab1548e84f        hello-world         "/hello"            3 hours ago         Exited (0) 3 hours ago                         agitated_almeida

C:\Users\lynnh>docker ps -aq
8cd9c9935d2a
45ab1548e84f

8cd9c9935d2a 是我们之前运行过的pytorch镜像的容器id。

docker ps # 列出当前正在运行的容器信息
-a        # 列出当前正在运行的容器和历史运行过的所有容器信息
-q        # 只显示容器id
  • 启动和停止容器
docker start 容器id   # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id    # 停止当前正在运行的容器
docker kill 容器id    # 强制停止当前容器
  • 进入容器
docker exec -it 容器id /bin/bash
docker attach 容器id

# 区别
# docker exec   # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会开启新的终端

测试:我们重启之前的容器8cd9c9935d2a并进入。

C:\Users\lynnh>docker restart 8cd9c9935d2a
8cd9c9935d2a

C:\Users\lynnh>docker attach 8cd9c9935d2a
root@8cd9c9935d2a:/workspace#
  • 退出容器
exit     # 直接停止容器并退出
ctrl+p+q # 不停止容器,只退出,在linux下有效
  • 删除容器
docker rm 容器id                    # 删除指定容器,不能删除正在运行的容器,可用 rm -f 强制删除
# 骚操作,linux下有效
docker rm -f $(docker ps -aq)      # 删除所有容器
docker ps -a -q|xargs docker rm -f # 删除所有容器

DIY一个自己的Pytorch镜像

以前面的pytorch镜像为基础。

C:\Users\lynnh>docker attach 8cd9c9935d2a
root@8cd9c9935d2a:/workspace# cd /
root@8cd9c9935d2a:/# pip list
Package                Version
---------------------- ----------
asn1crypto             1.2.0
backcall               0.1.0
beautifulsoup4         4.8.2
certifi                2019.11.28
cffi                   1.13.0
chardet                3.0.4
conda                  4.8.1
conda-build            3.18.11
conda-package-handling 1.6.0
cryptography           2.8
decorator              4.4.1
filelock               3.0.12
glob2                  0.7
idna                   2.8
ipython                7.11.1
ipython-genutils       0.2.0
jedi                   0.15.2
Jinja2                 2.10.3
libarchive-c           2.8
lief                   0.9.0
MarkupSafe             1.1.1
mkl-fft                1.0.15
mkl-random             1.1.0
mkl-service            2.3.0
numpy                  1.17.4
olefile                0.46
parso                  0.5.2
pexpect                4.7.0
pickleshare            0.7.5
Pillow                 7.0.0
pip                    19.3.1
pkginfo                1.5.0.1
prompt-toolkit         3.0.2
psutil                 5.6.7
ptyprocess             0.6.0
pycosat                0.6.3
pycparser              2.19
Pygments               2.5.2
pyOpenSSL              19.0.0
PySocks                1.7.1
pytz                   2019.3
PyYAML                 5.2
requests               2.22.0
ruamel-yaml            0.15.46
setuptools             41.4.0
six                    1.12.0
soupsieve              1.9.5
torch                  1.4.0
torchvision            0.5.0
tqdm                   4.36.1
traitlets              4.3.3
urllib3                1.24.2
wcwidth                0.1.7
wheel                  0.33.6

进入容器,发现该镜像已经安装好了pytorch环境所需要的一些基础包。
假设除了这些基础包,现在我们需要一些额外的包怎么办呢?比如我们还需要scikit-learnscikit-image这两个包。
因为该镜像中已经有了pip工具,在容器中我们可以直接通过pip来安装我们额外需要的包。
pip install scikit-learn scikit-image -i https://pypi.douban.com/simple

root@8cd9c9935d2a:/# pip install scikit-learn scikit-image -i https://pypi.douban.com/simple
Looking in indexes: https://pypi.douban.com/simple
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f9b37a34c50>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /simple/scikit-learn/
Collecting scikit-learn
  Downloading https://pypi.doubanio.com/packages/f4/cb/64623369f348e9bfb29ff898a57ac7c91ed4921f228e9726546614d63ccb/scikit_learn-0.23.2-cp37-cp37m-manylinux1_x86_64.whl (6.8MB)
     |████████████████████████████████| 6.8MB 1.5MB/s
Collecting scikit-image
  Downloading https://pypi.doubanio.com/packages/d7/ee/753ea56fda5bc2a5516a1becb631bf5ada593a2dd44f21971a13a762d4db/scikit_image-0.17.2-cp37-cp37m-manylinux1_x86_64.whl (12.5MB)
     |████████████████████████████████| 12.5MB 640kB/s
Requirement already satisfied: numpy>=1.13.3 in /opt/conda/lib/python3.7/site-packages (from scikit-learn) (1.17.4)
Collecting joblib>=0.11
  Downloading https://pypi.doubanio.com/packages/51/dd/0e015051b4a27ec5a58b02ab774059f3289a94b0906f880a3f9507e74f38/joblib-0.16.0-py3-none-any.whl (300kB)
     |████████████████████████████████| 307kB 3.1MB/s
Collecting scipy>=0.19.1
  Downloading https://pypi.doubanio.com/packages/65/f9/f7a7e5009711579c72da2725174825e5056741bf4001815d097eef1b2e17/scipy-1.5.2-cp37-cp37m-manylinux1_x86_64.whl (25.9MB)
     |████████████████████████████████| 25.9MB 1.6MB/s
Collecting threadpoolctl>=2.0.0
  Downloading https://pypi.doubanio.com/packages/f7/12/ec3f2e203afa394a149911729357aa48affc59c20e2c1c8297a60f33f133/threadpoolctl-2.1.0-py3-none-any.whl
Requirement already satisfied: pillow!=7.1.0,!=7.1.1,>=4.3.0 in /opt/conda/lib/python3.7/site-packages (from scikit-image) (7.0.0)
Collecting matplotlib!=3.0.0,>=2.0.0
  Downloading https://pypi.doubanio.com/packages/f1/b9/712584f12f840968a14969a1fe298ffdeaa9c4b484b3bfd973c74c4a481d/matplotlib-3.3.1-cp37-cp37m-manylinux1_x86_64.whl (11.6MB)
     |████████████████████████████████| 11.6MB 2.8MB/s
Collecting imageio>=2.3.0
  Downloading https://pypi.doubanio.com/packages/6e/57/5d899fae74c1752f52869b613a8210a2480e1a69688e65df6cb26117d45d/imageio-2.9.0-py3-none-any.whl (3.3MB)
     |████████████████████████████████| 3.3MB 1.4MB/s
Collecting PyWavelets>=1.1.1
  Downloading https://pypi.doubanio.com/packages/62/bd/592c7242fdd1218a96431512e77265c50812315ef72570ace85e1cfae298/PyWavelets-1.1.1-cp37-cp37m-manylinux1_x86_64.whl (4.4MB)
     |████████████████████████████████| 4.4MB 1.5MB/s
Collecting networkx>=2.0
  Downloading https://pypi.doubanio.com/packages/41/8f/dd6a8e85946def36e4f2c69c84219af0fa5e832b018c970e92f2ad337e45/networkx-2.4-py3-none-any.whl (1.6MB)
     |████████████████████████████████| 1.6MB 15.1MB/s
Collecting tifffile>=2019.7.26
  Downloading https://pypi.doubanio.com/packages/3f/51/151f2c5b89af5a3ebbe9d1078ce598abeeb6802b6cf568350914746d1c4c/tifffile-2020.8.13-py3-none-any.whl (146kB)
     |████████████████████████████████| 153kB 9.9MB/s
Collecting python-dateutil>=2.1
  Downloading https://pypi.doubanio.com/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227kB)
     |████████████████████████████████| 235kB 11.9MB/s
Collecting kiwisolver>=1.0.1
  Downloading https://pypi.doubanio.com/packages/31/b9/6202dcae729998a0ade30e80ac00f616542ef445b088ec970d407dfd41c0/kiwisolver-1.2.0-cp37-cp37m-manylinux1_x86_64.whl (88kB)
     |████████████████████████████████| 92kB 4.1MB/s
Collecting certifi>=2020.06.20
  Downloading https://pypi.doubanio.com/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl (156kB)
     |████████████████████████████████| 163kB 3.0MB/s
Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3
  Downloading https://pypi.doubanio.com/packages/8a/bb/488841f56197b13700afd5658fc279a2025a39e22449b7cf29864669b15d/pyparsing-2.4.7-py2.py3-none-any.whl (67kB)
     |████████████████████████████████| 71kB 1.7MB/s
Collecting cycler>=0.10
  Downloading https://pypi.doubanio.com/packages/f7/d2/e07d3ebb2bd7af696440ce7e754c59dd546ffe1bbe732c8ab68b9c834e61/cycler-0.10.0-py2.py3-none-any.whl
Requirement already satisfied: decorator>=4.3.0 in /opt/conda/lib/python3.7/site-packages (from networkx>=2.0->scikit-image) (4.4.1)
Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.7/site-packages (from python-dateutil>=2.1->matplotlib!=3.0.0,>=2.0.0->scikit-image) (1.12.0)
Installing collected packages: joblib, scipy, threadpoolctl, scikit-learn, python-dateutil, kiwisolver, certifi, pyparsing, cycler, matplotlib, imageio, PyWavelets, networkx, tifffile, scikit-image
  Found existing installation: certifi 2019.11.28
    Uninstalling certifi-2019.11.28:
      Successfully uninstalled certifi-2019.11.28
Successfully installed PyWavelets-1.1.1 certifi-2020.6.20 cycler-0.10.0 imageio-2.9.0 joblib-0.16.0 kiwisolver-1.2.0 matplotlib-3.3.1 networkx-2.4 pyparsing-2.4.7 python-dateutil-2.8.1 scikit-image-0.17.2 scikit-learn-0.23.2 scipy-1.5.2 threadpoolctl-2.1.0 tifffile-2020.8.13

接下来,退出容器,提交我们增加了内容的镜像。
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[tag]

C:\Users\lynnh>docker commit -m="add scikit packages" -a="lynnh" 8cd9c9935d2a pytorch_diy:1.4.0
sha256:b285a729c32b3a20411dcd09bc39acfdef93054e5091b0054bef08d665c27643

C:\Users\lynnh>docker images
REPOSITORY          TAG                           IMAGE ID            CREATED             SIZE
pytorch_diy         1.4.0                         b285a729c32b        26 seconds ago      4.43GB
centos              centos8                       0d120b6ccaa8        9 days ago          215MB
pytorch/pytorch     1.4-cuda10.1-cudnn7-runtime   37b81722dadc        7 months ago        4.16GB
hello-world         latest

至此,我们自己的docker镜像就做好了。接下来可以选择将该镜像发布到云端(如docker hub 或者阿里云仓库),或者保存到本地。

发布到阿里云仓库

首先在自己阿里云的容器镜像服务中创建命名空间,创建好命名空间后创建镜像仓库。

点击仓库名称进入,安装下图的步骤进行操作即可将镜像发布到阿里云。

保存到本地

docker save -o xxx.tar 镜像id

该指令即可将对应id的镜像保存到本地,保存的位置就在执行该指令的路径。

容器数据卷

下面仅介绍在linux上如何操作。

问题描述

如果我们数据都在容器中,当容器删除的时候,数据就会丢失!
需求:数据持久化,比如mysql,当容器被删除的时候不就意味着删库跑路了。
需求: mysql数据存储在本地!
容器之间可以有一个数据共享的技术! Docker容器中产生的数据,同步到本地!
这就是卷技术!即目录的挂载,将容器中的目录,挂载到linux上!
总结:容器的持久化和同步操作!容器间也可以数据共享!

使用数据卷

使用命令挂载 -v

docker run -it -v 主机目录:容器内目录
docker run -it -v 主机目录:容器内目录 -v 主机目录:容器内目录 ...
# 测试
# 1. 挂载
[root@localhost home]# docker run -it -v /home/ceshi:/home centos /bin/bash

# 2. 查看挂载是否成功
[root@localhost home]# docker inspect 115880798a20
...
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi", # 主机内地址
                "Destination": "/home",  # docker容器内地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]
...

# 3. 在容器内新建文件,查看主机内是否同步
[root@115880798a20 home]# ls
[root@115880798a20 home]# touch test.java
[root@115880798a20 home]# ls
test.java
[root@115880798a20 home]# 


[root@localhost home]# ls
ceshi  lynn
[root@localhost home]# cd ceshi
[root@localhost ceshi]# ls
[root@localhost ceshi]# ls
test.java
[root@localhost ceshi]# 

# 4. 停止容器,并修改主机中test.java中的内容,查看在容器中是否变化
[root@115880798a20 home]# exit
exit
[root@localhost home]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[root@localhost ceshi]# vim test.java
[root@localhost ceshi]# cat test.java
hello world!


[root@localhost home]# docker restart 115880798a20
115880798a20
[root@localhost home]# docker attach 115880798a20
[root@115880798a20 /]# cd home
[root@115880798a20 home]# ls
test.java
[root@115880798a20 home]# cat test.java
hello world!

# 5. 删除容器内的文件,主机上也会被删除。但删除容器,主机上的文件依然在

依旧同步!!!

好处:只需在本地修改配置,容器内会自动同步!

具名挂载和匿名挂载

# 1. 匿名挂载
-v 容器内路径  # 不加主机路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有卷的情况
docker volume ls 
local               5b6b9ff93dc8ea2c34e706e707d7db5d2aa6373faf1a9d4a8ab4
# 这里发现,这种匿名挂载,我们在 -v 只写了容器内的路径, 没有写容器外的路径

# 2. 具名挂载, 注意juming-nginx前面没有/, 不表示路径,只是起名
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

[root@localhost home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
a7e97f4512dc67fe30463838aa2d5f838d9f1013fa440114d5f02a41c9302ea7
[root@localhost home]# docker volume ls
DRIVER              VOLUME NAME
local               5b6b9ff93dc8ea2c34e706e707d7db5d2aa6373faf1a9d4a8ab44ebeb388dd2d
local               b5e0bf6cdf6fcf5b7a469dc3ca9b16cd2873a398ff63381482c7adeec0b61cac
local               juming-nginx
local               portainer_data

# 查看卷
[root@localhost home]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2020-08-04T20:30:08+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有的docker容器内的卷,没有指定目录的情况下都在 /var/lib/docker/volumes/xxx/_data

我们通过具名挂载可以方便的找到卷,大多数情况使用具名挂载

如何确定是具名挂载还是匿名挂载,还是指定路径挂载?

-v 容器内路径           # 匿名挂载
-v 卷名:容器内路径      # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载

目前关于Docker的介绍到此结束,后面有新内容会进行补充!

Docker常用命令

基础

# 运行一个在后台执行的容器,同时还能用控制台管理
docker run -dit --name docer-name IMAGE 

镜像常用命令

docker search centos #搜索镜像不带版本号默认latest
 
docker pull centos  #下载镜像
 
docker images #查看本地镜像
 
#镜像导出
====== 方法一 ======
docker save nginx -o nginx1.tar
 
====== 方法二 ======
docker save nginx > nginx2.tar
 
====== 方法三 ======
docker save nginx | gzip > nginx.tar.gz #导出并压缩到当前目录
 
#镜像导入
docker load -i centos.tar 

# 删除镜像
docker rmi -f 镜像id # 删除指定镜像, -f表示强制删除
docker rmi -f 镜像id 镜像id 镜像id # 同时删除多个镜像
# 骚操作,linux下有效
docker rmi -f $(docker images -aq) # 全部删除

容器常用命令

docker logs nginx #查看容器日志
 
#容器常用选项
-i #打开一个交互接口
-t  #分配一个tty
-d #后台运行容器
--name #容器名称
-P 大 #随机端口 镜像里必须有EXPOSE字段暴露端口
-p 小 #[宿主机端口]:[容器端口]/tcp  指定端口映射
--rm #当容器退出时自动清理容器
-e #容器传递环境变量
-v #给容器创建映射目录,数据卷 
#举例: docker run -v /path/dir1:/dir img:1 
-h  #指定主机名
$(docker ps -aq -f status=exited) #-f 指定参数
--restart  #容器在退出时重启策略
 
docker stop $(docker ps -qa -f name=test*) #批量停止容器
 
docker volume ls #查看卷
 
#常用方法举例
docker run -it --name test -v /data/:/www:ro -v /data/:/web busybox #:ro给挂载目录可读权限

docker run -P nginx #大P前台启动并随机映射端口
docker run -p 81:80 --name nginx_test nginx  #指定端口映射
docker port nginx #查看容器已经映射的端口
docker run -it --rm --name nginx-tets1 nginx  #容器退出后自动删除
 
# ==============================================================
docker ps     #查看正在运行的容器
docker ps -a  #显示所有容器包括死掉的
docker ps -aq  #显示所有容器并显示id

docker rm -f id  #即使容器正在运行当中,也会被强制删除掉
#举例: docker rm -f 38f6268f754e
docker stop $(docker ps -ap) #批量关闭正在运行的容器 
docker kill $(docker ps -aq) #批量强制关闭正在运行的容器

#运行容器,交互式方式
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
#创建容器,守护式方式
docker run -id --name=容器名称 镜像名称:标签
#进入容器
docker exec -it 容器名称/ID /bin/bash
#退出容器不注销
ctrl + p + q  
#关闭容器
docker stop 容器名/ID
#打开容器
docker start 容器名/ID
#删除容器
docker rm 容器名/ID

#文件拷贝
#将文件copy到容器内
docker cp 要copy的文件或目录 容器名称:容器目录
#将容器中的文件copy出来
docker cp 容器名称:容器目录 要copy的文件或目录 

#查看容器所有信息
docker inspect 容器名称/ID
#查看容器IP
docker inspect --format='{{.NetWorkSetting.IpAddress}}' 容器名称/ID

应用部署

#mysql
#拉取mysql镜像
docker pull mysql
#创建容器
docker run -id --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 mysql
#登录容器
docker exec -it mysql /bin/bash
#修改身份验证类型
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123';
查看拉取镜像位置

docker容器默认拉取文件的位置在 /var/lib/docker

1、当拉取镜像完成后执行docker run -id --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 mysql命令创建容器。

2、创建容器成功之后给出容器id,或者执行docker ps查看正在运行的容器,如下图所示:

3、执行cd /var/lib/docker进入docker目录

4、执行cd image/overlay2/layerdb/mounts/命令进入mounts目录,可以看到和正在运行中容器ID相同的文件

5、执行cd 635785d012d9dde870cb1db9390366d8fc845e00ca8bd8df70306d78c0553e25/命令进入目录,可以看到有一个init-id文件,如下所示:

6、执行cat init-id可以查看到该容器所对应的初始化镜像名称,如下所示

7、这时执行cd /var/lib/docker/overlay2/命令进入到docker拉取镜像所存储的文件夹,可以看到一个和上图红框相同名字的文件夹,如下所示:

8、执行cd 09fe316f3306479f5dfe7a5d48ff7f839033cb0430a47ac08e68b1120846877e命令进入文件夹,如下图所示:

9、执行cd merged命令,此文件夹就为的docker容器的工作目录,我们可以在里面修改一些配置文件等

docker导出镜像&导入镜像

使用 export 和 import

export 和 import的针对点是容器,将本机的容器导出为镜像包。

1.格式: docker export [容器名称] > [压缩包名称]
docker import [压缩包名称] [镜像名称]

2.示例
#使用export保存容器为镜像
[root@instance-gvpb80ao docs]# docker export daf9c3656be3 > nginx.tar
[root@instance-gvpb80ao docs]# ll | grep nginx.tar 
-rw-r--r-- 1 root root 135117824 9月 24 20:51 nginx.tar

使用import导入包为镜像
[root@instance-gvpb80ao docs]# docker import nginx.tar test/nginx:v1 
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b 
[root@instance-gvpb80ao docs]# docker images | grep test test/nginx v1
02107323de1b 22 seconds ago 131MB

使用 load 和 save

save 和 load的针对的点是镜像,将本机的镜像导入、导出为镜像包。
 
#1.格式:
	docker save [镜像ID...] > [压缩包名称]
	docker load < [压缩包名称]
 
注:使用镜像ID保存镜像时,导入时没有名称
	
#2.示例
#使用save保存镜像
[root@instance-gvpb80ao docs]# docker save 6858809bf669 > busybox.tar
[root@instance-gvpb80ao docs]# ll | grep busy
-rw-r--r-- 1 root root   1458176 9月  24 21:01 busybox.tar
 
#使用save保存多个镜像
[root@instance-gvpb80ao docs]# docker save -o test.tar busybox nginx:1.18.0
[root@instance-gvpb80ao docs]# docker load < test.tar
Loaded image: busybox:latest
Loaded image: nginx:1.18.0
 
#使用load导入镜像
[root@instance-gvpb80ao docs]# docker load < busybox.tar
[root@instance-gvpb80ao docs]# docker load -i busybox.tar
Loaded image ID: sha256:6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
[root@instance-gvpb80ao docs]# docker images | grep 685880
busybox                                                           latest                     6858809bf669        2 weeks ago         1.23MB

两种方案的差别

1、针对的对象不一样
export和import针对的是容器,save和load针对的是镜像
 
2、save是完全保存, export是部分保存
 
3.文件大小不同
export导出的镜像文件体积小于 save 保存的镜像
 
4.是否可以对镜像重命名
docker import可以为镜像指定新名称,docker load不能对载入的镜像重命名。
 
5.是否可以同时将多个镜像打包到一个文件中
docker export不支持,docker save支持。
 
6.是否包含镜像历史
save保存的是原生的镜像,export保存成一个新的镜像
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
 
save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。
 
[root@instance-gvpb80ao docs]# docker history 6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
IMAGE        CREATED       CREATED BY                   SIZE        COMMENT
6858809bf669    2 weeks ago     /bin/sh -c #(nop) CMD ["sh"]          0B
<missing>      2 weeks ago     /bin/sh -c #(nop) ADD file:72be520892d0a903d…  1.23MB
 
7.应用场景不同
save应用场景在部署或者需要追溯的场景中,export应用场景在作为基础镜像时使用.
docker export的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
 
docker save的应用场景:如果我们的应用是使用docker-compose.yml编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。

参考:https://blog.youkuaiyun.com/baidu_36511315/article/details/108117826
https://blog.youkuaiyun.com/m0_75181278/article/details/137132603
https://blog.youkuaiyun.com/m0_67391870/article/details/124167895
https://blog.youkuaiyun.com/weixin_44815878/article/details/128444456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值