取材

第一本Docker书。原作者:James Turnbull

安装

这里只说明Windows环境的安装(Windows7以上)

使用Docker Toolbox工具即可:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/?spm=5176.8351553.0.0.58a71991lwK6LZ

然后点击下一步安装完毕,

出现三个图标,ToolBox是Docker组件的集合,包括了一个极小的虚拟机,在Windows下安装了一个支持命令行的工具。

而其中的Docker Quickstart Terminal,提供了一个命令行操作的平台,Kitematic (Alpha)提供了一个GUI客户端的平台。

需要注意的是:使用-v的docker run命令在Windows下无法工作,因为无法挂载本地目录。

另外:

docker-machine stop default 停止运行中的虚拟机
docker-machine rm default 删除默认的虚拟机

Docker组件说明

1.Docker客户端和服务端

Docker客户端位于外界,各个客户端通过Docker守护进程作为中介,连接到Docker容器中。Docker容器和Docker守护进程,属于Docker主机中的内容。

2.Docker镜像

打开Docker Quickstart Terminal输入命令:docker images,即可查看本地的镜像。镜像是存储在本地的一个位置的(在/var/lib/docker中)

docker images

用户基于镜像,创建容器。

在Docker里,root文件系统永远只读状态,并会通过root文件系统价值更多的只读文件系统。这样的文件系统称为镜像。

容器将镜像的层层堆叠和覆盖,形成新的镜像,下面的镜像称为父镜像,最底层为基础镜像。在最上层是一个可读写的文件系统,用于Docker程序在该读写层执行。

这种堆叠称为写时复制,因此说,当在最上层进行修改后,覆盖了原有的一部分,又可以构成新的镜像,然后发布(快速构建)。

3.Registry

Registry保存用户的镜像,下载,上传镜像。Docker公司是Docker Hub上存储了不少官方和私人的镜像。如MySQL数据库的镜像。用户也可以自己架设Registry,Registry也有共有和私有之分。

4.Docker容器

使用镜像创建容器container。我觉得是镜像的实例化。使用命令:docker run -i -t ubuntu /bin/bash之类的命令可以根据镜像创建容器,镜像不存在则自动下载镜像

位置在(/var/lib/docker/containers)。在Toolbox中查看需要使用:docker-machine ssh进入到虚拟机中才可以查看。如图,有时候需要sudo,或者切换到管理员才能进入目录下:

第二种图为容器的ID号码

更改镜像源

有时候,一个良好的下载速度是必要的。和其它人一样,这里提供一个更改下载镜像源的方案。

使用阿里云加速,也许可以打开参阅:https://cr.console.aliyun.com/cn-shenzhen/instances/mirrors

注册账号,找到容器镜像服务,打开,找到自己专属的地址,对应系统,然后输入到控制台中即可。可以用docker info 查看镜像源是否更改。

查看docker信息

在终端输入docker info,可以查看到当前容器数量,镜像数量,还有更改的镜像源等

运行第一个容器

运行如下代码,-i保证容器中的STDIN开启,-t创建伪tty终端,这样可以交互。该代码使用的镜像为Ubuntu,当该镜像不存在则会自动pull然后下载,保存到本地。该镜像是一个基础镜像。

创建的容器,是一个剪裁的Ubuntu系统,有自己的网络和IP地址,和宿主机通信的网络接口。

docker run -i -t ubuntu /bin/bash

运行该行会进入到容器中,并自动为该容器创建一个名字和一个ID。

名字可以在run的时候指定,指定的方式为:

docker run --name my_container -i -t ubuntu /bin/bash

输入后直接进入该容器中,输入hostname可以查看到ID。

通过

apt update
apt install net-tools

命令安装完ifconfig的程序时候,可以通过ifconfig -a查看到该容器的IP地址。

可以通过以下代码在容器中,查看进程,安装vim等

ps aux
apt install vim

输入exit退出容器,或者ctrl+d退出。退出容器,/bin/bash命令结束,容器停止。

通过以下代码查看创建的容器详细信息,包括ID,名字。在引用的时候,可以使用ID,也可以使用名字引用。

docker ps -a

启动,创建,和附着容器

如下命令即可启动:(对应到上图中ID的第一个,也可以使用NAMES的值代替ID,这里ID没有写全了,不过能用)

docker start 6d47

使用如下代码查看STATUS,可以看到启动了:

docker ps -a

容器创建使用docker create命令,创建却不运行它。

虽然容器启动了,可是没有进到容器中,不能进行交互式会话。

使用如下命令,附着到正在运行的容器,进行会话。

docker attach 6d47

这样就又回到交互式环境中了:

创建和使用守护式容器

守护式容器没有交互式会话,长期运行在后台,提供服务即可。使用的命令还是run命令。

运行如下命令,即可创建一个守护式容器。

docker run --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"

运行完以后,通过docker ps -a可以查看状态,它在后台运行。会在每秒中输出一个hello world。

因为使用了-d参数,所以才能够放到后台运行。

查看该容器中的输出效果:

docker logs my_container

使用如下跟踪守护式进程日志(ctrl +c退出跟踪(容器不会停止)):

另外,-t可以增加日志的时间戳信息,如--tail 4,可以只显示最后四条信息

docker logs -f my_container

Docker日志驱动,使用

docker run --log-driver="syslog" --name container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"

创建,但是在Docker Toolbox中,需要使用:

docker-machine ssh
syslogd

命令进入Docker Toolbox虚拟机,然后运行syslogd,来启动syslog守护进程

容器进程查看、统计信息

在终端查看守护式容器中的进程:

docker top my_container

在容器中运行进程

后台命令示例使用代码:

docker exec -d my_container touch /etc/new_file

则在该容器中(-d表示后台执行),创建一个新文件

交互式命令示例使用代码:

docker exec -t -i my_container /bin/bash

该代码可以进去与之前创建的守护式容器进行交互(当然我之前使用了 docker exec -d my_container kill -9 xxx结束了容器中的循环echo的代码了)。

停止、自重启守护式容器

使用如下(发送SIGTERM信号),停止正在运行的该容器:(也可以使用docker kill 发送SIGKILL信号更快停止)

docker stop my_container

创建守护式容器中使用了:docker run --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done",这里添加--restart部分即可

docker run --restart=always --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"

可以使用always表示是否正常退出都重启,使用参数为on-failure:5表示失败重启,次数为5次。

查看容器详细信息与删除容器

查看详细信息如下,其中第二条用于过滤信息。

docker inspect my_container
docker inspect --format='{{.State.Running}}' my_container

删除容器使用rm命令

docker rm my_container

使用-f选项,可以删除正在运行中的容器。

删除所有容器的方法是:

docker rm `docker ps -a -q`

其中的子句列出了所有容器的id。

  

拉取、查找镜像

拉取:

之前通过run获取的是自动获取,这里手动下载镜像示例:

docker pull ubuntu:12.04

该命令会从Docker Hub上拉取镜像

之后可以通过docker images查看本地镜像。在拉取过程中,不指定则使用标签为latest,这里指定了标签为12.04.

这种标签机制可以存活多个相同名字不同标签的镜像。

在run的过程中,指定基础镜像时候,需要加上该标签更合适(默认latest):

docker run --name my_container -i -t ubuntu:12.04 /bin/bash

从用户那里拉取镜像时候,:需要包含:用户名,仓库名。

之前拉取只有仓库名,是因为其为顶级仓库,由优质厂商提供的镜像。

查找镜像:

使用代码示例:

docker search puppet

会提示一些信息,排名等

然后通过以下拉取镜像即可

docker pull xxx/xxxx

前面是用户名,后面是仓库名。

构建镜像--commit

这里指代的是在原有镜像的基础上,进行修改,然后重新生成新的镜像。

创建容器,进行修改后退出容器,提交即可:

docker run -i -t ubuntu /bin/bash

apt update
apt -y install apache2 docker commit $ID $用户名/$仓库名

其中,提交参数有 -a 后面添加作者,-m后面添加提交说明,仓库名后添加    :$标签   ,表示提交使用的标签。

提交后成为镜像,又可以拿来产生容器。

构建镜像--build与Dockerfile

使用build和Dockerfile创建镜像。其中Dockerfile中填写了一些说明信息。下面构建了文件夹作为环境上下文,然后在该环境中创建文件。

mkdir static_web
cd static_web
touch Dockerfile
nano Dockerfile

文件中写入的内容例如:

FROM ubuntu:14.04
MAINTAINER Bai "1872040489@qq.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi I am in your container ' > /usr/share/nginx/html/index.html
EXPOSE 80

这里的每一个作为一个控制说明。分别说明了基础镜像,作者,邮箱,运行命令和向外公布的端口。

当然其还有如CMD,ENTRYPOINT,WORKDIR等等的标记,用于构建Dockerfile。#表示注释

其中run的命令在有时候需要写成如下格式(exec格式的RUN指令):

RUN ["apt-get", "install","-y","nginx"]

进行保存后,在该路径下执行命令:

docker build -t="jamtur01/static_web:v1" .

进行在该路径下构建镜像,每一步会形成一个新的镜像,中途失败,下次会冲上次失败的地方开始(镜像堆叠效果)。

使用docker history + 镜像可以查看堆叠过程。

以上构建代码指明了用户名,仓库名,标签。

另外,也可以在git仓库中构建镜像。

Docker运行nginx

在构建一个nginx镜像成功以后,通过以下命令,进行端口映射,然后创建容器:以下代码使用了地址加随机端口的方式,进行了映射。当然还有其它各种映射方案。

sudo docker run -d -p 127.0.0.1::80 --name static jm/static_web_1 nginx -g "daemon off;"

通过以下查看端口映射情况(都可):

docker ps -l
docker port + ID + 被映射端口

  

上传镜像

使用:docker push username/image

可能需要登录:

docker login命令即可

删除镜像

使用docker rmi +镜像即可

Docker从门外到入门使用的更多相关文章

  1. Docker Rest API使用入门

    Docker Rest API使用入门 系统:Centos7.2, Docker版本信息如下: [python] view plain copy Client: Version:      17.03 ...

  2. docker安装kafka快速入门

    docker安装kafka快速入门 1.安装zookeeper docker search zookeeperdocker pull zookeeperdocker run -d -v /home/s ...

  3. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  4. Docker与容器快速入门

    Docker之风席卷全球,但很多人觉得docker入门确实不太容易,其原因在于很多知识点上没准备好,在docker解决了什么问题.怎么解决的.用什么技术解决的都还没想清楚的时候就去探索docker组件 ...

  5. Docker官方文档翻译之入门

    转自:http://www.cnblogs.com/vikings-blog/p/3958091.html Docker学习总结之docker入门 Understanding Docker 以下均翻译 ...

  6. Docker三十分钟快速入门(上)

    一.背景 ​ 最近,Docker技术真是一片火热,它的出现也弥补了虚拟机资源消耗过高的问题,直接让虚拟化技术有了质的飞跃.那么本文我们来聊一聊Docker,和大家一起认识Docker,简单入门Dock ...

  7. Docker三十分钟快速入门(下)

    一.背景 上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项目,来达到学会容器间通信以及dock ...

  8. Docker Compose安装以及入门

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用. Compose 简介 Compose 项目是 Docker 官方的开源 ...

  9. Docker学习系列(二):Docker三十分钟快速入门(上)

    一.背景 ​ 最近,Docker技术真是一片火热,它的出现也弥补了虚拟机资源消耗过高的问题,直接让虚拟化技术有了质的飞跃.那么本文我们来聊一聊Docker,和大家一起认识Docker,简单入门Dock ...

随机推荐

  1. C++ 11标准

    C++11,也称为C++0x.为目前C++编程语言的最新正式标准(ISO/IEC 14882:2011).它将取代第二版标准ISO/IEC 14882:2003(第一版ISO/IEC 14882:19 ...

  2. Python 依赖库管理哪家强?pipreqs、pigar、pip-tools、pipdeptree 任君挑选

    在 Python 的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份"requirements.txt",记录下依赖库的名字及其版本号. 那么,如何来生成这份文件呢?在上 ...

  3. Leetcode Tags(4)Stack & Queue

    一.232. Implement Queue using Stacks private Stack<Integer> stack; /** Initialize your data str ...

  4. sql 经典查询50题 思路(一)

    因为需要提高一下sql的查询能力,当然最快的方式就是做一些实际的题目了.选择了这个sql的50题,这次大概做了前10题左右,把思路放上来,也是一个总结. 具体题目见: https://zhuanlan ...

  5. JVM垃圾收集策略与算法

    垃圾收集策略与算法 程序计数器.虚拟机栈.本地方法栈随线程而生,也随线程而灭:栈帧随着方法的开始而入栈,随着方法的结束而出栈.这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的 ...

  6. Golang的json包

    encoding/json encoding/json是官方提供的标准json, 实现RFC 7159中定义的JSON编码和解码.使用的时候需要预定义struct,原理是通过reflection和in ...

  7. 小白学 Python(19):基础异常处理

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  8. 建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板

    随着互联网越来越生活化,二维码的使用越来越普遍,不论是扫码支付还是扫码关注引流,似乎我们总是离不开二维码,那么很多需要推广的文章或社区想要自己的二维码,那么你是不是需要在网站直接提供给用户呢?很多开发 ...

  9. [LLL邀请赛]参观路线(图论+dfs)

    emmmm....学校的oj被查水表了,扒不到原题面,所以.... 但是我还是扒到了题面... 题目大意:给定一个完全图,删掉其中一些边,然后求其字典序最小的遍历顺序 有点像去年day2T1啊.... ...

  10. win10系统任务栏点击没有反应

    今天碰到了一个神奇的bug任务栏上的图标怎么也没反应,鼠标点击不了,win+R命令行也出来不了. 经过一番研究,发现CTRL+ALT+DEL,可以打开任务管理器.所以来了一番操作: 1.先打开任务管理 ...