docker 部署流程,各种问题集合 阿里云 centos6和centos7有区别

0. 母机系统版本 centos7.0,如果是centos6.x,查看内核是否小于3.8否者升级内核

  [root@iZ2893wjzgyZ ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@iZ2893wjzgyZ ~]# rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm  #这里的地址根据www.elrepo.org随时变
[root@iZ2893wjzgyZ ~]# yum --enablerepo=elrepo-kernel install kernel-lt -y 
[root@iZ2893wjzgyZ ~]# vim /etc/grub.conf default=1 改为default=0 
[root@iZ2893wjzgyZ ~]# reboot 
[root@iZ2893wjzgyZ ~]# uname -a 
Linux iZ2893wjzgyZ 3.10.65-1.el6.elrepo.x86_64 #1 SMP Sat Jan 17 10:36:35 EST 2015 x86_64 x86_64 x86_64 GNU/Linux

1. 安装docker看博客【yuanxiao.sinaapp.com 搜索docker centos 阿里云】
因为阿里云比较特殊,不是安装了就能用,要分配一个ip运行docker
docker --bip=192.168.100.1/24 -d
然后将上面这命令封装到supervisor里面运行

如果运行出错docker: relocation error: docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference

 yum upgrade device-mapper-libs //安装这个包包,解决上面的Error 错误信息

 


2. 安装基础镜像
由于镜像仓库在国内,国内慢的令人发指,推荐有import方式使用镜像(此例采用的此种镜像方案可以很容易安装ssh服务)_
在http://openvz.org/Download/templates/precreated中有很多压缩的镜像文件,可以将这些文件下载后采用import方式使用镜像
# wget http://download.openvz.org/template/precreated/centos-6-x86_64-devel.tar.gz
# cat centos-6-x86_64-devel.tar.gz |docker import - centos:6.0
用命令docker images查看镜像列表

3. 运行一个容器【这一条只是演示,具体看第4条】

特别注意:容器里面的openfiles的数量不要用网上写的修改文件来进行修改,否则sshd是登录不进去的,要用下面的--ulimit 参数(前一个数字是soft,后面的是hard),注意容器的openfile数量不要超过主机的,否则ssh连不上

修改/etc/ssh/sshd_config里面的UsePAM改为no,否则会出现有些机器无法ssh登陆的情况

a. 运行一个容器 进入一个交互性环境
docker run -t -i -p 3306:3306 -p 301:22 --ulimit nofile=60000:60001 --ulimit nproc=10000:20000 --name rqname centos:6.0 /bin/bash #进去配置各种需要配置的东西

b. 后台运行一个容器【各种端口映射,前面的是主机端口,后面的是容器端口】---这个容器是在后台运行的,我们要在运行的时候进去配置东西,具体看第4条
docker run -p 301:22 -p 7008:7008 -p 9997:9997 -p 9998:9998 -p 9999:9999 -p 3306:3306 -p 80:80 -p 8000:8000 -p 8001:8001 -p 8002:8002 -p 8003:8003 -p 8004:8004 -p 8005:8005 -p 8006:8006 -p 8008:8008 -p 8009:8009 -p 8010:8010 -p 8011:8011 -p 8012:8012 -p 8013:8013 -p 8014:8014 -p 8015:8015 -p 8100:8100 -p 8101:8101 -p 8102:8102 -p 8103:8103 -p 8104:8104 -p 8105:8105 -p 8106:8106 -p 8107:8107 -p 8108:8108 -p 8109:8109 -p 8110:8110 -p 8111:8111 -p 8112:8112 -p 8113:8113 -p 8114:8114 -p 8115:8115 -p 8116:8116 -p 8117:8117 -p 8118:8118 -p 8119:8119 -p 8120:8120 -p 8121:8121 -p 8122:8122 -p 8123:8123 -p 8124:8124 -p 8125:8125 -p 8126:8126 -p 8127:8127 -p 8128:8128 -p 8129:8129 -p 8130:8130 -p 8131:8131 -p 8132:8132 -p 8133:8133 -p 8134:8134 -p 8135:8135 -p 8136:8136 -p 8137:8137 -p 8138:8138 -p 8139:8139 -p 8140:8140 -p 8141:8141 -p 8600:8600 -p 8601:8601 -p 8602:8602 -p 8603:8603 -p 8604:8604 -p 8605:8605 -p 8606:8606 -p 8607:8607 -p 8608:8608 -p 8609:8609 -p 8610:8610 -p 8611:8611 -p 8612:8612 -p 8613:8613 -p 8614:8614 -p 8615:8615 -p 8616:8616 -p 8617:8617 -p 8618:8618 -p 8619:8619 -p 8620:8620 -p 8621:8621 -p 8622:8622 -p 8623:8623 -p 8624:8624 -p 8625:8625 -p 8626:8626 -p 8627:8627 -p 8628:8628 -p 8629:8629 -p 8630:8630 -p 8631:8631  -p 8632:8632 -p 8633:8633 -p 8634:8634 -p 8635:8635 -p 8636:8636 -p 8637:8637 -p 8638:8638 -p 8639:8639 -p 8640:8640 -p 8641:8641  -p 10001:10001 -p 10002:10002 -p 10003:10003 -p 10004:10004 -p 10005:10005 -p 10006:10006 -p 10007:10007 -d  --ulimit nofile=60000:60001 --ulimit nproc=10000:20000 --name upup centos:6.0 /usr/bin/supervisord

新的sshd不占用supervisor的启动命令:

在容器里面:vi /root/run.sh,修改这个文件的权限为777

##########

!/bin/bash
/usr/sbin/sshd -D
while:
do
sleep 10
done

###########

如果需要打开容器自启动则

 

###############################

#!/bin/bash
sleep 5
service mysqld stop
sleep 5
service mysqld start
sleep 5
service nginx stop
sleep 5
service nginx start
sleep 5
service supervisord stop
sleep 5
service supervisord start
sleep 10
/usr/sbin/sshd -D
while:
do
sleep 10
done


###############################

 这里每个程序之间记得sleep,防止mysql没有启动起来就启动supervisord,supervisord会启动不了,注意,第一个sleep 30很重要,其他的sleep可以酌情减少或者去掉

 

docker run -p 301:22 -p 7008:7008 -p 9997:9997 -p 9998:9998 -p 9999:9999 -p 3306:3306 -p 80:80 -p 8000:8000 -p 8001:8001 -p 8002:8002 -p 8003:8003 -p 8004:8004 -p 8005:8005 -p 8006:8006 -p 8008:8008 -p 8009:8009 -p 8010:8010 -p 8011:8011 -p 8012:8012 -p 8013:8013 -p 8014:8014 -p 8015:8015 -p 8100:8100 -p 8101:8101 -p 8102:8102 -p 8103:8103 -p 8104:8104 -p 8105:8105 -p 8106:8106 -p 8107:8107 -p 8108:8108 -p 8109:8109 -p 8110:8110 -p 8111:8111 -p 8112:8112 -p 8113:8113 -p 8114:8114 -p 8115:8115 -p 8116:8116 -p 8117:8117 -p 8118:8118 -p 8119:8119 -p 8120:8120 -p 8121:8121 -p 8122:8122 -p 8123:8123 -p 8124:8124 -p 8125:8125 -p 8126:8126 -p 8127:8127 -p 8128:8128 -p 8129:8129 -p 8130:8130 -p 8131:8131 -p 8132:8132 -p 8133:8133 -p 8134:8134 -p 8135:8135 -p 8136:8136 -p 8137:8137 -p 8138:8138 -p 8139:8139 -p 8140:8140 -p 8141:8141 -p 8600:8600 -p 8601:8601 -p 8602:8602 -p 8603:8603 -p 8604:8604 -p 8605:8605 -p 8606:8606 -p 8607:8607 -p 8608:8608 -p 8609:8609 -p 8610:8610 -p 8611:8611 -p 8612:8612 -p 8613:8613 -p 8614:8614 -p 8615:8615 -p 8616:8616 -p 8617:8617 -p 8618:8618 -p 8619:8619 -p 8620:8620 -p 8621:8621 -p 8622:8622 -p 8623:8623 -p 8624:8624 -p 8625:8625 -p 8626:8626 -p 8627:8627 -p 8628:8628 -p 8629:8629 -p 8630:8630 -p 8631:8631  -p 8632:8632 -p 8633:8633 -p 8634:8634 -p 8635:8635 -p 8636:8636 -p 8637:8637 -p 8638:8638 -p 8639:8639 -p 8640:8640 -p 8641:8641  -p 10001:10001 -p 10002:10002 -p 10003:10003 -p 10004:10004 -p 10005:10005 -p 10006:10006 -p 10007:10007 -d  --ulimit nofile=60000:60001 --ulimit nproc=10000:20000 --name upup centos:6.0 sh /root/run.sh

 如果需要容器开机自启动则在docker run 创建容器的时候加上 “--restart=always”


4. 建立一个真正可以用的容器【将主机和容器的防火墙关闭,开放所有端口,便于测试】
a. 在第二步的基础上
b. 我们建立一个可以ssh上来的容器,这样方便我们进行各种修改
参考http://www.cnblogs.com/alexkn/p/4239457.html

一.安装关键软件,supervisord,sshd 和 创建一个容器【run命令创建】
docker run -t -i -p 3306:3306 -p 301:22 --ulimit nofile=60000:60001 --ulimit nproc=10000:20000 --name rqname centos:6.0 /bin/bash #进去配置各种需要配置的东西
进入一个容器的交互性环境
root@050f6efc5ed6: welcom


进去配置supervisord,配置sshd等---具体的配置参考博客上面的supervisord的配置方法,很详细的,下面的是关键配置项
supervisord的关键配置
#################################################################################################################
我们先配置supervisord
; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
nodaemon=true ;(修改该软件的启动模式为非daemon,否则docker 在执行的时候会直接退出) ----这里很重要
[include]
files = /etc/supervisor/conf.d/*.conf

[program:sshd]
command = /usr/sbin/sshd -D ;
################################################################################################################

sshd的关键配置--看网上是怎么安装的
#################################################################################################################
mkdir /var/run/sshd
passwd root #很重要,容器中的root用户是没有密码的,这样等会ssh这个用户的时候,就用这个密码
sshd服务无法启动;Could not load host key: /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_dsa_key问题 看blog搜索“sshd服务无法启动”
#################################################################################################################
exit--退出容器

二.将刚才创建的容器commit到镜像
这之前最好docker images和docker ps -a查看镜像和容器ID

docker commit 容器的ID [镜像的名字:TAG]或者[ID]
例如:docker commit f3cfsdfsd8 centos:6.0
我们可以用docker images查看刚才的镜像列表

三.创建一个可以用来ssh连接的新的后台运行的容器
docker run -p 301:22 -p 9997:9997 -p 9998:9998 -p 9999:9999 -p 3306:3306 -p 80:80 -p 8000:8000 -p 8001:8001 -p 8002:8002 -p 8003:8003 -p 8004:8004 -p 8005:8005 -p 8006:8006 -p 8008:8008 -p 8009:8009 -p 8010:8010 -p 8011:8011 -p 8012:8012 -p 8013:8013 -p 8014:8014 -p 8015:8015 -p 8100:8100 -p 8101:8101 -p 8102:8102 -p 8103:8103 -p 8104:8104 -p 8105:8105 -p 8106:8106 -p 8107:8107 -p 8108:8108 -p 8109:8109 -p 8110:8110 -p 8600:8600 -p 8601:8601 -p 8602:8602 -p 8603:8603 -p 8604:8604 -p 8605:8605 -p 8606:8606 -p 8607:8607 -p 8608:8608 -p 8609:8609 -p 8610:8610 -p 10001:10001 -p 10002:10002 -p 10003:10003 -p 10004:10004 -p 10005:10005 -p 10006:10006 -p 10007:10007 -d --ulimit nofile=60000:60001 --ulimit nproc=10000:20000 --name upup centos:6.0 /usr/bin/supervisord

这样我们就可以用putty了,ssh进去这个容器,ssh root@主机IP -P301,输入密码即可登陆 ,进入容器进行apache等的安装,msyql的安装等,配置整个系统环境,如果是安装好的,可以service mysqld start,启动各种服务等【技巧,supervisor可以启动时候运行,嘿嘿,但是千万不要service supervisor stop,这样容器就停止了,因为我们的容器是挂着supervisord的】

四.我们怎么对这个容器进行修改呢【我每次采用第一种方式】
这样我们就可以用putty了,ssh进去这个容器,ssh root@主机IP -P301,输入密码即可登陆 ,进入容器进行apache等的安装,msyql的安装等,配置整个系统环境
i.当配置完成后,我们可以用commit命令将容器的改变提交到镜像上面,然后用save命令,将镜像打包,其他服务器就可以用lload命令用这个镜像了--最好加上.load后缀
ii.当配置完成后,我们不想保存到镜像,那么就可以用export命令导出容器到镜像,然后其他服务器可以用import加载这个镜像--最好加上.import后缀

五.用python运行一个simplehttpserver,方便其他服务器下载
mkdir /home/sy/docker_images #第四点导出的包放在这个文件夹下面

#最好配置在supervisor里面
[program:simplehttpserver]
command=python -m SimpleHTTPServer 9003
directory=/home/yx/docker_images
autostart=true
stdout_logfile=NONE



5. 常用命令


http://www.tuicool.com/articles/7V7vYn

学习记录:
run 会建立新的容器
start 只会开始原来的容器

更多关于如何编写 Dockerfile 文件的信息可以查看 镜像创建 和 Dockerfile 使用。


常用命令【记住进入同一个容器,要用start,如果用run 镜像的话会产生一个新的容器,不是所有容器都要commit到镜像,可以单独export容器】
docker images #查看所有镜像
docker rmi $(docker images -q) #删除所有镜像

docker ps -a #查看所有正在运行的容器
docker rm $(docker ps -q -a) #删除所有正在运行的容器
docker kill $(docker ps -q -a) #停止所有正在运行的容器

$docker stop Name/ID #停止容器
$docker start Name/ID #开始容器 可以加 -i参数
$docker kill Name/ID #杀死容器

attach 很有用,可以在容器后台运行的时候进去交互模式(执行后 按ctrl+c----目前我用sshd代替了)

 

6.dockerfile的使用【具体命令使用本blog可以搜索dockerfile】

#####################################################################################

 dockerfile篇幅

 #####################################################################################

 

 

第一步:

 docker容器经常需要启动的启动一些服务;

cd /data

mkdir dockerfiles

vi Dockerfile   #必须是Dockerfile这个文件名

############################

# 选择一个已有的os镜像作为基础,这里假设centos_xyxy:1.0是上面的docker images里面的镜像,已经安装了ssh服务和mysql
FROM centos_xyxy:1.0

# 镜像的作者
MAINTAINER xiaoyuan "yuan6785@163.com"

 

# 启动sshd服务并且暴露22端口,注意这里启动多个需要的服务,那么/usr/sbin/sshd -D必须放在最后面,而且前面的命令必须不是卡死的,多个命令用&&隔开,可以使用sleep n这个命令

# 具体的RUN,CMD和entrypoint的区别可以看这个文章http://www.163py.com/pages/122/127/795/article_index.html
EXPOSE 22 3306
CMD service mysqld start && /usr/sbin/sshd -D

#############################

 

 

第二步:

 通过Dockerfile构建镜像

docker build -t test:1.0 ./   

运行完成后镜像名为test,tag为1.0,用docker images即可查看,  ./代表了Dockerfile文件所在的路径

 

第三步:

通过test:1.0 构建容器test1

docker run -p 304:22 -p 3325:3306 -d --volumes-from dbdata  --ulimit nofile=60000:60001 --ulimit nproc=10000:20000 --restart=always --name test1 test:1.0 #特别注意这里后面不要跟命令,否则会覆盖Docker里面的CMD

第四部:

后面的使用就和普通容器一样了,可以ssh,重启后自动启动容器test,因为加了--restart=always; 也会自动启动mysql

 

 

#####################################################################

华丽分割线,下面是centos7的镜像制作流程
#####################################################################


#####################################################################


#####################################################################


#####################################################################

centos7的配置简单多了

1.centos7和centos6做镜像有点不一样,centos7的endpoint必须是/usr/sbin/init,否则进去以后systemctl是没有用处的,如果是docker-ce还必须加特权模式

docker run --privileged=true   非常重要

2.后台制作一个镜像
docker run  -t -i -p 310:22 --ulimit nofile=60000:60001 --ulimit nproc=10000:20000 --name dddd 镜像ID /usr/sbin/init    ;如果是docker-ce还必须加--privileged=true
这里会阻塞

3.开另外一个ssh进入dddd这个镜像
docker exec -it dddd /bin/bash

4.在这个镜像里面配置好sshd服务
yum install openssh-server -y
启动/usr/sbin/sshd -D 没有问题后
修改root密码 passwd root即可
然后将sshd设置为自启动
systemctl enable sshd.service

5.提交镜像
docker stop dddd
docker commit dddd 镜像ID
docker rm dddd

6.制作配置好的正常容器即可【备份,重新制作镜像都走这个文件即可】
docker run -p 310:22 -p 3327:3327 -p 7808:7808 -p 7809:7809 -p 7810:7810 -p 7811:7811 -p 7812:7812 -p 7813:7813 -p 7814:7814 -p 7815:7815 -p 7817:7817 -p 7818:7818 -p 7819:7819 -p 7820:7820 -p 7998:7998 -v /data/dbdata:/data -d --ulimit nofile=60000:60001 --ulimit nproc=10000:20000 --name centos7_test 镜像ID /usr/sbin/init

7. ssh 进入这个容器即可

 


分享到: 微信 更多