什么是 Docker

Docker 简介

Docker 核心概念如下:

  1. Docker 引擎 (Docker Engine)
  2. Docker 客户端 (Docker Client)
  3. Docker 镜像 (Docker Images)
  4. Docker 容器 (Docker Containers)
  5. Docker 镜像注册中心 (Docker Registry)

Docker 的特点

  1. 快速运行

  2. 节省资源

    Docker 容器直接运行在 Docker 引擎之上,可直接利用宿主机硬件资源,无需占用过多的系统开销

  3. 便于交付

    Docker 的交付物是镜像,镜像不仅封装了程序,还包含了运行程序的环境

  4. 容易管理

    通过 Docker 客户端直接操作 Docker 引擎,非常方便的管理 Docker 镜像和容器

如何使用 Docker

镜像的常用操作

  1. 列出镜像

    1. [root@dev ~]# docker images
    2. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    3. centos latest ab9a80ab07d0 2 weeks ago 201.8 MB

    以上表格包含 5 个字段,其中

    • REPOSITORY 镜像仓库的名称
    • TAG 镜像的标签,一般带有版本或别名,这里的 lastest 表示最新版本
    • IMAGE ID 表示镜像的标识符,称为镜像 ID ,具备唯一性
    • created 表示镜像的创建时间
    • SIZE 大小
  2. 拉取镜像 docker pull

  3. 搜索镜像

    执行上面的命令,会输出带有 centos 关键字的镜像仓库。

    1. [root@dev ~]# docker search centos
    2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    3. centos The official build of CentOS. 5070 [OK]
    4. ansible/centos7-ansible Ansible on Centos7 119 [OK]
    5. jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x... 104 [OK]
    6. consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 73 [OK]
    7. imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 48 [OK]
    8. centos/mysql-57-centos7 MySQL 5.7 SQL database server 45
    9. tutum/centos Simple CentOS docker image with SSH access 43
    10. gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 38 [OK]
    11. openshift/base-centos7 A Centos7 derived base image for Source-To... 37
    12. centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Relationa... 36
    13. centos/python-35-centos7 Platform for building and running Python 3... 33
    14. kinogmt/centos-ssh CentOS with SSH 25 [OK]
    15. openshift/jenkins-2-centos7 A Centos7 based Jenkins v2.x image for use... 20
    16. centos/php-56-centos7 Platform for building and running PHP 5.6 ... 17
    17. pivotaldata/centos-gpdb-dev CentOS image for GPDB development. Tag nam... 10
    18. openshift/wildfly-101-centos7 A Centos7 based WildFly v10.1 image for us... 6
    19. openshift/jenkins-1-centos7 DEPRECATED: A Centos7 based Jenkins v1.x i... 4
    20. darksheer/centos Base Centos Image -- Updated hourly 3 [OK]
    21. pivotaldata/centos-mingw Using the mingw toolchain to cross-compile... 2
    22. pivotaldata/centos Base centos, freshened up a little with a ... 2
    23. blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK]
    24. pivotaldata/centos-gcc-toolchain CentOS with a toolchain, but unaffiliated ... 1
    25. smartentry/centos centos with smartentry 0 [OK]
    26. pivotaldata/centos7-build CentosOS 7 image for GPDB compilation 0
    27. pivotaldata/centos7-test CentosOS 7 image for GPDB testing 0

    字段的意义如下

    1. NAME 表示镜像仓库的名称

      1. 不带 / 表示 Docker 官方发布的仓库
      2. 其他仓库表示个人仓库
    2. DESCRIPTION 表示镜像仓库描述
    3. STARS 表示镜像的收藏数,该数字体现该仓库的受欢迎程度
    4. OFFICAL 是否为官方仓库,官方仓库具有更高的安全性
    5. AUTOMATED 是否自动构建镜像仓库,用户可以将自己的 Docker Hub 绑定到 GitHub 或者 BitBucket 上,当代码提交后,可以自动构建镜像仓库
  4. 导出和导入镜像

    1. [root@dev docker]# docker save centos > centos.tar
    2. [root@dev docker]# docker load < centos.tar

当获取镜像后,就能基于镜像启动相应的容器。

容器的常用操作

  1. 创建并启动容器

    1. [root@dev docker]# docker run -i -t centos /bin/bash
    • -i 选项: 表示启动容器后,打开标准输入设备 (STDIN) ,可使用键盘进行输入
    • -t 选项: 表示启动容器后,分配一个伪终端,与服务器奖励一个会话
    • centos 参数: 表示需要运行的镜像名称,标准格式为 centos:latest ,若为 latest 版本,可以省略
    • /bin/bash 参数: 表示运行容器中的 bash 应用程序

    执行该命令后,会首先从本地拉取 centos 镜像,如果本地没有此镜像,就会从 docker hub 上拉取并存放在本地,随后就能根据镜像创建并启动 centos 容器。

    此时可以参考容器的命令提示符:

    1. [root@5b51855797e3 /]#

    其中

    • root 表示当前登录的用户名,默认都是以超级管理员身份登录的
    • 5b51855797e3 表示容器的标识符,一般称为 “容器 ID"
    • / 表示当前路径

    可在 # 符号后输入 Linux 命令,执行 exit 命令退出容器

  2. 列出容器

    1. [root@dev ~]# docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 5b51855797e3 centos "/bin/bash" 17 minutes ago Up 17 minutes sharp_mccarthy

    结果字段的具体意义如下

    1. CONTAINER ID 表示容器 ID
    2. IMAGE 镜像名称
    3. COMMAND 启动容器时运行的命令,Docker 要求在启动容器时需要运行一个命令
    4. CREATED 容器创建时间
    5. STAUS 表示容器运行的状态
      1. Up 表示运行中
      2. Existed 表示已退出
    6. PORTS 表示容器需要对外暴露的端口号
    7. NAMES 容器的名称

    docker ps 命令包括一些常用选项,描述如下

    • -a 列出所有的容器,包含所有的状态
    • -l 表示列出最近创建的容器,包括所有的状态
    • -n 表示列出 n 个 最近创建的容器,包括所有的状态
    • -q 表示仅仅列出 CONTAINER ID 字段
    • -s 表示在输出表格中增加一个 SIZE 字段
  3. 进入容器

    1. [root@dev ~]# docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. c6e7132314fd centos "/bin/bash" 2 minutes ago Up 2 minutes happy_colden
    4. [root@dev ~]# docker attach c6e7132314fd
    5. [root@c6e7132314fd /]#

    只能进入运行中的数据,不能进入已停止的数据。

  4. 执行命令

    使用以下命令像运行中的容器执行具体的命令

    1. [root@dev ~]# docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. e5fa12acb939 centos "/bin/bash" 20 seconds ago Up 19 seconds pensive_fermat
    4. [root@dev ~]# docker exec -i -t e5fa12acb939 ls -l
    5. total 56
    6. -rw-r--r-- 1 root root 12076 Dec 5 01:37 anaconda-post.log
    7. lrwxrwxrwx 1 root root 7 Dec 5 01:36 bin -> usr/bin
    8. drwxr-xr-x 5 root root 380 Dec 26 09:52 dev
    9. drwxr-xr-x 47 root root 4096 Dec 26 09:52 etc
    10. drwxr-xr-x 2 root root 4096 Apr 11 2018 home
    11. lrwxrwxrwx 1 root root 7 Dec 5 01:36 lib -> usr/lib
    12. lrwxrwxrwx 1 root root 9 Dec 5 01:36 lib64 -> usr/lib64
    13. drwxr-xr-x 2 root root 4096 Apr 11 2018 media
    14. drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
    15. drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
    16. dr-xr-xr-x 192 root root 0 Dec 26 09:52 proc
    17. dr-xr-x--- 2 root root 4096 Dec 5 01:37 root
    18. drwxr-xr-x 11 root root 4096 Dec 5 01:37 run
    19. lrwxrwxrwx 1 root root 8 Dec 5 01:36 sbin -> usr/sbin
    20. drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
    21. drwxr-xr-x 13 root root 0 Dec 26 09:45 sys
    22. drwxrwxrwt 7 root root 4096 Dec 5 01:37 tmp
    23. drwxr-xr-x 13 root root 4096 Dec 5 01:36 usr
    24. drwxr-xr-x 18 root root 4096 Dec 5 01:36 var
  5. 停止容器

    使用下面命令停止运行中的容器(需要指定 ID 或者容器名称):

    1. docker stop e5fa12acb939

    该命令会想容器发送 SIGTERM 信号,将等待很短的时间,再对容器发送 SIGKILL 信号,会立即终止容器。

  6. 终止容器

    1. docker kill e5fa12acb939
  7. 启动容器

    可以启动已经停止的容器

    1. docker start e5fa12acb939
  8. 重启容器

    1. docker restart e5fa12acb939
  9. 删除容器

    1. docker rm e5fa12acb939

    不能删除正在运行的容器,只能将它停止后,再删除。

  10. 导入和导出容器

    1. docker export e5fa12acb939 > centos.tar
    2. docker import foo.tar reycg/centos:latest

Docker 命令汇总

  1. docker help

手工制作 java 镜像

整体步骤

  1. 容器启动前, 准备一个 JDK 压缩包,并存放在宿主机的 ~/software 目录下
  2. 容器启动时,通过数据卷的方式,将宿主机的 ~/software 目录挂载到容器的 /mnt/software 目录
  3. 容器启动后,先解压 JDK 压缩包,随后创建 JDK 符号链接
  4. 使用 docker commit 命令,提交当前容器为 reycg/java 的镜像
  5. 运行 reycg/java 镜像,启动一个 java 容器,并输出 java 版本号,从而验证镜像是否可用,最后自动删除当前容器

具体命令如下,前 3 个步骤

  1. [root@dev software]# ls
  2. jdk-8u121-linux-x64.tar.gz
  3. [root@architecture01.general.dev.tj1 software]# docker run -i -t -v ~/software/:/mnt/software centos /bin/bash
  4. [root@b3d2064d1a3d /]# ls
  5. anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
  6. [root@b3d2064d1a3d /]# ll /mnt/software/
  7. total 178956
  8. -rw-r--r-- 1 root root 183246769 Dec 26 12:41 jdk-8u121-linux-x64.tar.gz
  9. [root@b3d2064d1a3d /]# tar -zxf /mnt/software/jdk-8u121-linux-x64.tar.gz -C /opt/
  10. [root@b3d2064d1a3d /]# ll /opt/
  11. total 4
  12. drwxr-xr-x 8 10 143 4096 Dec 13 2016 jdk1.8.0_121
  13. [root@b3d2064d1a3d /]# ln -s /opt/jdk1.8.0_121 /opt/jdk
  14. [root@b3d2064d1a3d /]# ll /opt/jdk
  15. lrwxrwxrwx 1 root root 17 Dec 26 12:44 /opt/jdk -> /opt/jdk1.8.0_121
  16. [root@b3d2064d1a3d /]# /opt/jdk/bin/java -version
  17. java version "1.8.0_121"
  18. Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
  19. Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

步骤 4, 5

  1. [root@dev software]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
  3. reycg/java latest d3c1df69ffb2 13 seconds ago 571.9 MB
  4. centos latest ab9a80ab07d0 2 weeks ago 201.8 MB
  5. [root@dev software]# docker run --rm reycg/java /opt/jdk/bin/java -version
  6. java version "1.8.0_121"
  7. Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
  8. Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

上面过程是手工完成的,除了这种方式,我们还可以写一段脚本,让其自动运行同样可以生成镜像,这就是下面讲的 Dockerfile。

使用 Dockerfile 制作镜像

Dockerfile 脚本文件,包括一些指令,通过学习这些指令,可以快速的编写镜像的构建脚本,从而让构建镜像做到自动化。下面先了解下 Docker file 的基本结构。

Dockerfile 的基本结构

  1. 设置基础镜像

    1. FROM centos:latest

    FROM 指令的值有固定的格式,即“仓库名:标签名”,若使用基础镜像的最新版本,则 latest 签名可以省略,否则需要指定基础镜像的具体版本。

  2. 设置维护者信息

    1. MAINTAINER "reycg"<reycg2017@163.com>

    MAINTAINER 指令没有固定格式,建议使用姓名与邮箱的格式,可以同时指定多个人

  3. 设置需要添加到容器中的文件

    1. ADD jdk-8u121-linux-x64.tar.gz /opt

    ADD 指令的第一个参数是宿主机的来源路径(可使用相对路径),第二个参数是容器的目标路径(必须为绝对路径)。

    ADD 指令还可以自动解压来源路径中的压缩包,将解压后的文件复制到目标路径中。

    除了 ADD 指令,还有一个类似的 COPY 指令,只是它只能完成简单的复制,而没有自动解压的功能。

  4. 设置镜像制作过程中需要执行的命令

    1. RUN ln -s /opt/jdk1.8.0_121 /opt/jdk

    使用 RUN 指令可以执行一系列构建镜像所需的命令,如果要执行多条命令,可以使用多行 RUN 命令,但最好是通过 \ 换行符合并成一条,这样能够减小所构建的镜像的体积。

  5. 设置容器启动时需要执行的命令

    1. CMD /opt/jdk/bin/java -version

    如果在使用 docker run 命令时指定了需要执行的命令,会覆盖 Dockerfile CMD 指令。

    在 Dockerfile 还有一个类似的 ENTRYPOINT 指令,只是后者所执行的指令不能被 docker run 覆盖。

了解了 Dockerfile 的基本结果后,后面我们使用 Dockerfile 构建一个 java 镜像。

使用 Dockerfile 构建镜像

将上一节的 Dockerfile 指令整理一下,得到汇总的文件内容:

  1. FROM centos:latest
  2. MAINTAINER "reycg"<reycg2017@163.com>
  3. ADD jdk-8u121-linux-x64.tar.gz /opt
  4. RUN ln -s /opt/jdk1.8.0_121 /opt/jdk
  5. CMD /opt/jdk/bin/java -version

下面就使用 docker build 命令读取 Dockerfile 文件,并构建一个镜像:

  1. [root@dev software]# docker build -t reycg/java .
  2. Sending build context to Docker daemon 183.2 MB
  3. Sending build context to Docker daemon
  4. Step 0 : FROM centos:latest
  5. ---> ab9a80ab07d0
  6. Step 1 : MAINTAINER "reycg"<reycg2017@163.com>
  7. ---> Running in ae37609d29d2
  8. ---> 51911673bc4a
  9. Removing intermediate container ae37609d29d2
  10. Step 2 : ADD jdk-8u121-linux-x64.tar.gz /opt
  11. ---> e4743bdb5bcd
  12. Removing intermediate container 4ef5335f53e0
  13. Step 3 : RUN ln -s /opt/jdk1.8.0_121 /opt/jdk
  14. ---> Running in 513ba2d0d2ff
  15. ---> 097586ce97cd
  16. Removing intermediate container 513ba2d0d2ff
  17. Step 4 : CMD /opt/jdk/bin/java -version
  18. ---> Running in cde9191ea078
  19. ---> cd4c35cfb8ac
  20. Removing intermediate container cde9191ea078
  21. Successfully built cd4c35cfb8ac

当执行成功后,将输出最终的镜像 ID (d3c1df69ffb2 ),此时可通过 docker images 查看最终生成的镜像

  1. [root@dev software]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
  3. reycg/java latest cd4c35cfb8ac 27 minutes ago 571.9 MB
  4. <none> <none> d3c1df69ffb2 56 minutes ago 571.9 MB
  5. centos latest ab9a80ab07d0 2 weeks ago 201.8 MB

此时可使用 docker tag 命令来修改镜像的仓库名和标签名。

  1. docker tag d3c1df69ffb2 reycg/java:1.0

此时再查看当前的镜像

  1. [root@dev software]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
  3. reycg/java latest cd4c35cfb8ac 33 minutes ago 571.9 MB
  4. reycg/java 1.0 d3c1df69ffb2 About an hour ago 571.9 MB

安装 jdk 后都需要设置一个 JAVA_HOME 和 PATH 环境变量,这样就可以在命令行中直接使用 Java 命令了。可以使用 ENV 指令来完成。

  1. ENV JAVA_HOME /opt/jdk
  2. ENV PATH $JAVA_HOME/bin:$PATH

这样完整的 Dockerfile 指令如下

  1. FROM centos:latest
  2. MAINTAINER "reycg"<reycg2017@163.com>
  3. ADD jdk-8u121-linux-x64.tar.gz /opt
  4. RUN ln -s /opt/jdk1.8.0_121 /opt/jdk
  5. ENV JAVA_HOME /opt/jdk
  6. ENV PATH $JAVA_HOME/bin:$PATH
  7. CMD java -version

与 Spring Boot 整合

在微服务架构中,交付方式由应用程序转变为 Docker 镜像,将服务及其运行环境封装在 Docker 镜像中。若需要发布服务时,只需要根据镜像启动相应的容器即可。

搭建 Spring Boot 应用程序框架

标准的 Spring Boot 应用程序的 Maven 配置如下

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>demo.msa</groupId>
  5. <artifactId>mesa-hello</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>jar</packaging>
  8. <name>mesa-hello</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. </properties>
  13. <parent>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-parent</artifactId>
  16. <version>1.3.3.RELEASE</version>
  17. </parent>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-actuator</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>junit</groupId>
  29. <artifactId>junit</artifactId>
  30. <scope>test</scope>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <plugins>
  35. <plugin>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-maven-plugin</artifactId>
  38. </plugin>
  39. </plugins>
  40. </build>
  41. </project>

由于使用了 spring-boot-maven-plugin 插件,在 mvn package 打包后将生成一个直接运行的 jar 包,生成的 jar 包默认文件名格式为 ${project.build.finalName} ,它是一个 maven 属性,相当于 ${project.artifactId}:${project.version}.

添加 Dockerfile

我们的应用是基于 Maven 构建的,Maven 规范要求我们将所有的资源放在 src/main/resources 资源目录下。 Dockerfile 也是资源文件,因此也需要放在该目录下。完整的文件内容如下:

  1. FROM java
  2. MAINTAINER "ReyCG"<reycg2017@163.com>
  3. ADD mesa-hello-0.0.1-SNAPSHOT.jar app.jar
  4. EXPOSE 8080
  5. CMD java -jar app.jar

默认情况下, Spring Boot 开启的是 8080 端口,因此使用 ExPOSE 指令暴露出来。

最后使用 java -jar app.jar 执行 jar 包。

使用 Maven 构建 Docker 镜像

Dockerfile 创建成功了,下一步就是读取 Dockerfile,并构建 Docker 镜像。而这些则是由 spotfy 公司的 docker-maven-plugin 插件来完成的。具体 maven 配置如下:

  1. <plugin>
  2. <groupId>com.spotify</groupId>
  3. <artifactId>docker-maven-plugin</artifactId>
  4. <version>0.4.10</version>
  5. <configuration>
  6. <imageName>${project.groupId}/${project.artifactId}:${project.version}</imageName>
  7. <dockerDirectory>${project.build.outputDirectory}</dockerDirectory>
  8. <resources>
  9. <resource>
  10. <directory>${project.build.directory}</directory>
  11. <include>${project.build.finalName}.jar</include>
  12. </resource>
  13. </resources>
  14. </configuration>
  15. </plugin>

下面来解释下 configuration 片段

  • imageName Docker 镜像名称,它由 ${project.groupId} 仓库名,${project.artifactId} 镜像名和 ${project.version} 标签名组成
  • dockerDirectory 指定 Dockerfile 文件所在的目录
  • resources/resource/directory 指定需要复制的根目录,其中 ${project.build.directory} 则表示 target 目录
  • resources/resource/directory 指定需要复制的文件

执行 mvn docker:build 即可编译镜像。编译成功后,查看一下

  1. [tomcat@ root]$ docker images
  2. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
  3. demo.msa/mesa-hello 0.0.1-SNAPSHOT 67b94db5ac60 About an hour ago 657 MB

启动 Spring Boot 的 Docker 容器

在后台运行容器,并将容器的 8080 端口绑定到宿主机 58080 端口上。

  1. docker run -d -p 58080:8080 demo.msa/mesa-hello:0.0.1-SNAPSHOT

通过浏览器访问 localhost:8080 请求来验证下。

调整 Docker 内存限制

可以使用如下 Docker 命令监控 Docker 容器的运行情况

  1. [tomcat@ root]$ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. eb8659f31ca3 demo.msa/mesa-hello:0.0.1-SNAPSHOT "/bin/sh -c 'java -j 37 minutes ago Up 37 minutes 0.0.0.0:58080->8080/tcp sharp_hodgkin
  4. [tomcat@ root]$ docker stats eb8659f31ca3
  5. CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O
  6. eb8659f31ca3 0.10% 540.2 MB/8.128 GB 6.65% 5.024 kB/7.208 kB

由此命令可以看出容器的 CPU 使用率,内存使用情况与使用率,网络 IO 使用情况等信息。

从内存使用情况来看,启动容器后默认分配了 8.128 GB 的内存,其中已经使用了 540.2 MB。由此我们可以估算出容器应用程序的最大内存,对启动容器所需分配的内存做出限制,可以节省更多的宿主机内容。从而可以启动更多的容器。

docker run 命令中添加 -m 参数就可以调整容器的内存限制。

  1. [tomcat@ root]$ docker run -d -m 800m -p 58080:8081 demo.msa/mesa-hello:0.0.1-SNAPSHOT
  2. 40c7c49d0002c08c72034d97bb39d0b415df7a7eef0bfa959853649c88c8e77c
  3. [tomcat@ root]$ docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 40c7c49d0002 demo.msa/mesa-hello:0.0.1-SNAPSHOT "/bin/sh -c 'java -j 4 seconds ago Up 3 seconds 0.0.0.0:58080->8081/tcp dreamy_mcclintock
  6. [tomcat@root]$ docker stats 40c7c49d0002
  7. CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O
  8. 40c7c49d0002 105.87% 531.8 MB/838.9 MB 63.39% 468 B/558 B

问题记录

  1. centos 6 如何安装 docker

    https://www.liquidweb.com/kb/how-to-install-docker-on-centos-6/

  2. docker 不能连接问题

    1. Get http:///var/run/docker.sock/v1.19/images/json: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

    解决方案 http://www.cnblogs.com/ashinliu/p/5477259.html

    http://tinylab.org/use-docker-without-sudo/

参考

  1. 《架构探险—轻量级微服务架构》
  2. https://www.liquidweb.com/kb/how-to-install-docker-on-centos-6/
  3. http://www.cnblogs.com/ashinliu/p/5477259.html

docker 知识点汇总的更多相关文章

  1. nginx几个知识点汇总

    WHY? 为什么用Nginx而不用LVS? 7点理由足以说明一切:1 .高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 - 3 万并发连接数.?2 .内存消耗少: 在 3 万 ...

  2. docker命令汇总

    docker命令汇总 序号 类别 简述 命令 功能 说明 1 整体管理 安装 yum install docker-engine centos上安装docker Ubuntu上安装dockerapt- ...

  3. python全栈开发 * 10知识点汇总 * 180612

    10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...

  4. 清华大学OS操作系统实验lab1练习知识点汇总

    lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...

  5. c++ 函数知识点汇总

    c++ 函数知识点汇总 swap函数 交换两个数组元素 比如 swap(a[i],a[j]); 就是交换a[i] 和 a[j] 的值 strcpy() 复制一个数组元素的值到另一个数组元素里 strc ...

  6. 前端开发 JavaScript 干货知识点汇总

    很多初学的朋友经常问我,前端JavaScript都需要学习哪些东西呀?哪些是JavaScript的重点知识啊? 其实做前端开发工程师,所有的知识点都是我们学习必备的东西,只有扎实的技术基础才是高薪的关 ...

  7. BBS项目知识点汇总

    目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...

  8. Java面试知识点汇总

    Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总   版权声明 ...

  9. Docker 资源汇总

    Docker 资源汇总 Docker官方英文资源 Docker官网:http://www.docker.com Docker Windows 入门:https://docs.docker.com/do ...

随机推荐

  1. Lily-一个埋点管理工具

    本文来自网易云社区 前言 在很多项目中,埋点数据使用表格来统计的,随着项目的进行,数据量越来越复杂,越来越难以维护.所以很多公司都已经开发了一整套系统,从埋点的录入到代码的输出. 我们项目中iOS和A ...

  2. 564. Find the Closest Palindrome

    Given an integer n, find the closest integer (not including itself), which is a palindrome. The 'clo ...

  3. django 中 Oauth2 实现第三方登陆

    django 中 Oauth2 实现第三方登陆 python网站第三方登录,social-auth-app-django模块, social-auth-app-django模块是专门用于Django的 ...

  4. GoLang学习控制语句之if/else

    if语句 if 是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行 if 后由大括号括起来的代码块,否则就忽略该代码块继续执行后续的代码. if condition { // do ...

  5. mysql创建账号及管理权限

    mysql创建账号及管理权限 0.mysql版本8.0.15,服务器版本:RHEL 6.5 1.创建用户名密码 mysql> use mysql; mysql> create user ' ...

  6. 让PETSc跑得再快一些

    最近做了一个使用PETSc来求解线性方程组(Ax=b)的项目,把其中遇到的一些坑和解决方法记录下来.本文不介绍PETSc如何入门,而是给出一些能让PETSc运行得更快的编程细节.开始我只是简单地修改P ...

  7. switch...case... 语句中的类型转换

    switch语句对case表达式的结果类型有如下要求: 要求case表达式的结果能转换为switch表示式结果的类型 并且如果switch或case表达式的是无类型的常量时,会被自动转换为此种常量的默 ...

  8. MVC3学习:利用mvc3+ajax检测用户是否被注册

    假设用户名是保存在表Users中.关系模式为Users(Uid,UserName,PassWord) 可先利用mvc自带的模板生成Create页面. 将填写用户名的地方,由原来的 <div cl ...

  9. (转) JVM Crash with SIGSEGV - problematic frame - libzip.so

    原文:https://stackoverflow.com/questions/38057362/jvm-crash-with-sigsegv-problematic-frame-libzip-so h ...

  10. 使用mysql workbench和vscode进行数据库差异比对

    按照如图步骤,导出正式服务器的数据库和测试服务器数据库,并按照指定格式命名. 在vscdoe的文件列表下选中待比较文件1,右键-选择以进行比较. 然后选中第二文件,右键-与已选择文件比较