ubuntu下创建docker镜像并打包输出

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
以上呢,是关于docker的解释。通俗来说,就是一个个针对于不同的源码的不同开发环境,一些库啊什么的。由于我日常工作中会用到编译不同arm处理器的linux或者android系统,但是不同版本之间用到的交叉编译器还有库之类的都不太一样,甚至有冲突。之前的是通过不同的ubuntu虚拟机来区分,但是这样的弊端就是虚拟机太多,也太大了,占用磁盘过多,同时也不方便同事之间互相拷贝。
所以需要一个简单小巧又能把各个环境隔离开互不影响的东西,于是搭建起了docker。
docker可以支持ubuntu、debian、red hat等发行版linux系统。但是其也是有安装条件要求的:只能在64位CPU架构的计算机上运行(目前只能是x86_64、arm64)。linux3.8或更高版本的内核。另外提一下,3.8之前的也不是一定就不可以运行,但是可能会有各种问题。针对这个条件,我选择了ubuntu18.04,并且在windows上安装了对应的虚拟机。
废话说了不少,开始步入正题。
首先要保证虚拟机能正常上网

forlinx@forlinx:~$ ping www.baidu.com
PING www.a.shifen.com (220.181.38.149) 56(84) bytes of data.
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=1 ttl=128 time=10.1 ms
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=2 ttl=128 time=9.26 ms
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=3 ttl=128 time=10.1 ms
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=4 ttl=128 time=8.98 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 8.988/9.634/10.155/0.527 ms

可以ping通网站,进行下一步。更新软件信息。

forlinx@forlinx:~$ sudo apt-get update
Hit:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
Hit:2 http://cn.archive.ubuntu.com/ubuntu bionic InRelease
Hit:3 http://cn.archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:4 http://cn.archive.ubuntu.com/ubuntu bionic-backports InRelease
Reading package lists... Done

软件信息更新完毕,安装一些需要的库

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

执行这条命令的时候有可能会有如下的信息:

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

这种一般是由于有apt线程在运行,如果自己没有其他的正在运行的apt线程,直接使用sudo rm删掉提示中的lock文件即可。
安装GPG证书,完成后显示OK。

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

安装完证书,添加docker的软件源信息,我这里使用的是阿里的源。使用其他的源可以自己更换。

forlinx@forlinx:/$ sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
Get:1 http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic InRelease [64.4 kB]
Hit:2 http://cn.archive.ubuntu.com/ubuntu bionic InRelease                     
Get:3 http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages [18.8 kB]
Get:4 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]    
Get:5 http://cn.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]   
Get:6 http://cn.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB] 
Fetched 335 kB in 4s (82.4 kB/s)                                     
Reading package lists... Done

添加好源,再进行一次更新

forlinx@forlinx:/$ sudo apt-get -y update
Hit:1 http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic InRelease
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]    
Hit:3 http://cn.archive.ubuntu.com/ubuntu bionic InRelease                     
Get:4 http://cn.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]   
Get:5 http://cn.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Fetched 252 kB in 6s (45.0 kB/s)    
Reading package lists... Done

查看docker-ce的版本,可列出可用安装的版本。

forlinx@forlinx:/$ apt-cache madison docker-ce
 docker-ce | 5:20.10.7~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:20.10.6~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:20.10.5~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:20.10.4~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:20.10.3~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:20.10.2~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:20.10.1~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:20.10.0~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.15~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.14~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.13~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.12~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.11~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.10~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.9~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.8~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.7~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.6~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.5~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.4~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.3~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.2~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.1~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.0~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.9~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.8~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.7~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.6~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.5~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.4~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.3~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.2~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.1~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:18.09.0~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.3~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.2~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.1~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.0~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.03.1~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages

我这里选择了18.06.3版本,并进行安装

 sudo apt-get -y install docker-ce=18.06.3~ce~3-0~ubuntu

等待安装完成之后查看一下版本

forlinx@forlinx:/$ sudo docker version
Client:
 Version:           18.06.3-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        d7080c1
 Built:             Wed Feb 20 02:28:10 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.3-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       d7080c1
  Built:            Wed Feb 20 02:26:34 2019
  OS/Arch:          linux/amd64
  Experimental:     false

至此docker-ce安装完成。下面开始安装docker镜像。先看一下虚拟机上的镜像。

forlinx@forlinx:/$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

可以看到是空的,虚拟机中一个docker镜像都没有。
拉取ubuntu的docker镜像,我这里拉取的是12.04版本的,当然也可以拉其他版本,这个自己修改一下命令即可。

forlinx@forlinx:/$ sudo docker pull ubuntu:12.04
12.04: Pulling from library/ubuntu
d8868e50ac4c: Pull complete 
83251ac64627: Pull complete 
589bba2f1b36: Pull complete 
d62ecaceda39: Pull complete 
6d93b41cfc6b: Pull complete 
Digest: sha256:18305429afa14ea462f810146ba44d4363ae76e4c8dfc38288cf73aa07485005
Status: Downloaded newer image for ubuntu:12.04

这个过程时间可能会长一点,取决于网速和源。耐心等待一下就好。
再看一下ubuntu里的镜像

forlinx@forlinx:/$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              12.04               5b117edd0b76        4 years ago         104MB

这个时候已经有了这个12.04的docker镜像。接下来使用命令创建一个docker容器。

forlinx@forlinx:/$ sudo docker run -it --name test_ubuntu_12.04 --privileged=true --cap-add=SYS_ADMIN -v /home/forlinx/docker:/home/forlinx/docker -p 10900:22 5b117edd0b76 /bin/bash
[sudo] password for forlinx: 
root@f05dabe71dca:/# 

输入exit命令退出容器,然后用docker ps -a命令查看

forlinx@forlinx:/$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
f05dabe71dca        5b117edd0b76        "/bin/bash"         6 minutes ago       Exited (100) 5 seconds ago                       test_ubuntu_12.04

已经有了一个docker容器信息,平常的操作就在这个容器中进行。那么,怎么将我在容器中的修改提交呢,要用到docker commit命令。

docker commit <容器ID> <镜像名称><Tag>
forlinx@forlinx:/$ sudo docker commit f05dabe71dca ubuntu:12.04
sha256:aa3f6c67eab9484a919b60b3bdc27dede533a2390bfbd0629d9f2bcc8569d1f2

这就对做的修改进行了提交。然后再查看镜像信息。

forlinx@forlinx:/$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              12.04               aa3f6c67eab9        46 seconds ago      104MB
ubuntu              <none>              5b117edd0b76        4 years ago         104MB

这就添加了一个新的镜像,创建时间是46秒前。如果需要将这个镜像分享出去,或者转移到其他电脑上,就需要将镜像打包出来。

forlinx@forlinx:/$ sudo docker save aa3f6c67eab9 -o /home/forlinx/docker/test_ubuntu_12.04.tar
forlinx@forlinx:/$ ls /home/forlinx/docker/
test_ubuntu_12.04.tar

使用docker save命令就将镜像打包成了tar包。复制到其他电脑上使用docker load -i命令加载即可。


版权声明:本文为qq_41561171原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。