2025年3月28日 星期五 甲辰(龙)年 月廿七 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 云技术 > Docker

使用docker搭建深度学习环境-从零开始(下)

时间:07-22来源:作者:点击数:42

5. 生成基于ubuntu镜像的容器,并对该容器进行基本设置

生成容器

现在,可以运行ubuntu16.04的docker了

  • docker run -it docker:16.04

其中,'-it'的中的‘i’表示持续运行该容器;‘t’表示告诉docker为该容器建立一个标准的命令行终端。

ubuntu-16.04运行成功~

命令行中的root表示该容器正以管理员权限运行,所以在输入命令时就不用在前面加上sudo了。

‘@’之后的2e01fd26138f则是该容器的名字,是一串随机生成的字符。这串字符后面还有用,先埋下伏笔。

进行基础设置

现在,我们安装基础的网络命令:ping和ifconfig

  • apt-get update
  • apt install net-tools # ifconfig
  • apt install iputils-ping # ping

安装完成~,现在我们使用exit命令来关闭并退出容器‘2e01fd26138f’

现在我们再启动ubuntu-16.04的docker镜像,输入ping和ifconfig,看看会发生什么。

  • docker run -it docker:16.04
  • ifconfig
  • ping

可以看出,ping和ifconfig并没有被安装,那么刚才安装了ping和ifconfig的ubuntu环境去哪里了?

这是由于我们在第二次输入‘docker run -it docker:16.04’时,是从原始的额docker:16.04镜像又生成了一个新的容器‘22c6844faf94’,而我们刚才安装ping和ifconfig的容器名字叫做‘2e01fd26138f’,这两个容器是源自同一个镜像生成的(还记得上文中说过的‘一个镜像可以运行成互不影响的多个容器’么?)。

那么,已经安装ping和ifconfig的容器‘2e01fd26138f’去哪里了?我们先输入exit关闭容器‘22c6844faf94’。

之后输入

  • docker ps -a

来查看所有的容器。

可以看到两个基于ubuntu-16.04的容器都在其中。

我们进入刚才已经安装好ping喝ifconfig命令的容器中,看看他们还在不~

  • C:\Users\ChenJH>docker start -i 2e01fd26138f
  • root@2e01fd26138f:/# ifconfig
  • eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
  • inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
  • UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  • RX packets:8 errors:0 dropped:0 overruns:0 frame:0
  • TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  • collisions:0 txqueuelen:0
  • RX bytes:688 (688.0 B) TX bytes:0 (0.0 B)
  • lo Link encap:Local Loopback
  • inet addr:127.0.0.1 Mask:255.0.0.0
  • UP LOOPBACK RUNNING MTU:65536 Metric:1
  • RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  • TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  • collisions:0 txqueuelen:1
  • RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  • root@2e01fd26138f:/# ping
  • Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
  • [-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
  • [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
  • [-w deadline] [-W timeout] [hop1 ...] destination

你看,他们都在 ( ̄▽ ̄)/

将容器(CONTAINER)提交(固化)为镜像(IMAGE)

现在,我们想将容器‘固化’为镜像,这样就可以通过新生成的镜像生成新的容器。将容器转换(固化)成镜像的命令格式如下:

  • docker commit [CONTAINER ID] [IMAGE_NAME]:[TAG]

如上,现在将已安装ping和ifconfig命令的容器‘2e01fd26138f’,固化为新的镜像ubuntu:test

  • docker commit 2e01fd26138f ubuntu:test

随后,使用‘docker images’命令来查看现在所有的镜像。

  • docker images

可以看到第一行就是刚刚新生成的镜像(ubuntu:test)),我们基于这个新镜像(ubuntu:test),生成一个新容器,并测试该容器是否有ping和ifconfig命令。

  • docker run -it ubuntu:test
  • ping
  • ifconfig

可以看到,命令出现了。

顺带一提,如果想进入已经关闭的容器,那么输入的命令格式为:

  • docker start -i [CONTAINER ID]

举个例子,现在我们想进入刚才没有ping和ifconfig命令的容器‘22c6844faf94’,那么输入的命令为:

  • docker start -i 22c6844faf94

顺利进入容器~

6.安装Anaconda2和Anaconda3,并‘花式’配置环境变量。

拷贝安装文件

首先我们使用‘docker cp’命令对宿主机和docker容器进行文件交互,该命令格式如下:

  • # 宿主机的文件/文件夹 拷贝到docker容器的指定目录中
  • docker cp [src_path] [target_container]:[container_path]
  • # 容器1的文件/文件夹 拷贝到容器2的指定目录中
  • docker cp [src_container]:[container_path] [target_container]:[container_path]
  • # 容器的文件/文件夹 拷贝到宿主机的指定目录中
  • docker cp [src_container]:[container_path] [target_path]

如上,我们将anaconda2和anaconda3的安装文件拷贝到容器中的home路径中

注意,不要再通过镜像生成容器了,直接用'docker start'命令进入容器。

可以看到,我们的文件复制成功,下面我们分别安装anaconda2和anaconda3

安装Anaconda

  • ./Anaconda2-2019.03-Linux-x86_64.sh
  • ./Anaconda3-2019.03-Linux-x86_64.sh

执行到一半发现错误

  • ./Anaconda2-2019.03-Linux-x86_64.sh: 353: ./Anaconda2-2019.03-Linux-x86_64.sh: bunzip2: not found
  • tar: This does not look like a tar archive
  • tar: Exiting with failure status due to previous errors

原来是没有安装bunzip2,使用如下命令进行安装

  • apt-get install bzip2

之后安装就可以进行了。之间需要输入两次yes,第一次是问你是否同意一些条款,第二次是问你是否要配置环境变量。

安装好后输入‘source ~/.bashrc’更新下环境变量,再输入'python'

可以看到,我们进入了anaconda3的python环境。这是因为我们是先装的anaconda2,再装的anacodna3,所以anconda3的环境变量把2覆盖掉了。

配置环境变量

那么如何让anaconda2和3的环境同时存在呢?

一般来说常用的方法是修改环境变量,但是笔者认为这种方式比较复杂,下面我们通过创建软连接(快捷方式)的办法,实现anaconda2和3的环境同时存在。

我们先来查看系统现在的环境变量

  • (base) root@60a197e8a57f:/home# echo $PATH
  • /root/anaconda3/bin:/root/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

可以看到,环境变量指向了,下面这几个文件夹。

/root/anaconda3/bin:

/root/anaconda3/condabin:

/usr/local/sbin:/usr/local/bin:

/usr/sbin:/usr/bin:

/sbin:

/bin

笔者认为,当我们在终端中输入命令时,系统会在上面这些路径中寻找,那么我们在其中一个文件夹中分别创建anaconda2和3的软连接(快捷方式)的话,就可以同时调用anaconda2和3了。

下面开始创建软连接:

  • ln -s /root/anaconda2/bin/python /bin/anaconda2
  • ln -s /root/anaconda3/bin/python /bin/anaconda3

创建好后,我们进入/bin文件夹查看我们刚刚生成的软连接

  • (base) root@60a197e8a57f:/# cd bin/
  • (base) root@60a197e8a57f:/bin# ll | grep anaconda
  • lrwxrwxrwx 1 root root 26 Jul 17 01:36 anaconda2 -> /root/anaconda2/bin/python*
  • lrwxrwxrwx 1 root root 26 Jul 17 01:36 anaconda3 -> /root/anaconda3/bin/python*

上面表示软连接创建成功,现在就可以通过输入anaconda2和anaconda3来使用python环境了。

  • (base) root@60a197e8a57f:/# anaconda2
  • Python 2.7.16 |Anaconda, Inc.| (default, Mar 14 2019, 21:00:58)
  • [GCC 7.3.0] on linux2
  • Type "help", "copyright", "credits" or "license" for more information.
  • >>>
  • (base) root@60a197e8a57f:/# anaconda3
  • Python 3.7.3 (default, Mar 27 2019, 22:11:17)
  • [GCC 7.3.0] :: Anaconda, Inc. on linux
  • Type "help", "copyright", "credits" or "license" for more information.
  • >>>

可以看出,环境使用正常。

别忘了删除安装文件,减少docker容器的体积。

  • (base) root@60a197e8a57f:/# rm -rf /home/Anaconda2-2019.03-Linux-x86_64.sh
  • (base) root@60a197e8a57f:/# rm -rf /home/Anaconda3-2019.03-Linux-x86_64.sh

pip与conda等命令的调用

但是现在有个问题,现在使用pip命令或者conda命令的话,由于环境变量的设置,默认使用的还是anaconda3的pip和conda,虽然这些命令也可以通过建立软连接的方式来解决,但是我们还可以使用'anaconda2 -m'命令来完成这些工作,我们看看实际的效果。

  • # 调用python2的pip
  • (base) root@60a197e8a57f:/# anaconda2 -m pip -V
  • pip 19.0.3 from /root/anaconda2/lib/python2.7/site-packages/pip (python 2.7)
  • # 调用python3的pip
  • (base) root@60a197e8a57f:/# anaconda3 -m pip -V
  • pip 19.0.3 from /root/anaconda3/lib/python3.7/site-packages/pip (python 3.7)

现在,python环境就已经配置完全。

7.分享你配置好的docker镜像。

将镜像/容器打包

现在,python环境已经配置好,如果想线下分享你刚刚配置好的环境,需要先将docker容器固化为镜像,然后再将镜像导出

首先查看现在全部的docker容器

  • C:\Users\ChenJH>docker ps -a
  • CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 60a197e8a57f ubuntu:test "/bin/bash" 15 hours ago Exited (0) 22 seconds ago stoic_sanderson
  • 22c6844faf94 ubuntu:16.04 "/bin/bash" 15 hours ago Exited (127) 15 hours ago gifted_thompson
  • 2e01fd26138f ubuntu:16.04 "/bin/bash" 16 hours ago Exited (130) 15 hours ago hopeful_blackburn
  • 5fd6f176d67c hello-world "/hello" 16 hours ago Exited (0) 16 hours ago musing_panini

将容器提交(固化)为镜像

  • C:\Users\ChenJH>docker commit 60a197e8a57f ubuntu:python2_and_3
  • sha256:0b24dd655a01edc948b9b39a7fa4fe403c78959cb28341b94cf8e20bf75986ed

再查看现在所有的镜像

  • C:\Users\ChenJH>docker images
  • REPOSITORY TAG IMAGE ID CREATED SIZE
  • ubuntu python2_and_3 0b24dd655a01 51 seconds ago 6.85GB
  • ubuntu test aa0f52bb27be 15 hours ago 149MB
  • ubuntu 16.04 13c9f1285025 4 weeks ago 119MB
  • hello-world latest fce289e99eb9 6 months ago 1.84kB

之后使用save命令将生成的镜像导出为可以分享的文件(save命令不仅可以对镜像打包,也可以对容器打包,不过我比较习惯先将容器转为镜像,之后再打包)

  • C:\Users\ChenJH>docker save -o C:\Users\ChenJH\Desktop\my_docker.tar ubuntu:python2_and_3

从压缩包中读取镜像

如果想读取该文件,重新生成镜像,需要使用load命令来读取压缩包中的镜像。

  • C:\Users\ChenJH>docker load -i C:\Users\ChenJH\Desktop\my_docker.tar
  • # -i代表从tar文件中读取
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门