0%

安装遇到问题

Could not execute auto check for display colors using command /usr/bin/xdpyinfo.

这个问题说是要求显示256色

1

Activiti部署

环境准备

环境准备这块需要准备的东西不多,有一下三块,其中JDK是Java的运行环境,Tomcat是Activiti的运行容器,Activiti压缩包中主要是要其中的war包,用作部署在Tomcat容器中

  • JDK1.8
  • Tomcat8
  • Activiti的压缩包

安装JDK1.8

这块就不多讲了,自己百度,网上有很多资料,尽量不要使用CentOS自带的OpenJdk,容易出现问题

Tomcat8安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 下载Tomcat
[root@localhost Download]# wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.50/bin/apache-tomcat-8.0.50.zip
# 解压缩
[root@localhost Download]# unzip apache-tomcat-8.0.50.zip
# 创建Tomcat程序安装目录
[root@localhost Download]# mkdir /usr/local/tomcat
# 把Tomcat移到安装目录下
[root@localhost Download]# mv apache-tomcat-8.0.50 /usr/local/tomcat/
[root@localhost Download]# cd /usr/local/tomcat/bin/
# 添加执行权限,没有执行权限,文件是没法运行的
[root@localhost bin]# chmod +x *.sh
# 启动Tomcat程序
[root@localhost bin]# ./startup.sh
# 添加防火墙端口开放
[root@localhost bin]# firewall-cmd --add-port=8080/tcp --permanent
[root@localhost bin]# firewall-cmd --reload

Activiti下载及部署

1
2
3
4
5
6
7
8
9
10
11
12
# 下载
[root@localhost Download]# wget https://github.com/Activiti/Activiti/releases/download/activiti-6.0.0/activiti-6.0.0.zip
# 解压缩
[root@localhost Download]# unzip activiti-6.0.0.zip
[root@localhost Download]# cd activiti-6.0.0/
# 把activiti的war包拷贝到tomcat下进行部署
[root@localhost activiti-6.0.0]# cp wars/* /usr/local/tomcat/apache-tomcat-8.0.50/webapps/
# 重启Tomcat
[root@localhost activiti-6.0.0]# ps -ef|grep java
[root@localhost activiti-6.0.0]# kill -9 2642
[root@localhost activiti-6.0.0]# cd /usr/local/tomcat/apache-tomcat-8.0.50/bin/
[root@localhost activiti-6.0.0]# ./startup.sh

创建流程体验

创建三个不同的用户作为流程参与者

ID Email Name Remark
admin admin Administrator 系统默认用户,不需要创建,默认就有
userdev userdev@126.com userDEV 流程发起者,开发人员
userhr userhr@126.com userHR 人资
usertl usertl@126.com userTL TeamLeader
  1. 登录系统,系统地址为http://192.168.2.163:8080/activiti-app,默认的admin密码为test
  2. 打开上面的界面后,点击“Users”TAB页卡,然后点击页面中的“Create User”按钮,打开用户创建界面
  3. 其中Password随意自己记下来就可以,后面会用到FirstName也是随意的

设计一个二级审批流程

流程的流程图如下

  1. 回到主页面,点击Kickstart App创建流程
  2. 点击“Create Process”按钮,打开新增流程界面
  3. 填写流程的基础信息,其中需要注意Model Key是作为流程之间唯一性的标识,也就是不能和其他流程重复
  4. 点击图中的圆圈,点击圆圈右侧的头像,可以新增一个节点
  5. 双击新增节点,可编辑节点的名称,点击节点,下方的Assignments可以设置本节点的参与者
  6. 然后再设置下HR审批节点上的参与者信息

参与者协同完成流程


Java中牵扯到小数点的计算的时候,往往会出现各种加减乘除的出来的数据不是我们想要的数据的情况,如下

1
Math.round(value * 100) / 100.0;

上面的方法并不能解决精度的问题,会出现10.0000000009和0.00000000001的问题,其正确的处理方案为转化为BigDecimal然后进行运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;

/**
* @Title: DoubleUtil
* @Description: Double类型数字计算
* @author: Daniel
* @version: V1.0
**/

/**
* double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型
* 整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可
* 以下是摘抄的BigDecimal方法:
*/
public class DoubleUtil implements Serializable {
private static final long serialVersionUID = -3345205828566485102L;
// 默认除法运算精度
private static final Integer DEF_DIV_SCALE = 2;

/**
* 提供精确的加法运算。
*
* @param value1 被加数
* @param value2 加数
* @return 两个参数的和
*/
public static Double add(Double value1, Double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2).doubleValue();
}

/**
* 提供精确的减法运算。
*
* @param value1 被减数
* @param value2 减数
* @return 两个参数的差
*/
public static double sub(Double value1, Double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.subtract(b2).doubleValue();
}

/**
* 提供精确的乘法运算。
*
* @param value1 被乘数
* @param value2 乘数
* @return 两个参数的积
*/
public static Double mul(Double value1, Double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.multiply(b2).doubleValue();
}

/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。
*
* @param dividend 被除数
* @param divisor 除数
* @return 两个参数的商
*/
public static Double divide(Double dividend, Double divisor) {
return divide(dividend, divisor, DEF_DIV_SCALE);
}

/**
* 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
*
* @param dividend 被除数
* @param divisor 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static Double divide(Double dividend, Double divisor, Integer scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(dividend));
BigDecimal b2 = new BigDecimal(Double.toString(divisor));
return b1.divide(b2, scale,RoundingMode.HALF_UP).doubleValue();
}

/**
* 提供指定数值的(精确)小数位四舍五入处理。
*
* @param value 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double value,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(value));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale, RoundingMode.HALF_UP).doubleValue();
}
}

简述

通常生产环境由于安全原因都无法访问互联网。此时就需要进行离线安装,主要有两种方式:源码编译、rpm包安装。源码编译耗费时间长且缺乏编译环境,所以一般都选择使用离线rpm包安装

环境

CentOS 7.2

查看依赖包

可以使用yum deplist命令来查找rpm包的依赖列表。例如,要查找perl的依赖包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
[xxxx@xxxx perl]$ yum deplist perl
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.yun-idc.com
* extras: mirrors.aliyun.com
* updates: mirrors.ustc.edu.cn
软件包:perl.x86_64 4:5.16.3-295.el7
依赖:libc.so.6(GLIBC_2.14)(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:libcrypt.so.1()(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:libdl.so.2()(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:libgdbm.so.4()(64bit)
provider: gdbm.x86_64 1.10-8.el7
依赖:libgdbm_compat.so.4()(64bit)
provider: gdbm.x86_64 1.10-8.el7
依赖:libm.so.6()(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:libm.so.6(GLIBC_2.2.5)(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:libnsl.so.1()(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:libperl.so()(64bit)
provider: perl-libs.x86_64 4:5.16.3-295.el7
依赖:libpthread.so.0()(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:libresolv.so.2()(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:libutil.so.1()(64bit)
provider: glibc.x86_64 2.17-307.el7.1
依赖:perl(Carp)
provider: perl-Carp.noarch 1.26-244.el7
依赖:perl(Cwd)
provider: perl-PathTools.x86_64 3.40-5.el7
依赖:perl(Exporter)
provider: perl-Exporter.noarch 5.68-3.el7
依赖:perl(File::Path)
provider: perl-File-Path.noarch 2.09-2.el7
依赖:perl(File::Spec)
provider: perl-PathTools.x86_64 3.40-5.el7
依赖:perl(File::Spec::Functions)
provider: perl-PathTools.x86_64 3.40-5.el7
依赖:perl(File::Spec::Unix)
provider: perl-PathTools.x86_64 3.40-5.el7
依赖:perl(File::Temp)
provider: perl-File-Temp.noarch 0.23.01-3.el7
依赖:perl(Filter::Util::Call)
provider: perl-Filter.x86_64 1.49-3.el7
依赖:perl(Getopt::Long)
provider: perl-Getopt-Long.noarch 2.40-3.el7
依赖:perl(Pod::Simple::Search)
provider: perl-Pod-Simple.noarch 1:3.28-4.el7
依赖:perl(Pod::Simple::XHTML)
provider: perl-Pod-Simple.noarch 1:3.28-4.el7
依赖:perl(Scalar::Util)
provider: perl-Scalar-List-Utils.x86_64 1.27-248.el7
依赖:perl(Scalar::Util) >= 1.10
provider: perl-Scalar-List-Utils.x86_64 1.27-248.el7
依赖:perl(Socket)
provider: perl-Socket.x86_64 2.010-5.el7
依赖:perl(Socket) >= 1.3
provider: perl-Socket.x86_64 2.010-5.el7
依赖:perl(Storable)
provider: perl-Storable.x86_64 2.45-3.el7
依赖:perl(Time::HiRes)
provider: perl-Time-HiRes.x86_64 4:1.9725-3.el7
依赖:perl(Time::Local)
provider: perl-Time-Local.noarch 1.2300-2.el7
依赖:perl(constant)
provider: perl-constant.noarch 1.27-2.el7
依赖:perl(threads)
provider: perl-threads.x86_64 1.87-4.el7
依赖:perl(threads::shared)
provider: perl-threads-shared.x86_64 1.43-6.el7
依赖:perl-libs
provider: perl-libs.x86_64 4:5.16.3-295.el7
provider: perl-libs.i686 4:5.16.3-295.el7
依赖:perl-libs = 4:5.16.3-295.el7
provider: perl-libs.x86_64 4:5.16.3-295.el7
provider: perl-libs.i686 4:5.16.3-295.el7
依赖:perl-macros
provider: perl-macros.x86_64 4:5.16.3-295.el7
依赖:rtld(GNU_HASH)
provider: glibc.x86_64 2.17-307.el7.1
provider: glibc.i686 2.17-307.el7.1

下载依赖包

方案一(推荐):repotrack

1
2
3
4
5
# 安装yum-utils
[root@xxxx ~]# yum -y install yum-utils

# 下载perl全量依赖包
[root@xxxx ~]# repotrack perl

方案二:yumdownloader

1
2
3
4
5
# 安装yum-utils
[root@xxxx ~]# yum -y install yum-utils

# 下载 perl 依赖包
$ yumdownloader --resolve --destdir=/tmp perl

参数说明:

  • destdir:指定rpm包下载目录(不指定,默认为当前目录)
  • resolve:下载依赖的rpm包

仅会将主软件包和基于你现在的操作系统所缺少的依赖关系包一并下载。

离线安装rpm

1
rpm -Uvh --force --nodeps *.rpm

Shell教程

Shell是一个C语言编写的教程,他是用户使用Linux的桥梁。Shell即是一种命令语言,有事一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供一个界面,用户通过这个界面访问操作系统内核的服务

Shell脚本

Shell脚本(shell script),是一种为shell编写的脚本程序

第一个Shell脚本

打开文本编辑器(vi/vim创建文件),新建一个test.sh

1
2
#!/bin/bash
echo "Hello World!"
  • 其中#!是一个约定的标记,他告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell
  • echo命令是用于向窗口输出文本
    1
    2
    chmod +x test.sh #给脚本赋可执行权限
    ./test.sh

Shell变量

定义变量,如下

1
2
echo_str="Hello World ehco"
echo $echo_str

注意:变量名和等号之间不能有空格,同时需要遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,可以使用下划线_
  • 不能使用标点符号
  • 不能使用bash里的关键字

除了显式地直接赋值,,还可以用语句给变量赋值

1
2
3
4
5
for file in `ls /etc`;do
echo $file
done

for file in $(ls /etc)

使用变量

使用一个定义过的变量,只要在变量名前面加一个美元符号即可

1
2
3
your_name="Hello World"
echo $your_name
echo ${your_name}

变量外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面的情况

1
2
3
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done

只读变量

使用readonly命令可以讲变量定义为只读变量,只读变量的值不能被改变
下面的例子是尝试更改只读变量,结果报错

1
2
3
4
#!/bin/bash
myUrl="http://www.baidu.com"
readonly myUrl
myUrl="http://xyd.com"

运行脚本后会报如下错误

1
/bin/sh: NAME: This variable is read only.

删除变量

使用unset命令可以删除变量

1
unset variable_name

变量被删除后不能再次使用。unset命令不能删除只读变量

变量类型

运行shell时,会同时存在三种变量:

  • 局部变量:局部变量在脚本或命令中定义,尽在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  • 环境变量:所有的程序,包含shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本可以定义环境变量
  • Shell变量:shell变量是由Shell程序设置的特殊变量。Shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证Shell的正常运行

Shell字符串

字符串是Shell中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号

单引号

1
2
3
danyinhao='danyinhao'
danyinhao='dan''yinhao'
echo $danyinhao

单引号字符串的限制:

  • 单引号里的任何字符都会鸳鸯输出,单引号字符串中的变量是无效的
  • 单引号子串中不能出现单独一个单引号,但可以承兑出现,作为字符串拼接

双引号

1
2
3
4
5
#!/bin/bash

you_name="test name"
str="Hello,I know you are \"${you_name}\"! "
echo -e $str

输出内容如下

1
Hello,I know you are "test name"!

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

your_name="Daniel"

# 使用双引号拼接
greeting="hello,"$your_name"!"
greeting_1="hello ${your_name}!"
echo $greeting $greeting_1

# 使用单引号拼接
greeting_2='hello,'$your_name'!'
greeting_3='hello,${your_name}!'
echo $greeting_2 $greeting_3

执行输出结果

1
2
hello,Daniel! hello Daniel!
hello,Daniel! hello,${your_name}!

因此单引号不支持${}输出变量内容

获取字符串长度

1
2
string="abcd"
echo ${#string} #输出4

提取子字符串

下面实例从字符串第2个字符开始截取4个字符

1
2
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

查找字符i或o的位置(那个字母先出现就计算哪个)

1
2
3
#/bin/bash
string="runoob is a great site"
echo `expr index "$string" io` #输出4

Shell数组

Shell相关实例

查询软件是否安装

1
2
3
4
5
6
7
#或者pName=`exec rpm -qa|grep mariadb`
pName=$(rpm -qa | grep mariadb)
if [ $? -eq 0 ]
then
echo "软件包"${pName}"已经安装。"
else
echo "软件包"${package}"没有安装"

for循环遍历打印rpm安装的包

1
2
3
4
#!/bin/bash
for package in `rpm -qa|grep mysql-community*`; do
echo $package
done

WAS8之后,Websphere的安装包不在区分系统,一份安装包可以在多个平台安装,只是针对Installation Manager进行了操作系统的区分,Websphere的产品必须通过Install Manager安装

准备安装包

安装前准备

  1. 目前手头的拿到的文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Installation Manager安装包
    InstalMgr1.6.2_LNX_X86_64_WAS_8.5.5.zip

    # WAS-FP的安装包
    8.5.5-WS-WAS-FP017-part1.zip
    8.5.5-WS-WAS-FP017-part2.zip
    8.5.5-WS-WAS-FP017-part3.zip

    # WAS_ND安装包
    WAS_ND_V8.5.5_1_OF_3.zip
    WAS_ND_V8.5.5_2_OF_3.zip
    WAS_ND_V8.5.5_3_OF_3.zip
  2. 将上面的zip包放到/opt/WebSphereInstallPackage/

Installation Manager 安装

解压缩文件Installation Manager安装文件

1
2
3
4
5
6
## 切换到放压缩文件的目录下
[root@CDH1 WebSphereInstallPackage]# cd /opt/WebSphereInstallPackage/
## 创建用于解压Installation Manager的目录
[root@CDH1 WebSphereInstallPackage]# mkdir installManager
## 指定刚刚创建的目录进行解压
[root@CDH1 WebSphereInstallPackage]# unzip -d installManager/ InstalMgr1.6.2_LNX_X86_64_WAS_8.5.5.zip

确认下安装配置文件内容

1
2
[root@CDH1 WebSphereInstallPackage]# cd installManager/
[root@CDH1 installManager]# cat install.xml

确认下内容是否和下方的一致(版本version可能存在差异)

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<agent-input clean='true' temporary='true'>
<server>
<repository location='.'/>
</server>
<install>
<offering features='agent_core,agent_jre' id='com.ibm.cic.agent' version='1.6.2000.20130301_2248'/>
</install>
</agent-input>

执行./consoleinst.sh脚本开始安装Installation Manager

  1. 执行./consoleinst.sh脚本,并输入N,进入下一页

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [root@CDH1 installManager]# ./consoleinst.sh
    预处理输入。
    正在装入存储库...
    正在准备和解析所选软件包...


    =====> IBM Installation Manager> 安装

    选择要安装的软件包:
    1. [X] IBM Installation Manager 1.6.2

    O. 检查其他版本、修订程序和扩展

    N. 下一页, C. 取消
    -----> [N] N
  2. 输入A,选择我接手许可协议中的条款

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    =====> IBM Installation Manager> 安装> 许可证

    仔细阅读下列许可证协议。
    通过输入编号来查看许可证协议:
    1. IBM Installation Manager - 许可协议

    选项:
    A. [ ] 我接受许可协议中的条款(A)
    D. [ ] 我不接受许可协议中的条款(D)

    B. 上一页, C. 取消
    -----> [C] A
  3. 输入N,跳到下一页

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    =====> IBM Installation Manager> 安装> 许可证

    仔细阅读下列许可证协议。
    通过输入编号来查看许可证协议:
    1. IBM Installation Manager - 许可协议

    选项:
    A. [X] 我接受许可协议中的条款(A)
    D. [ ] 我不接受许可协议中的条款(D)

    B. 上一页, N. 下一页, C. 取消
    -----> [N] N
  4. 界面会显示Installation Manager默认安装的路径,确认后输入N,继续下一项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    =====> IBM Installation Manager> 安装> 许可证> 位置

    Installation Manager 安装位置:
    /opt/IBM/InstallationManager/eclipse

    选项:
    L. 更改 Installation Manager 安装位置

    B. 上一页, N. 下一页, C. 取消
    -----> [N] N
  5. 安装摘要信息确认,输入I,选择安装。等待安装完成后,输入R重启Installation Manager

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    =====> IBM Installation Manager> 安装> 许可证> 位置> 摘要

    目标位置:
    软件包组名 : IBM Installation Manager
    安装目录 : /opt/IBM/InstallationManager/eclipse

    要安装的软件包:
    IBM Installation Manager 1.6.2

    选项:
    G. 生成安装响应文件

    B. 上一页, I. 安装, C. 取消
    -----> [I] I
    25% 50% 75% 100%
    ------------------|------------------|------------------|------------------|
    ............................................................................

    =====> IBM Installation Manager> 安装> 许可证> 位置> 摘要> 完成

    安装已成功完成。

    选项:
    R. 重新启动 Installation Manager
    -----> [R] R
  6. 输入X退出Installation Manager。至此,Installation Manager安装完成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    =====> IBM Installation Manager

    选择:
    1. 安装 - 安装软件包
    2. 更新 - 查找并安装对已安装软件包的更新和修订
    3. 修改 - 更改已安装的软件包
    4. 回滚 - 还原到已安装软件包的较低版本
    5. 卸载 - 除去已安装的软件包。

    其他选项:
    L. 查看日志
    S. 查看安装历史记录
    V. 查看已安装的软件包
    ------------------------
    P. 首选项
    ------------------------
    A. 关于 IBM Installation Manager
    ------------------------
    X. 退出 Installation Manager

    -----> X

WAS安装

安装前准备

  1. 创建目录,解压文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@CDH1 WebSphereInstallPackage]# cd /opt/WebSphereInstallPackage/
    [root@CDH1 WebSphereInstallPackage]# mkdir wasfp wasnd

    ## 解压WS-WAS-FP
    [root@CDH1 WebSphereInstallPackage]# unzip -d wasfp 8.5.5-WS-WAS-FP017-part1.zip
    [root@CDH1 WebSphereInstallPackage]# unzip -d wasfp 8.5.5-WS-WAS-FP017-part2.zip
    [root@CDH1 WebSphereInstallPackage]# unzip -d wasfp 8.5.5-WS-WAS-FP017-part3.zip

    ## 解压WAS_ND
    [root@CDH1 WebSphereInstallPackage]# unzip -d wasnd WAS_ND_V8.5.5_1_OF_3.zip
    [root@CDH1 WebSphereInstallPackage]# unzip -d wasnd WAS_ND_V8.5.5_2_OF_3.zip
    [root@CDH1 WebSphereInstallPackage]# unzip -d wasnd WAS_ND_V8.5.5_3_OF_3.zip
    解压完的wasnd下的目录结构
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@CDH1 WebSphereInstallPackage]# ll wasnd/
    总用量 12
    -rw-r--r-- 1 root root 380 5月 14 2013 Copyright.txt
    drwxr-xr-x 5 root root 56 5月 14 2013 disk1
    drwxr-xr-x 3 root root 35 5月 14 2013 disk2
    drwxr-xr-x 3 root root 35 5月 14 2013 disk3
    drwxr-xr-x 2 root root 4096 5月 14 2013 lafiles
    drwxr-xr-x 10 root root 156 5月 14 2013 readme
    drwxr-xr-x 3 root root 43 5月 14 2013 Remote_Installation_Tool_for_IBM_i
    -rw-r--r-- 1 root root 81 5月 14 2013 repository.config
    drwxr-xr-x 3 root root 21 5月 14 2013 responsefiles
    解压完的wasfp下的目录结构
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [root@CDH1 WebSphereInstallPackage]# ll wasfp
    总用量 3920
    drwxr-xr-x 3 root root 32 2月 9 16:55 atoc
    drwxr-xr-x 2 root root 237568 2月 9 16:56 files
    drwxr-xr-x 2 root root 65536 7月 9 16:25 native
    drwxr-xr-x 2 root root 4096 2月 9 16:56 Offerings
    drwxr-xr-x 2 root root 4096 2月 9 16:56 plugins
    -rw-r--r-- 1 root root 1284 2月 9 16:56 repository.config
    -rw-r--r-- 1 root root 149657 2月 9 16:56 repository.xml
    -rw-r--r-- 1 root root 394210 2月 9 16:55 update_com.ibm.websphere.BASETRIAL.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 394676 2月 9 16:55 update_com.ibm.websphere.BASE.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 394218 2月 9 16:56 update_com.ibm.websphere.DEVELOPERSILAN.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 394412 2月 9 16:56 update_com.ibm.websphere.DEVELOPERS.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 394653 2月 9 16:56 update_com.ibm.websphere.EXPRESSTRIAL.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 395131 2月 9 16:56 update_com.ibm.websphere.EXPRESS.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 135101 2月 9 16:56 update_com.ibm.websphere.NDDMZTRIAL.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 135262 2月 9 16:56 update_com.ibm.websphere.NDDMZ.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 411363 2月 9 16:55 update_com.ibm.websphere.NDTRIAL.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml
    -rw-r--r-- 1 root root 411815 2月 9 16:55 update_com.ibm.websphere.ND.v85_8.5.5017.20200205_1450_from_8.5.0.20120501_1108.xml

安装Websphere

  1. 使用Installation Manager安装前面解压的Websphere
    进入install Manager安装目录cd /opt/IBM/InstallationManager/eclipse/
    1
    2
    [root@CDH1 WebSphereInstallPackage]# cd /opt/IBM/InstallationManager/eclipse/
    [root@CDH1 eclipse]#
    执行./IBMIM,启动Install Manager的界面,使用Install Manager 安装Websphere应用服务器
    这个启动的时候需要服务器有GUI,也就是有界面,发现使用Xmanager不好使不知道为什么
1
[root@CDH1 eclipse]# ./IBMIM
  1. 点击“文件-首选项”,添加Websphere产品的各个组件存储库位置,分别选择/opt/WebSphereInstallPackage/wasnd/opt/WebSphereInstallPackage/wasfp文件夹下面的仓库配置文件repository.config
  2. 点击“安装”按钮,点击下一步,选择接受协议
  3. 点击“下一步”,选择共享目录位置,默认即可
  4. 点击“下一步”,为对应的软件包Application Server设置安装目录
  5. 设置好安装目录后,点击“下一步”,如果想在管理控制台显示中文,选择简体中文,再点击“下一步”,如果是测试环境,可勾选”样本应用程序,点击“下一步”
  6. 显示“摘要信息”,点击“安装”按钮
  7. 完成后,勾选右侧区域中的“无”,点击“完成”按钮

创建Dmgr管理概要文件

WAS中的概要文件和Weblogic中的domain类似,是WAS中的服务

使用概要管理工具创建概要文件

  1. 进入目录/opt/IBM/WebSphere/AppServer/bin/ProfileManagement/,启动./wct.sh,选择概要管理工具,点击启动所选工具
    1
    2
    $ cd /opt/IBM/WebSphere/AppServer/bin/ProfileManagement/
    # ./wct.sh
  2. 点击“创建”,选择类型为“管理”即Dmgr管理概要文件,点击“下一步”
  3. 选择“Development Manager”,点击“下一步”,选择“高级概要文件创建”,点击“下一步”
  4. 选择“部署管理控制台(建议)”(这个必选),点击“下一步”,填写
  5. 填写单名、主机名和单元名、特别注意此处填写的主机名必须能通过ping解析为相应的ip地址,否则实例将不能启动。节点名和单元名可随便。点击“下一步”
  6. 填写用户名和密码,用来管理Websphere服务器启动豆浆用到,设置好并记住
  7. 安全证书默认,点击“下一步”,然后再点击“下一步”
  8. 端口分配,可按照需要选择,点击下一步
  9. “Linux服务定义”默认,点击“下一步”
  10. “概要文件创建已完成”界面,去掉“启动第一步…”的勾选,点击完成,创建好的概要文件位置在/opt/IBM/Websphere/AppServer/profiles/目录下

通过命令行启动概要管理服务器

  1. 进入概要管理文件所在的目录/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin,执行./startManager.sh启动管理服务进程,在/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/logs/dmgr/目录下查看对应的日志SystemOut文件,查看启动过程是否正常
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@CDH1 bin]# cd /opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin
    [root@CDH1 bin]# ./startManager.sh
    ADMU0116I: 正在文件
    /opt/IBM/WebSphere/AppServer/profiles/Dmgr01/logs/dmgr/startServer.log
    中记录工具信息
    ADMU0128I: 正在启动具有 Dmgr01 概要文件的工具
    ADMU3100I: 正在从服务器读取配置:dmgr
    ADMU3200I: 服务器已启动。正在等待初始化状态。
    ADMU3000I: 为电子商务开放服务器 dmgr;进程标识为 82127

    通过浏览器验证Development Manager启动成功及管理

  2. 在浏览器https://192.168.2.201:9043/ibm/console,应该出现Websphere管理控制台登录页面,输入之前记住的账号和密码 如果安装完成,就验证完毕了,已经安装完成


今天在同一台主机上安装了Windows,然后安装了CentOS,结果发现CentOS的引导把Window的引导给覆盖了,造成Windows进不去了,百度一番发现了如下方案,目前测试发现可行,谨在此记录方便后期使用,系统安装的顺序先Win7/Win10后CentOS7

修复方案一

  1. 编辑grub.cfg
    1
    vim /boot/grub2/grub.cfg
  2. 打开后,定位到如下内容的位置,需要注意grub.d/后面有可能是40_custom或者其他xx_custom
    1
    2
    3
    4
    5
    ### BEGIN /etc/grub.d/40_custom ###
    # This file provides an easy way to add custom menu entries. Simply type the
    # menu entries you want to add after this comment. Be careful not to change
    # the 'exec tail' line above.
    ### END /etc/grub.d/40_custom ###
  3. ### END /etc/grub.d/40_custom ###前面添加如下代码
    1
    2
    3
    4
    menuentry 'Windows 10'{
    set root=(hd0,1)
    chainloader +1
    }
    解析:
  • hd0表示硬盘,1表示c盘,我的windows安装在硬盘的第一个分区,所以此处是 set root=(hd0,1),根据实际情况修改
  1. 重启CentOS7
    1
    reboot

修复方案二(推荐)

  1. root用户登录,修改40_custom文件
    1
    vim /etc/grub.d/40_custom
  2. 在文件的最后添加如下代码
    1
    2
    3
    4
    menuentry 'Windows 10'{
    set root=(hd0,1)
    chainloader +1
    }
    解析:
  • hd0表示硬盘,1表示c盘,我的windows安装在硬盘的第一个分区,所以此处是 set root=(hd0,1),根据实际情况修改
  1. 生成gurb.cfg文件
    1
    grub2-mkconfig -o /boot/grub2/grub.cfg
  2. 重启就能看到Win系统的引导了
    1
    reboot

Docker 教程

Docker 教程

Docker 的应用场景

  • Web应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其他的后台应用

Docker 的优点

Docker是一个用于开发、交付和运行应用程序的开放平台。DOcker使能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,可以与管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付,测试和部署代码,可以大大减少编写代码和在生产环境中运行代码之间的延迟。

  1. 快速,一致的交付应用程序
    Docker允许开发者使用提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期

    • 开发者在本地编写代码,并使用Docker容器与同事共享工作
    • 使用Docker将应用程序推送到测试环境中,并执行自动或手动测试
    • 当开发人员发现错误时,他们可以在开发环境中对其进行秀谷,然后将其重新部署到测试环境中,以进行测试和验证
    • 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
  2. 响应式部署和扩展
    Docker是基于容器的平台,允许高度可移植的工作负载。Docker容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上火混合环境中运行
    DOcker的可移植性和轻量级的特点,还可以轻松的完成动态管理的工作负担,并根据业务需求指示,实现扩展或拆除应用程序和服务。

  3. 在同一硬件上运行更多工作负载
    Docker轻巧快速。他为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker非常适合高密度环境以及中小型部署,而可以使用更少的资源做更多的事情。

Docker架构

Docker包含三个基本概念

  • 镜像(Image):Docker镜像,就相当于是一个root文件系统。比如官方镜像ubuntu16.04就是包含了完整的一套Ubuntu最小系统的root文件系统
  • 容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像时静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
    Docker 使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。
    Docker容器通过Docker镜像来创建。
    容器和镜像的关系类似于面向对象编程中的对象和类。Docker中容器是对象,镜像是类。
概念 说明
Docker镜像(Images) Docker镜像是用于创建DOcker容器的模板
Docker容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体
Docker客户端(Client) Docker客户端通过命令或其他工具使用Docker SDK(https://docs.docker.com/develop/sdk/))与Docker的守护进程(daemon)通讯
Docker主机(Host) 一个物理或者虚拟的机器用于执行Docker守护进程和容器
Docker Registry Docker仓库用来保存镜像,可以理解为代码版本控制中的代码仓库
Docker Hub(https://hub.docker.com/)提供了庞大的镜像集合供使用
一个Docker Registry中可以包含多个仓库(Repositry);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应的该软件的哥哥版本。我们可以通过<仓库名>:<标签>的格式来制定具体是这个软件那个版本的镜像。如果不给出标签,将以latest作为默认标签
Docker Machine Docker Machine是一个简单化Docker安装的命令行工具,通过一个简单的命令就即可在相应的平台上安装Docker

安装

CentOS Docker安装

  1. 如果之前安装过旧的版本,先卸载下

    1
    2
    3
    4
    5
    6
    7
    8
    $ sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  2. 使用仓库(Repository)安装方式(推荐)
    首先需要 设置下Docker仓库,然后你可以从仓库中安装或更新Docker

    • 设置仓库:安装yum-utils包(该包提供yum-config-manager 单元)然后设置稳定版仓库
      1
      2
      3
      4
      5
      $ sudo yum install -y yum-utils

      $ sudo yum-config-manager \
      --add-repo \
      https://download.docker.com/linux/centos/docker-ce.repo
  3. 安装 Docker 引擎

    • 安装最新版本的Docker引擎和容器,安装过程中会要求输入两次‘y’
      1
      $ sudo yum install docker-ce docker-ce-cli containerd.io
      Docker 已经安装完成,但是还没有启动
    • (安装最新版本的可略过本步骤)安装特定版本的Docker 引擎
      1
      2
      3
      4
      5
      6
      # 查看可用版本
      $ yum list docker-ce --showduplicates | sort -r
      docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
      docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
      docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
      docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
    • 根据指定版本安装
      1
      $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  4. 启动Docker

    1
    $ sudo systemctl start docker
  5. 运行hello-world镜像验证是否安装成功,显示This message shows that your installation appears to be working correctly表示安装成功
    下面这个命令是下载一个测试镜像然后在容器中运行它,当容器运行后,将会打印相关信息然后退出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    [root@hecs-x-medium-2-linux-xxxx ~]# docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    0e03bdcc26d7: Pull complete
    Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
    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.
    (amd64)
    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 Ubuntu container with:
    $ docker run -it ubuntu bash

    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/

    For more examples and ideas, visit:
    https://docs.docker.com/get-started/

Docker使用

Docker Hello world

Docker 允许你在容器内运行应用程序,使用docker run命令来在容器内运行一个应用程序

1
2
3
4
5
6
7
8
9
[root@hecs-x-xxx-2-l
- docker:docker的二进制执行文件
- run:与前面的docker组合来运行一个容器
- `ubuntu:15.10`:指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker就会从镜像仓库Docker Hub下载公共镜像
- `/bin/echo "Hello World"`:在启动的容器里面执行的命令
完整意思:Docker以ubuntu15.10镜像创建一个新的容器,然后在容器里面执行bin/echo "Hello world",然后输出结果;当然也可以尝试下面的命令,会进入一个新的系统幺:
```bash
[root@hecs-x-xxxx-2-linux-xxxxx ~]# docker run -it ubuntu bash
root@70b1006ae6a1:/#

运行交互式的容器

我们通过docker的两个参数-i -t,让docker运行的容器实现“对话”的能力

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker run -it ubuntu:15.10 /bin/bash
# 进入一个ubuntu15.10系统的容器
root@686f91a07af0:/#

各个参数解析:

  • -t:在新容器内指定一个伪终端或终端
  • -i:允许你对容器内的标准输入(STDIN)进行交互

我们可以以通过exit命令或者Ctrl+D退出容器

启动容器(后台模式)

使用一下命令创建一个以进程方式运行的容器

1
2
[root@hecs-x-medium-2-linux-xxxx ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true;do echo hello world;sleep1;done"
2698163a0d659bd4d98d7ad3ec8dd6eb3027fb529dcc4159b8b2cef2a505724b

在输出中,我们没有看到期望的“hello world”,而是一串长字符
2698163a0d659bd4d98d7ad3ec8dd6eb3027fb529dcc4159b8b2cef2a505724b
在这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么
首先,需要确认容器有在运行,可以通过docker ps 查看

1
2
3
4
[root@hecs-x-medium-2-linux-xxxx ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2698163a0d65 ubuntu:15.10 "/bin/sh -c 'while t…" 2 minutes ago Up 2 minutes flamboyant_golick
[root@hecs-x-medium-2-linux-xxxx ~]#
  • CONTAINER ID:容器ID
  • IMAGE:使用的镜像
  • COMMAND:启动容器时运行的命令
  • CREATED:创建时间
  • STATUS:容器状态
    • created:已创建
    • restarting:重启中
    • running:运行中
    • removing:前一种
    • paused:暂停
    • exited:停止
    • dead:死亡
  • PORTS:容器的端口信息和使用的连接类型(tcp/udp)
  • NAMES:自动分配的容器名称

在宿主主机内使用docker logs命令,查看容器内的标准输出

1
[root@hecs-x-medium-2-linux-xxxx ~]# docker logs 2b1b7a428627

停止容器

shiyong docker stop命令来停止容器

1
[root@hecs-x-medium-2-linux-xxxx ~]# docker stop 2b1b7a428627

Docker 容器使用

Docker客户端

docker客户端非常简单,可以输入docker命令查看Docker客户端的所有命令选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@hecs-x-medium-2-linux-xxxx ~]# docker

Usage: docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit

Management Commands:
builder Manage builds
config Manage Docker configs
container Manage containers
context Manage contexts
engine Manage the docker engine
image Manage images

可以通过docker command –help 更深入的了解指定的Docker命令使用方法
例如我们要查看docker stats指令的具体使用方法

1
2
3
4
5
6
7
8
9
10
11
12
[root@hecs-x-medium-2-linux-xxxx ~]# docker stats --help

Usage: docker stats [OPTIONS] [CONTAINER...]

Display a live stream of container(s) resource usage statistics

Options:
-a, --all Show all containers (default shows just running)
--format string Pretty-print images using a Go template
--no-stream Disable streaming stats and only pull the first result
--no-trunc Do not truncate output

容器使用

  1. 获取镜像
    如果本地没有ubuntu镜像,我们可以使用docker pull命令里载入ubuntu镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@hecs-x-medium-2-linux-xxxx ~]# docker pull ubuntu
    Using default tag: latest
    latest: Pulling from library/ubuntu
    Digest: sha256:35c4a2c15539c6c1e4e5fa4e554dac323ad0107d8eb5c582d6ff386b383b7dce
    Status: Image is up to date for ubuntu:latest
    docker.io/library/ubuntu:latest
    [root@hecs-x-medium-2-linux-xxxx ~]# docker pull centos
    Using default tag: latest
    latest: Pulling from library/centos
    6910e5a164f7: Pull complete
    Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
    Status: Downloaded newer image for centos:latest
    docker.io/library/centos:latest
  2. 启动容器

    1
    2
    3
    4
    5
    [root@hecs-x-medium-2-linux-xxxx ~]# docker run -it centos /bin/bash
    [root@92f340d92240 /]# docker ps
    bash: docker: command not found
    [root@92f340d92240 /]# exit
    exit
  3. 启动已停止运行的容器
    查看所有的容器命令

    1
    2
    3
    4
    5
    6
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                            PORTS               NAMES
    83e3a5b2c60f centos "/bin/bash" About a minute ago Exited (0) About a minute ago blissful_wright
    92f340d92240 centos "/bin/bash" About a minute ago Exited (127) About a minute ago priceless_burnell
    2698163a0d65 ubuntu:15.10 "/bin/sh -c 'while t…" 25 minutes ago Exited (137) 19 minutes ago flamboyant_golick
    686f91a07af0 ubuntu:15.10 "/bin/bash" 34 minutes ago Exited (0) 30 minutes ago epic_tereshkova
    3ae7d786d261 ubuntu:15.10 "/bin/echo 'Hello Wo…" 18 hours ago Exited (0) 18 hours ago vigilant_payne

    使用docker start 启动一个已停止的容器

    1
    [root@hecs-x-medium-2-linux-xxxx ~]# docker start 92f340d92240
  4. 后台运行
    在大部分场景下,我们希望docker的服务是在后台运行的,我们可以通过-d指定容器的运行模式

    1
    2
    [root@hecs-x-medium-2-linux-xxxx ~]# docker run -itd --name ubuntu-test ubuntu:15.10 /bin/sh
    dd3cff7cf16a8e73187be4fb62e411822d9ffc81f1870e9078a1b9f777d3f652

    注:加了-d参数默认不会进入容器,想要进入容器要使用指令docker exec

  5. 停止/重启一个容器

    1
    $ docker stop <容器ID>

    容器可以通过docker restart重启

    1
    2
    [root@hecs-x-medium-2-linux-xxxx ~]# docker restart  dd3cff7cf16a
    dd3cff7cf16a
  6. 进入容器
    在使用-d参数的时候,容器启动会进入后台。此时如果想要进入容器,可以通过下面指令进入

  • docker attach
  • docker exec:推荐使用该命令,因为此退出容器中断,不会导致容器停止

下面演示使用docker exec 命令

1
2
3
4
5
6
[root@hecs-x-medium-2-linux-xxxx ~]# docker exec -it dd3cff7cf16a /bin/bash
root@dd3cff7cf16a:/# exit
exit
[root@hecs-x-medium-2-linux-xxxx ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd3cff7cf16a ubuntu:15.10 "/bin/sh" 23 minutes ago Up 18 minutes ubuntu-test

可以看到上面的退出之后,容器还是在运行着的
5. 导出和导入容器
如果要导出本地某个容器,可以使用docker export命令,使用下面的命令就可以导出容器快照到本地

1
2
3
[root@hecs-x-medium-2-linux-xxxxx ~]# docker export dd3cff7cf16a > ubuntu.tar.gz
[root@hecs-x-medium-2-linux-xxxxx ~]# ls
ubuntu.tar.gz

导入容器快照
可以使用docker import从容器快照文件中在导入镜像,以下实例快照ubuntu.tar.gz 导入到镜像test/ubuntu:v1

1
2
[root@hecs-x-medium-2-linux-xxxx ~]# cat ubuntu.tar.gz|docker import - test/ubuntu:v1
sha256:8837160e99131307a3b98bc357624a6a883888b3ec7cb6837f08388012538ab7

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

1
[root@hecs-x-medium-2-linux-xxxxx ~]#  docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

删除容器使用docker rm 命令:

1
2
[root@hecs-x-medium-2-linux-xxxxx ~]# docker rm -f dd3cff7cf16a
dd3cff7cf16a

下面这个命令可以清零掉所有处于终止状态的容器

运行一个web应用

下面将在docker 容器中运行一个Python Flask应用来运行一个web应用
首先把镜像拉去下来

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker pull training/webapp
Using default tag: latest
latest: Pulling from training/webapp

然后运行镜像

1
2
3
4
5
6
[root@hecs-x-medium-2-linux-xxxx ~]# docker run -d -P training/webapp python app.py
a9c60ebe355aa679fa9989a36b5b3ecbf22a66ddbc854e38258d9250c9c7c0e8
[root@hecs-x-medium-2-linux-xxxx ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9c60ebe355a training/webapp "python app.py" 5 seconds ago Up 3 seconds 0.0.0.0:32768->5000/tcp bold_ellis
[root@hecs-x-medium-2-linux-xxxx ~]#

参数说明:

  • -d:让容器在后台运行
  • -P:将容器内部使用的网络端口随机映射到我们使用的主机上

查看WEB应用

使用docker ps 来查看我们正在运行的容器

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9c60ebe355a training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:32768->5000/tcp bold_ellis

这里多了端口信息(PORTS)
Docker 开放了5000端口映射到主机端口32768端口上,我们可以使用浏览器访问WEB应用
也可以通过-p参数来设置不一样的端口

1
2
3
4
5
[root@hecs-x-medium-2-linux-xxxx ~]$ docker run -d -p 5000:5000 training/webapp python app.py
84f844338385cb95414ae1c15b3227a0a6017a96c3f7bd5f12b30f2223c89e36
[root@hecs-x-medium-2-linux-xxxx ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84f844338385 training/webapp "python app.py" 12 seconds ago Up 11 seconds 0.0.0.0:5000->5000/tcp strange_bassi

网络端口快捷方式

通过docker ps可以查看端口映射情况,docker 还提供了另一个快捷方式docker port,可以指定容器ID查看端口情况

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker port 84f844338385
5000/tcp -> 0.0.0.0:5000
[root@hecs-x-medium-2-linux-xxxx ~]#

查看WEB应用程序日志

docker logs[ID或者名字] 可以查看容器内部的标准日志输出

1
2
3
[root@hecs-x-medium-2-linux-xxxxxx ~]# docker logs aa53c237d4e5
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
[root@hecs-x-medium-2-linux-xxxx ~]#

-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

查看WEB应用程序容器的进程

我们还可以通过docker top 来查看容器内部的运行进程

1
2
3
[root@hecs-x-medium-2-linux-xxxxx ~]# docker top aa53c237d4e5
UID PID PPID C STIME TTY TIME CMD
root 3627 3611 0 08:59 ? 00:00:00 python app.py

检查WEB应用程序

使用docker inspect 来查看docker的底层信息。它会返回一个JSON文件记录着Docker容器的配置和状态信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@hecs-x-medium-2-linux-xxxx ~]# docker inspect aa53c237d4e5
[
{
"Id": "aa53c237d4e5ef476203c3712ed9b60ac929ededc1df6f659ad8535d451739ed",
"Created": "2020-07-06T00:59:34.605869182Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3627,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-07-06T00:59:34.851310537Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
"ResolvConfPath": "/var/lib/docker/containers/aa53c237d4e5ef476203c3712ed9b60ac929ededc1df6f659ad8535d451739ed/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/aa53c237d4e5ef476203c3712ed9b60ac929ededc1df6f659ad8535d451739ed/hostname",
"HostsPath": "/var/lib/docker/containers/aa53c237d4e5ef476203c3712ed9b60ac929ededc1df6f659ad8535d451739ed/hosts",
"LogPath": "/var/lib/docker/containers/aa53c237d4e5ef476203c3712ed9b60ac929ededc1df6f659ad8535d451739ed/aa53c237d4e5ef476203c3712ed9b60ac929ededc1df6f659ad8535d451739ed-json.log",
"Name": "/laughing_hofstadter",
"RestartCount": 0,
"Driver": "overlay2",
.....

停止WEB应用容器

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker stop aa53c237d4e5
aa53c237d4e5
[root@hecs-x-medium-2-linux-xxxx ~]#

重启WEB应用程序

已经停止的容器,我们可以使用命令docker start来启动

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker start aa53c237d4e5
aa53c237d4e5
[root@hecs-x-medium-2-linux-xxxx ~]#

docker ps -l查询最后一次创建的容器

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa53c237d4e5 training/webapp "python app.py" 22 minutes ago Up 46 seconds 0.0.0.0:5000->5000/tcp laughing_hofstadter

正在运行的容器,我们可以使用docker restart命令来重启

移除WEB应用容器

我们可以使用docker rm命令来删除不需要的容器

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker rm aa53c237d4e5
aa53c237d4e5
[root@hecs-x-medium-2-linux-xxxx ~]#

删除容器时,容器必须是停止状态,否则会报如下错误

1
2
3
[root@hecs-x-medium-2-linux-xxxx ~]# docker rm aa53c237d4e5
Error response from daemon: You cannot remove a running container aa53c237d4e5ef476203c3712ed9b60ac929ededc1df6f659ad8535d451739ed. Stop the container before attempting removal or force remove
[root@hecs-x-medium-2-linux-xxxx ~]#

Docker 镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认是Docker Hub公共镜像源下载

列出镜像列表

我们可以使用docker images来列出本地主机上的镜像

1
2
3
4
5
6
7
8
[root@hecs-x-medium-2-linux-xxxx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 8837160e9913 2 days ago 119MB
ubuntu latest 74435f89ab78 2 weeks ago 73.9MB
centos latest 831691599b88 2 weeks ago 215MB
hello-world latest bf756fb1ae65 6 months ago 13.3kB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
training/webapp latest 6fae60ef3446 5 years ago 349MB

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小
    同一个仓库源可以有多个TAG,代表这个仓库源的不同个版本,使用REPOSITORY:TAG来定义不同的镜像

    获取一个新的镜像

    当在本地主机上使用一个不存在的镜像时Docker就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用docker pull命令下载它。
    1
    2
    3
    4
    5
    6
    [root@hecs-x-medium-2-linux-xxxx ~]# docker pull centos
    Using default tag: latest
    latest: Pulling from library/centos
    Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
    Status: Image is up to date for centos:latest
    docker.io/library/centos:latest
    下载完成后,我们可以直接使用这个镜像来运行容器。

    查找镜像

    可以从Docker Hub网站来搜索镜像,Docker Hub的网址为:https://hub.docker.com/
    可以使用docker search命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过docker search命令搜索httpd来寻找适合我们的镜像
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@hecs-x-medium-2-linux-xxxx ~]# docker search httpd
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    httpd The Apache HTTP Server Project 3088 [OK]
    centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 33
    centos/httpd 29 [OK]
    arm32v7/httpd The Apache HTTP Server Project 9
    salim1983hoop/httpd24 Dockerfile running apache config 2 [OK]
    lead4good/httpd-fpm httpd server which connects via fcgi proxy h… 1 [OK]
    solsson/httpd-openidc mod_auth_openidc on official httpd image, ve… 1 [OK]
    jonathanheilmann/httpd-alpine-rewrite httpd:alpine with enabled mod_rewrite 1 [OK]
    publici/httpd httpd:latest 1 [OK]
    clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 1
    ......
  • NAME:镜像仓库源的名称
  • DESCRIPTION:镜像的描述
  • OFFICIAL:是否docker官方发布
  • STARS:类似github里面的star,表示点赞、喜欢的意思
  • AUTOMATED:自动构建

拉取镜像

使用上面的httpd官方版本的镜像,使用docker pull来下载镜像

1
2
3
4
5
6
7
8
[root@hecs-x-medium-2-linux-xxxxx ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
8559a31e96f4: Downloading [============> ] 6.716MB/27.1MB
bd517d441028: Download complete
f67007e59c3c: Downloading [===> ] 772.6kB/10.37MB
83c578481926: Waiting
f3cbcb88690d: Waiting

下载完成后,我们就可以运行这个镜像了

1
[root@hecs-x-medium-2-linux-xxxx ~]# docker run httpd

删除镜像

镜像删除使用docker rmi命令,比如我们删除

1
2
3
4
5
[root@hecs-x-medium-2-linux-xxxx ~]# docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63

创建镜像

当从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改

  • 从已经创建的容器中更新镜像,并且提交这个镜像
  • 使用Dockerfile指令来创建一个新的镜像

更新镜像

更新镜像之前,需要使用镜像来创建一个容器

1
2
[root@hecs-x-medium-2-linux-xxxx ~]# docker run -it ubuntu:15.10 /bin/bash
root@79b87b167653:/# apt-get update

在运行的容器内使用 apt-get update 命令进行更新
在完成操作之后,输入exit命令退出容器
此时刚刚运行的容器就是我们更改后的容器,可以通过docker commit提交容器副本

1
2
[root@hecs-x-medium-2-linux-xxxx ~]# docker commit -m="Test commit" -a="daniel"  a39b5e9c2b8c smartcore/ubuntu:v2
sha256:179f46c4f9063855e8685f899fcxxxxxb3763124684a9a126c79e4d136988

参数说明:

  • -m:提交说明
  • -a:镜像作者
  • a39b5e9c2b8c:容器ID
  • smartcore/ubuntu:v2:指定要创建的目标镜像名
    使用docker images命令查看我们的新镜像
    1
    2
    3
    [root@hecs-x-medium-2-linux-xxxx ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    smartcore/ubuntu v2 179f46c4f906 50 minutes ago 349MB
    使用新镜像启动一个容器
    1
    2
    3
    4
    5
    [root@hecs-x-medium-2-linux-xxxx ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    smartcore/ubuntu v2 179f46c4f906 50 minutes ago 349MB
    [root@hecs-x-medium-2-linux-xxxx ~]# docker run -it smartcore/ubuntu:v2 /bin/bash
    root@a98626036409:/opt/webapp#

构建镜像

使用命令docker build,从零开始创建一个新的镜像。为此,我们需要创建一个Dockerfile文件,其中包含一卒之令来告诉Docker如何构建镜像

1
2
3
4
5
6
7
8
9
10
[root@hecs-x-medium-2-linux-xxxx docker]# cat Dockerfile
FROM centos:7.2.1511
MAINTAINER Fisher "Daniel"
RUN /bin/echo 'root:xydtech123'|chpasswd
RUN useradd sem
RUN /bin/echo 'sem:xydtech123'|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(注意最后还有个点,是指定Dockerfile的目录)命令来构建一个镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@hecs-x-medium-2-linux-xxxx docker]# docker build -t sem/centos:7.2.1511 .
Sending build context to Docker daemon 2.048kB
Step 1/9 : FROM centos:7.2.1511
---> 9aec5c5fe4ba
Step 2/9 : MAINTAINER Fisher "Daniel"
---> Running in 8445c6f27d59
Removing intermediate container 8445c6f27d59
---> 95e03a3fd461
Step 3/9 : RUN /bin/echo 'root:xydtech123'|chpasswd
---> Running in 43fbc2461433
Removing intermediate container 43fbc2461433
---> 87c6207f2280
Step 4/9 : RUN useradd sem
---> Running in 80a7d1c778b5
Removing intermediate container 80a7d1c778b5
---> a407d4394f54
.......

参数说明:

  • -t:指定要创建的目标镜像名
    .:Dockerfile文件所在目录,可以指定Dockerfile的绝对路径
    使用docker images查看创建的镜像已经在列表中存在,镜像ID为:9a52aadd3648
    1
    2
    3
    4
    [root@hecs-x-medium-2-linux-xxxx docker]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    sem/centos 7.2.1511 9a52aadd3648 47 seconds ago 195MB
    smartcore/ubuntu v2 179f46c4f906 About an hour ago 349MB
    使用新的镜像创建容器
    1
    2
    3
    4
    5
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker run -it sem/centos:7.2.1511 /bin/bash
    [root@5393673efc17 /]# id
    uid=0(root) gid=0(root) groups=0(root)
    [root@5393673efc17 /]# id sem
    uid=1000(sem) gid=1000(sem) groups=1000(sem)
    从上面的新镜像已经包含了上面创建的用户sem

    设置镜像标签

    可以通过docker tag命令,为镜像添加一个新的标签
  1. 首先使用docker images 查看目前已有的镜像
    1
    2
    3
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    sem/centos 7.2.1511 9a52aadd3648 13 minutes ago 195MB
  2. 把IMAGE ID为9a52aadd3648的TAG修改为7.2
    1
    2
    3
    4
    5
    6
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker tag 9a52aadd3648 daniel/centos:v3
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    sem/centos 7.2 9a52aadd3648 3 hours ago 195MB
    sem/centos 7.2.1511 9a52aadd3648 3 hours ago 195MB
    daniel/centos v3 9a52aadd3648 3 hours ago 195MB

Docker容器连接

新建网络

首先使用命令docker network create创建一个新的Docker网络,然后使用命令docker network ls查看建立的网络

1
2
3
4
5
6
7
8
[root@hecs-x-medium-2-linux-20200701102124 docker]# docker network create -d bridge test-net
786b44147e9e885c65e6ee5597832027acd2d48daf49074a495e8f5502a91a13
[root@hecs-x-medium-2-linux-20200701102124 docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
fc82f80ad8ea bridge bridge local
663856490eac host host local
6bf6dea57a12 none null local
786b44147e9e test-net bridge local

参数说明:

  • -d:参数指定Docker网络类型,有bridge,overlay

    连接容器

    运行两个新的容器并连接到新建的test-net网络:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker run -itd --name="test1" --network test-net centos:7 /bin/bash
    Unable to find image 'centos:7' locally
    7: Pulling from library/centos
    524b0c1e57f8: Pull complete
    Digest: sha256:e9ce0b76f29f942502facd849f3e468232492b259b9d9f076f71b392293f1582
    Status: Downloaded newer image for centos:7
    ed51b979348a00dcce6f0147bff04a5685f39625f4620dd2d11527385ec523e6
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    ed51b979348a centos:7 "/bin/bash" 5 seconds ago Up 5 seconds test1
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker run -itd --name="test2" --network test-net centos:7 /bin/bash
    78846bd75ddb85801af29423d9d153f533e7595e6bcf687e50bf1f95cc948dd6
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    78846bd75ddb centos:7 "/bin/bash" 3 seconds ago Up 2 seconds test2
    ed51b979348a centos:7 "/bin/bash" 17 seconds ago Up 16 seconds test1
    测试两个容器之间的网络
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@78846bd75ddb /]# ping test1
    PING test1 (172.18.0.2) 56(84) bytes of data.
    64 bytes from test1.test-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.052 ms
    64 bytes from test1.test-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.050 ms
    --- test1 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 999ms
    rtt min/avg/max/mdev = 0.050/0.051/0.052/0.001 ms
    [root@78846bd75ddb /]# ping test2
    PING test2 (172.18.0.3) 56(84) bytes of data.
    64 bytes from 78846bd75ddb (172.18.0.3): icmp_seq=1 ttl=64 time=0.015 ms

配置DNS

  1. 统一设置DNS配置信息
    可以在宿主机的/etc/docker/daemon.json文件中增加以下内容来设置全部容器的DNS
    1
    2
    3
    4
    5
    6
    {
    "dns":[
    "144.144.144.144",
    "8.8.8.8"
    ]
    }
    设置后,启动容器的DNS会自动配置为144.144.144.144和8.8.8.8
    配置完,需要重启docker才能生效service docker restart
    查看容器的DNS是否生效可以使用一下命令,它会输出容器的DNS信息:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    [root@hecs-x-medium-2-linux-20200701102124 docker]# service docker restart
    Redirecting to /bin/systemctl restart docker.service
    [root@hecs-x-medium-2-linux-20200701102124 docker]# service docker status
    Redirecting to /bin/systemctl status docker.service
    ● docker.service - Docker Application Container Engine
    Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
    Active: active (running) since Tue 2020-07-07 15:54:12 CST; 16s ago
    Docs: https://docs.docker.com
    Main PID: 9989 (dockerd)
    Tasks: 9
    Memory: 42.8M
    CGroup: /system.slice/docker.service
    └─9989 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    ......
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    78846bd75ddb centos:7 "/bin/bash" 24 minutes ago Exited (137) About a minute ago test2
    ed51b979348a centos:7 "/bin/bash" 25 minutes ago Exited (137) About a minute ago test1
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker start 78846bd75ddb ed51b979348a
    78846bd75ddb
    ed51b979348a
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker run -it --rm ubuntu cat etc/resolv.conf
    search openstacklocal
    nameserver 144.144.144.144
    nameserver 8.8.8.8
    options single-request-reopen
    [root@hecs-x-medium-2-linux-20200701102124 docker]#
  2. 手动指定容器配置
    如果指向在指定的容器设置DNS,则可以使用一下命令:
    1
    2
    [root@hecs-x-medium-2-linux-20200701102124 docker]# docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
    root@host_ubuntu:/#
    参数说明:
  • -h HOSTNAME或者–hostname=HOSTNAME :设定容器的主机名,他会被卸载容器的/etc/hostname和/etc/hosts
  • –dns=IP_ADDRESS:添加DNS服务器到容器的/etc/resolv.cnf中,让容器用这个服务器来解析所有不在/etc/hosts中的主机名
  • –dns-search=DOMAIN:设定容器的搜索域,当设定搜索域为example.com时,在搜索一个名为host的主机时,DNS不仅搜索host,还会搜索host.example.com

如果在容器启动时没有指定–dns和–dns-search,Docker会默认用宿主主机上的/etc/resolv.conf来配置容器的DNS

Docker仓库管理

仓库是集中存放镜像的地方,下面简单介绍下Docker Hub。目前仓库的服务商有很多,但操作都是一样的

Docker Hub

目前Docker官方维护的一个公共仓库Docker Hub
大部分需求都可以通过在Docker Hub上直接下载镜像来实现

注册

在Docker hub上免费注册一个Docker账号

登录和退出

登录需要输入用户名和密码,登录成功后,我们可以从docker hub上拉去自己账号下面的全部镜像

1
2
3
4
5
6
7
8
9
[root@hecs-x-medium-2-linux-20200701102124 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: donkeyzp
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded