• docker学习笔记


    *Docker学习笔记*

    docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。简单理解一下,就是将独立的一个或者一组应用打包到一起(httpd、tomcat)放在一个简版的linux系统(镜像)下运行,可以挂载宿主的磁盘,桥接宿主机的网络,发布的应用和应用(容器)之间相互隔离。

    如图,docker client可以理解为docker宿主机的终端(tty)docker index可以理解为docker服务,在docker服务上可以发布多个container(独立应用)。

    使用docker可以简化应用程序的安装步骤,可兼容多种应用,Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成镜像部署。结合云可以做到高性能低价格。

    docker典型的应用场景有:

    1.web应用自动化打包发布,像tomcat应用的发布。

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

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

    4.搭建paas环境

    基本概念

    Docker 镜像

    Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新 的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

    Docker 仓库

    Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

    Docker 容器

    Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

    安装

    yum安装

    Docker 支持 CentOS6 及以后的版本。在6+版本上可以使用EPEL库来进行安装。

    $ sudo yum install epel-release

    $ sudo yum install docker-io

    在7+版本 CentOS-Extras 库中已带 Docker,可以直接安装

    $ sudo yum install docker

    配置国内镜像仓库

    由于docker默认使用一个国外的镜像仓库,在国内环境使用,下载速度相当的慢,所有我们要修改配置使用国内的仓库。

    编辑配置文件 vim /etc/docker/daemon.json

    写入
    {

    xxxxxx,

    “registry-mirrors”: [“https://registry.docker-cn.com“] ,

    xxxxxx

    }

    这里注意{}里就是python字典的写法,别少了,号。

    启动和关闭

    安装之后启动 Docker 服务,并设置开机启动。

    $ sudo service docker start

    $ sudo service docker status

    $ sudo chkconfig docker on

    $ sudo service docker stop

    7+版本使用

    systemctl daemon-reload
    systemctl restart docker

    docker镜像

    从仓库中获取镜像

    从仓库中下载镜像,这里的仓库就是在安装时配置的国内镜像仓库,也可以使用dockerhub之类的应用,自己搭建私有的镜像仓库,在实际使用中因为有很多自己公司开发应用程序,所以搭建私有库是必须的。

    测试拉取

    docker pull ubuntu:12.04

    docker pull dl.dockerpool.com:5000/ubuntu:12.04

    docker pull busybox

    docker pull centos:7

    管理本地主机上的镜像

    列出本地镜像

    docker images

    REPOSITORY:出自哪个仓库,比如 ubuntu

    TAG:镜像的标记,比如 14.04

    IMAGE ID:它的 ID 号(唯一)

    CREATED:创建时间

    SIZE:镜像大小

    其中镜像的 ID 唯一标诃了镜像,注意到 ubuntu:14.04 和 ubuntu:trusty 具有相同的镜像 ID ,说明它

    们实际上是同一镜像。

    TAG 信息用来标记来自同一个仓库的丌同镜像。例如 ubuntu 仏库中有多个镜像,通过 TAG 信息来区分

    发行版本,例如 10.04 、 12.04 、 12.10 、 13.04 、 14.04 等。例如下面的命令挃定使用镜像

    ubuntu:14.04 来自同一个容器。

    $ sudo docker run -t -i ubuntu:14.04 /bin/bash

    如果不指定具体的标记,则默认使用 latest 标记信息。

    创建镜像

    有多种方法可以创建镜像,用户可以从 Docker Hub 获取已有镜像更新,也可以利用本地文件系统创建一个。

    修改已有镜像

    使用下载好的镜像启动容器

    使用docker run命令创建容器,docker run命令提供了docker容器的创建到启动的功能。

    docker run -ti centos:7 /bin/bash

    docker run --privileged -ti mytest:httpd /usr/sbin/init

    其中centos是镜像的来源就是仓库名,7是镜像的TAG。一般情况使用第一个命令就可以,如果需要在容器里使用systemctl命令就需要使用--privileged来启动容器。

    容器启动时执行 /bin/bash,我们会进入容器的交互界面,这时候我们可以在容器中安装我们需要的应用,比如python、httpd等,安装完成后使用exit退出。

    提交新的副本

    docker commit -m "httpd" 16551ffb8324 mytest:v1

    exit命令退出容器,commit命令提交容器并保存成新的镜像。语法格式为:

    docker commit -m “提交的说明信息” -a “更新的用户信息” 容器ID 新生成镜像的仓库名和tag信息,如果使用原有的仓库名信息会覆盖原有镜像。

    此时,使用docker imges查看我们新保存的修改好的镜像,然后就可以使用自己的镜像来启动容器。

    利用 Dockerfile 来创建镜像

    使用 docker commit 来扩展一个镜像比较简单,但它不容易在一个团队中分享它。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的命令。

    新建一个目录和一个 Dockerfile

    $ mkdir testdockerfile

    $ cd testdockerfile

    $ touch dockerfile

    vim dockerfile

    dockerfile中每一条指令都创建镜像的一层。如:

    # This is a comment

    FROM centos:7

    MAINTAINER zhaobw

    RUN yum install httpd -y

    RUN yum install gcc -y

    ADD myApp /var/www

    ENV JAVA_HOME=xx

    EXPOSE 80

    CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

    *Dockerfile 基本的语法*

    使用 # 来注释

    FROM 指令 Docker 使用哪个镜像作为基础

    接着MAINTAINER 是维护者的信息

    RUN 开头的指令会在创建中运行,比如安装一个软件包。顺便废话一句Centos镜像用yum安装软件包、ubuntu用apt-get安装。

    ADD命令复制本地文件到镜像

    ENV设置环境变量

    EXPOSE命令向外部开放端口

    CMD命令描述容器启动后运行的程序

    *编写完成 Dockerfile 后可以使用 docker build 来生成镜像。*

    docker build -t testdockerfile:centos7 .

    其中 -t 标记来添加 tag,挃定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

    Build进程在执行操作,他要做的第一件事情就是上传这个dockerfile内容,因为所有的操作都要一句dockerfile来进行。然后,dockfile中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改。当所有的指令都执行完毕之后返回了最终的镜像id。所有的中间步骤所产生的容器都被删除和清理了。

    *注意一个镜像不能超过127层。

    更多的语法就不一一列举。

    基于本地模板导入镜像

    也可以从操作系统模板文件导入一个镜像,比如使用OpenVZ提供的模板创建,OPENVZ下载模板在:http://openvz.org/Download/template/precreated。

    下载一个ubuntu的镜像

    wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz

    cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04

    上传镜像

    用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。

    格式: docker push 镜像:tag 镜像仓库地址

    存出和载入镜像

    我们制作好镜像后,有时需要将镜像复制到另一台服务器使用。如果目标服务器和镜像仓库处于同一网络可以使用私有仓库下载。如果不在一个网络,就需要使用docker save 导出镜像,然后使用docker load在目标服务器上恢复。

    导出
    docker save 镜像名 > /root/镜像名.tar
    导入
    docker load -i /root/镜像名.tar

    删除镜像

    可以使用docker rmi “镜像id”删除指定镜像

    docker rmi cenots:7

    *注意:在删除镜像之要先用 docker rm 删掉依赖于这个镜像的所有容器。

    修改镜像的标签

    docker tag c85b3aa8876b testdockerfile:centos7updateTag

    修改标签后会新生成一个镜像,不过镜像的ID是一样的。

    容器

    启动容器

    *新建启动*

    docker run -ti centos:7 /bin/bash

    其中-t选项让docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。

    当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

    检查本地是否存在挃定的镜像,丌存在就从公有仏库下载

    利用镜像创建幵吪劢一个容器

    一个文件系统,幵在叧读的镜像层外面挂载一层可读写层

    从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

    从地址池配置一个 ip 地址给容器

    执行用户挃定的应用程序

    执行完毕后容器被终止

    *启动已终止的容器*

    docker start 容器id

    使用docker start 容器ID 启动容器,但是start只是启动容器并不会新建一个终端进入容器。

    守护态运行

    更多的时候,需要将 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d 参数来实现。

    docker run -d centos:7 /bin/sh -c "while true;do echo hello world;sleep 1;done"

    使用docker logs命令获取容器的输出信息

    Usage: docker logs -f 容器id

    停止容器

    Usage: docker stop 容器ID # 停止容器

    Usage: docker pause 容器ID #暂停容器

    Usage: docker unpause 容器ID #恢复容器

    进入容器

    Usage: docker attach 容器ID

    (1)*Attach*

    Docker 容器启动的时候,我们可以通过docker run命令指定 /bin/bash 来运行,因此我们的容器再重新启动后会沿用docker run时指定的参数来运行。此外,也可以用docker attach命令,重新附着到 ubuntu 容器的会话上。

    (2)*exec*

    我们进入刚刚创建的 httpd 的容器,首先我们要查看此容器的 ID。

    docker exec -ti 780ec986be0f /bin/bash

    (3)*attach VS exec*

    attach 与 exec 主要区别如下:

    · attach 直接进入容器启动命令的终端,不会启动新的进程。

    · exec 则是在容器中打开新的终端,并且可以启动新的进程。

    · 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。

    (4)*Nsenter*

    nsenter 工具在 util-linux 包2.23版本后包含。 如果系统中 util-linux 包没有安装该命令,可以使用如下方法安装。

    cd /tmp; Curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
    ./configure --without-ncurses
    make nsenter && sudo cp nsenter /usr/local/bin**

    nsenter 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。而Ubuntu 14.4仍然使用的是 util-linux 2.20。安装最新版本的 util-linux(2.24)版,请按照以下步骤:

    wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
    cd util-linux-2.24

    ./configure --without-ncurses && make nsenter
    sudo cp nsenter /usr/local/bin**

    为了连接到容器,你迓需要找到容器的第一个迕程的 PID,可以通过下面的命令获取。

    PID=$(docker inspect --format "{{ .State.Pid }}" )

    通过pid,就可以连接到这个容器

    $ nsenter --target $PID --mount --uts --ipc --net --pid

    更简单的是可以使用.bashrc_docker,幵将内容放到 .bashrc 中

    $ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;

    $ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc

    返个文件中定义了很多方便使用 Docker 的命令,例如 docker-pid 可以获取某个容器的 PID;而 docker-

    enter 可以迕入容器戒直接在容器内执行命令。

    $ echo $(docker-pid )

    $ docker-enter ls

    导出和导入容器

    *导出容器*

    如果要导出本地某个容器,可以使用 docker export 命令。

    sudo docker export 7691a814370e > ubuntu.tar

    返样将导出容器快照到本地文件。

    *导入容器快照*

    可以使用 docker import 从容器快照文件中再导入为镜像,例如

    cat ubuntu.tar | sudo docker import - test/buntu:v1.0

    此外,也可以通过指定URL 或者某个目录来导入,例如

    sudo docker import http://example.com/exampleimage.tgz example/imagerepo

    *注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的却别在于容器快找文件将丢弃所有的历史记录和元数据信息(即进保存容器当时的快找状态),而镜像存储文件将保存完整记录,体积也要打。此外,从容器快找文件导入时可以重新制定标签等元数据信息。

    深入容器

    除了通过docker ps命令获取容器的信息,还可以使用docker inspect来获取更多的容器信息。

    docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。

    删除容器

    Usage: docker rm容器ID

    如果容器已经不再使用,我们可以使用docker rm命令来删除它们。注意:如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

    docker rm一次可以指定多个容器,如果希望批量删除所有已经退出的容器,可以执行如下命令:

    docker rm -v docker ps -aq -f status=exited

    docker rm是删除容器,而docker rmi是删除镜像。

    仓库

    仓库(Repository)是集中存放镜像的地方。

    一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 dl.dockerpool.com/ubuntu 来说, dl.dockerpool.com 是注册服务器地址, ubuntu 是仓库名。大部分时候,不需要严格区分返两者的概念。

    数据管理

    这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:

    数据卷(Data volumes)

    数据卷容器(Data volume containers)

    数据卷

    数据卷是一个可供一个戒多个容器使用的特殊目录,它绕过 UFS,可以提供徆多有用的特性:

    1. 数据卷可以在容器之间共享和重用
    2. 对数据卷的修改会立马生效
    3. 数据卷的更新,不会影响镜像
    4. 卷会一直存在,直到没有容器使用
    5. 数据卷的使用,类似亍 Linux 下对目录或文件迕行 mount。

    *创建一个数据卷*

    在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中使用可以挂载多个数据卷。

    下面创建一个 web 容器,并加载一个数据卷到容器的 /webapp 目录。

    docker run -d -P --name web -v /webapp centos:7** python app.py**

    该命令意思是使用centos:7镜像创建一个名叫web的容器,并创建数据卷挂载到容器的webapp,启动app.py应用并使用-P暴露外部端口。

    *注意:也可以在Dokcerfile中使用VOLUME来添加一个或者多个新的卷到由该镜像创建的任意容器。

    *挂载一个主机目录作为数据卷*

    使用 -v 标记也可以挃定挂载一个本地主机的目录到容器中去。

    docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

    上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。返个功能在迕行测试的时候十分

    方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对

    路径,如果目录不存在 Docker 会自劢为你创建它。

    *注意:Dockerfile 中不支持返种用法,返是因为 Dockerfile 是为了秱植和分享用的。然而,丌同操作系统

    的路径格式丌一样,所以目前迓丌能支持。

    Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 挃定为只读。

    docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

    加了 :ro 之后,就挂载为只读了。

    *挂载一个本地主机文件作为数据卷*

    -v 标记也可以从主机挂载单个文件到容器中

    docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

    这样就可以记录在容器输入过的命令了。

    *注意:如果直接挂载一个文件,徆多文件编辑工具,包括 vi 戒者 sed --in-place ,可能会造成文件 inode的改变,从 Docker 1.1 .0起,返会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。

    数据卷容器

    如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。

    数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

    首先,创建一个命名的数据卷容器 dbdata:

    docker run -d -v /dbdata --name dbdata ‘镜像仓库:TAG’ echo Data-only container for postgres

    然后,在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。

    docker run -d --volumes-from dbdata --name db1 镜像仓库****:TAG

    docker run -d --volumes-from dbdata --name db2 镜像仓库****:TAG

    还可以使用多个 --volumes-from 参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了容器卷的容器来挂载数据卷。

    docker run -d --name db3 --volumes-from db1 training/postgres

    *注意:使用 --volumes-from 参数所挂载数据卷的容器自己幵丌需要保持在运行状态。

    如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷不会被删除。如果要删除一个数据卷,必须在删除最后一个迓挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。 还可以让用户在容器之间升级和移动数据卷。

    利用数据卷容器来备份、恢复、迁移数据卷

    可以利用数据卷对其中的数据进行备份、恢复、迁移

    *备份*

    首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,幵从本地主机挂载当前到容器的/backup 目录。命令如下:

    docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

    容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar

    *恢复*

    如果要恢复数据到一个容器,首先创建一个带有数据卷的容器 dbdata2。

    docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

    然后创建另一个容器,挂载 dbdata2 的容器,幵使用 untar 解压备仹文件到挂载的容器卷中。

    docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

    网络

    Docker 允许通过外部访问容器戒容器亏联的方式来提供网络服务。

    映射配置

    *外部访问容器*

    容器中可以运行一些网络应用,要使外部也可以访问返些应用,可以通过 -P 或-p 参数来指定端口映射。

    当使用 -P (大写P)标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

    使用 docker ps 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49115 端口即可访问容器内 web 应用提供的界面。

    docker run -d -P training/webapp python app.py

    同样的,可以通过 docker logs 命令来查看应用的信息。

    -p(小写的)则可以指定要映射的端口,在一个指定端口上叧可以绑定一个容器。支持的格式有

    ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。

    *映射所有接口地址*

    #创建容器

    docker run -d -e "container=docker" --privileged=true -p 8090:80 --name testsystmctl mytest:httpd /usr/sbin/init &

    #连接容器终端

    docker exec -ti 652590f43a0e /bin/bash

    #启动服务

    system****ctl status httpd.service

    system****ctl start httpd.service

    编辑echo “11111” > /var/www/html/index.html

    在本机访问127.0.0.1::8090测试

    *映射到指定地址的指定端口*

    流程同上,只是使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1

    docker run -d -e "container=docker" --privileged=true -p 127.0.0.1:8090:80 --name testsystmctl mytest:httpd /usr/sbin/init &

    *映射到指定地址的任意端口*

    使用 ip::containerPort 绑定 localhost 的仸意端口到容器的 80端口,本地主机会自动分配一个端口。

    docker run -d -e "container=docker" --privileged=true -p 127.0.0.1::80 --name testsystmctl mytest:httpd /usr/sbin/init &

    *查看映射端口配置*

    使用docker port 容器ID 来查看当前映射的端口配置,也可以查看到绑定的地址

    注意:

    容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 迓可以有一个

    可变的网络配置。)

    -p 标记可以多次使用来绑定多个端口

    例如

    $ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

    容器互联

    容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。

    该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

    *自定义容器命名*

    连接系统依据容器的名称来执行,因此首先需要自定义一个好记的容器命名。虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有两个好处:

    1. 自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叨web
    2. 当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器

    使用 --name 标记可以为容器自定义名称,设置好后可以在docker ps -a中查看到。

    *容器互联*

    使用--link参数可以让容器之间安全的进行交互。

    下面先创建一个新的数据库容器。

    docker run -d --name db mytest:db

    然后创建一个新的 web 容器,幵将它连接到 db 容器

    docker run -d -P --name web --link db:db mytest****:httpd

    --link 参数的格式为 --link name:alias ,其中 name 是要链接的容器的名称, alias 是返个连接的别名。

    使用 docker ps 来查看容器的连接。

    高级网络配置

    当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发,同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动分配一个同一网段( 172.17.0.0/16 )的地址。

    当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。返对接口一端在容器内,即 eth0 ;另一端在本地幵被挂载到docker0 网桥,名称以 veth 开头(例如 vethAQI2QT )。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

    接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。高级网络配置是一个高级话题,在这里就不详细讨论。

    日志

    日志分两类,一类是 Docker 引擎日志;另一类是 容器日志。

    Docker 引擎日志

    Docker 引擎日志 一般是交给了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7, Ubuntu 16.04)。前者一般位于 /var/log/upstart/docker.log 下,后者一般通过 jounarlctl -u docker 来读取,不同系统的位置都不一样。

    系统 日志位置
    Ubuntu(14.04) /var/log/upstart/docker.log
    Ubuntu(16.04) journalctl -u docker.service
    CentOS 7/RHEL 7/Fedora journalctl -u docker.service
    CoreOS6.5 /var/log/docker
    OpenSuSE journalctl -u docker.service
    OSX ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/d‌ocker.log
    Debian GNU/Linux 7 /var/log/daemon.log
    Debian GNU/Linux 8 journalctl -u docker.service
    Boot2Docker /var/log/docker.log

    容器日志

    容器的日志 则可以通过 docker logs 命令来访问,而且可以像 tail -f 一样,使用 docker logs -f 来实时查看。如果使用 Docker Compose,则可以通过 docker-compose logs <服务名> 来查看。

    如果深究其日志位置,每个容器的日志默认都会以 json-file 的格式存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log 下,不过并不建议去这里直接读取内容,因为 Docker 提供了更完善地日志收集方式 - Docker 日志收集驱动。

    关于日志收集,Docker 内置了很多日志驱动,可以通过类似于 fluentd, syslog 这类服务收集日志。无论是 Docker 引擎,还是容器,都可以使用日志驱动。比如,如果打算用 fluentd 收集某个容器日志,可以这样启动容器:

    $ docker run -d --log-driver=fluentd --log-opt fluentd-address=10.2.3.4:24224 --log-opt tag="docker.{{.Name}}" ginx

    其中 10.2.3.4:24224 是 fluentd 服务地址,实际环境中应该换成真实的地址。

    附录

    Docker命令归纳

    从图中可以看到,对用户来说,大部分命令都是针对仓库(repository),镜像(image),容器(container)操作使用的,其他还包括管理命令,比如网络(network),卷(volume),节点(node)等的管理。
    通过shell查看docker的帮助文档 docker --help。

    仓库相关操作

    docker pull #从远程仓库拉取镜像到本地

    docker push #推送本地镜像到远程仓库

    docker search #在仓库搜索镜像

    docker login #登录到官方仓库Docker Hub

    docker logout #退出登录

    镜像相关操作

    docker build #从Dockerfile构建镜像

    docker pull #同上 docker push #同上

    docker history #显示镜像的历史信息

    docker images #列出镜像

    docker rmi #删除镜像

    docker tag #给镜像打上tag标签

    docker run #创建容器并启动容器

    docker create #创建容器

    docker commit #将修改后的容器生成镜像

    docker load #从压缩包中加载镜像

    docker import # docker save #将镜像保存到压缩文件

    容器相关操作

    docker attach #依附到一个正在运行的容器中

    docker exec #进到正在运行的容器中执行命令

    docker cp #在容器和本地系统间复制文件

    docker update #将一个容器内所有的进程从暂停状态中恢复

    docker ps #列出主机中的容器

    docker port #查找一个nat到私有网口的公共口

    docker top #查看一个容器中正在运行的进程信息

    docker logs #查看日志文件

    docker diff #检查容器内文件系统的修改

    docker status #输出容器的资源使用统计信息

    docker wait #阻塞直到容器终止

    docker start #启动已创建的容器

    docker pause #暂停运行中的容器

    docker unpause #使暂停的容器恢复运行

    docker stop #停止容器运行

    docker rename #容器改名

    docker restart #容器重启

    docker kill #关闭运行中的容器

    docker rm #删除容器

    docker export #导出容器内容为tar包

    docker run #同上

    docker create #同上

    docker commit #同上

    其他基本命令

    docker events #从服务端获取实时的事件

    docker info #查看系统相关信息

    docker inspect #显示Docker对象的具体配置信息,包括容器,镜像,网络等

    docker version #输出Docker的版本信息

    管理命令

    docker container #容器管理

    docker image #镜像管理

    docker network #网络管理

    docker node #节点管理

    docker plugin #插件管理

    docker secret #

    docker service #服务管理

    docker stack #

    docker swarm #集群管理

    docker system # docker volume #卷管理

    管理命令不能直接直接使用,后面还要加上命令,比如镜像管理

    参数

    *--rm*

    执行docker run命令带--rm命令选项,等价于在容器退出后,执行docker rm -v。

    *sh -c*

    有时在启动docker container时需要同时运行不止一条命令,这时在command处使用:sh -c ' cmd1 && cmd2 '即可。

    docker run -it myimage sh -c 'service mysql start && python test.py'

    *-it /-i -t*

    创建一个可交互式的终端。

    *-v*

    标记并创建一个数据卷挂载到容器。

    *-d*

    守护态运行

    *-P、-p*

    当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。使用docker ps可以看到。

    p(小写)则可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。

    *--name*

    指定容器名称

    结尾

    本章学习了docker的基本概念和用法,都是一些初级概念。有一些高级话题,比如网络配置、安全、性能、实践等之后再讨论。

  • 相关阅读:
    CSS 选择器
    CSS 用法和特性
    Objective-C 事件响应链
    苹果签名机制
    欧几里得算法
    扩展欧几里得算法
    RSA算法
    动态库加载和代码签名
    __attribute__
    信息熵
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13258569.html
Copyright © 2020-2023  润新知