接触 docker 时间也不短了, 但是 docker 的配置文件一直是个”神秘”的东西, 我在CentOS/Ubuntu/Fedora 平台上都使用过 docker, 而且 docker 的版本从1.9到最新的1.13都用过, 可以说 docker 的配置文件真的是 “乱花渐欲迷人眼”, 写在哪儿的都有. 而且 docker 的启动方式不同读取的配置文件位置也不同, 有的时候改了半天配置文件发现不生效… 今天我们就来找找 docker 的配置文件!

1.12版本后的万能配置文件

1.12版本后, 用户可以自行创建 /etc/docker/daemon.js 该文件, 该文件是 docker 进程的配置管理文件, 里面几乎包含了所有 docker 命令行启动可以配置的参数, 不管是哪个平台, 不管是以何种方式启动, 默认都会来这里读取配置, 所以如果你会配置这个文件, 就不会再费力气去找 docker 的普通配置文件或是 docker 的启动入口了

这个文件在前面的文章里有介绍, 官方也给出了使用模板, 有需要的话可以翻看前面的文章查看或是到 docker 的官方文档中查看

查找配置文件

不管是 CentOS7+/Fedora24+ 还是 Ubuntu16+, 他们现在都使用 systemctl 来管理程序, 所以在以上平台上, 启动 docker 的时候都推荐使用如下命令

1
> systemctl start docker.service

即使在 Ubuntu 下使用/etc/init.d/docker start的方式启动, 回显也会告诉你他还是使用了 systemd 去管理的. service 也是一样, service 找的就是/etc/init.d/docker 所以使用 service 启动其本质也还是使用了 systemctl 的方式启动的(Ubuntu16.04LTS)

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
> systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2017-02-06 12:43:32 CST; 1s ago
Docs: https://docs.docker.com
Main PID: 22100 (dockerd)
Tasks: 18
Memory: 12.5M
CPU: 434ms
CGroup: /system.slice/docker.service
├─22100 /usr/bin/dockerd -H fd://
└─22109 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

Feb 06 12:43:31 xsl dockerd[22100]: time="2017-02-06T12:43:31.890635900+08:00" level=warning msg="Your kernel does not support cgroup rt period"
Feb 06 12:43:31 xsl dockerd[22100]: time="2017-02-06T12:43:31.891099470+08:00" level=warning msg="Your kernel does not support cgroup rt runtime"
Feb 06 12:43:31 xsl dockerd[22100]: time="2017-02-06T12:43:31.892444087+08:00" level=info msg="Loading containers: start."
Feb 06 12:43:31 xsl dockerd[22100]: time="2017-02-06T12:43:31.903230791+08:00" level=info msg="Firewalld running: false"
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.205131505+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.346345114+08:00" level=info msg="Loading containers: done."
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.397174805+08:00" level=info msg="Daemon has completed initialization"
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.397651049+08:00" level=info msg="Docker daemon" commit=49bf474 graphdriver=aufs version=1.13.0
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.419960532+08:00" level=info msg="API listen on /var/run/docker.sock"
Feb 06 12:43:32 xsl systemd[1]: Started Docker Application Container Engine.

在回显的第二行就可以看到Loaded字样, 这行就提示了 docker 启动的入口文件, 如果有需要添加的启动配置, 来这里找就对了!

以上查出来的 docker 文件是 docker 的入口文件, 你可以在入口文件的 docker 启动方式中, 添加一些参数, 也可以像上面写的, 把配置写进”万能配置文件中(js 文件)”

其他配置文件

让人眼花缭乱的配置文件

/etc/default/docker

这个文件在开头的注释中就写到了

1
2
3
4
5
6
7
8
# Docker Upstart and SysVinit configuration file

#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
# Please see the documentation for "systemd drop-ins":
# https://docs.docker.com/engine/articles/systemd/
#

这个配置文件只有在 Linux 使用SysvinitUpstart作为初始化 init 系统的时候才会生效, 才会读取这个配置文件, 紧接着下面一行又说了 systemd系统并不适用

而在 Ubuntu16.04 LTS中, 系统默认使用的是 systemd 来管理的, 即使你使用 service, 最后还是重定向到了 systemctl. 所以上面这个配置文件在默认使用 systemd 的 CentOS7+/Fedora24+/Ubuntu16+ 系统中都是没有任何卵用的配置文件!!!

如果你想深入了解三大 init 系统的历史以及发展现状, 可以点开以下参考文档中的链接查看

下面我简单区分一下这三大初始化系统

  1. Sysvinit: CentOS6时代, 我们最熟悉的 service docker restart 命令就出自这个系统管理; 在 Ubuntu 中的 /etc/init.d/docker restart 也是这个系统来管理的

  2. Upstart: 这个初始化系统比较少见, 在 Ubuntu 上比较多见, 启动软件的方式为 restart docker 在 docker 的官方网站中, 介绍基于 Ubuntu14和15版本 docker 启动方式时, 就是使用的这个初始化系统https://docs.docker.com/engine/admin/

  3. Systemd: systemd 是目前大多数 Linux 发行版默认的初始化管理系统, CentOS7+ 和 Ubuntu16+ 都是使用 Systemd 进行管理, 软件启动方式为 systemctl restart docker.service

/etc/init.d/docker

这个文件只有在系统使用 sysvinit 来管理时才会用到, 因为我的系统默认都使用了 systemd 进行管理, 所以这个文件对我来说也没有任何卵用, 即使我用了 sysvinit 管理程序的语法, 也会被重定向到 systemd 去管理程序. 这个 docker 入口读取的是 /etc/default/docker 这个配置文件

/etc/init/docker.conf

这个文件只有在系统使用 Upstart 来管理时才会用到, 无用的道理同上. 这个 docker 入口读取的也是 /etc/default/docker 这个配置文件

总结

入口文件

  • /etc/init/docker.conf == service docker start 的入口文件==
  • /etc/init.d/docker == start docker 的入口文件 ==
  • /usr/lib/systemd/system/docker == RHEL 系列中 systemctl start docker.service 的入口文件 ==
  • /lib/systemd/system/docker == Ubuntu 系列中 systemctl start docker.service 的入口文件 ==

配置文件

  • /etc/default/docker == service 和 start 的配置文件==
  • /etc/docker/daemon.js ==1.12版本后万能配置文件==

如果你使用的是 docker 1.11(含)之前的版本, 如果能升级的话还是升级到最新版本吧. 如果不能升级, 还找不到配置文件, 可以在对应的入口文件中直接在启动命令后面添加参数

不知道的时候对 docker 这么多的入口和配置文件感觉真的很烦, 明白了他们的对应关系之后才恍然大悟, 原来 docker 不仅仅为跨平台付出了大量的精力, 连初始化系统也全部都适配到了, 让你不管使用什么系统, 系统使用什么初始化工具都能运用自如, 这里给 docker 点👍 (虽然用不到这么多文件, 而且给我带来了很长时间的困扰)


参考文档

Linux文件目录/etc/init和/etc/init.d的前世今生: https://my.oschina.net/lvyi/blog/183123

前面的文章介绍了 docker 默认的配置文件, 本篇文章介绍如何在配置文件中配置 docker 的镜像下载加速

daocloud 方案

daocloud 不仅仅为我们提供了镜像加速的地址, 而且为我们提供了便捷的配置方式

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://172d594a.m.daocloud.io

执行如上命令之后重启 docker 服务即可让镜像加速的配置生效, 你可以查看 /etc/docker/daemon.js 文件里的内容(如果这个文件不存在, daocloud 的脚本会自动创建)

手动配置

1
2
3
4
> vim /etc/docker/daemon.js
{
"registry-mirrors": ["http://172d594a.m.daocloud.io"],
}

加入以上配置, 重启 docker 服务即可生效, 生效后, 可以通过 docker info 命令查看详细信息

docker 的版本更新比较快, 而且现在几乎支持了包括 windows 和 mac 在内的所有系统平台(不知道啥时候可以在手机上运行 docker🐳 😆) 我在刚接触 docker 的时候使用的是1.9版本, 现在已经更新到了1.13.1版本, 变化很大, 相信有好多友友都找不到docker 的配置文件在哪里, 需要指定一些功能时, 一般会去 docker 的启动文件里配置. 本篇文章就介绍 docker 的默认配置文件在哪里, 怎么用

docker 1.12 版本之后, Linux 下(Ubuntu/RHEL/CentOS/Fedora/…)docker 的默认配置文件存放在 /etc/docker/daemon.js

如果你的 docker 是新装的, 那么这个文件默认不存在, 需要自己创建

根据官方文档介绍, daemon.js的配置模板如下

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
{
"api-cors-header": "",
"authorization-plugins": [],
"bip": "",
"bridge": "",
"cgroup-parent": "",
"cluster-store": "",
"cluster-store-opts": {},
"cluster-advertise": "",
"debug": true,
"default-gateway": "",
"default-gateway-v6": "",
"default-runtime": "runc",
"default-ulimits": {},
"disable-legacy-registry": false,
"dns": [],
"dns-opts": [],
"dns-search": [],
"exec-opts": [],
"exec-root": "",
"fixed-cidr": "",
"fixed-cidr-v6": "",
"graph": "",
"group": "",
"hosts": [],
"icc": false,
"insecure-registries": [],
"ip": "0.0.0.0",
"iptables": false,
"ipv6": false,
"ip-forward": false,
"ip-masq": false,
"labels": [],
"live-restore": true,
"log-driver": "",
"log-level": "",
"log-opts": {},
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"mtu": 0,
"oom-score-adjust": -500,
"pidfile": "",
"raw-logs": false,
"registry-mirrors": [],
"runtimes": {
"runc": {
"path": "runc"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"--debug"
]
}
},
"selinux-enabled": false,
"storage-driver": "",
"storage-opts": [],
"swarm-default-advertise-addr": "",
"tls": true,
"tlscacert": "",
"tlscert": "",
"tlskey": "",
"tlsverify": true,
"userland-proxy": false,
"userns-remap": ""
}

官方给出的模板中, 包含了大量的配置参数, 其中大多数如果没有特殊需求, 我们不需要特殊指定, 稍后的文章中, 我会根据此模板文件, 定制自己对 docker 的需求


官方文档: https://docs.docker.com/engine/reference/commandline/dockerd/

官方文档-启动项加载参数v18.03: https://docs.docker.com/engine/reference/commandline/dockerd/
官方文档-启动项加载参数v17.03: https://docs.docker.com/v17.03/edge/engine/reference/commandline/dockerd/

在 Linux 中, 我们执行命令的时候, 有时会忘记放到后台执行, 而阻塞在终端前台执行, 一般情况下会 control+c 掉再重新执行, 加入放入到后台的命令, 本篇文章介绍一种方法, 不需要 control+c 掉就能直接放入到后台执行, 且支持前台后台的切换

  • 在前台启动程序

我这里有个 webtty 的小程序, 现在我在前台执行它

1
2
3
4
5
6
7
8
9
10
11
> ttyd -p 8080 bash
[2017/01/05 14:31:42:7759] INFO: ttyd 1.2.2 (libwebsockets 1.7.5)
[2017/01/05 14:31:42:7759] INFO: tty configuration:
[2017/01/05 14:31:42:7760] INFO: start command: bash
[2017/01/05 14:31:42:7760] INFO: reconnect timeout: 10s
[2017/01/05 14:31:42:7760] INFO: close signal: SIGHUP (1)
[2017/01/05 14:31:42:7799] INFO: listening on port 8080
[2017/01/05 14:32:02:1003] INFO: HTTP / - 10.1.100.239 (10.1.100.239)
[2017/01/05 14:32:02:5699] INFO: HTTP /auth_token.js - 10.1.100.239 (10.1.100.239)
[2017/01/05 14:32:03:3588] INFO: WS /ws - 10.1.100.239 (10.1.100.239), clients: 1
[2017/01/05 14:32:03:3600] INFO: started process, pid: 29018

现在这个程序挂在了我终端的前台执行, 运行正常

  • 输入 control+z 暂停程序的执行
1
2
3
4
5
6
7
8
9
10
11
12
13
> ttyd -p 8080 bash
[2017/01/05 14:31:42:7759] INFO: ttyd 1.2.2 (libwebsockets 1.7.5)
[2017/01/05 14:31:42:7759] INFO: tty configuration:
[2017/01/05 14:31:42:7760] INFO: start command: bash
[2017/01/05 14:31:42:7760] INFO: reconnect timeout: 10s
[2017/01/05 14:31:42:7760] INFO: close signal: SIGHUP (1)
[2017/01/05 14:31:42:7799] INFO: listening on port 8080
[2017/01/05 14:32:02:1003] INFO: HTTP / - 10.1.100.239 (10.1.100.239)
[2017/01/05 14:32:02:5699] INFO: HTTP /auth_token.js - 10.1.100.239 (10.1.100.239)
[2017/01/05 14:32:03:3588] INFO: WS /ws - 10.1.100.239 (10.1.100.239), clients: 1
[2017/01/05 14:32:03:3600] INFO: started process, pid: 29018
^Z
[1]+ Stopped ttyd -p 8080 bash

现在再次访问 webtty 已经没有响应, 但是没有报错退出, 显然程序是被 “暂停⏸” 了, 而不是被退出了, 再开一个终端可以看见, 进程在, 端口也在, 进程状态如下

1
root     29016  0.0  0.1 142632  3504 pts/0    Tl   14:31   0:00 ttyd -p 8080 bash

  • 使用 bg 命令将暂停的程序放入到后台继续执行
1
2
3
4
> jobs # 查看后台任务状态
[1]+ Stopped ttyd -p 8080 bash
> bg %1 # 从上面可以查询到, 有一个任务, 任务 ID 为 1,现在是暂停的状态, 使用 bg %ID 的参数将此任务放入到后台执行
[1]+ ttyd -p 8080 bash &

这时, 系统会自动帮我们在启动命令的最后面加入一个 & 后台命令启动

此时 webtty 的工作又恢复了正常, 而且之前暂停时在 webtty 输入的内容也都显示了出来, 由此可以看出, control+z 阻塞了程序的入口

1
2
3
# 再次查看后台任务
> jobs
[1]+ Running ttyd -p 8080 bash &

状态显示已在运行

  • 将已经在后台运行的程序再拉回到前台执行
1
2
3
4
> jobs
[1]+ Running ttyd -p 8080 bash &
> fg %1 # 使用 fg %ID 的方式可以把后台运行的程序拉回到前台执行
ttyd -p 8080 bash
  • 关闭程序

  • 运行在前台的程序需要关闭执行按下 control+c 组合键即可

  • 运行在后台的程序需要关闭执行 kill %ID 即可

参考文章

从 tomcat 官网中下载下来的软件包, 默认使用的是格林尼治标准时间, 与中国的时间相差8个小时, 此时我们需要修改 tomcat 中的配置, 让其变为东八区的时间

最近新装的 tomcat 发现与北京时间相差正好8小时, 查看系统时间没有问题, 是正确的, 问题出在 tomcat 中, 需要对 tomcat 做如下修改

1
2
3
4
5
6
> cd apache-tomcat-8.0.39/bin
> vim catalina.sh
# 在这个启动脚本中, 找到如下行并替换
# JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
# 替换为
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Duser.timezone=GMT+08"

拷贝你的 Java_OPTS 原有的配置, 注释后, 在下面粘贴, 并在末尾处添加 -Duser.timezone=GMT+08 保存退出, 重启 tomcat 服务器即可

我们 pull 下来的大多镜像时不支持中文的, 网上也有好多文章介绍如何让 container 支持中文, 有的写的挺复杂的, 把运维都看晕了, 有的按照他写的执行过后发现还是不能正常显示中文, 或是又引发了其他问题… 这里给大家介绍一个简单的方法让 docker 容器支持中文

已经启动的容器

由于容器是根据镜像而来, 已经启动的容器或已经存在的镜像不支持配置永久生效(当然你也可以在容器内配置之后, 再出来保存容器的状态为一个新的镜像) 所以下面的配置操作, 只对当前容器的生存周期有效

1
2
3
> docker exec -it containerID /bin/bash
>> echo 'export LANG="en_US.UTF-8"' >> /etc/profile
>> source /etc/profile

配置镜像支持中文

只需要在 dockerfile 中加入如下一行配置即可

1
2
# 环境变量
ENV LANG="en_US.UTF-8"

有人可能会问为什么不是用zh_CN.UTF-8而是用en_US.UTF-8

这个问题很棒👍 我也不清楚, 但是我查阅了资料, 整理如下:

1
2
3
4
5
6
en_US.UTF-8:你说英语,你在美国,字符集是utf-8 
zh_CN.UTF-8:你说中文,你在中国,字符集是utf-8

如果你的LANG环境变量是en_US.UTF-8,那么系统的菜单、程序的工具栏语言、输入法默认语言就都是英文的

如果你的LANG环境变量是zh_CN.UTF-8,那么系统的菜单、程序的工具栏语言、输入法默认语言就都是中文的

在运维的实际应用中, 系统一般都是使用英文环境, 且支持中文字符的, 因为在自动化的过程中, 系统的回显是英文会避免很多不必要的问题

镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在):

  • 通过config命令
1
2
> npm config set registry https://registry.npm.taobao.org 
> npm info underscore #如果上面配置正确这个命令会有字符串response
  • 命令行指定
1
npm --registry https://registry.npm.taobao.org info underscore
  • 编辑 ~/.npmrc 加入下面内容
1
registry = https://registry.npm.taobao.org

参考文章

http://www.cnblogs.com/trying/p/4064518.html

官网站点

https://npm.taobao.org

在执行systemctl restart network的时候,出现了Failed to start LSB: Bring up/down networking的报错

解决的办法(由于centos7中没有70-persistent-net.rules这个文件,复制出来的虚拟机(vmware)需要修改mac地址),就是修改mac地址

查看网卡配置文件中是否存在 mac 地址的配置, 如果有, 直接删除再重启网卡即可

以上问题在虚拟机中出现的比较多, 大多是因为 mac 地址配置的问题, 在 centos6 系列中, 可以直接删除70-persistent-net.rules这个文件, 重启服务器即可(具体位置可以通过 find /etc/ -name “70-persistent-net.rules” 的方式来查找)

优秀的 web console PasS 服务商 codepicnic https://codepicnic.com 有了开源的克隆版. 搜索了一些codetainer搭建的相关文档, 都引用了 github 的官方介绍, 但是官方说明比较简单, 安装过程中的一些报错严重影响了用户对codetainer的体验, 本篇文章介绍 codetainer 的部署与使用

环境依赖

安装 docker 环境

1
2
3
4
5
6
7
8
tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
1
2
3
4
yum install docker-engine
systemctl enable docker.service
systemctl start docker
systemctl status docker

安装 golang 环境

根据自己的平台选择对应的安装包, 这里我使用的环境为 CentOS7.2 所以选择了如下安装包下载

go1.7.4.linux-amd64.tar.gz Archive Linux 64-bit 80MB 47fda42e46b4c3ec93fa5d4d4cc6a748aa3f9411a2a2b7e08e3a6d80d753ec8b

1
2
3
4
cd /usr/local/src
wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz
tar -xvzf go1.7.4.linux-amd64.tar.gz
mv go /usr/local/
1
2
3
4
5
echo "export GOROOT=/usr/local/go" >> /etc/profile
echo "export PATH=$PATH:$GOROOT/bin" >> /etc/profile
echo "export GOPATH=$HOME/work" >> /etc/profile
mkdir $HOME/work
source /etc/profile

安装 go-bindata

go get -u github.com/jteeuwen/go-bindata/...

安装了 go-bindata 后如果还是报: go-bindata command not found 的话, 就进行如下操作

ln -s $GOPATH/bin/go-bindata $GOROOT/bin

可以用 cp 也可以用 ln, 当然也可以把这个路径添加到 PATH中, 总之只要环境变量 PATH 能找到就行

安装 godep

go get github.com/tools/godep

安装 codetainer

1
2
3
go get github.com/codetainerapp/codetainer
cd $GOPATH/src/github.com/codetainerapp/codetainer
make

make 成功后会生成这个文件 $GOPATH/src/github.com/codetainerapp/codetainer/bin/codetainer

docker 配置

1
2
3
4
vim /usr/lib/systemd/system/docker.service
# 将 ExecStart=/usr/bin/docker daemon -H fd:// 这行修改为下面这行
ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://127.0.0.1:4500 -H unix:///var/run/docker.sock
# 修改完毕后保存退出

codetainer 配置

codetainer 的默认配置文件只有在 codetainer命令第一次执行之后才会自动创建, 自动创建的配置文件在 $HOME/.codetainer/config.toml

默认只有两行, 如果上面你没有修改过 docker API 监听的端口, 那这一步骤你是不需要关心的

1
2
DockerServer = "localhost"
DockerPort = 4500

官方给出的配置说明如下:

1
2
3
4
5
6
7
8
9
10
11
12
# Docker API server and port
DockerServer = "localhost"
DockerPort = 4500

# Enable TLS support (optional, if you access to Docker API over HTTPS)
# DockerServerUseHttps = true
# Certificate directory path (optional)
# e.g. if you use Docker Machine: "~/.docker/machine/certs"
# DockerCertPath = "/path/to/certs"

# Database path (optional, default is ~/.codetainer/codetainer.db)
# DatabasePath = "/path/to/codetainer.db"

启动 codetainer

以下是官方案例, 这里我不做修改, 只说明一下

1
2
3
4
5
6
$ cd $GOPATH/src/github.com/codetainerapp/codetainer/bin/
$ docker pull ubuntu:14.04 # 你可以下载任意一个你需要的镜像
$ ./codetainer image register ubuntu:14.04 # 把你需要托管到codetainer的镜像注册给codetainer
$ ./codetainer create ubuntu:14.04 my-codetainer-name # 启动你托管给codetainer的镜像
$ ./codetainer server # to start the API server on port 3000
# 最后一步是启动 codetainer 服务

codetainer 服务启动后默认会卡在前台, 提示你已经监听了 127.0.0.1:3000 这个地址

不用管这个监听了本地3000端口地址的提示, 你可以执行如下命令查看监听的端口

1
2
3
4
netstat -antupl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::3000 :::* LISTEN 20597/./codetainer

这里可以看到 codetainer 的服务监听了所有 IP 的3000端口

登录你的 web console

我试了下, 直接打开 http://IP:3000 是有问题的, 如果需要登录到 console, 需要知道你刚刚使用 codetainer 启动的镜像 id, 可以通过以下方式查看

1
2
3
4
5
cd $GOPATH/src/github.com/codetainerapp/codetainer/bin/

./codetainer list
Found 1 codetainers.
-- [5ded5ca44ce1d9347a7d8556675b6a269b922660a27eef02df631bd323ed8057] mycode (Running)

通过 ./codetainer list 可以查看当前 codetainer 托管的镜像 id (这里我说的镜像
id 指的是在 codetainer 里管理的 id, 而不是 docker 管理 container 的 id )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 3f755ca42730 12 days ago 187.9 MB

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ded5ca44ce1 3f755ca42730 "/bin/bash" 6 hours ago Up 6 hours mycode

./codetainer image list
Found 1 images:
-- [sha256:3f755ca4273009a8b9d08aa156fbb5e601ed69dc698860938f36b2109c19cc39] [ubuntu:14.04]

./codetainer list
Found 1 codetainers.
-- [5ded5ca44ce1d9347a7d8556675b6a269b922660a27eef02df631bd323ed8057] mycode (Running)

自行感受他们的区别吧~

找到 ./codetainer list回显出来的 id 之后就可以访问我们的 web console 啦

访问这个地址: http://:3000/api/v1/codetainer//view

codetainer

到这里实现了在一台宿主机中启动一个容器来提供 terminal

下面我来介绍下如何在一台宿主机上启动多个 container 来提供过个 terminal

多 terminal

不难发现, web console 的服务是 codetainer 来提供的, 他提供了前端页面, 提供与 docker API 的交互, 所以, 只要我们使用 ./codetainer create 命令启动多个容器, 就可以在 ./codetainer list 上看到多个”主机”, 查到他们的 id, 就可以在 url 中通过更换 id 的值来访问不通的 terminal

1
2
3
4
5
6
7
8
9
10
➜  bin git:(master) ✗ ./codetainer list
Found 1 codetainers.
-- [5ded5ca44ce1d9347a7d8556675b6a269b922660a27eef02df631bd323ed8057] mycode (Running)
➜ bin git:(master) ✗ ./codetainer create ubuntu:14.04 mycode2
Codetainer mycode2 creation succeeded!
You can interact with it here: http://localhost:3000/api/v1/codetainer/c2d2fc896a60d37a7d1fd9d365850518d2ba7da853cc35563d68f4c32533912f/view
➜ bin git:(master) ✗ ./codetainer list
Found 2 codetainers.
-- [5ded5ca44ce1d9347a7d8556675b6a269b922660a27eef02df631bd323ed8057] mycode (Running)
-- [c2d2fc896a60d37a7d1fd9d365850518d2ba7da853cc35563d68f4c32533912f] mycode2 (Running)

可以看到我们在使用 ubuntu:14.04 镜像创建第二个容器的时候, 回显自动给出了访问的地址, 因为我现在的 server 已经启动, 在 server 没有启动的时候, 只能通过手动查找 id 的方式来访问

以上我依然使用了 ubuntu:14.04 镜像, 你可以在 pull 下来新的镜像注册到 codetainer服务中. 例如:

1
2
docker pull centos:latest
codetainer image register centos:latest

参考文档

docker 官方安装文档: https://docs.docker.com/engine/installation/linux/centos/
codetainer 项目 github 地址: https://github.com/codetainerapp/codetainer
go-bindata 项目 github 地址: https://github.com/jteeuwen/go-bindata
godep 项目 github 地址: https://github.com/tools/godep
golang 官方下载地址: https://golang.org/dl/
golang 官方安装文档: https://golang.org/doc/install
go-bindata 报错解决: http://blog.csdn.net/lampqiu/article/details/48649881

mysqldump迁移方案

数据库D从A主机迁往B主机

前期准备

  • 前端应用操作D库的用户名和密码

向研发人员收集用户名和密码,在B主机的数据库实例中,预先建立用户

1
B: mysql> create user 'username'@'%' identified by 'password';
  • 在A主机中查询D库中该用户的权限

找到该用户对应的D库的权限SQL语句,保存一下,等到B主机建库后,给该用户赋予权限

1
A: mysql> show grants for username;
  • 收集需要迁移的目标数据库的建库参数

一般情况下午特殊建库参数,注意字符集

用户体系的my.cnf中指定字符集默认为character_set_server=utf8

ocrdb的my.cnf中指定字符集默认为character_set_server=utf8mb4

1
A: mysql> show create database dbname;
  • 为上面指定的用户赋予B主机上新库的权限
1
B: mysql> 在B主机上执行第二步保存的grant语句

迁移前的操作

  • 将A主机上D库用户的insert update delete权限撤销
1
A: mysql> revoke INSERT, UPDATE, DELETE ON databasename.* FROM username;
  • 停止连接数据库A的所有前端应用

尽可能停止连接数据库A的所有前端应用,不能停止的,将在数据库中killESTABLISHED的连接,让前端应用的连接池重新连接mysql数据库

检查该用户的连接情况

1
A: $> mysql -uroot -p -e 'show processlist;' | grep username

如果前端应用停止后,仍有其他服务器的连接,则kill掉这些连接,让其重连,重新获取该库权限,并记录这些服务器的IP地址,因为该库迁走并剥夺写入权限后,这些服务器可能会有问题

迁移

  • mysqldump
1
A: $> mysqldump -uusername -p databasename | gzip > databasename.sql.gz
  • scp
1
A: $> scp databasename.sql.gz ps@IP:/tmp/
  • load
1
B: $> gunzip < databasename.sql.gz | mysql -uroot -p databasename

迁移后

  • 在三区开启应用服务器,连接三区mysql

  • 删除某一用户的所有权限
1
revoke all on *.* from sss@localhost ;