docker是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux (windos\mac)机器上,也可以实现虚拟化。直观的讲就是移植你的应用,而不用考虑依赖,且比虚拟机要节约资源。
下面的实践是在腾讯云主机(Ubuntu Server 18.04.1 LTS 64位)进行的一个简单尝试,主要包括对docker的安装,启动,公有镜像(image)的拉取,容器(container)的运行;以及构建一个镜像并且上传到私人仓库中。
安装docker:
apt-get install -y docker.io
查看docker版本:
docker version
运行一个helloworld示例:
docker run ubuntu:15.10 /bin/echo "Hello world"
运行这条指令后,此时docker中是没有这个镜像(image)的,docker会在docker hub这样一个公有镜像仓库中拉去ubuntu:15.10这个镜像。
其中,“/bin/echo "Hello world"”表示在启动的容器(container)里执行的命令。
(其实,这个过程相当于类的实例化,镜像是一个只读的层结构,容器是在镜像的层结构上多了一层可写的层,你可以以一个镜像对应多个容器。通俗的理解就是image就是一个操作系统iso镜像,而container就是一个运行的操作系统实例;前者是一个存储态的东西,后者是一个运行态的东西。)
然后我们尝试以进程的方式运行这个容器:
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
返回的这串字符是这个容器的ID
我们可以在docker进程中看到:
docker ps
查看正在运行的docker容器
我们可以通过docker log看一个这个容器干了什么:
其中,4745052f2c16是我们刚才docker ps中的第一列的容器id。
现在,我们可以通过“docker stop+容器id”让这个容器停止了,然后docker ps一下,看一看停了没有:
我们来查看一下我们所有的镜像(image):
到这里,我们已经会“使用”docker了。。。。从公有库里拉一个镜像,然后跑一跑容器已经不是什么大问题了,哈哈哈哈。
因为docker是一个轻量级的容器引擎,所以,我们刚才拉去的ubuntu镜像其实是非常精简的,精简到甚至没有python。
那么,我们用ubuntu终端的形式启动这个镜像试试看:
docker run -i -t ubuntu:15.10 /bin/bash
-t:在新容器内指定一个伪终端或终端。
我们ls一下,发现现在容器以一个ubuntu终端的形式运行了。
其中,root@后面的是容器的id
我们试一下python,发现果然是没有python的。
索然无味,退出容器:
三,例子
既然docker的目的是用来打包应用,增强其可移植性,那么,我们就来尝试一下利用docker,做一个最简单的可移植程序。
查看一下我们现在有个镜像:
我们只有一个ubuntu:15.10,而这个镜像并没有python,我们需要一个python镜像。
直接利用docker pull从公有镜像仓库拉去一个python镜像。此处,如果不指定版本,则会默认是lastest版。
下面我们开始构造自己的镜像!
新建一个Dockerfile,开头的D一定要大写。
(Dockfile是一个命令集合,docker通过读取Dockerfile中的命令来生成镜像。可以理解为我们镜像的配置文件,而且一个配置文件负责初始化镜像。)
我在/usr/test1/dockertest目录下建了一个Dockerfile,然后vim这个Dockerfile,写入了如下内容:
其中,除了MAINTAINER,其余都是必须有的,而且关键词还有很多,具体的可以看官方文档或者自行网上搜索学习。
然后,在这个目录下写一个最简单的python文件,命名为hellodocker.py
print('hello docker !')
现在我们的目录结构如下:
然后执行命令,构建我们的镜像:
docker build -t dockertest:1.0 .
如图所示,docker按照我们Dockerfile中的五个指令分步构造了我们的镜像。
我们运行一下我们的容器试试看:
docker run dockertest:1.0
成功!perfect!
其实我也不是一次就成功了,Dockerfile我改了好几次才成功了,哈哈哈哈。
然后我们以终端形式运行一下我们的这个容器:
docker run -i -t dockertest:1.0 /bin/bash
发现docker缺实根据Dockerfile中的COPY指令,创建了工作目录,并将目录下的文件都拷贝到了这个新的目录下。
到这里,我们可移植的这个镜像已经完成了。
那么,docker是怎么将这个最简单的python部署到别的机器呢?
有两种方法:
一,将镜像上传到docker hub这个公有仓库,方法比较简单:
docker push 镜像名
不过这个问题有一个比较明显的问题就是,你这样相当于将你的应用开源了。。。。不过不是所有东西你都可以开源的,因此还有另一个建立私人仓库的方法。
二,建立私人仓库,上传到私人仓库中:
首先,获取docker的仓库镜像registry:2,然后运行该容器
docker pull registry:2
docker run -d -p 5000:5000 --restart=always --name registry registry:2
然后,标记一下自己要上传的镜像:
docker tag dockertest:1.0 123.207.84.170:5000/dockertest:1.0
接着,就可以上传镜像了:
docker push 123.207.84.170:5000/dockertest
接着就发现报错了。。。。
The push refers to repository [123.207.84.170:5000/dockertest]
Get https://123.207.84.170:5000/v2/: http: server gave HTTP response to HTTPS client
网上查了一下,发现需要修改一个daemon文件:
vim /etc/docker/daemon.json
{
"insecure-registries":["公网ip:5000"]
}
然后重新载入daemon(守护进程),重启docker
systemctl daemon-reload
systemctl restart docker
最后,开始上传!
上传成功!
我们查看一下我们私有仓库中的镜像:
curl -XGET http://123.207.84.170:5000/v2/_catalog
但是!从私人仓库拉取这个镜像报错了!
最后,网上找了半天,还是没能解决。。。。mark一下,明天再想办法。