您当前的位置:首页 > 计算机 > 云技术 > Docker

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

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

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文件中读取
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门