Docker在 CentOS7.X上运行。Docker可能在其他EL7的兼容版本中成功安装,但是官方并未进行测试,因此也不提供任何支持。

系统环境要求

docker必须运行在64-bit的系统上,对于CentOS的版本号并没有特别要求。另外,如果需要在CentOS上安装,内核版本必须高于3.10。

通过uname -r 查看内核版本

uname -r

3.10.0-327.el7.x86_64

脚本安装

可以通过以下两种方法安装Docker Engine。使用 yum包管理器;

或者使用 curl命令访问 get.docker.com网站。后者将获得一个安装脚本,该脚本将通过yum管理器安装Docker。

[root@localhost ~]# curl https://get.docker.com|sh

#安装好之后在/etc/group 下,会有一个docker组

创建一个docker用户组

docker守护进程现在绑定了一个Unix Socket,取代了之前的TCP端口。 默认情况下,这个Socket的属主用户是root并且用户可以通过sudo进行访问。因此,docker守护进程总是通过root用户运行。

为了避免在使用docker命令的时候使用sudo,需要创建一个名为docker的Unix用户组,并给该用户组添加用户。当docker守护进程启动后,docker用户组的用户可以获得socket的的读写权限。

注意: docker用户组等效于root用户; 关于这样做为什么为影响你的系统安全,更多信息可以查看Docker Daemon Attach Surface。

为docker用户组添加用户

$ sudo usermod -aG docker your_username

重新登录

这样可以保证你的用户获得正确的权限

确认你可以不使用sudo启动docker容器

$ docker run hello-world

设置docker daemon为开机启动

确保docker会在开机时候启动,需要执行以下命令

sudo chkconfig docker on

# 或者

sudo systemctl enabld docker.service

#如果需要使用HTTP代理,那么需要为Docker执行文件另外设置一个目录或者分区,或者使用其他定制选项。阅读关于系统的文章并学习customize your Systemd Docker daemon options。

卸载

可以通yum 卸载docker软件

列出所有以及安装的程序包

$ yum list installed |grep docker

docker-engine.x86_64                 1.12.1-1.el7.centos             @dockerrepo

docker-engine-selinux.noarch         1.12.1-1.el7.centos             @dockerrepo

删除软件包

$ sudo yum -y remove docker-engine.x86_64   1.12.1-1.el7.centos

该命令不会删除docker镜像,容器,数据卷,或者用户创建的配置文件。 +

如果要删除镜像,容器和数据卷,使用以下命令

$ rm -rf /var/lib/docker

查找并删除其他任意用户创建的配置文件。

使用yum安装

登录系统,并确认用户为root或者用户有权限使用sudo命令。

保证你现有的yum安装包是最新的。

sudo yum update

添加yum repo

sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'

[dockerrepo]

name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/7/

enabled=1

gpgcheck=1

gpgkey=https://yum.dockerproject.org/gpg

EOF

安装docker

sudo yum install docker-engine

启动docker

    sudo service docker start

    /bin/systemctl  stop  docker.service

确认docker被正确安装并在容器中运行一个测试镜像(image)

    $ sudo docker run hello-world (大小为1.84KB)

    Unable to find image 'hello-world:latest' locally

    latest: Pulling from library/hello-world

    c04b14da8d14: Pull complete

    Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9

    Status: Downloaded newer image for hello-world:latest

    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.

     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

     3. The Docker daemon created a new container from that image which runs the

    executable that produces the output you are currently reading.

     4. The Docker daemon streamed that output to the Docker client, which sent it

     to your terminal.

    To try something more ambitious, you can run an centos container with:

    $ docker run -it centos bash

    Share images, automate workflows, and more with a free Docker Hub account:

    https://hub.docker.com

    For more examples and ideas, visit:

    https://docs.docker.com/engine/userguide/

了解docker镜像与容器

docker引擎提供核心docker技术,从而实现镜像和容器。正如安装的最后一步,你执行docker run hello-world命令。这条命令分为三个部分:

        

镜像是在运行时使用的文件系统和参数构成的。他没有状态且还不会改变。

容器是镜像运行时的一个实例。当你执行命令时,Docker引擎会:

    ● 检查当前系统环境是否有hello-world软件镜像

    ● 如果没有则从Docker Hub上下载镜像

    ● 加载镜像到容器并“执行”他

根据构建方式的不同,一个镜像可能在执行一个简单的、单一的命令后退出。正如hello-world镜像。

一个docker镜像可以做事情还有很多。一个镜像可能启动一个例如数据库的复杂程序,并等待你(或其他人)添加、存储数据并在之后使用他;进而等待之后的人员继续使用。

Docker创建了 hello-world镜像,但是其他任何人也可以。Docker引擎允许其他人或公司通过镜像创建并分享软件。

使用docker时,你不用担心你的计算机是否能够运行镜像中的软件,在dock容器中,永远可以成功运行

容器中的Hello World

Docker允许你在容器中运行你创建的应用或其他任何东西。而运行一个应用只需要一个简单的命令: docker run ****

注意:跟你docker系统的配置,可能你需要使用 sudo才能执行docker命令。如果不想再使用sudo,可以将用户添加到docker用户组。

输出hello wolrd

    $ docker run centos /bin/echo "hello world"

    hello wolrd

#########启动了你的第一个容器##########

docker run 启动了一个容器。

Centos是这个容器使用的镜像。如果本地没有该镜像则会从DockerHub上下载。

镜像启动完成后,在容器内执行了 /bin/echo 命令。

这个容器启动后,Docker创建了一个新的centos系统环境并在容器内执行/bin/echo已经打印输出

hello world

启动一个可交互的容器

$ docker run centos (# pull centos系统)

$ docker run -t  -i  centos  /bin/bash

[root@041024e7efea /]# pwd

/

[root@041024e7efea /]# cd /tmp

[root@041024e7efea tmp]# ls

ks-script-CIN_1i  yum.log

[root@041024e7efea tmp]#

在本例中:

docker run启动了一个容器。

centos是使用的镜像。

-t 在容器内部注册了一个 pseudo-tty或者terminal。

-i 通过容器的标准输入[STDIN]建立了一个链接,允许你与容器进行交互

/bin/bash 在容器中启动 bash shell。

容器启动后,我们可以看到命令行提示为:

[root@3b39ca23e6c8 /]#

当需要结束是,使用 exit命令或 Ctrl+D退出交互shell。+

[root@3b39ca23e6c8 /]# exit

exit

[root@localhost ~]#

注意: 这里一旦结束了 bash shell进程,容器就停止了。

启动一个后台容器

$ docker run -d centos /bin/sh -c "while trus;echo hello world;sleep 1;done"

1864e7a169419b74a8c863f4e488461d54bf2f8fdcd8a41cd5a47ca23467fb53

-d 参数使容器在后台运行

在输出中只是有一串很长的字符串

1864e7a169419b74a8c863f4e488461d54bf2f8fdcd8a41cd5a47ca23467fb53

这个字符串就是容器ID。 该字符串唯一标识一个容器的,可以通过该字符串操作容器。

注意:这个容器ID显然太长了。之后我们将使用更短的ID和方法标示容器。

可以使用这个容器ID查看hello wolrd做了什么。

首先, 需要确认容器正在运行。 使用命令 docker ps 查看。 该命令将引导docker进程列出所有已知容器的信息。

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED                 STATUS               PORTS               NAMES

1f8830d097b7      centos             "/bin/sh -c 'while..."         11 minutes ago         Up 11 minutes                                upbeat_noether

在本例中,可以看到处于后台运行的容器。 docker ps 另外返回了一些有用的信息:

1f8830d097b7 这是一个更短的容器ID。

Centos 是我们所使用的镜像。

另外还有容器启动后执行的命令,容器状态和容器名称。

注意:如果启动容器的时候不指定容器名称,那么docker会自动为容器分配一个。

确认了容器正在运行,但是容器是否按照我们要求在运行呢?

为了确认,我们可以使用 docker log命令观察容器内部。

$ docker logs upbeat_noether     (upbeat_noether是上面的,往上看)

本例中:

docker log查看了容器的内部,并返回 hello world

docker还在后台运行。另外,你刚创建了你的第一个docker化的应用。

接下来使用 docker stop 命令关闭容器。 ( docker stop + 名字也可以关闭)

或者

使用 docker ps查看容器运行状态

Excellent. 所有容器都已经停止了。

运行一个简单的应用

在之前容器中的Hello World学习了如何使用 docker run启动容器。在前台运行了一个可交互容器;也可以在后台运行一个分离的容器。之前你习以下几个命令

docker ps 显示容器

docker logs 显示容器中的标准输出

docker stop 停止一个运行中的容器

学习如何使用docker客户端

可能你还没有意识到,你之前使用的在bash终端中输入的每一条docker命令都是在使用docker客户端。命令行客户端又被称为命令行接口(CLI)。你每一次执行的行为都是由docker命令和一些标记和参数组成。

例如:$ docker run -i -t ubuntu /bin/bash

使用命令 docker version 可以查看你当前使用的docker客户端和服务端版本信息。+

$ docker version

docker命令帮助信息

使用 --help 参数, 可以查看docker命令的帮助信息。 查询docker所有子命令,如下:

$ docker --help

查看具体子命令的帮助信息,则是在子命令后使用 --help 参数。

$ docker attach --help

注意:如果要了解更多命令的详细信息和用法,参考命令手册。

在docker中运行一个web应用

刚才又学习了一点关于docker客户端的用法,现在可以开始处理一些更做要的工作了:

启动更多的容器。到目前为止,你还没有启动任何一台有实际意义的容器,现在你可以运行一台我们预先准备的web应用。

提供的web应用镜像中,将运行一个 Python Flash 应用。 使用 docker run:

$ docker run -d -P training/webapp python app.py(是大P)

再来回顾一下该命令做了些什么。 使用了两个标记 -d 和 -P。

-d 是告诉docker后台运行容器

-P则是告诉docker映射所有容器内部需要使用的网络端口到本地计算机,这让我们可以访问容器中的web应用。

指定使用镜像:training/webapp。 该镜像是一个创建好的镜像,容器中会运行一个简单的 Python Flash web应用程序。

最后, 你为容器指定了一个命令: python app.py命令会启动容器内的web应用

注意: 你可以在 命令手册 和 docker run 手册 中查看更多关于 docker run 的信息。

查看web容器

现在你可以使用命令 docker ps 查看刚才启动的容器。

[root@localhost ~]# docker ps -l

CONTAINER ID      IMAGE                   COMMAND           CREATED                STATUS                  PORTS                                   NAMES

8a0be323ed56   training/webapp     "python app.py"     54 seconds ago     Up 53 seconds       0.0.0.0:32769->5000/tcp   stupefied_hoover

注意:默认情况下, docker ps 只会显示正在运行的容器信息。使用 docker ps -a 则会显示所有容器信息,包括停止了的。

当我们使用 -P 标记时, docker run 命令会映射容器中使用的所有端口到本地计算机。

PORTS

0.0.0.0:32769->5000/tcp

注意:将在 如何创建镜像 中学习如何在镜像暴露(EXPOSE)端口。

在上面的案例中,docker将容器的5000端口(python flask的默认端口)映射到了本地计算机的49155端口上。

端口绑定是可配置的。在上一个案例中, -P 是 -p 5000 的缩写将容器内部的5000端口映射到本机计算机的高端口号(临时端口范围(ephemeral port range),通常为32768-61000)上。也可以使用 -p指定绑定的端口

注意: -P  local_port:container_port 前面是是本机计算机端口,后面是容器端口如果省略 local_port的话,则将使用随机高位端口

例如:docker run -d -P 80:5000 training/webapp python app.py

      #iptables -F

      #setenforce 0

curl localhost:32769 ##linux端访问本地

http://192.168.0.18:32769/ ##win端访问

python应用成功运行了。可以在浏览器上访问 http://192.168.0.18:32769 访问。

容器的5000端口将被映射到本机计算机的80端口上。你可能会问,那我们为什么不使用1:1对应的端口映射,而要映射到高端口号上?

1:1对应端口映射的局限在于本地计算机端口只能被映射一次,不能同时被重复映射。

试想一下你同时测试两个python应用,容器内部都使用5000端口。

在不使用docker端口映射的情况下,在同一时间内你只能访问一个docker容器。

快速查询端口映射

使用 docker ps 命令查询容器的端口映射信息有一点不方便。因此docker提供了一个有用的快捷方式: docker port。

使用 docker port 命令时,我们需要指定容器ID名称以及需要进行通讯的的容器端口号。

本例中,你查询容器的5000端口映射到了本机计算机哪个端口上。

查看web应用的日志

也可以使用 docker logs 命令查看web引用发生了什么

查看容器内应用的进程信息

除了查看容器日志之外,还可以使用 docker top 命令查看容器内的进程信息

[root@localhost ~]# docker top stupefied_hoover

UID          PID          PPID         C        STIME        TTY         TIME               CMD

root       25912       25897        0        19:14           ?          00:00:01        python app.py

#这里我们看到,容器中只有一个进程。

检查容器内的应用信息

最后,将使用 docker  inspect 命令获取docker容器初级信息。该命令将返回一个JSON文档,其中包含了指定容器配置和状态信息。

[root@localhost ~]# docker inspect stupefied_hoover

可以通过指定具体的元素查询信息,例如说,查询容器的IP地址:

停止一个运行的容器

已经看过web应用如何工作了,现在可以使用 docker stop container_name|container_id 命令停止容器。

启动一个停止的容器

在你停止了容器之后,你接到一个电话说另外一个程序员需要使用web应用。现在你有两个选择:

创建一个新的容器;

使用   docker start container_name|container_id   重启刚才关闭的容器

注意: 也可以使用 docker restart container_name|container_id 命令停止并启动一个容器。

删除一个容器

当一个容器不再被使用的时候,可以通过 docker  rm  container_name|container_id 命令删除

[root@localhost ~]# docker stop stupefied_hoover    #先暂停

[root@localhost ~]# docker rm stupefied_hoover       #再删除

#不能删除一个正在运行的容器,这样做的原因是防止删除时的误操作。因此在删除容器之前,你需要停止他。

现在容器已经被删掉了

注意: 永远记住 删除 是一个容器操作的最后操作

创建自定义镜像

docker images是容器的技术。每次使用 docker run 命令时都需要指定使用的镜像。之前的章节中使用的镜像都已经存在,例如 centos 和 training/webapp。

也学习了如何在docker hub搜索并下载镜像到本地计算机。如果本机计算机上没有该镜像,则会从远程仓库中下载,默认仓库为 Docker Hub Registry

本节中,将学习更多关于docker镜像的只是,包括:

管理和使用本机镜像

创建基础镜像

上传镜像到Docker Hub Registry

docker images    #可以列出本地计算机上的所有镜像。

docker search centos   #可以列出docker hub上所有关于centos (也可以说成搜索镜像的意思)

#上图中第一个的意思是:CentOS的官方搭建的意思。

之前使用过的镜像都是在启动容器时从DockerHub上下载的。

当查看镜像列表时,需要注意三个重要信息:

    镜像所在的仓库,例如centos

    镜像的标签(TAG),例如7.3.1611

    镜像的IMAGE ID

Tips: 你可以使用第三方的图形工具 dockviz tool 或 镜像网站 查看镜像数据。

查询当前centos的版本:

当你的容器运行一个指定tag的镜像,命令如下:(如果想使用其他版本,换一下版本号即可)

###这里如果没有的话会下载到本地,如果命令中不指定tag,例如 centos, docker默认使用 centos:latest 镜像。

创建自己的镜像

将基于 training/sinatra 创建新镜像。

    1、修改容器内容,并时候commit提交结果创建新镜像

    2、使用dockerfile指定新镜像的创建指令

docker官方文档笔记的更多相关文章

  1. 【Docker官方文档】理解Docker

    本文来自Docker的官方文档,详细介绍了Docker的体系结构.重要概念.内部工作机理等内容,推荐不了解Docker内部原理的同学阅读. 什么是Docker? Docker是一个用于开发.交付和运行 ...

  2. docker官方文档学习-1-Docker for mac安装配置

    https://docs.docker.com/docker-for-mac/ Get started with Docker for Mac 首先像在本博客docker-1-环境安装及例子实践处将环 ...

  3. docker官方文档中的dns,link,expose,publish

    link是过时的了,尽量不要用. dns内部集成,也可以用外部. expose只是用于记录,并不真的. publish是否起作用,也要看情况,是否被占用端口. -------------------- ...

  4. [Docker 官方文档] 理解 Docker

    http://segmentfault.com/a/1190000002609286 什么是 Docker? Docker 是一个用于开发.交付和执行应用的开放平台,Docker 设计用来更快的交付你 ...

  5. Vue官方文档笔记(二)

    23.$refs是什么东东? 通过在标签上设置ref属性,然后在Vue实例方法中可以通过$refs拿到这些标签,如: <input ref="input"> metho ...

  6. React官方文档笔记之快速入门

    快速开始 JSFiddle 我们建议在 React 中使用 CommonJS 模块系统,比如 browserify 或 webpack. 要用 webpack 安装 React DOM 和构建你的包: ...

  7. Vue官方文档笔记

    1.如何创建一个Vue实例对象? var vm = new Vue({ el: "#app", //标签id 或 标签类名 data:{ //双向绑定的数据 message: &q ...

  8. Spring 官方文档笔记---Bean

    In Spring, the objects that form the backbone of your application and that are managed by the Spring ...

  9. pm2 官方文档 学习笔记

    一.安装 1.安装 npm install pm2 -g 2.更新 npm install pm2 -g && pm2 update pm2 update 是为了刷新 PM2 的守护进 ...

随机推荐

  1. TestOps宣言

    TestOps   TestOps离不开敏捷 TestOps是测试驱动的一种延伸,它强调测试人员与运维人员沟通协作规范化的实践模式. DevOps的持续集成与持续交付,实现了从代码到服务的快速落地.而 ...

  2. Lightning 组件基础知识

    Lightning框架简介 Lightning框架是Salesforce提供的一套基于用户界面的开发框架,对于开发单页面应用(Single Page Application)有很大的帮助.它和Visu ...

  3. ActiveReports公开课开启报名,学习如何解决中国式复杂报表难题

    ActiveReports实战教学 90分钟解决中国式复杂报表六大需求 [开课时间]4月19日 [主讲老师]葡萄城资深报表专家 [培训方式]网络在线公开课 报名地址

  4. Java:匿名类,匿名内部类

    本文内容: 内部类 匿名类 首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类.[包含内部类的类可以称为内部类的外部类] 如果想要通过一个类来使用另一个类,可以 ...

  5. typescritp 导出默认接口

    假如有ITest.ts文件,如下: export default interface ITest{ } 这样会报错,编译不通过.据说是设计成这样的,具体详细见:https://github.com/M ...

  6. WebStorm连接Github教程

    上学期刚开学的时候看过一次git相关的内容,很久没用过,忘了,两个月前又看了一次还精心做了笔记,也没有具体使用,又忘了,所以,避免又双叒叕忘了,我决定正式把git用起来.刚开始是通过Git Bash来 ...

  7. python接口测试—get请求(一)

    python 做借口测试用到的是requests模块,首先要导入requests库,pip install requests 1.get直接请求方式 以豆瓣网为例: url = 'https://re ...

  8. MySQL 复制夯住一例排查以及原理探讨

    目录 目录 一 引子 二 故障分析 三 故障解决 四 原理探讨 五 小结 文/温国兵 一 引子 研发反应,有台从库和主库不同步.由于业务读操作是针对从库的,数据不同步必定会带来数据的不一致,业务获取的 ...

  9. FastReport脚本把数据绑定到文本控件上

    public class ReportScript { private void Data25_BeforePrint(object sender, EventArgs e)//Data25是指需要绑 ...

  10. Jenkins修改workspace和build目录

    Jenkins: Change Workspaces and Build Directory Locations  转自: http://ingorichter.blogspot.jp/2012/02 ...