Docker-入门实践(安装,构建镜像,私人仓库)

一,前言

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)里执行的命令。

Docker-入门实践(安装,构建镜像,私人仓库)_第1张图片

其实,这个过程相当于类的实例化,镜像是一个只读的层结构,容器是在镜像的层结构上多了一层可写的层,你可以以一个镜像对应多个容器。通俗的理解就是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看一个这个容器干了什么:

Docker-入门实践(安装,构建镜像,私人仓库)_第2张图片

其中,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:在新容器内指定一个伪终端或终端。

  • -i:允许你对容器内的标准输入 (STDIN) 进行交互。

我们ls一下,发现现在容器以一个ubuntu终端的形式运行了。

其中,root@后面的是容器的id

我们试一下python,发现果然是没有python的。

索然无味,退出容器:

三,例子

既然docker的目的是用来打包应用,增强其可移植性,那么,我们就来尝试一下利用docker,做一个最简单的可移植程序。

查看一下我们现在有个镜像:

我们只有一个ubuntu:15.10,而这个镜像并没有python,我们需要一个python镜像。

直接利用docker pull从公有镜像仓库拉去一个python镜像。此处,如果不指定版本,则会默认是lastest版。

Docker-入门实践(安装,构建镜像,私人仓库)_第3张图片

下面我们开始构造自己的镜像!

新建一个Dockerfile,开头的D一定要大写。

(Dockfile是一个命令集合,docker通过读取Dockerfile中的命令来生成镜像。可以理解为我们镜像的配置文件,而且一个配置文件负责初始化镜像。)

我在/usr/test1/dockertest目录下建了一个Dockerfile,然后vim这个Dockerfile,写入了如下内容:

Docker-入门实践(安装,构建镜像,私人仓库)_第4张图片

其中,除了MAINTAINER,其余都是必须有的,而且关键词还有很多,具体的可以看官方文档或者自行网上搜索学习。

然后,在这个目录下写一个最简单的python文件,命名为hellodocker.py

print('hello docker !')

现在我们的目录结构如下:

然后执行命令,构建我们的镜像:

docker build -t dockertest:1.0 .

Docker-入门实践(安装,构建镜像,私人仓库)_第5张图片

如图所示,docker按照我们Dockerfile中的五个指令分步构造了我们的镜像。

我们运行一下我们的容器试试看:

docker run dockertest:1.0

成功!perfect!

其实我也不是一次就成功了,Dockerfile我改了好几次才成功了,哈哈哈哈。

然后我们以终端形式运行一下我们的这个容器:

docker run -i -t dockertest:1.0 /bin/bash

Docker-入门实践(安装,构建镜像,私人仓库)_第6张图片

发现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-入门实践(安装,构建镜像,私人仓库)_第7张图片

然后,标记一下自己要上传的镜像:

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

最后,开始上传!

Docker-入门实践(安装,构建镜像,私人仓库)_第8张图片

上传成功!

我们查看一下我们私有仓库中的镜像:

curl -XGET http://123.207.84.170:5000/v2/_catalog

但是!从私人仓库拉取这个镜像报错了!

最后,网上找了半天,还是没能解决。。。。mark一下,明天再想办法。

你可能感兴趣的:(Docker-入门实践(安装,构建镜像,私人仓库))