当前位置: 首页 > news >正文

icp备案网站名称更改做网站具体收费

icp备案网站名称更改,做网站具体收费,官网制作一般费用多少,北京建设安全生产协会网站文章目录 前言一、Docker Hello World二、Docker 容器使用三、Docker 镜像使用四、Docker 容器连接五、Docker 仓库管理六、Docker Dockerfile七、Docker Compose八、Docker Machine九、Swarm 集群管理 前言 Docker 使用‌ Docker 容器使用、镜像使用、容器连接、仓库管理、Do… 文章目录 前言一、Docker Hello World二、Docker 容器使用三、Docker 镜像使用四、Docker 容器连接五、Docker 仓库管理六、Docker Dockerfile七、Docker Compose八、Docker Machine九、Swarm 集群管理 前言 Docker 使用‌ Docker 容器使用、镜像使用、容器连接、仓库管理、Dockerfile、Docker Compose、Docker Machine、Swarm 集群管理 一、Docker Hello World Docker 允许你在容器内运行应用程序 使用 ‌docker run‌ 命令来在容器内运行一个应用程序。 输出Hello world runoobrunoob:~$ docker run ubuntu:15.10 /bin/echo Hello world Hello world各个参数解析 docker: Docker 的二进制执行文件。 run: 与前面的 docker 组合来运行一个容器。 ubuntu:15.10: 指定要运行的镜像Docker 首先从本地主机上查找镜像是否存在如果不存在Docker 就会从镜像仓库 Docker Hub 下载公共镜像。 /bin/echo “Hello world”: 在启动的容器里执行的命令 以上命令完整的意思可以解释为Docker 以 ubuntu15.10 镜像创建一个新容器然后在容器里执行 bin/echo “Hello world”然后输出结果。 运行交互式的容器 我们通过 docker 的两个参数 -i -t让 docker 运行的容器实现对话的能力 runoobrunoob:~$ docker run -i -t ubuntu:15.10 /bin/bash root0123ce188bd8:/#各个参数解析 -t: 在新容器内指定一个伪终端或终端。 -i: 允许你对容器内的标准输入 (STDIN) 进行交互。 注意第二行 root0123ce188bd8:/#此时我们已进入一个 ubuntu15.10 系统的容器 我们尝试在容器中运行命令 cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表 root0123ce188bd8:/# cat /proc/version Linux version 4.4.0-151-generic (builddlgw01-amd64-043) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #178-Ubuntu SMP Tue Jun 11 08:30:22 UTC 2019 root0123ce188bd8:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root0123ce188bd8:/# 我们可以通过运行 exit 命令或者使用 CTRLD 来退出容器。 root0123ce188bd8:/# exit exit rootrunoob:~# 注意第三行中 ‌rootrunoob:~#‌ 表明我们已经退出了当前的容器返回到当前的主机中。 启动容器后台模式 使用以下命令创建一个以进程方式运行的容器 runoobrunoob:~$ docker run -d ubuntu:15.10 /bin/sh -c while true; do echo hello world; sleep 1; done 2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63在输出中我们没有看到期望的 “hello world”而是一串长字符 ‌2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63‌ 这个长字符串叫做容器 ID对每个容器来说都是唯一的我们可以通过容器 ID 来查看对应的容器发生了什么。 首先我们需要确认容器有在运行可以通过 docker ps 来查看 runoobrunoob:~$ docker ps CONTAINER ID IMAGE COMMAND ... 5917eac21c36 ubuntu:15.10 /bin/sh -c while t… ...输出详情介绍 CONTAINER ID: 容器 ID。 IMAGE: 使用的镜像。 COMMAND: 启动容器时运行的命令。 CREATED: 容器的创建时间。 STATUS: 容器状态。 状态有7种 created已创建restarting重启中running 或 Up运行中removing迁移中paused暂停exited停止dead死亡 PORTS: 容器的端口信息和使用的连接类型tcp\udp。 NAMES: 自动分配的容器名称。 在宿主主机内使用 ‌docker logs‌ 命令查看容器内的标准输出 runoobrunoob:~$ docker logs 2b1b7a428627runoobrunoob:~$ docker logs amazing_cori![docker logs](https://i-blog.csdnimg.cn/direct/665e22036f39479caf8a18987aec51b2.png 停止容器 我们使用 ‌docker stop‌ 命令来停止容器: 通过 ‌docker ps‌ 查看容器已经停止工作: runoobrunoob:~$ docker ps可以看到容器已经不在了。 也可以用下面的命令来停止: runoobrunoob:~$ docker stop amazing_cori二、Docker 容器使用 Docker 容器是一个轻量级、可移植、自给自足的软件环境用于运行应用程序。 Docker 容器将应用程序及其所有依赖项包括库、配置文件、系统工具等封装在一个标准化的包中使得应用能够在任何地方一致地运行。 容器是操作系统级别的虚拟化不需要运行完整的操作系统启动和运行更为高效。 镜像与容器的关系 镜像Image容器的静态模板包含了应用程序运行所需的所有依赖和文件。镜像是不可变的。 容器Container镜像的一个运行实例具有自己的文件系统、进程、网络等且是动态的。容器从镜像启动并在运行时保持可变。 Docker 客户端 Docker 客户端是与 Docker 守护进程Docker Daemon交互的命令行工具。 docker 客户端非常简单我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 runoobrunoob:~# docker可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。 例如我们要查看 docker stats 指令的具体使用方法 runoobrunoob:~# docker stats --help以下是常用的 Docker 客户端命令 命令功能示例docker run启动一个新的容器并运行命令docker run -d ubuntudocker ps列出当前正在运行的容器docker psdocker ps -a列出所有容器包括已停止的容器docker ps -adocker build使用 Dockerfile 构建镜像docker build -t my-image .docker images列出本地存储的所有镜像docker imagesdocker pull从 Docker 仓库拉取镜像docker pull ubuntudocker push将镜像推送到 Docker 仓库docker push my-imagedocker exec在运行的容器中执行命令docker exec -it container_name bashdocker stop停止一个或多个容器docker stop container_namedocker start启动已停止的容器docker start container_namedocker restart重启一个容器docker restart container_namedocker rm删除一个或多个容器docker rm container_namedocker rmi删除一个或多个镜像docker rmi my-imagedocker logs查看容器的日志docker logs container_namedocker inspect获取容器或镜像的详细信息docker inspect container_namedocker exec -it进入容器的交互式终端docker exec -it container_name /bin/bashdocker network ls列出所有 Docker 网络docker network lsdocker volume ls列出所有 Docker 卷docker volume lsdocker-compose up启动多容器应用从 docker-compose.yml 文件docker-compose updocker-compose down停止并删除由 docker-compose 启动的容器、网络等docker-compose downdocker info显示 Docker 系统的详细信息docker infodocker version显示 Docker 客户端和守护进程的版本信息docker versiondocker stats显示容器的实时资源使用情况docker statsdocker login登录 Docker 仓库docker logindocker logout登出 Docker 仓库docker logout 常用选项说明: -d后台运行容器例如 docker run -d ubuntu。-it以交互式终端运行容器例如 docker exec -it container_name bash。-t为镜像指定标签例如 docker build -t my-image .。 容器使用 获取镜像 如果我们本地没有 ubuntu 镜像我们可以使用 docker pull 命令来载入 ubuntu 镜像 $ docker pull ubuntu启动容器 以下命令使用 ubuntu 镜像启动一个容器参数为以命令行模式进入该容器 $ docker run -it ubuntu /bin/bash参数说明 -i: 交互式操作。-t: 终端。ubuntu: ubuntu 镜像。/bin/bash放在镜像名后的是命令这里我们希望有个交互式 Shell因此用的是 /bin/bash。 要退出终端直接输入 exit: rooted09e4490c57:/# exit启动已停止运行的容器 查看所有的容器命令如下 $ docker ps -a使用 docker start 启动一个已停止的容器 $ docker start b750bbbcfd88 后台运行 在大部分的场景下我们希望 docker 的服务是在后台运行的我们可以过 -d 指定容器的运行模式。 $ docker run -itd --name ubuntu-test ubuntu /bin/bash注加了 ‌-d‌ 参数默认不会进入容器想要进入容器需要使用指令 docker exec下面会介绍到。 停止一个容器 停止容器的命令如下 $ docker stop 容器 ID停止的容器可以通过 docker restart 重启 $ docker restart 容器 ID进入容器 在使用 ‌-d‌ 参数时启动容器时容器会运行在后台这时如果要进入容器可以通过以下命令进入 docker attach允许你与容器的标准输入stdin、输出stdout和标准错误stderr进行交互。 docker exec推荐大家使用 ‌docker exec‌ 命令因为此命令会退出容器终端但不会导致容器的停止。 attach 命令 使用 docker attach 命令实例 $ docker attach 1e560fca3906 注意 如果从这个容器退出会导致容器的停止。 exec 命令 使用 docker exec 命令实例 docker exec -it 243c32535da7 /bin/bash注意 如果从这个容器退出容器不会停止这就是为什么推荐大家使用 docker exec。 更多参数说明请使用 ‌docker exec --help‌ 命令查看。 导出和导入容器 导出容器 如果要导出本地某个容器可以使用 docker export 命令。 $ docker export 1e560fca3906 ubuntu.tar导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。 这样将导出容器快照到本地文件。 导入容器快照 可以使用 ‌docker import‌ 从容器快照文件中再导入为镜像以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1: $ cat docker/ubuntu.tar | docker import - test/ubuntu:v1此外也可以通过指定 URL 或者某个目录来导入例如 $ docker import http://example.com/exampleimage.tgz example/imagerepo删除容器 删除容器使用 docker rm 命令 $ docker rm -f 1e560fca3906下面的命令可以清理掉所有处于终止状态的容器。 $ docker container prune运行一个 web 应用 前面我们运行的容器并没有一些什么特别的用处。 接下来让我们尝试使用 docker 构建一个 web 应用程序。 我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。 runoobrunoob:~# docker pull training/webapp # 载入镜像 runoobrunoob:~# docker run -d -P training/webapp python app.py参数说明: ‌-d‌:让容器在后台运行。 ‌-P‌:将容器内部使用的网络端口随机映射到我们使用的主机上。 查看 WEB 应用容器 使用 docker ps 来查看我们正在运行的容器 runoobrunoob:~# docker ps CONTAINER ID IMAGE COMMAND ... PORTS d3d5e39ed9d3 training/webapp python app.py ... 0.0.0.0:32769-5000/tcp这里多了端口信息。 PORTS 0.0.0.0:32769-5000/tcpDocker 开放了 5000 端口默认 Python Flask 端口映射到主机端口 32769 上。 这时我们可以通过浏览器访问WEB应用 我们也可以通过 ‌-p‌ 参数来设置不一样的端口 runoobrunoob:~$ docker run -d -p 5000:5000 training/webapp python app.py‌docker ps‌查看正在运行的容器 runoobrunoob:~# docker ps CONTAINER ID IMAGE PORTS NAMES bf08b7f2cd89 training/webapp ... 0.0.0.0:5000-5000/tcp wizardly_chandrasekhar d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769-5000/tcp xenodochial_hoov容器内部的 5000 端口映射到我们本地主机的 5000 端口上。 网络端口的快捷方式 通过 ‌docker ps‌ 命令可以查看到容器的端口映射docker 还提供了另一个快捷方式 ‌docker port‌使用 docker port 可以查看指定 ID 或者名字容器的某个确定端口映射到宿主机的端口号。 上面我们创建的 web 应用容器 ID 为 bf08b7f2cd89 名字为 wizardly_chandrasekhar。 我可以使用 docker port bf08b7f2cd89 或 docker port wizardly_chandrasekhar 来查看容器端口的映射情况。 runoobrunoob:~$ docker port bf08b7f2cd89 5000/tcp - 0.0.0.0:5000runoobrunoob:~$ docker port wizardly_chandrasekhar 5000/tcp - 0.0.0.0:5000查看 WEB 应用程序日志 docker logs [ID或者名字] 可以查看容器内部的标准输出。 runoobrunoob:~$ docker logs -f bf08b7f2cd89* Running on http://0.0.0.0:5000/ (Press CTRLC to quit) 192.168.239.1 - - [09/May/2016 16:30:37] GET / HTTP/1.1 200 - 192.168.239.1 - - [09/May/2016 16:30:37] GET /favicon.ico HTTP/1.1 404 --f: 让 ‌docker logs‌ 像使用 ‌tail -f‌ 一样来输出容器内部的标准输出。 从上面我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。 查看WEB应用程序容器的进程 我们还可以使用 ‌docker top‌ 来查看容器内部运行的进程 runoobrunoob:~$ docker top wizardly_chandrasekhar UID PID PPID ... TIME CMD root 23245 23228 ... 00:00:00 python app.py检查 WEB 应用程序 使用 ‌docker inspect‌ 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 runoobrunoob:~$ docker inspect wizardly_chandrasekhar [{Id: bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85,Created: 2018-09-17T01:41:26.174228707Z,Path: python,Args: [app.py],State: {Status: running,Running: true,Paused: false,Restarting: false,OOMKilled: false,Dead: false,Pid: 23245,ExitCode: 0,Error: ,StartedAt: 2018-09-17T01:41:26.494185806Z,FinishedAt: 0001-01-01T00:00:00Z}, ......停止 WEB 应用容器 runoobrunoob:~$ docker stop wizardly_chandrasekhar wizardly_chandrasekhar重启WEB应用容器 已经停止的容器我们可以使用命令 ‌docker start‌ 来启动。 runoobrunoob:~$ docker start wizardly_chandrasekhar wizardly_chandrasekhar‌docker ps -l‌ 查询最后一次创建的容器 # docker ps -l CONTAINER ID IMAGE PORTS NAMES bf08b7f2cd89 training/webapp ... 0.0.0.0:5000-5000/tcp wizardly_chandrasekhar正在运行的容器我们可以使用 ‌docker restart‌ 命令来重启。 移除WEB应用容器 我们可以使用 docker rm 命令来删除不需要的容器 runoobrunoob:~$ docker rm wizardly_chandrasekhar wizardly_chandrasekhar删除容器时容器必须是停止状态否则会报如下错误 runoobrunoob:~$ docker rm wizardly_chandrasekhar Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove三、Docker 镜像使用 当运行容器时使用的镜像如果在本地中不存在docker 就会自动从 docker 镜像仓库中下载默认是从 Docker Hub 公共镜像源下载。 下面讲述 1、管理和使用本地 Docker 主机镜像 2、创建镜像 列出镜像列表 我们可以使用 ‌docker images‌ 来列出本地主机上的镜像。 runoobrunoob:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB php 5.6 f40e9e0f10c8 9 days ago 444.8 MB nginx latest 6f8d099c3adc 12 days ago 182.7 MB mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB hello-world latest 690ed74de00f 6 months ago 960 B training/webapp latest 6fae60ef3446 11 months ago 348.8 各个选项说明: REPOSITORY表示镜像的仓库源 TAG镜像的标签 IMAGE ID镜像ID CREATED镜像创建时间 SIZE镜像大小 同一仓库源可以有多个 TAG代表这个仓库源的不同个版本如 ubuntu 仓库源里有 15.10、14.04 等多个不同的版本我们使用 REPOSITORY:TAG 来定义不同的镜像。 所以我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时命令如下 runoobrunoob:~$ docker run -t -i ubuntu:15.10 /bin/bash rootd77ccb2e5cca:/#参数说明 -i: 交互式操作。 -t: 终端。 ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。 /bin/bash放在镜像名后的是命令这里我们希望有个交互式 Shell因此用的是 /bin/bash。 如果要使用版本为 14.04 的 ubuntu 系统镜像来运行容器时命令如下 runoobrunoob:~$ docker run -t -i ubuntu:14.04 /bin/bash root39e968165990:/# 如果你不指定一个镜像的版本标签例如你只使用 ubuntudocker 将默认使用 ‌ubuntu:latest‌ 镜像。 获取一个新的镜像 当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像我们可以使用 docker pull 命令来下载它。 Crunoobrunoob:~$ docker pull ubuntu:13.10 13.10: Pulling from library/ubuntu 6599cadaf950: Pull complete 23eda618d451: Pull complete f0be3084efe9: Pull complete 52de432f084b: Pull complete a3ed95caeb02: Pull complete Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3 Status: Downloaded newer image for ubuntu:13.10下载完成后我们可以直接使用这个镜像来运行容器。 查找镜像 我们可以从 Docker Hub 网站来搜索镜像Docker Hub 网址为 https://hub.docker.com/ 我们也可以使用 ‌docker search‌ 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。 我们可以通过 ‌docker search‌ 命令搜索 httpd 来寻找适合我们的镜像。 runoobrunoob:~$ docker search httpdNAME: 镜像仓库源的名称 DESCRIPTION: 镜像的描述 OFFICIAL: 是否 docker 官方发布 stars: 类似 Github 里面的 star表示点赞、喜欢的意思。 AUTOMATED: 自动构建。 拖取镜像 我们决定使用上图中的 httpd 官方版本的镜像使用命令 ‌docker pull‌ 来下载镜像。 runoobrunoob:~$ docker pull httpd Using default tag: latest latest: Pulling from library/httpd 8b87079b7a06: Pulling fs layer a3ed95caeb02: Download complete 0d62ec9c6a76: Download complete a329d50397b9: Download complete ea7c1f032b5c: Waiting be44112b72c7: Waiting下载完成后我们就可以使用这个镜像了。 runoobrunoob:~$ docker run httpd删除镜像 镜像删除使用 ‌docker rmi‌ 命令比如我们删除 hello-world 镜像 $ docker rmi hello-world创建镜像 当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时我们可以通过以下两种方式对镜像进行更改。 1、从已经创建的容器中更新镜像并且提交这个镜像2、使用 Dockerfile 指令来创建一个新的镜像 更新镜像 更新镜像之前我们需要使用镜像来创建一个容器。 runoobrunoob:~$ docker run -t -i ubuntu:15.10 /bin/bash进入容器后更新系统 apt-get update apt-get upgrade -y在完成操作之后输入 exit 命令来退出这个容器。 exit此时 ID 为 e218edb10161 的容器是按我们的需求更改的容器。我们可以通过命令 ‌docker commit‌ 来提交容器副本。 runoobrunoob:~$ docker commit -mhas update -arunoob e218edb10161 runoob/ubuntu:v2 sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8各个参数说明 -m: 提交的描述信息 -a: 指定镜像作者 e218edb10161容器 ID runoob/ubuntu:v2: 指定要创建的目标镜像名 我们可以使用 ‌docker images‌ 命令来查看我们的新镜像 ‌runoob/ubuntu:v2‌ runoobrunoob:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE runoob/ubuntu v2 70bf1840fd7c 15 seconds ago 158.5 MB ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB php 5.6 f40e9e0f10c8 9 days ago 444.8 MB nginx latest 6f8d099c3adc 12 days ago 182.7 MB mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB hello-world latest 690ed74de00f 6 months ago 960 B training/webapp latest 6fae60ef3446 12 months ago 348.8 MB使用我们的新镜像 ‌runoob/ubuntu‌ 来启动一个容器 runoobrunoob:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash root1a9fbdeb5da3:/#构建镜像 我们使用命令 ‌docker build‌ 从零开始来创建一个新的镜像。为此我们需要创建一个 Dockerfile 文件其中包含一组指令来告诉 Docker 如何构建我们的镜像。 runoobrunoob:~$ cat Dockerfile FROM centos:6.7 MAINTAINER Fisher fishersudops.comRUN /bin/echo root:123456 |chpasswd RUN useradd runoob RUN /bin/echo runoob:123456 |chpasswd RUN /bin/echo -e LANG\en_US.UTF-8\ /etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D每一个指令都会在镜像上创建一个新的层每一个指令的前缀都必须是大写的。 第一条FROM指定使用哪个镜像源 RUN 指令告诉docker 在镜像内执行命令安装了什么。。。 然后我们使用 Dockerfile 文件通过 docker build 命令来构建一个镜像。 runoobrunoob:~$ docker build -t runoob/centos:6.7 . Sending build context to Docker daemon 17.92 kB Step 1 : FROM centos:6.7---gt; d95b5ca17cc3 Step 2 : MAINTAINER Fisher fishersudops.com---gt; Using cache---gt; 0c92299c6f03 Step 3 : RUN /bin/echo root:123456 |chpasswd---gt; Using cache---gt; 0397ce2fbd0a Step 4 : RUN useradd runoob ......参数说明 -t 指定要创建的目标镜像名 . Dockerfile 文件所在目录可以指定Dockerfile 的绝对路径 使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec runoobrunoob:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE runoob/centos 6.7 860c279d2fec About a minute ago 190.6 MB runoob/ubuntu v2 70bf1840fd7c 17 hours ago 158.5 MB ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB php 5.6 f40e9e0f10c8 10 days ago 444.8 MB nginx latest 6f8d099c3adc 12 days ago 182.7 MB mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB hello-world latest 690ed74de00f 6 months ago 960 B centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB training/webapp latest 6fae60ef3446 12 months ago 348.8 MB我们可以使用新的镜像来创建容器 runoobrunoob:~$ docker run -t -i runoob/centos:6.7 /bin/bash [root41c28d18b5fb /]# id runoob uid500(runoob) gid500(runoob) groups500(runoob)从上面看到新镜像已经包含我们创建的用户 runoob。 设置镜像标签 我们可以使用 ‌docker tag‌ 命令为镜像添加一个新的标签。 runoobrunoob:~$ docker tag 860c279d2fec runoob/centos:devdocker tag 镜像ID这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。 使用 docker images 命令可以看到ID为860c279d2fec的镜像多一个标签。 runoobrunoob:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE runoob/centos 6.7 860c279d2fec 5 hours ago 190.6 MB runoob/centos dev 860c279d2fec 5 hours ago 190.6 MB runoob/ubuntu v2 70bf1840fd7c 22 hours ago 158.5 MB ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB php 5.6 f40e9e0f10c8 10 days ago 444.8 MB nginx latest 6f8d099c3adc 13 days ago 182.7 MB mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB hello-world latest 690ed74de00f 6 months ago 960 B centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB training/webapp latest 6fae60ef3446 12 months ago 348.8 MB四、Docker 容器连接 前面我们实现了通过网络端口来访问运行在 docker 容器内的服务。 容器中可以运行一些网络应用要让外部也可以访问这些应用可以通过 -P 或 -p 参数来指定端口映射。 下面我们来实现通过端口连接到一个 docker 容器。 网络端口映射 我们创建了一个 python 应用的容器。 runoobrunoob:~$ docker run -d -P training/webapp python app.py fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d另外我们可以指定容器绑定的网络地址比如绑定 127.0.0.1。 我们使用 -P 绑定端口号使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。 runoobrunoob:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES fce072cc88ce training/webapp python app.py ... 0.0.0.0:32768-5000/tcp grave_hopper我们也可以使用 -p 标识来指定容器端口绑定到主机端口。 两种方式的区别是: -P是容器内部端口随机映射到主机的端口。-p是容器内部端口绑定到指定的主机端口。 runoobrunoob:~$ docker run -d -p 5000:5000 training/webapp python app.py 33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0runoobrunoob:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 33e4523d30aa training/webapp python app.py ... 0.0.0.0:5000-5000/tcp berserk_bartik fce072cc88ce training/webapp python app.py ... 0.0.0.0:32768-5000/tcp grave_hopper另外我们可以指定容器绑定的网络地址比如绑定 127.0.0.1。 runoobrunoob:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py 95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c runoobrunoob:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 95c6ceef88ca training/webapp python app.py ... 5000/tcp, 127.0.0.1:5001-5000/tcp adoring_stonebraker 33e4523d30aa training/webapp python app.py ... 0.0.0.0:5000-5000/tcp berserk_bartik fce072cc88ce training/webapp python app.py ... 0.0.0.0:32768-5000/tcp grave_hopper这样我们就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口。 上面的例子中默认都是绑定 tcp 端口如果要绑定 UDP 端口可以在端口后面加上 /udp。 runoobrunoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a runoobrunoob:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 6779686f06f6 training/webapp python app.py ... 5000/tcp, 127.0.0.1:5000-5000/udp drunk_visvesvaraya 95c6ceef88ca training/webapp python app.py ... 5000/tcp, 127.0.0.1:5001-5000/tcp adoring_stonebraker 33e4523d30aa training/webapp python app.py ... 0.0.0.0:5000-5000/tcp berserk_bartik fce072cc88ce training/webapp python app.py ... 0.0.0.0:32768-5000/tcp grave_hopperdocker port 命令可以让我们快捷地查看端口的绑定情况。 runoobrunoob:~$ docker port adoring_stonebraker 5000 127.0.0.1:5001Docker 容器互联 端口映射并不是唯一把 docker 连接到另一个容器的方法。 docker 有一个连接系统允许将多个容器连接在一起共享连接信息。 docker 连接会创建一个父子关系其中父容器可以看到子容器的信息。 容器命名 当我们创建一个容器的时候docker 会自动对它进行命名。另外我们也可以使用 --name 标识来命名容器例如 runoobrunoob:~$ docker run -d -P --name runoob training/webapp python app.py 43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441我们可以使用 docker ps 命令来查看容器名称。 runoobrunoob:~$ docker ps -l CONTAINER ID IMAGE COMMAND ... PORTS NAMES 43780a6eabaa training/webapp python app.py ... 0.0.0.0:32769-5000/tcp runoob新建网络 下面先创建一个新的 Docker 网络。 $ docker network create -d bridge test-net参数说明 -d参数指定 Docker 网络类型有 bridge、overlay。 其中 overlay 网络类型用于 Swarm mode在本小节中你可以忽略它。 连接容器 运行一个容器并连接到新建的 test-net 网络: $ docker run -itd --name test1 --network test-net ubuntu /bin/bash打开新的终端再运行一个容器并加入到 test-net 网络: $ docker run -itd --name test2 --network test-net ubuntu /bin/bash下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。 如果 test1、test2 容器内中无 ping 命令则在容器内执行以下命令安装 ping即学即用可以在一个容器里安装好提交容器到镜像在以新的镜像重新运行以上俩个容器。 apt-get update apt install iputils-ping在 test1 容器输入以下命令 同理在 test2 容器也会成功连接到: 这样test1 容器和 test2 容器建立了互联关系。 如果你有多个容器之间需要互相连接推荐使用 Docker Compose后面会介绍。 配置 DNS 我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS {dns : [114.114.114.114,8.8.8.8] }设置后启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。 配置完需要重启 docker 才能生效。 查看容器的 DNS 是否生效可以使用以下命令它会输出容器的 DNS 信息 $ docker run -it --rm ubuntu cat etc/resolv.conf手动指定容器的配置 如果只想在指定的容器设置 DNS则可以使用以下命令 $ docker run -it --rm -h host_ubuntu --dns114.114.114.114 --dns-searchtest.com ubuntu参数说明 –rm容器退出时自动清理容器内部的文件系统。 -h HOSTNAME 或者 --hostnameHOSTNAME 设定容器的主机名它会被写到容器内的 /etc/hostname 和 /etc/hosts。 –dnsIP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。 –dns-searchDOMAIN 设定容器的搜索域当设定搜索域为 .example.com 时在搜索一个名为 host 的主机时DNS 不仅搜索 host还会搜索 host.example.com。 如果在容器启动时没有指定 ‌--dns‌ 和 ‌--dns-search‌Docker 会默认用宿主主机上的 /‌etc/resolv.conf‌ 来配置容器的 DNS。 五、Docker 仓库管理 仓库Repository是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub只是远程的服务商不一样操作都是一样的。 Docker Hub 目前 Docker 官方维护了一个公共仓库 Docker Hub。 大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。 注册 在 https://hub.docker.com 免费注册一个 Docker 账号。 登录和退出 登录需要输入用户名和密码登录成功后我们就可以从 docker hub 上拉取自己账号下的全部镜像。 $ docker login退出 退出 docker hub 可以使用以下命令 $ docker logout拉取镜像 你可以通过 ‌docker search‌ 命令来查找官方仓库中的镜像并利用 ‌docker pull‌ 命令来将它下载到本地。 以 ubuntu 为关键词进行搜索 $ docker search ubuntu使用 ‌docker pull‌ 将官方 ubuntu 镜像下载到本地 $ docker pull ubuntu推送镜像 用户登录后可以通过 ‌docker push‌ 命令将自己的镜像推送到 Docker Hub。 以下命令中的 username 请替换为你的 Docker 账号用户名。 $ docker tag ubuntu:18.04 username/ubuntu:18.04 $ docker image lsREPOSITORY TAG IMAGE ID CREATED ... ubuntu 18.04 275d79972a86 6 days ago ... username/ubuntu 18.04 275d79972a86 6 days ago ... $ docker push username/ubuntu:18.04 $ docker search username/ubuntuNAME DESCRIPTION STARS OFFICIAL AUTOMATED username/ubuntu六、Docker Dockerfile 什么是容器编排 利用各种工具来让容器部署、管理、弹性伸缩、网络管理等功能都能够自动化进行这就是容器编排。 实现容器编排的工具 我们常常听说的Kubernetes是一个强大的容器编排工具除此之外Docker Swarm、Docker Compose也是比较常用的编排工具。 Docker Compose和Docker Swarm都是Docker官方容器编排工具的项目两者的作用不同Docker Compose是一个用于定义和运行多容器 Docker 应用程序的工具主要用在单机上创建容器而Docker Swarm是用来管理Docker集群的平台可以用在多个服务器上创建容器服务。而K8s本身的定位和Docker Swarm一样是由谷歌研发的一款容器运维平台。目前已成为主流的容器编排工具。 Dockerfile 了解Docker compose之前需要先了解Dockerfile。我们的Spring Boot服务在编译完还只是一个jar包需要借助Dockerfile将jar包构建成docker镜像才能将服务部署到Docker容器上。 Dockerfile是一个用来构建镜像的文本文件文件的内容包含了一条条用于构建镜像时所需要的指令和说明。要注意的是每一条指令都将会构建一层镜像。Dockerfile指令其实并不多但日常基本掌握常用的指令也足够使用了。 用Dockerfile构建Spring Boot应用 使用Dockerfile打包Spring Boot还是比较简单的只需要使用Jdk8的镜像再将本地打包好的jar包复制到镜像中再暴露服务的端口启动服务即可。 Dockerfile 简介 Dockerfile 是一个文本文件包含了构建 Docker 镜像的所有指令。 Dockerfile 是一个用来构建镜像的文本文件文本内容包含了一条条构建镜像所需的指令和说明。 通过定义一系列命令和参数Dockerfile 指导 Docker 构建一个自定义的镜像。 使用 Dockerfile 定制镜像 如何运行 Dockerfile 文件来定制一个镜像具体 Dockerfile 文件内指令详解将在下一节中介绍这里你只要知道构建的流程即可。 1、下面以定制一个 nginx 镜像构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件 在一个空目录下新建一个名为 Dockerfile 文件并在文件内添加以下内容 FROM nginx RUN echo 这是一个本地构建的nginx镜像 /usr/share/nginx/html/index.html2、FROM 和 RUN 指令的作用 FROM定制的镜像都是基于 FROM 的镜像这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。 RUN用于执行后面跟着的命令行命令。有以下俩种格式 shell 格式 RUN 命令行命令 # 命令行命令 等同于在终端操作的 shell 命令。exec 格式 RUN [可执行文件, 参数1, 参数2] # 例如 # RUN [./test.php, dev, offline] 等价于 RUN ./test.php dev offline注意Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层会造成镜像膨胀过大。例如 FROM centos RUN yum -y install wget RUN wget -O redis.tar.gz http://download.redis.io/releases/redis-5.0.3.tar.gz RUN tar -xvf redis.tar.gz以上执行会创建 3 层镜像。可简化为以下格式 FROM centos RUN yum -y install wget \ wget -O redis.tar.gz http://download.redis.io/releases/redis-5.0.3.tar.gz \ tar -xvf redis.tar.gz如上以 符号连接命令这样执行后只会创建 1 层镜像。 3、开始构建镜像 在 Dockerfile 文件的存放目录下执行构建动作。 以下示例通过目录下的 Dockerfile 构建一个 nginx:v3镜像名称:镜像标签。 注最后的 . 代表本次执行的上下文路径下一节会介绍。 $ docker build -t nginx:v3 .以上显示说明已经构建成功。 4、上下文路径 上一节中有提到指令最后一个 . 是上下文路径那么什么是上下文路径呢 $ docker build -t nginx:v3 .上下文路径是指 docker 在构建镜像有时候想要使用到本机的文件比如复制docker build 命令得知这个路径后会将路径下的所有内容打包。 解析由于 docker 的运行模式是 C/S。我们本机是 Cdocker 引擎是 S。实际的构建过程是在 docker 引擎下完成的所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。 如果未说明最后一个参数那么默认上下文路径就是 Dockerfile 所在的位置。 注意上下文路径下不要放无用的文件因为会一起打包发送给 docker 引擎如果文件过多会造成过程缓慢。 指令详解 云服务实战 # 使用openjdk8的镜像 FROM swr.cn-north-4.mycloud.com/swr-public/base-openjdk:8-jdk-slim # 将jar包复制到容器中 COPY xxx-xxx-service/target/*.jar /usr/src/myapp/springboot.jar # 设置工作目录 WORKDIR /usr/src/myapp/ # 设置时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo Asia/Shanghai /etc/timezone # 暴露8080端口 EXPOSE 8080 # 运行jar包 ENTRYPOINT [sh,-c, java ${JAVA_OPTS} -Duser.timezone08:00 -DskipTeststrue -Dspring.profiles.active${JAVA_ENV} -Djava.security.egdfile:/dev/./urandom -jar springboot.jar]Dockerfile官网文档 Dockerfile 指令说明FROM指定基础镜像用于后续的指令构建。MAINTAINER指定Dockerfile的作者/维护者。已弃用推荐使用LABEL指令LABEL添加镜像的元数据使用键值对的形式。RUN在构建过程中在镜像中执行命令。CMD指定容器创建时的默认命令。可以被覆盖ENTRYPOINT设置容器创建时的主要命令。不可被覆盖EXPOSE声明容器运行时监听的特定网络端口。ENV在容器内部设置环境变量。ADD将文件、目录或远程URL复制到镜像中。COPY将文件或目录复制到镜像中。VOLUME为容器创建挂载点或声明卷。WORKDIR设置后续指令的工作目录。USER指定后续指令的用户上下文。ARG定义在构建过程中传递给构建器的变量可使用 “docker build” 命令设置。ONBUILD当该镜像被用作另一个构建过程的基础时添加触发器。STOPSIGNAL设置发送给容器以退出的系统调用信号。HEALTHCHECK定义周期性检查容器健康状态的命令。SHELL覆盖Docker中默认的shell用于RUN、CMD和ENTRYPOINT指令。 COPY 复制指令从上下文目录中复制文件或者目录到容器里指定路径。 格式 COPY [--chownuser:group] 源路径1... 目标路径 COPY [--chownuser:group] [源路径1,... 目标路径]‌[--chownuser:group]‌可选参数用户改变复制到容器内文件的拥有者和属组。 源路径源文件或者源目录这里可以是通配符表达式其通配符规则要满足 Go 的 filepath.Match 规则。例如 COPY hom* /mydir/ COPY hom?.txt /mydir/目标路径容器内的指定路径该路径不用事先建好路径不存在的话会自动创建。 ADD ADD 指令和 COPY 的使用格类似同样需求下官方推荐使用 COPY。功能也类似不同之处如下 优点在执行 源文件 为 tar 压缩文件的话压缩格式为 gzip, bzip2 以及 xz 的情况下会自动复制并解压到 目标路径。 缺点在不解压的前提下无法复制 tar 压缩文件。会令镜像构建缓存失效从而可能会令镜像构建变得比较缓慢。具体是否使用可以根据是否需要自动解压来决定。 CMD 类似于 RUN 指令用于运行程序但二者运行的时间点不同: CMD 在docker run 时运行。 RUN 是在 docker build。作用为启动的容器指定默认要运行的程序程序运行结束容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 注意如果 Dockerfile 中如果存在多个 CMD 指令仅最后一个生效。 格式 CMD shell 命令 CMD [可执行文件或命令,param1,param2,...] CMD [param1,param2,...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数推荐使用第二种格式执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行并且默认可执行文件是 sh。 ENTRYPOINT 类似于 CMD 指令但其不会被 docker run 的命令行参数指定的指令所覆盖而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。 但是, 如果运行 docker run 时使用了 --entrypoint 选项将覆盖 ENTRYPOINT 指令指定的程序。 优点在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。 注意如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令仅最后一个生效。 格式 ENTRYPOINT [executeable,param1,param2,...]可以搭配 CMD 命令使用一般是变参才会使用 CMD 这里的 CMD 等于是在给 ENTRYPOINT 传参以下示例会提到。 示例 假设已通过 Dockerfile 构建了 nginx:test 镜像 FROM nginxENTRYPOINT [nginx, -c] # 定参 CMD [/etc/nginx/nginx.conf] # 变参 1、不传参运行 $ docker run nginx:test容器内会默认运行以下命令启动主进程。 nginx -c /etc/nginx/nginx.conf2、传参运行 $ docker run nginx:test -c /etc/nginx/new.conf容器内会默认运行以下命令启动主进程(/etc/nginx/new.conf:假设容器内已有此文件) nginx -c /etc/nginx/new.confENV 设置环境变量定义了环境变量那么在后续的指令中就可以使用这个环境变量。 格式 ENV key value ENV key1value1 key2value2...以下示例设置 NODE_VERSION 7.2.0 在后续的指令中可以通过 $NODE_VERSION 引用 ENV NODE_VERSION 7.2.0RUN curl -SLO https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz \ curl -SLO https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.ascARG 构建参数与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效也就是说只有 docker build 的过程中有效构建好的镜像内不存在此环境变量。 构建命令 docker build 中可以用 --build-arg 参数名值 来覆盖。 格式 ARG 参数名[默认值]VOLUME 定义匿名数据卷。在启动容器时忘记挂载数据卷会自动挂载到匿名卷。 作用 避免重要的数据因容器重启而丢失这是非常致命的。 避免容器不断变大。格式 VOLUME [路径1, 路径2...] VOLUME 路径在启动容器 docker run 的时候我们可以通过 -v 参数修改挂载点。 EXPOSE 仅仅只是声明端口。 作用 帮助镜像使用者理解这个镜像服务的守护端口以方便配置映射。 在运行时使用随机端口映射时也就是 docker run -P 时会自动随机映射 EXPOSE 的端口。格式 EXPOSE 端口1 [端口2...]WORKDIR 指定工作目录。用 WORKDIR 指定的工作目录会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录如该目录不存在WORKDIR 会帮你建立目录。 docker build 构建镜像过程中的每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。 格式 WORKDIR 工作目录路径USER 用于指定执行后续命令的用户和用户组这边只是切换后续命令执行的用户用户和用户组必须提前已经存在。 格式 USER 用户名[:用户组]HEALTHCHECK 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。 格式 HEALTHCHECK [选项] CMD 命令设置检查容器健康状况的命令 HEALTHCHECK NONE如果基础镜像有健康检查指令使用这行可以屏蔽掉其健康检查指令HEALTHCHECK [选项] CMD 命令 : 这边 CMD 后面跟随的命令使用可以参考 CMD 的用法。ONBUILD 用于延迟构建命令的执行。简单的说就是 Dockerfile 里用 ONBUILD 指定的命令在本次构建镜像的过程中不会执行假设镜像为 test-build。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build 这时执行新镜像的 Dockerfile 构建时候会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。 格式 ONBUILD 其它指令LABEL LABEL 指令用来给镜像添加一些元数据metadata以键值对的形式语法格式如下 LABEL keyvalue keyvalue keyvalue ...比如我们可以添加镜像的作者 LABEL org.opencontainers.image.authorsrunoob七、Docker Compose Docker Compose 是通过python编写的Docker的服务编排工具主要用来构建基于Docker的复杂应用Compose 通过一个配置文件来管理多个Docker容器非常适合组合使用多个容器进行开发的场景。 Docker Compose 官网 Compose 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令就可以从 YML 文件配置中创建并启动所有服务。 Compose 使用的三个步骤 使用 Dockerfile 定义应用程序的环境。 使用 docker-compose.yml 定义构成应用程序的服务这样它们可以在隔离环境中一起运行。 最后执行 docker-compose up 命令来启动并运行整个应用程序。 Docker Compose file官网文档 docker-compose.yml 的配置案例如下配置参数参考下文 # yaml 配置实例 version: 3 services:web:build: .ports:- 5000:5000volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis volumes:logvolume01: {}云服务实战 version: 3 # 指定当前文件所对应的compsoe版本主要有1、2.x和3.x services: # 服务列表redis: # 服务名image: redis:7-alpine # 指定运行的镜像可直接拉取已有镜像进行处理# build: # 设置Dockerfile所在的文件夹可处理需要用Dockerfile构建的镜像# content: # 存放Dockerfile的路径# dockerfile: # 指定构建的Dockerfile文件名# args: # 构建参数只能在构建过程中访问# restart: # 重启策略有no、always、no-failure、unless-stoped# hostname: # 设置容器的主机名container_name: redis # 设置容器名称privileged: trueenvironment: # 设置环境变量- TZAsia/Shanghaivolumes: # 设置容器的挂载点可以挂载到宿主机上,主要格式为宿主机路径:容器路径[:访问模式]- ./redis/redis.conf:/usr/local/etc/redis/redis.conf- ./XXX/redis:/datacommand: sh -c redis-server /usr/local/etc/redis/redis.confports:# ports: # 暴露容器的端口格式为宿主机端口:容器端口- 6379:6379mysql: # 服务名image: mysql:8.0 # 指定运行的镜像可直接拉取已有镜像进行处理container_name: mysql # 设置容器名称privileged: truecommand:--default-authentication-pluginmysql_native_password--character-set-serverutf8mb4--collation-serverutf8mb4_general_ci--explicit_defaults_for_timestamptrue--lower_case_table_names1environment: # 设置环境变量- TZAsia/Shanghai- MYSQL_ROOT_PASSWORDXXXXvolumes:# 设置容器的挂载点可以挂载到宿主机上,主要格式为宿主机路径:容器路径[:访问模式]- ./XXX/mysql:/var/lib/mysqlports: # ports: # 暴露容器的端口格式为宿主机端口:容器端口- 3306:3306rabbitmq: # 服务名image: rabbitmq:management-alpine # 指定运行的镜像可直接拉取已有镜像进行处理container_name: rabbitmq # 设置容器名称privileged: trueenvironment: # 设置环境变量- TZAsia/Shanghai- RABBITMQ_DEFAULT_USERXXXX- RABBITMQ_DEFAULT_PASSXXXX- RABBITMQ_DEFAULT_VHOST/devvolumes: # 设置容器的挂载点可以挂载到宿主机上,主要格式为宿主机路径:容器路径[:访问模式]- ./XXX/rabbitmq:/var/lib/rabbitmqports: # ports: # 暴露容器的端口格式为宿主机端口:容器端口- 15672:15672- 5672:5672xxl-job: # 服务名image: xuxueli/xxl-job-admin:2.4.0 # 指定运行的镜像可直接拉取已有镜像进行处理container_name: xxl-job # 设置容器名称privileged: truedepends_on:- mysqllinks:- mysqlenvironment: # 设置环境变量- TZAsia/Shanghai- PARAMS--spring.datasource.urljdbc:mysql://mysql:3306/xxl_job?UnicodetruecharacterEncodingUTF-8 --spring.datasource.usernameXXXX --spring.datasource.passwordXXXXvolumes: # 设置容器的挂载点可以挂载到宿主机上,主要格式为宿主机路径:容器路径[:访问模式]- ./XXX/xxl-job:/data/applogsports: # ports: # 暴露容器的端口格式为宿主机端口:容器端口- 8080:8080nacos: # 服务名image: nacos/nacos-server:v2.1.0-slim # 指定运行的镜像可直接拉取已有镜像进行处理container_name: nacos # 设置容器名称privileged: truedepends_on:- mysqllinks:- mysqlenvironment: # 设置环境变量- TZAsia/Shanghai- MODEstandalone- MYSQL_SERVICE_HOSTmysql- MYSQL_SERVICE_PORT3306- MYSQL_SERVICE_DB_NAMEnacos- MYSQL_SERVICE_USERXXXX- MYSQL_SERVICE_PASSWORDXXXXports: # ports: # 暴露容器的端口格式为宿主机端口:容器端口- 8848:8848 # networks: # 配置网络# app_netwotk:Compose 安装 Linux 上我们可以从 Github 上下载它的二进制包来使用最新发行的版本地址https://github.com/docker/compose/releases。 运行以下命令以下载 Docker Compose 的当前稳定版本 $ sudo curl -L https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose要安装其他版本的 Compose请替换 v2.2.2。 Docker Compose 存放在 GitHub不太稳定。 你可以也通过执行下面的命令高速安装 Docker Compose。curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-uname -s-uname -m /usr/local/bin/docker-compose将可执行权限应用于二进制文件 $ sudo chmod x /usr/local/bin/docker-compose创建软链 $ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose测试是否安装成功 $ docker-compose version docker-compose version 1.24.1, build 4667896b注意 对于 alpine需要以下依赖包 py-pippython-devlibffi-devopenssl-devgcclibc-dev和 make。 macOS Mac 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序因此 Mac 用户不需要单独安装 Compose。Docker 安装说明可以参阅 MacOS Docker 安装。 windows PC Windows 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序因此 Windows 用户不需要单独安装 Compose。Docker 安装说明可以参阅 Windows Docker 安装。 Compose 使用 1、准备 创建一个测试目录 $ mkdir composetest $ cd composetest在测试目录中创建一个名为 app.py 的文件并复制粘贴以下内容 composetest/app.py 文件代码 import timeimport redis from flask import Flaskapp Flask(__name__) cache redis.Redis(hostredis, port6379)def get_hit_count():retries 5while True:try:return cache.incr(hits)except redis.exceptions.ConnectionError as exc:if retries 0:raise excretries - 1time.sleep(0.5)app.route(/) def hello():count get_hit_count()return Hello World! I have been seen {} times.\n.format(count)在此示例中redis 是应用程序网络上的 redis 容器的主机名该主机使用的端口为 6379。 在 composetest 目录中创建另一个名为 requirements.txt 的文件内容如下 flask redis2、创建 Dockerfile 文件 在 composetest 目录中创建一个名为 Dockerfile 的文件内容如下 FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD [flask, run]Dockerfile 内容解释 FROM python:3.7-alpine: 从 Python 3.7 映像开始构建镜像。 WORKDIR /code: 将工作目录设置为 /code。ENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0设置 flask 命令使用的环境变量。 RUN apk add --no-cache gcc musl-dev linux-headers: 安装 gcc以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速。COPY requirements.txt requirements.txtRUN pip install -r requirements.txt复制 requirements.txt 并安装 Python 依赖项。 COPY . .: 将 . 项目中的当前目录复制到 . 镜像中的工作目录。 CMD [flask, run]: 容器提供默认的执行命令为flask run。3、创建 docker-compose.yml 在测试目录中创建一个名为 docker-compose.yml 的文件然后粘贴以下内容 docker-compose.yml 配置文件 # yaml 配置 version: 3 services:web:build: .ports:- 5000:5000redis:image: redis:alpine该 Compose 文件定义了两个服务web 和 redis。 web该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端 5000 。 redis该 redis 服务使用 Docker Hub 的公共 Redis 映像。4、使用 Compose 命令构建和运行您的应用 在测试目录中执行以下命令来启动应用程序 docker-compose up 如果你想在后台执行该服务可以加上 -d 参数 docker-compose up -d yml 配置指令参考 version 指定本 yml 依从的 compose 哪个版本制定的。 build 指定为构建镜像上下文路径 例如 webapp 服务指定为从上下文路径 ./dir/Dockerfile 所构建的镜像 version: 3.7 services:webapp:build: ./dir或者作为具有在上下文指定的路径的对象以及可选的 Dockerfile 和 args version: 3.7 services:webapp:build:context: ./dirdockerfile: Dockerfile-alternateargs:buildno: 1labels:- com.example.descriptionAccounting webapp- com.example.departmentFinance- com.example.label-with-empty-valuetarget: prodcontext上下文路径。 dockerfile指定构建镜像的 Dockerfile 文件名。 args添加构建参数这是只能在构建过程中访问的环境变量。 labels设置构建镜像的标签。 target多层构建可以指定构建哪一层。 cap_addcap_drop 添加或删除容器拥有的宿主机的内核功能。 cap_add:- ALL # 开启全部权限cap_drop:- SYS_PTRACE # 关闭 ptrace权限cgroup_parent 为容器指定父 cgroup 组意味着将继承该组的资源限制。 cgroup_parent: m-executor-abcdcommand 覆盖容器启动的默认命令。 command: [bundle, exec, thin, -p, 3000]container_name 指定自定义容器名称而不是生成的默认名称。 container_name: my-web-containerdepends_on 设置依赖关系。 docker-compose up 以依赖性顺序启动服务。在以下示例中先启动 db 和 redis 才会启动 web。 docker-compose up SERVICE 自动包含 SERVICE 的依赖项。在以下示例中docker-compose up web 还将创建并启动 db 和 redis。 docker-compose stop 按依赖关系顺序停止服务。在以下示例中web 在 db 和 redis 之前停止。 version: 3.7 services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres注意web 服务不会等待 redis db 完全启动 之后才启动。 deploy 指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。 version: 3.7 services:redis:image: redis:alpinedeploy:modereplicatedreplicas: 6endpoint_mode: dnsrrlabels: description: This redis service labelresources:limits:cpus: 0.50memory: 50Mreservations:cpus: 0.25memory: 20Mrestart_policy:condition: on-failuredelay: 5smax_attempts: 3window: 120s可以选参数 endpoint_mode访问集群服务的方式。 endpoint_mode: vip # Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。 endpoint_mode: dnsrr # DNS 轮询DNSRR。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。labels在服务上设置标签。可以用容器上的 labels跟 deploy 同级的配置 覆盖 deploy 下的 labels。 mode指定服务提供的模式。 replicated复制服务复制指定服务到集群的机器上。 global全局服务服务将部署至集群的每个节点。 图解下图中黄色的方块是 replicated 模式的运行情况灰色方块是 global 模式的运行情况。 replicasmode 为 replicated 时需要使用此参数配置具体运行的节点数量。 resources配置服务器资源使用的限制例如上例子配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。 restart_policy配置如何在退出容器时重新启动容器。 condition可选 noneon-failure 或者 any默认值any。delay设置多久之后重启默认值0。max_attempts尝试重新启动容器的次数超出次数则不再尝试默认值一直重试。window设置容器重启超时时间默认值0。 rollback_config配置在更新失败的情况下应如何回滚服务。 parallelism一次要回滚的容器数。如果设置为0则所有容器将同时回滚。delay每个容器组回滚之间等待的时间默认为0s。failure_action如果回滚失败该怎么办。其中一个 continue 或者 pause默认pause。monitor每个容器更新后持续观察是否失败了的时间 (ns|us|ms|s|m|h)默认为0s。max_failure_ratio在回滚期间可以容忍的故障率默认为0。order回滚期间的操作顺序。其中一个 stop-first串行回滚或者 start-first并行回滚默认 stop-first 。 update_config配置应如何更新服务对于配置滚动更新很有用。 parallelism一次更新的容器数。delay在更新一组容器之间等待的时间。failure_action如果更新失败该怎么办。其中一个 continuerollback 或者pause 默认pause。monitor每个容器更新后持续观察是否失败了的时间 (ns|us|ms|s|m|h)默认为0s。max_failure_ratio在更新过程中可以容忍的故障率。order回滚期间的操作顺序。其中一个 stop-first串行回滚或者 start-first并行回滚默认stop-first。 注仅支持 V3.4 及更高版本。 devices 指定设备映射列表。 devices:- /dev/ttyUSB0:/dev/ttyUSB0dns 自定义 DNS 服务器可以是单个值或列表的多个值。 dns: 8.8.8.8dns:- 8.8.8.8- 9.9.9.9dns_search 自定义 DNS 搜索域。可以是单个值或列表。 dns_search: example.comdns_search:- dc1.example.com- dc2.example.comentrypoint 覆盖容器默认的 entrypoint。 entrypoint: /code/entrypoint.sh也可以是以下格式 entrypoint:- php- -d- zend_extension/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so- -d- memory_limit-1- vendor/bin/phpunitenv_file 从文件添加环境变量。可以是单个值或列表的多个值。 env_file: .env也可以是列表格式 env_file:- ./common.env- ./apps/web.env- /opt/secrets.envenvironment 添加环境变量。您可以使用数组或字典、任何布尔值布尔值需要用引号引起来以确保 YML 解析器不会将其转换为 True 或 False。 environment:RACK_ENV: developmentSHOW: trueexpose 暴露端口但不映射到宿主机只被连接的服务访问。 仅可以指定内部端口为参数 expose:- 3000- 8000extra_hosts 添加主机名映射。类似 docker client --add-host。 extra_hosts:- somehost:162.242.195.82- otherhost:50.31.209.229以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系 162.242.195.82 somehost 50.31.209.229 otherhosthealthcheck 用于检测 docker 服务是否健康运行。 healthcheck:test: [CMD, curl, -f, http://localhost] # 设置检测程序interval: 1m30s # 设置检测间隔timeout: 10s # 设置检测超时时间retries: 3 # 设置重试次数start_period: 40s # 启动后多少秒开始启动检测程序image 指定容器运行的镜像。以下格式都可以 image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd # 镜像idlogging 服务的日志记录配置。 driver指定服务容器的日志记录驱动程序默认值为json-file。有以下三个选项 driver: json-file driver: syslog driver: none仅在 json-file 驱动程序下可以使用以下参数限制日志得数量和大小。 logging:driver: json-fileoptions:max-size: 200k # 单个文件大小为200kmax-file: 10 # 最多10个文件当达到文件限制上限会自动删除旧得文件。 syslog 驱动程序下可以使用 syslog-address 指定日志接收地址。 logging:driver: syslogoptions:syslog-address: tcp://192.168.0.42:123network_mode 设置网络模式。 network_mode: bridge network_mode: host network_mode: none network_mode: service:[service name] network_mode: container:[container name/id]networks 配置容器连接的网络引用顶级 networks 下的条目 。 services:some-service:networks:some-network:aliases:- alias1other-network:aliases:- alias2 networks:some-network:# Use a custom driverdriver: custom-driver-1other-network:# Use a custom driver which takes special optionsdriver: custom-driver-2aliases 同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。 restart no是默认的重启策略在任何情况下都不会重启容器。always容器总是重新启动。on-failure在容器非正常退出时退出状态非0才会重启容器。unless-stopped在容器退出时总是重启容器但是不考虑在Docker守护进程启动时就已经停止了的容器 restart: no restart: always restart: on-failure restart: unless-stopped注swarm 集群模式请改用 restart_policy。 secrets 存储敏感数据例如密码 version: 3.1 services:mysql:image: mysqlenvironment:MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secretsecrets:- my_secretsecrets:my_secret:file: ./my_secret.txtsecurity_opt 修改容器默认的 schema 标签。 security-opt- label:user:USER # 设置容器的用户标签- label:role:ROLE # 设置容器的角色标签- label:type:TYPE # 设置容器的安全策略标签- label:level:LEVEL # 设置容器的安全等级标签stop_grace_period 指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号)等待多久后发送 SIGKILL 信号关闭容器。 stop_grace_period: 1s # 等待 1 秒 stop_grace_period: 1m30s # 等待 1 分 30 秒 默认的等待时间是 10 秒。 stop_signal 设置停止容器的替代信号。默认情况下使用 SIGTERM 。 以下示例使用 SIGUSR1 替代信号 SIGTERM 来停止容器。 stop_signal: SIGUSR1sysctls 设置容器中的内核参数可以使用数组或字典格式。 sysctls:net.core.somaxconn: 1024net.ipv4.tcp_syncookies: 0sysctls:- net.core.somaxconn1024- net.ipv4.tcp_syncookies0tmpfs 在容器内安装一个临时文件系统。可以是单个值或列表的多个值。 tmpfs: /runtmpfs:- /run- /tmpulimits 覆盖容器默认的 ulimit。 ulimits:nproc: 65535nofile:soft: 20000hard: 40000volumes 将主机的数据卷或者文件挂载到容器里。 version: 3.7 services:db:image: postgres:latestvolumes:- /localhost/postgres.sock:/var/run/postgres/postgres.sock- /localhost/data:/var/lib/postgresql/data八、Docker Machine Docker Machine 官网 docker machine就是在远程机器上安装docker的虽然实际线上环境很少使用在实验环境中docker machine还是非常重要的。 简介 Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具并可以使用 docker-machine 命令来管理主机。 Docker Machine 也可以集中管理所有的 docker 主机比如快速的给 100 台服务器安装上 docker。 Docker Machine 管理的虚拟主机可以是机上的也可以是云供应商如阿里云腾讯云AWS或 DigitalOcean。 使用 docker-machine 命令您可以启动检查停止和重新启动托管主机也可以升级 Docker 客户端和守护程序以及配置 Docker 客户端与您的主机进行通信。 安装 安装 Docker Machine 之前你需要先安装 Docker。 Docker Machine 可以在多种平台上安装使用包括 Linux 、MacOS 以及 windows。 Linux 安装命令 $ basehttps://github.com/docker/machine/releases/download/v0.16.0 curl -L $base/docker-machine-$(uname -s)-$(uname -m) /tmp/docker-machine sudo mv /tmp/docker-machine /usr/local/bin/docker-machine chmod x /usr/local/bin/docker-machinemacOS 安装命令 $ basehttps://github.com/docker/machine/releases/download/v0.16.0 curl -L $base/docker-machine-$(uname -s)-$(uname -m) /usr/local/bin/docker-machine chmod x /usr/local/bin/docker-machineWindows 安装命令 如果你是 Windows 平台可以使用 Git BASH并输入以下命令 $ basehttps://github.com/docker/machine/releases/download/v0.16.0 mkdir -p $HOME/bin curl -L $base/docker-machine-Windows-x86_64.exe $HOME/bin/docker-machine.exe chmod x $HOME/bin/docker-machine.exe查看是否安装成功 $ docker-machine version docker-machine version 0.16.0, build 9371605注意各版本更新日志里面也有安装说明https://github.com/docker/machine/releases 使用 本章通过 virtualbox 来介绍 docker-machine 的使用方法。其他云服务商操作与此基本一致。具体可以参考每家服务商的指导文档。 1、列出可用的机器 可以看到目前只有这里默认的 default 虚拟机。 $ docker-machine ls2、创建机器 创建一台名为 test 的机器。 $ docker-machine create --driver virtualbox test–driver指定用来创建机器的驱动类型这里是 virtualbox。 3、查看机器的 ip $ docker-machine ip test4、停止机器 $ docker-machine stop test5、启动机器 $ docker-machine start test6、进入机器 $ docker-machine ssh testdocker-machine 命令参数说明 docker-machine active查看当前激活状态的 Docker 主机。 $ docker-machine lsNAME ACTIVE DRIVER STATE URLdev - virtualbox Running tcp://192.168.99.103:2376staging * digitalocean Running tcp://203.0.113.81:2376$ echo $DOCKER_HOSTtcp://203.0.113.81:2376$ docker-machine activestagingconfig查看当前激活状态 Docker 主机的连接信息。create创建 Docker 主机env显示连接到某个主机需要的环境变量inspect 以 json 格式输出指定Docker的详细信息ip 获取指定 Docker 主机的地址kill 直接杀死指定的 Docker 主机ls 列出所有的管理主机provision 重新配置指定主机regenerate-certs 为某个主机重新生成 TLS 信息restart 重启指定的主机rm 删除某台 Docker 主机对应的虚拟机也会被删除ssh 通过 SSH 连接到主机上执行命令scp 在 Docker 主机之间以及 Docker 主机和本地主机之间通过 scp 远程复制数据mount 使用 SSHFS 从计算机装载或卸载目录start 启动一个指定的 Docker 主机如果对象是个虚拟机该虚拟机将被启动status 获取指定 Docker 主机的状态(包括Running、Paused、Saved、Stopped、Stopping、Starting、Error)等stop 停止一个指定的 Docker 主机upgrade 将一个指定主机的 Docker 版本更新为最新url 获取指定 Docker 主机的监听 URLversion 显示 Docker Machine 的版本或者主机 Docker 版本help 显示帮助信息 九、Swarm 集群管理 Docker 引擎内置原生的集群管理和编排工具。 简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限于以下各项 DokkuDocker ComposeDocker MachineJenkins 原理 如下图所示swarm 集群由管理节点manager和工作节点work node构成。 swarm mananger负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。work node即图中的 available node主要负责运行相应的服务来执行任务task。 使用 以下示例均以 Docker Machine 和 virtualbox 进行介绍确保你的主机已安装 virtualbox。 1、创建 swarm 集群管理节点manager 创建 docker 机器 $ docker-machine create -d virtualbox swarm-manager初始化 swarm 集群进行初始化的这台机器就是集群的管理节点。 $ docker-machine ssh swarm-manager $ docker swarm init --advertise-addr 192.168.99.107 #这里的 IP 为创建机器时分配的 ip。以上输出证明已经初始化成功。需要把以下这行复制出来在增加工作节点时会用到 docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:23772、创建 swarm 集群工作节点worker 这里直接创建好俩台机器swarm-worker1 和 swarm-worker2 。 分别进入两个机器里指定添加至上一步中创建的集群这里会用到上一步复制的内容。 以上数据输出说明已经添加成功。 上图中由于上一步复制的内容比较长会被自动截断实际上在图运行的命令如下 dockerswarm-worker1:~$ docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:23773、查看集群信息 进入管理节点执行docker info 可以查看当前集群的信息。 $ docker info通过画红圈的地方可以知道当前运行的集群中有三个节点其中有一个是管理节点。 4、部署服务到集群中 注意跟集群管理有关的任何操作都是在管理节点上操作的。 以下例子在一个工作节点上创建一个名为 helloworld 的服务这里是随机指派给一个工作节点 dockerswarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com5、查看服务部署情况 查看 helloworld 服务运行在哪个节点上可以看到目前是在 swarm-worker1 节点 dockerswarm-manager:~$ docker service ps helloworld查看 helloworld 部署的具体信息 dockerswarm-manager:~$ docker service inspect --pretty helloworld6、扩展集群服务 我们将上述的 helloworld 服务扩展到俩个节点。 dockerswarm-manager:~$ docker service scale helloworld2可以看到已经从一个节点扩展到两个节点。 7、删除服务 dockerswarm-manager:~$ docker service rm helloworld查看是否已删除 8、滚动升级服务 以下实例我们将介绍 redis 版本如何滚动升级至更高版本。 创建一个 3.0.6 版本的 redis。 dockerswarm-manager:~$ docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6滚动升级 redis 。 dockerswarm-manager:~$ docker service update --image redis:3.0.7 redis看图可以知道 redis 的版本已经从 3.0.6 升级到了 3.0.7说明服务已经升级成功。 9、停止某个节点接收新的任务 查看所有的节点 dockerswarm-manager:~$ docker node ls可以看到目前所有的节点都是 Active, 可以接收新的任务分配。 停止节点 swarm-worker1 注意swarm-worker1 状态变为 Drain。不会影响到集群的服务只是 swarm-worker1 节点不再接收新的任务集群的负载能力有所下降。 可以通过以下命令重新激活节点 dockerswarm-manager:~$ docker node update --availability active swarm-worker1 Docker 命令 本文的引用仅限自我学习如有侵权请联系作者删除。 参考知识 Docker 教程
文章转载自:
http://www.morning.ztqj.cn.gov.cn.ztqj.cn
http://www.morning.njfgl.cn.gov.cn.njfgl.cn
http://www.morning.qxrct.cn.gov.cn.qxrct.cn
http://www.morning.pphgl.cn.gov.cn.pphgl.cn
http://www.morning.mlcnh.cn.gov.cn.mlcnh.cn
http://www.morning.ctpfq.cn.gov.cn.ctpfq.cn
http://www.morning.ffrys.cn.gov.cn.ffrys.cn
http://www.morning.xinxianzhi005.com.gov.cn.xinxianzhi005.com
http://www.morning.yxnfd.cn.gov.cn.yxnfd.cn
http://www.morning.lyrgp.cn.gov.cn.lyrgp.cn
http://www.morning.incmt.com.gov.cn.incmt.com
http://www.morning.lmhcy.cn.gov.cn.lmhcy.cn
http://www.morning.tgdys.cn.gov.cn.tgdys.cn
http://www.morning.nqypf.cn.gov.cn.nqypf.cn
http://www.morning.hpspr.com.gov.cn.hpspr.com
http://www.morning.wrkcw.cn.gov.cn.wrkcw.cn
http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn
http://www.morning.jcbjy.cn.gov.cn.jcbjy.cn
http://www.morning.tknqr.cn.gov.cn.tknqr.cn
http://www.morning.mfjfh.cn.gov.cn.mfjfh.cn
http://www.morning.xlxmy.cn.gov.cn.xlxmy.cn
http://www.morning.plpqf.cn.gov.cn.plpqf.cn
http://www.morning.ylsxk.cn.gov.cn.ylsxk.cn
http://www.morning.lmxrt.cn.gov.cn.lmxrt.cn
http://www.morning.bpmfg.cn.gov.cn.bpmfg.cn
http://www.morning.rbtny.cn.gov.cn.rbtny.cn
http://www.morning.cykqg.cn.gov.cn.cykqg.cn
http://www.morning.pwxkn.cn.gov.cn.pwxkn.cn
http://www.morning.tnwgc.cn.gov.cn.tnwgc.cn
http://www.morning.prznc.cn.gov.cn.prznc.cn
http://www.morning.qnrpj.cn.gov.cn.qnrpj.cn
http://www.morning.yxwrr.cn.gov.cn.yxwrr.cn
http://www.morning.srcth.cn.gov.cn.srcth.cn
http://www.morning.ygkb.cn.gov.cn.ygkb.cn
http://www.morning.rdnkx.cn.gov.cn.rdnkx.cn
http://www.morning.qhrdx.cn.gov.cn.qhrdx.cn
http://www.morning.tpnch.cn.gov.cn.tpnch.cn
http://www.morning.psxxp.cn.gov.cn.psxxp.cn
http://www.morning.pnfwd.cn.gov.cn.pnfwd.cn
http://www.morning.nicetj.com.gov.cn.nicetj.com
http://www.morning.srnth.cn.gov.cn.srnth.cn
http://www.morning.wrbf.cn.gov.cn.wrbf.cn
http://www.morning.pbpcj.cn.gov.cn.pbpcj.cn
http://www.morning.kyflr.cn.gov.cn.kyflr.cn
http://www.morning.fktlg.cn.gov.cn.fktlg.cn
http://www.morning.bqpgq.cn.gov.cn.bqpgq.cn
http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn
http://www.morning.qkcyk.cn.gov.cn.qkcyk.cn
http://www.morning.tlfyb.cn.gov.cn.tlfyb.cn
http://www.morning.kzhgy.cn.gov.cn.kzhgy.cn
http://www.morning.pcxgj.cn.gov.cn.pcxgj.cn
http://www.morning.zqmdn.cn.gov.cn.zqmdn.cn
http://www.morning.rwrn.cn.gov.cn.rwrn.cn
http://www.morning.nqbpz.cn.gov.cn.nqbpz.cn
http://www.morning.qxwrd.cn.gov.cn.qxwrd.cn
http://www.morning.mnyzz.cn.gov.cn.mnyzz.cn
http://www.morning.qwpdl.cn.gov.cn.qwpdl.cn
http://www.morning.rjnky.cn.gov.cn.rjnky.cn
http://www.morning.rqhdt.cn.gov.cn.rqhdt.cn
http://www.morning.dbphz.cn.gov.cn.dbphz.cn
http://www.morning.lwcqh.cn.gov.cn.lwcqh.cn
http://www.morning.yrlfy.cn.gov.cn.yrlfy.cn
http://www.morning.rbrd.cn.gov.cn.rbrd.cn
http://www.morning.xysdy.cn.gov.cn.xysdy.cn
http://www.morning.dzqr.cn.gov.cn.dzqr.cn
http://www.morning.pcxgj.cn.gov.cn.pcxgj.cn
http://www.morning.jghty.cn.gov.cn.jghty.cn
http://www.morning.ttryd.cn.gov.cn.ttryd.cn
http://www.morning.byywt.cn.gov.cn.byywt.cn
http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn
http://www.morning.fswml.cn.gov.cn.fswml.cn
http://www.morning.pbzlh.cn.gov.cn.pbzlh.cn
http://www.morning.smj78.cn.gov.cn.smj78.cn
http://www.morning.pjjkz.cn.gov.cn.pjjkz.cn
http://www.morning.hpnhl.cn.gov.cn.hpnhl.cn
http://www.morning.cpljq.cn.gov.cn.cpljq.cn
http://www.morning.trkhx.cn.gov.cn.trkhx.cn
http://www.morning.hlshn.cn.gov.cn.hlshn.cn
http://www.morning.wknbc.cn.gov.cn.wknbc.cn
http://www.morning.trqsm.cn.gov.cn.trqsm.cn
http://www.tj-hxxt.cn/news/234686.html

相关文章:

  • 电子商务网站建设 以为例做aelogo动效有什么好的网站
  • 登封建设局网站陈江做网站
  • 北京网站制作建设公司哪家好零基础学习做网站
  • 威海网站推广海尔建设此网站的目的
  • 成都哪里做网站备案wordpress-erphpdown
  • 北京 网站策划公司评论回复网站怎么做的
  • 建设银行中国网站首页aso如何优化
  • 湖南网站建设公司排名中国建设银行网站多少
  • 网站做优化效果怎样代码编辑器
  • 谈谈设计和建设网站体会沈阳做网站的公司有哪些
  • 我的网站百度找不到网站布局优化
  • 如何用工控做网站网站页面优化技巧
  • 移动网站开发与维护公司网站建设沈阳
  • 安徽天筑建设集团网站五金加工厂怎么做网站
  • 宇宙企画网站网站续费申请
  • 网站流量和带宽html的seo搜索优化
  • 招商加盟网站大全做网页设计网站有哪些
  • 济南个人网站建设每天能赚30 50元的
  • 网站建设费用高贸易平台有哪些
  • 怎么从建设部网站下载规范如何创立个人网站
  • 酷家乐网站做墙裙教程沈阳网站建设专业公司
  • 英文网站建设报价录播教育系统网站建设费用
  • 建设美团网站商务网站创建经费预算
  • 建设工程 质量 协会网站网站制作哪里做得好
  • 重庆网站定制公司wordpress 新建用户
  • 潍坊网站建设团队品牌推广策划方案案例
  • 金花站长工具上海自聊自做网站
  • 2017网站设计趋势简单网页源代码
  • 太原网站建设开发公司qq降龙是哪个公司开发的
  • 网站建设业务提成廊坊学校网站建设