docker入门及命令行实战

docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解.              Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等;

  Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并

  Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展;

  Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image;

  Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS平台的支持等;

  docker运用场景:

    web应用的自动化打包和发布;

    自动化测试和持续集成、发布;

    在服务型环境中部署和调整数据库或其他的后台应用;

    从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

  可以看出来docker其实就是使得部署,发布变得更加快捷,更加自动化,且适应云平台环境.再看定义:

  Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、

Docker是什么? 

Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初是dotCloud公司发起。

Docker通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里应用组件,即可以是Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。

Docker由镜像(Image)、容器(Container)、仓库(Repository) 三大核心组成

为什么要用Docker?

更快速的交付和部署(使用docker,开发人员可以用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。)

更轻松的迁移和扩展(docker容器几乎可以在任意平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。可以在不同的平台轻松地迁移应用)

更简单的更新管理(使用Dockerfile,只需要修改小小的配置,就可以替代以往大量的更新工作)

 

与传统虚拟机对比

 

场景示例-传统开发流程

 

 

场景示例-docker环境开发流程

 

Linux下安装docker程序

环境准备

  1Linux7以上或者cent OS6及以上版本

  2、内核3.1.0以上

  364位操作系统

安装docker

  1yum安装 yum install  docker-engine

  2curl脚本安装  

 

Docker,可以说是一个终端命令行的虚拟机,但更准确的说法,其实应该是一个虚拟环境。比如,你想要在PC上无缝使用Linux么?那么虚拟机并不是你唯一的出路,你还有Docker!我更愿意称Docker为一个容器,当然这只是Docker的一个狭义解释,Docker不止是一个容器。Docker包含3个重要概念:

  • 一个是镜像(Image),镜像是静态的、可以被用户互相分享的文件。我们玩过双系统和虚拟机的人都知道,首先你需要一个.iso镜像,才能安装系统。Docker中的镜像也是这个东西,镜像是静态的,你不能对他操作,只能pull别人的镜像或者push自己的镜像。
  • 还有一个,是容器(Container),前面说过,镜像是静态不可操作的,只能被分享和下载,那什么是能被操作的呢?就是容器里!容器可以理解为镜像的动态状态,也就是我们虚拟机中系统装好后的状态,其实这么说是不对的,容器最符合的描述应该是Linux的iso文件的Live CD模式,比如我们玩双系统时都进入过Live CD模式,不安装系统而直接进入系统,很神奇是吧,Docker的容器就是这个概念,只不过更加轻量更加迅速便捷。但是Live CD的害处就是你关机后作出的修改安装的软件全部gg,容器也是一样,一旦被直接推出,之前安装的gcc啊vim啊啥的就会全部gg掉。如果要保存修改,就需要将当前容器封装成一个新的镜像,这样下次启动这个新的镜像后之前作出的修改还都在。
  • 最后,是仓库(Repository)。各位在前面看到我写的pull和push什么的,有没有晕?不知道各位对于git熟悉不熟悉,Docker中的仓库很像git的代码仓库,你可以pull自己之前push到自己仓库的镜像到本地,也可以pull别人push到公共仓库的镜像到自己本地。说白了就是百度云盘,你可以上传(push)自己做好环境的Docker上去,也可以下载(pull)自己云端的镜像到本地。同时,我们知道百度云最大的特点就是分享(你懂的嘿嘿嘿),类比Docker,如果你得到百度云分享链接(别人的镜像名字、标签和别人的用户名),你还可以下载(pull)别人分享的镜像到自己的本地,别人也可以下载(pull)你的镜像,因为Docker仓库都是公共的。当然,每个免费用户有一个名额把自己的一个镜像设为私有,也就是禁止被分享给别人,类比百度云上你自己保存的而没有被生成分享链接的小姐姐。

 

接下来就是实战了!打开你的iTerm2!(我是iTerm2党2333,打开普通terminal也行,这个不影响)

+ 查看Docker版本信息

终端输入:
docker version
显示的我的版本信息

 ~$ docker version
Client:
 Version:      17.06.2-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   cec0b72
 Built:        Tue Sep  5 20:12:06 2017
 OS/Arch:      darwin/amd64
 ...
 //omitted by sgy(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
 ...
不过我一般不需要那么多信息,所以一直用的是docker -v命令

+ 是时候pull你的第一个镜像下来的!

Docker安装好后是不会自带镜像的,你需要从仓库自己pull一个镜像下来,自己制作自己的镜像也是一个道理,你可以通过在已有的镜像基础上生成自己的镜像或者看一下这篇博客: 随便百度的如何创建自己Docker镜像得到的教程

Docker镜像官方好像只提供Linux,这个很容易想,windows和mac是要交钱的吧大概?

搜索ubuntu的Docker镜像docker search ubuntu,这个如果你想要什么centos,直接改就行,不区分写法,我的返回结果:

~$ docker search ubuntu
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating s...   6636                [OK]
dorowu/ubuntu-desktop-lxde-vnc                         Ubuntu with openssh-server and NoVNC            131                                     [OK]
rastasheep/ubuntu-sshd                                 Dockerized SSH service, built on top of of...   105                                     [OK]
ansible/ubuntu14.04-ansible                            Ubuntu 14.04 LTS with ansible                   86                                      [OK]
ubuntu-upstart                                         Upstart is an event-based replacement for ...   80                  [OK]
neurodebian                                            NeuroDebian provides neuroscience research...   40                  [OK]
ubuntu-debootstrap                                     debootstrap --variant=minbase --components...   31                  [OK]
...
//omitted by sgy(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
...
拉取官方最新版的ubuntu镜像:docker pull ubuntu:latest,其中的latest是一个标签(tag),表示是当前最新版本。你应该得到的信息,类似这样的

~$ docker pull ubuntu:latest
Trying to pull repository docker.io/library/ubuntu ... 
latest: Pulling from docker.io/library/ubuntu
aed158d74952: Pull complete 
773ae8273d14: Pull complete 
d1d487w88782: Pull complete 
cd3d6cd6c0cf: Pull complete 
8d73bu79120c: Pull complete 
Digest: sha256:35bc48a1ca97c3f74rhf378hj92hd82j29i4hf4hf84nf0dhnsid232de8d8
Status: Downloaded newer image for docker.io/ubuntu:latest

你输入的命令实际上相当于docker pull registry.hub.docker.com/ubuntu:latest命令,即从注册服务器registry.hub.docker.com中的名为ubuntu的仓库中下载标签为latest的镜像。

由于我的lab统一要求,ubuntu需要14.04版本,所以我在hub里面搜了搜,找到了一个用户分享的14.04 64位纯净镜像(base image),下面将他的镜像扒下来

~$ docker pull chug/ubuntu14.04x64
这个用户还有很多其他版本的ubuntu系统,12 13 14的32位64位都有,全是纯净镜像。

+ 查看你本地的镜像仓库!

把初始镜像拉下来后,就可以启动它了,不过,可以先使用docker images命令查看你自己的本地镜像,我随便找了个例子,你的也应该是类似这样的:

~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    16.04               e4415b714b62        11 days ago         128.1 MB
docker.io/ubuntu    latest              e4415b714b62        11 days ago         128.1 MB
docker.io/ubuntu    12.04               aefa163f7a7e        11 days ago         103.5 MB
docker.io/centos    latest              0584b3d2cf6d        3 weeks ago         196.5 MB
从网上一个教程中找到以下说法,比我说的好,那就看这个吧!

在列出信息中,可以看到几个字段信息:
来自于哪个仓库,比如 ubuntu
镜像的标记,比如 16.04
它的 ID 号(唯一),比如e4415b714b62
创建时间
镜像大小
其中镜像的 ID 唯一标识了镜像,注意到 ubuntu:16.04 和 ubuntu:latest具有相同的镜像 ID ,说明它们实际上是同一镜像。 TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如10.04 、 12.04 、 12.10 、 13.04 、 14.04 等。例如可以使用docker run -t -i ubuntu:16.04 /bin/bash命令指定使用镜像ubuntu:16.04来启动一个容器。如果不指定具体的标记,则默认使用latest标记信息
+ 启动你的镜像并尽情安装软件吧!

以下内容均以我自己pull下来的chug的初始镜像为例:

现在你已经有一个初始的镜像了,注意这个里面是什么都没有的,连vim都没装,是精简到不能再精简的镜像了。

首先启动它:

~$ docker run -it chug/ubuntu14.04x64 /bin/bash
root@aa97ba3292ce:/#
-it 表示运行在交互模式,是-i -t的缩写,即-it是两个参数:-i和-t。前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)一般这个模式就是可以启动bash,然后和容器有命令行的交互

可以看到我们终端的字头变成root@aa97ba3292ce:/#了,这就意味着我们的镜像已经创建了一个容器实例。现在我们可以对这个“ubuntu系统”进行操作了

比如安装vim:

root@aa97ba3292ce:/# apt-get install vim
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
  file libexpat1 libffi6 libgpm2 libmagic1 libpython2.7 libpython2.7-minimal libpython2.7-stdlib libsqlite3-0 libssl1.0.0 mime-support vim-common vim-runtime
Suggested packages:
  gpm ctags vim-doc vim-scripts
The following NEW packages will be installed:
  file libexpat1 libffi6 libgpm2 libmagic1 libpython2.7 libpython2.7-minimal libpython2.7-stdlib libsqlite3-0 libssl1.0.0 mime-support vim vim-common vim-runtime
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.7 MB of archives.
After this operation, 50.7 MB of additional disk space will be used.
Do you want to continue? [Y/n]
看到我没有用sudo,是因为本来就已经是超级用户(root)状态了。

同理按照我自己的需求,我安装了gcc和gdb

+ 想退出容器?很简单!

如果使用exit,命令退出,则容器的状态处于Exit,而不是后台运行。如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。

查看当前正在运行的容器:

~$ docker ps     //docker ps -a  查看所有容器
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS               NAMES
aa97ba3292ce        chug/ubuntu14.04x64   "/bin/bash"         7 minutes ago       Up 7 minutes                           relaxed_hoover
看到当前有一个ID为aa97ba3292ce的容器(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

启动、停止、重启容器aa97ba3292ce的命令

~$ docker start aa97ba3292ce
~$ docker stop aa97ba3292ce
~$ docker restart aa97ba3292ce
后台启动一个容器后,如果想进入到这个容器,可以使用attach命令

~$ docker attach aa97ba3292ce
+ 软件装完,想保存环境?commit帮你!

将容器转化为一个镜像,即执行commit操作,完成后可使用docker images查看

root@aa97ba3292ce:/#exit //先退出容器
~$ docker commit -m "ubuntu with vim" -a "sgy" aa97ba3292ce sgy/ubuntu:vim

~$ docker images
REPOSITORY                    TAG    IMAGE ID         CREATED             SIZE
sgy/ubuntu                    vim    52166e4475ed     5 seconds ago       358.1 MB
chug/ubuntu14.04x64           latest 0584b3d2cf6d     9 days ago          196.5 MB
其中,-m指定说明信息;-a指定用户信息;aa97ba3292ce代表容器的id;sgy/ubuntu:vim指定目标镜像的用户名、仓库名和 tag 信息。我这里都是为了博客瞎编的用户名,我自己的用户名也不是sgy,你运行命令的时候使用自己注册Docker时的用户名

此时Docker中就有了我们新建的镜像sgy/ubuntu:vim,此镜像和原有的ubuntu镜像区别在于多了个vim工具。此时我们利用新镜像创建的容器,本身就自带vim了。

启动新创建的镜像,可以看到vim已经自带了。

~$ docker run -it sgy/ubuntu:vim /bin/bash
root@520afc596c51:/# vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr  4 2017 18:14:54)
...
//omitted by sgy(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
...
利用exit退出容器。此时Docker引擎中就有了两个容器,可使用docker ps -a查看。

+ 想要删除容器或者镜像?用这个!

如果想删除容器或者镜像,可以使用rm命令,注意:删除镜像前必须先删除以此镜像为基础的容器(哪怕是已经停止的容器),否则无法删除该镜像,会报错Failed to remove image (e4415b714b62): Error response from daemon: conflict: unable to delete e4415b714b62 (cannot be forced) - image has dependent child images类似这种。

~$ docker rm container_id
~$ docker rmi image_id

有的时候尽管删除了全部容器,镜像还是无法删除,这时点击mac顶栏中的docker logo,选择restart,然后再试一次rmi,应该就没问题了。(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

+ 附上一张高大上的Docker命令图

docker4.png

+ 一次配置,到处使用?那就push到hub上吧!

因为之前已经在Docker.app中登陆了Docker账号,所以现在直接

~$ docker push sgy/ubuntu:vim
就可以了!

下次到了机房,在ubuntu系统中安装Docker,配置好加速器,启动Docker,docker login登陆自己的账号,然后直接~$ docker pull sgy/ubuntu:vim就可以把你push到hub的已经配置好的环境的镜像给扒下来。做完实验,再push上去就ok了!

Docker中安装gcc、gdb时遇到的问题

+ add-apt-repository: command not found

14.04系统解决办法:

apt-get install software-properties-common
older版本的系统:

apt-get install python-software-properties
+ Docker中使用gdb无法进入断点,无法调试

加上--privileged参数

~$ docker run -it --privileged sgy/ubuntu:vim /bin/bash
结语

到此本文就结束了,我说得很清楚,这只是一篇入门教程,可以让你从“一问三不知”到达“一问一不知”的状态,再高层次?那就靠自己了!

你可能感兴趣的:(Eos)