Docker outside of Docker

添加用户jenkins至docker组

1
2
3
4
5
6
7
8
# 如果不存在docker组就groupadd一个
$ sudo groupadd docker

# 添加用户jenkins至docker组
$ sudo gpasswd -a jenkins docker

# 重启docker服务
$ sudo service docker restart

自定义jenkins镜像

镜像Dockerfile

1
2
3
4
5
6
7
8
From jenkins

USER root
AGR dockerGid=995

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group

USER jenkins

其中的dockerGid是docker组id,可以在宿主机里cat /etc/group | grep ^docker查看组id序号。

docker:dial unix /var/run/docker.sock:permission denied.

上面的dockerfile内容关键是将宿主机的docker组及用户配置,写入docker镜像里,防止在docker容器里运行docker命令没有权限,会报错。
一定要注意,设置的dockerGid一定要与宿主机的组id一致。

build自定义镜像

1
docker build -t local_jenkins

Docker进程监听的Unix域socket

/var/run/docker.sock

这个文件是什么呢?简单地说,它是Docker守护进程(Docker daemon)默认监听的Unix域套接字(Unix domain socket),容器中的进程可以通过它与Docker守护进程进行通信。

管理jenkins的docker-compose

1
2
3
4
5
6
7
8
9
10
version: '2'
services:
my_jenkins:
image: local_jenkins
volumes:
- ./jenkins_home:/var/jenkins_home
- /bin/docker:/usr/bin/docker
- /usr/bin/docker.sock:/var/run/docker.sock
ports:
- "8081:8080"

在这个docker-compose中,我们挂载了**/bin/docker**,/var/run/docker.sock,实现了DooD(Docker outside of Docker)。在jenkins镜像里run起来的容器实际上就是运行在宿主机上的。

关于android资源文件路径

android资源文件的目录:

  • res/raw文件夹
  • asserts文件夹

res/raw

不能创建文件夹,只可创建文件。

asserts

  • 可以创建文件夹。
  • AssertManager没有提供直接获取asserts文件夹folder路径的function。

anaconda安装tensorflow

下载anaconda

anaconda是一个用于科学计算的python发行版,支持linux、mac、windows系统。
anaconda官方下载地址
我下载的版本是python27的anaconda2-4.4.0-Windows-x86_64.exe

创建python3的anaconda环境

1
conda create -n python3 python=3.5.2 anaconda

安装tensorflow

1
2
3
4
5
6
7
8
# 查看当前版本分支
conda info -e

# 切换python3的环境
activate python3

# 安装tensorflow
conda install tensorflow

启动spyder

1
2
# 在python3的虚拟环境下
spyder

docker-compose的使用

docker compose是一个用来定义和运行复杂应用的docker工具。使用compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动应用。

下载docker-compose

1
curl -L https://github.com/docker/compose/releases/download/1.3.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

创建应用目录

1
2
mkdir compose-gitbucket
touch docker-compose.yml

docker-compose.yml配置文件

1
2
3
4
5
6
7
8
gitbucket:
image: f99aq8ove/gitbucket
volumes:
- ./gitbucket:/gitbucket
ports:
- "8080:8080"
- "29418:29418"
restart: always

docker-compose命令

build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器

一般up之后,又改写了yml配置文件,则需要rm掉旧的容器,再up。

后台启动

在应用目录下启动

1
docker-compose up -d

docker设置http代理

创建目录

1
mkdir /etc/systemd/system/docker.service.d

创建http-proxy.conf文件

1
touch /etc/systemd/system/docker.service.d/http-proxy.conf

在http-proxy.conf文件中记入

1
2
[Service]
Environment="HTTP_PROXY=http://username:passwd@hostname:port/" "NO_PROXY=localhost,127.0.0.1"

reload配置及重启docker服务

1
2
3
systemctl daemon-reload
systemctl show docker --property Environment
systemctl restart docker.service

docker创建私有仓库

拉取registry的镜像

1
docker pull registry:2.1.1

启动容器

1
docker run -d -v /root/compose-docker-registry:/var/lib/registry -p 5000:5000 --restart=always --name registry2 --privileged registry:2.1.1

打包镜像push到本地仓库

1
2
docker tag postgres $registry-address:5000/postgres
docker push $registry-address:5000/postgres

list仓库中的镜像

在client端执行

1
curl -XGET http://$registry-address:5000/v2/_catalog    

可能问题

docker received unexpected HTTP status:501 Not Implemented

这个问题是client端配置了docker的http-proxy,没有将docker的私有仓库registry所在ip设为例外导致的。

server gave HTTP response to HTTPS client

registry默认的是https协议,因此需要在client端配置insecure-registries。
我的docker版本是1.12.1,配置文件是/etc/docker/daemon.json

1
{"insecure-registries":["$registry-address:5000"]}

win10启动vagrant

win10环境下vagrant启动会报错。

正常启动步骤:

设置virtual box的adapter网卡

打开Preferences -> Network -> Host-only Networks Tab

  • 将默认的adapter网卡的ipv4的地址,改写成192.168.xx.1
  • 将mask改为255.255.255.0

启动vagrant

$ vagrant up 

如果启动时报错

Bringing machine 'default' up with 'virtualbox' provider...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: E_FAIL
VBoxManage.exe: error: Failed to create the host-only adapter
VBoxManage.exe: error: Code E_FAIL (0x80004005) - Unspecified error (extended info not available)
VBoxManage.exe: error: Context: "int __cdecl handleCreate(struct HandlerArg ,int,int )" at line 68 of file VBoxManageHostonly.cpp
  1. check下virtual box有没有创建一个新的adapter网卡。
  2. check该网卡的ipv4的地址是以192.168开头的。
  3. 如果成功创建了,则再次vagrant up。就启动成功了。

web.py与gunicorn

web.py的application.py模块,主要实现了WSGI兼容的接口,以便应用程序被WSGI应用服务器调用。

WSGI接口的实现

app = web.application(urls, globals())
application = app.wsgifunc()

Gunicorn.conf的配置

workers = 3
bind = '127.0.0.1:8000'

Gunicorn的启动方式

/$path/bin/gunicorn $filename:application -c /$path/gunicorn.conf

supervisor管理服务器进程

在服务器上同时管理多个java进程和python进程,我使用supervisor。
在/etc/supervisor/conf.d/路径下创建xxx.conf
在xxx.conf下配置如下

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
[program:gzh]
command=/root/python-gzh/venv/bin/gunicorn main:application -c /root/python-gzh/gunicorn.conf
directory=/root/python-gzh
user=root
autostart=true
autorestart=true
stdout_logfile=/root/python-gzh/logs/gzh.log

[program:provider]
command=java -jar /root/springboot/platform-system-provider.jar --spring.profiles.active=prod
directory=/root/springboot
user=root
autostart=true
autorestart=true
stdout_logfile=/root/springboot/logs/provider.log

[program:webapi]
command=java -jar /root/springboot/platform-mobile-client.jar --spring.profiles.active=prod
directory=/root/springboot
user=root
autostart=true
autorestart=true
stdout_logfile=/root/springboot/logs/webapi.log

[program:web]
command=java -jar /root/springboot/platform-admin-web.jar --spring.profiles.active=prod
directory=/root/springboot
user=root
autostart=true
autorestart=true
stdout_logfile=/root/springboot/logs/web.log

通过supervisorctl可以监控管理各种进程的状态了。

  • Copyrights © 2015-2021 小白兔
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信