现在,可以运行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
你看,他们都在 ( ̄▽ ̄)/
现在,我们想将容器‘固化’为镜像,这样就可以通过新生成的镜像生成新的容器。将容器转换(固化)成镜像的命令格式如下:
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
顺利进入容器~
首先我们使用‘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
./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命令的话,由于环境变量的设置,默认使用的还是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环境就已经配置完全。
现在,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文件中读取