本文目的是给几乎从未接触过docker,或者仅仅是听说或者通过新闻了解过Docker的同学

通过一个已有的Docker仓库构建和提交自己的Docker 镜像

这里会涉及到一些概念,但是不单独介绍

这里首先推荐一本书:《第一本Docker的书》,如果你有充分的时间来阅读此书,那么本文对你来说几乎无用,本文内容均摘抄和整理自此书。

为 Docker 准备运行环境

  1. Linux,这是首要条件,虽然Micosoft正在拥抱Docker,不过当下,你还是需要一个比较新的Linux发行版本和gcc版本
  2. Linux 内核 gt 2.6.* 的版本都是可以安装Docker的,但是低版本的Linux不支持cgroup(Linux的资源管理方案),所以你的Linux内核最好在3.8以上。更重要的是,如果你在社区中询问如何在低版本上的Linux安装Docker,大多数人会说,你升级你的内核吧。如果你对内核编译不擅长,可以尝试学习安装Gentoo Linux来了解这个过程。当然我还是建议重新装个新系统,第一次使用Docker的你,需要一个漂亮的成功来增加信心(比如作者新安装了Arch Linux)。
  3. 你需要64位CPU架构的计算机,旧版本的Vmware不支持在windows下安装64位Linux,在安装之前,需要检查一下
  4. 我喜欢Ubuntu,但是生产环境是CentOS怎么办?这正是Docker最擅长的部分,Docker可以轻易的在Ubuntu上安装其他Linux基础镜像。
  5. UFW Ubuntu 中的UFW可能会导致Docker容器的网络无法使用,修改/etc/default/ufw 中:DEFAULT_FORWARD_POLICY="DROP" 为 DEFAULT_FORWARD_POLICY="ACCEPT",然后执行sudo ufw reload

官方文档 - 安装教程

在准备完成以上环境检查后,就可以去看安装教程,文档非常详尽和具体

  1. Linux 教程:https://docs.docker.com/linux/step_one/
  2. Ubuntu 教程:https://docs.docker.com/engine/installation/linux/ubuntulinux/
  3. 所有支持的Linux 发行版本的安装教程:https://docs.docker.com/engine/installation/

Docker的正常运行是需要Docker服务的支持,就像Apache Http Server 一样,我们称之为Docker守护进程

# 如果是通过yum atp-get安装,应该已经生成了相应的服务
service docker start
# 或者你需要这样来手动运行
/usr/bin/docker daemon

这里可能有个问题,如果你加上docker daemon -H tcp://127.0.0.1:2389 指定监听的地址,那么你需要在所有的指令中指明这个地址。

比如:docker -H tcp://127.0.0.1:2389 info

怎么知道一切正常?

# 执行info指令
[root@kevin kevin]$ docker info

输出:

Containers: 5

Running: 0

Server Version: 1.10.1

...省略一些

Registry: https://index.docker.io/v1/

大多数时候,你应该开始运行Hello World程序,好吧那就开始

docker run hello-world

#你会看到Docker在下载这个镜像,然后打印

输出:

Hello from Docker.

This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:

  1. The Docker client contacted the Docker daemon.

    ...省略

查看你所有的镜像

[root@kevin kevin]$ docker images

一般教程到这里,你可能被告知可以开始运行一个ubuntu镜像,这很简单:

docker run -i -t ubuntu
#docker会自动下载和启动ubuntu容器

其他镜像你可以在这里找到:https://hub.docker.com/

但是在你开始漫长的镜像更新之前,你可以先询问一下,如果你附近有一个私有仓库,那么过程会快的多。下面介绍基于私有仓库使用,如果要使用官方仓库,去掉教程中IP的部分便可。

比如192.168.2.1/centos:6 改为 centos:6 就行了。

使用私有仓库

假设上面一切顺利,那么你就可以开始构建你的镜像了,这里首先简单解释镜像是什么。在使用Docker的时候,你需要构建很多镜像,它们可能是Nginx镜像,Nginx + PHP + MySQL镜像,Cassandra镜像,或者只是一个简单纯粹的Linux镜像。这些镜像就像软件安装包,你可以到处使用,随时随地的使用任何一个镜像,将镜像变成容器。镜像和容器的关系就像:安装包和安装好的软件的关系。如果你觉得你的某个IDE因为某些莫名的原因不好用了,你会选择卸载重装,Docker也是你这个思路。

构建镜像

构建镜像正常来说有2种方式:通过DockerFile(很像MakeFile)或者就像使用虚拟机那样,启动一个镜像,然后安装你想要的任何东西,再提交。这里主要介绍方法二,对方法一感兴趣的话可以阅读文章开头推荐的书。

note: 镜像地址为虚拟地址,实际按照仓库提供方给的地址为准

  1. 假设有个镜像仓库:192.168.1.2:5000 是企业的私有仓库
  2. 如果仓库不是https协议,你需要修改你的docker守护进程的启动参数,让它像这样运行,如果你是自动安装,那么需要修改启动脚本。
usr/bin/docker daemon -H fd:// --insecure-registry 192.168.1.2:5000
  1. 运行Centos镜像 docker run -i -t 192.168.1.2:5000/centos:6

    如果运气不错,在一小段时间的下载后,你进到了另个命令提示符号下面了,这就是容器内部了。如果下载后没有打开命令提示符,你可以将指令修改为:
# 正常的容器内部,注意@后面就是容器ID
[root@8735f1f1ad16 /]$ # 没有看到终端的情况下执行
docker run -i -t 192.168.1.2:5000/centos:6 /bin/bash

新增的/bin/bash指的是,容器启动后,要执行的指令。不必担心,你不会被要求重新下载一次,本地已经缓存了这个镜像。

开始构建

这是一个各方面看起都没有什么问题的Linux环境,就不具体介绍如何在这里安装环境了,这里我简单的安装一个php环境来作为例子。

yum install php
#...省略 [root@8735f1f1ad16 /]$ php -v
#PHP 5.3.3 (cli) (built: Feb 9 2016 10:36:17)
#Copyright (c) 1997-2010 The PHP Group
#Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
# 如果你需要更新版本的php,你需要自己下载安装,而不是使用yum

搞定!

# 退出bash
[root@8735f1f1ad16 /]$ exit
exit
[root@kevin kevin]$

恭喜你又回到了外面的世界。。。

重启这个容器

提交之前,你需要关掉这个容器,如果你的容器的启动指令是一个服务,那么必须是服务被关闭后,容器才会关闭。不过我们这个容器的启动指令是bash,所以当执行exit时,指令就完成了,容器自然也就结束了。通过下面的指令,你可以看到你启动过的容器。

[root@kevin kevin]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8735f1f1ad16 192.168.62.187:5000/centos:6 "/bin/bash" 8 minutes ago Exited (0) About a minute ago cocky_mccarthy
55b1257721a7 hello-world "/hello" About an hour ago Exited (0) About an hour ago evil_euclid

你会发现容器最后一列names被起了个奇怪的名字,没办法,因为你启动的时候,没有指定好,就被随便取了(tip:--name用于命名)。第一列是一个ID,它唯一指定了你的容器。注意:当镜像启动为一个容器后,它会被保存起来,当你再次docker run ***的时候,会再生成一个新容器,而不是使用刚才这个,如果你还想使用原先的容器,你得用docker start

[root@kevin kevin]$ docker start 8735f1f1ad16
8735f1f1ad16
[root@kevin kevin]$

没成功吗?

[root@kevin kevin]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8735f1f1ad16 192.168.62.187:5000/centos:6 "/bin/bash" 13 minutes ago Up 41 seconds cocky_mccarthy

应该是成功了,可是命令提示符没有变化,这是因为我们少了2个参数:-i -t ,-i 参数保证容器的STDIN是开启的,-t 是告诉Docker为容器创建一个伪tty终端。不幸的是docker start 并不支持-i -t 参数,那么你需要使用另个指令来回到容器中

# 重新附着到容器
# 注意在attach 指令后,我敲了个回车,才真正进到了命令提示符下
[root@kevin kevin]$ docker attach 8735f1f1ad16 [root@8735f1f1ad16 /]$ # 在启动的时候,就附着上去 注意-a参数
[root@kevin kevin]$ docker start -a 8735f1f1ad16

提交这个镜像

提交之前,注意,刚才我们的容器的名字是摇骰子得到的,容器的ID是一个记不住的16进制数,所以我们得给容器一个好名字,再提交为镜像。

[root@kevin kevin]$ docker commit 8735f1f1ad16 kevin/hello-php
sha256:4981e55b52a9b5f2a4b8884f7f439b5bb4416287e47ba2f542a26f80ad0f7daf
[root@kevin kevin]$
#使用docker images看下我们提交的镜像
#centos 和 hello-php看起来都在 [root@kevin kevin]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kevin/hello-php latest 4981e55b52a9 36 seconds ago 352.4 MB
192.168.1.2:5000/centos 6 fc73b108c5ae 4 weeks ago 228.9 MB

不过你只是在你本地创建了一个hello-php镜像,并没被提交给服务器

#  用tag指令给hello-php 加上私有仓库地址,然后push
[root@kevin kevin]$ docker tag 4981e55b52a9 192.168.62.187:5000/kevin/hello-php
[root@kevin kevin]$ docker push 192.168.62.187:5000/kevin/hello-php # 如果你再查看镜像,会看到:
[root@kevin ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.62.187:5000/kevin/hello-php latest 4981e55b52a9 6 minutes ago 352.4 MB
kevin/hello-php latest 4981e55b52a9 6 minutes ago 352.4 MB
192.168.62.187:5000/centos 6 fc73b108c5ae 4 weeks ago 228.9 MB

漫长的上传后,我的镜像就可以被其他人使用了,虽然这个镜像基本一无是处。。。如果你希望它做点什么,最好是指定一个指令,比如启动一个服务器,或者一系列的服务器,你可以将你要做的事写成一个shell脚本,然后在启动后执行:比如我创建了一个容器用来看php版本(挺废的,就是举个例子。。。)

[root@kevin kevin]$ docker run --name php-1 192.168.62.187:5000/kevin/hello-php /usr/bin/php -v
PHP 5.3.3 (cli) (built: Feb 9 2016 10:36:17)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies # so 每次你想看php版本的时候,你可以:
[root@kevin kevin]$ docker start -a php-1

Docker 快速入门教程的更多相关文章

  1. 全面的Docker快速入门教程

    前言: 都2021年了,你还在为了安装一个开发或者部署环境.软件而花费半天的时间吗?你还在解决开发环境能够正常访问,而发布测试环境无法正常访问的问题吗?你还在为持续集成和持续交付(CI / CD)工作 ...

  2. 【干货合集】Docker快速入门与进阶

    收录待用,修改转载已取得腾讯云授权 Docker 在众多技术中,绝对是当红炸子鸡.这年头,如果你不懂一点容器,不学一些Docker,还怎么出去跟人炫耀技术? Docker 也是云计算技术中较为热门的一 ...

  3. 专为设计师而写的GitHub快速入门教程

    专为设计师而写的GitHub快速入门教程 来源: 伯乐在线 作者:Kevin Li     原文出处: Kevin Li 在互联网行业工作的想必都多多少少听说过GitHub的大名,除了是最大的开源项目 ...

  4. EntityFramework6 快速入门教程

    EntityFramework6 快速入门教程 不得不说EF在国内实在是太小众,相关的技术文章真实屈指可数,而且很多文章都很旧了,里面使用的版本跟如今的EF6差别还是比较大.我刚开始弄这个的时候真是绕 ...

  5. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  6. 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程

    指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程 1.4.2  指示灯组 指示灯组的放大图如图1.5所示. 图1.5  指示灯组 各个指示灯对应的功能如下: q  RX:对应于0号端口, ...

  7. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  8. Query 快速入门教程

    Query 快速入门教程 http://www.365mini.com/page/jquery-quickstart.htm#what_is_jquery jquery常用方法及使用示例汇总 http ...

  9. Realm for Android快速入门教程

    介绍 如果你关注安卓开发的最新趋势,你可能已经听说过Realm.Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库. 相比SQLite,Realm更快并且具有很多现代数据库 ...

随机推荐

  1. oracle中如何将表缓存到内存中

    oracle快速将表缓存到内存中,使得访问速度加快. 共有2种方法:   1)alter table fisher cache; 2)alter table fisher storage(buffer ...

  2. P1379 八数码难题

    #include<iostream> #include<bits/stdc++.h> using namespace std; #include<vector> u ...

  3. 使用Selenium慢慢向下滚动页面

    我正试图从航班搜索页面抓取一些数据. 此页面以这种方式工作: 你填写一个表格,然后你点击按钮搜索 – 这没关系.当您单击该按钮时,您将被重定向到包含结果的页面,这就是问题所在.这个页面连续添加结果,例 ...

  4. 【树形DP】洛谷1122_最大子树和

    又是一道树形DP的入门题,思想非常简单  然而我最开始还是存了两个状态[传送门] 题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上 ...

  5. 004---IO模型

    io模型 同步.异步.阻塞.非阻塞概念 同步:发出一个功能调用时,在没有得到结果之前,该调用就不会返回,原地等待 异步:相反,不需要等待 阻塞:调用结果返回之前,当前线程会被挂起,如io操作,只有在得 ...

  6. 4.28-python学习笔记(转义符&input函数)

    参考书目:<Learn Python The Hard Way> ##练习10 print("i am 6'2\"tall.")#将双引号转义 print(' ...

  7. Oracle入门第四天(上)——表管理与数据处理

    一.常见数据库对象 1.基本对象 对应的对象英文名参考:https://docs.oracle.com/cd/B19306_01/server.102/b14220/intro.htm#sthref6 ...

  8. 20155213 2016-2017-2《Java程序设计》第三周学习总结

    20155213 2016-2017-2<Java程序设计>第三周学习总结 教材学习内容总结 类与对象 类和对象的关系:类决定对象,对象反映类的性质 定义值域成员:在新建的类中定义变量,可 ...

  9. 20155217 实验四 Android程序设计

    20155217 实验四 Android程序设计 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号. R.java文件是定义该项目所有资源的 ...

  10. 20155317 王新玮 2016-2017-2 《Java程序设计》第5周学习总结

    20155317 王新玮 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 异常处理 & Collection与Map 异常继承架构 错误的对象继承ja ...