Docker
Install
Section titled “Install”Add the EPEL Repository
Section titled “Add the EPEL Repository”rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmyum update -y
Installation
Section titled “Installation”yum -y install docker-iochkconfig docker on
update
Section titled “update”yum --enablerepo=epel-testing update docker-io
move images path
Section titled “move images path”mkdir -p /opt/docker/dockermkdir -p /var/lib/docker#mount -o bind /var/lib/docker /opt/docker/docker
vim /etc/fstab/opt/docker/docker /var/lib/docker none bind 0 0# mount all stuff from /etc/fstabmount -a
limits
Section titled “limits”vim /etc/sysctl.conf
fs.file-max = 65536
vim /etc/security/limits.conf
* soft nproc 65535* hard nproc 65535* soft nofile 65535* hard nofile 65535
vim /etc/security/limits.d/90-nproc.conf
* soft nproc 65535
dynamic change limits
Section titled “dynamic change limits”echo -n ‘Max processes=SOFT_LIMITS:HARD_LIMITS’ > /proc/
export http_proxy=http://106.186.20.252:8384
run brfore daemon
vim /etc/sysconfig/docker
## Other arguments to pass to the docker daemon process# These will be parsed by the sysv initscript and appended# to the arguments list passed to docker -d
other_args="-H tcp://10.11.1.171:4243 -H unix:///var/run/docker.sock --iptables=false"
service docker start
interface
Section titled “interface”vim /etc/sysconfig/network-scripts/ifcfg-docker0
DEVICE=docker0TYPE=BridgeONBOOT=yesNM_CONTROLLED=yesBOOTPROTO=noneIPADDR=10.9.2.1NETMASK=255.255.255.0IPV6INIT=noUSERCTL=no
registry
Section titled “registry”download
Section titled “download”git clone https://github.com/dotcloud/docker-registrygit checkout -b 0.8.0cd docker-registrycp config/config_sample.yml config/config.yml
config
Section titled “config”vim config/config.yml
local: &local <<: *common storage: local storage_path: /opt/docker/registry
install deps
Section titled “install deps”pip install -r requirements.txt
run registry
Section titled “run registry”docker run --name registry -p 10.11.1.171:5000:5000 -d registry
docker run --name registry \ -p 10.11.1.171:5000:5000 \ -e SETTINGS_FLAVOR=dev \ -e STORAGE_PATH=/opt/docker/registry \ -e CORS_ORIGINS=[\'*\'] \ -v /opt/docker/registry:/opt/docker/registry \ --restart always \ -d registry
docker run -p 10.11.1.171:8080:8080 \ -e REG1=http://dk.wizinnov.com/v1/ \ atcol/docker-registry-ui
shipyard
Section titled “shipyard”mkdir -p /opt/docker/shipyard-datadocker run -it -d --name shipyard-rethinkdb-data \ -v /opt/docker/shipyard-data:/data \ --restart always \ --entrypoint /bin/bash shipyard/rethinkdb -l
docker run -it -d --name shipyard-rethinkdb \ -p 10.11.1.171:49153:28015 \ -p 10.11.1.171:49154:29015 \ -p 10.11.1.171:49155:8080 \ --restart always \ --volumes-from shipyard-rethinkdb-data shipyard/rethinkdb
docker run -it -p 10.11.1.171:8080:8080 -d --name shipyard \ --restart always \ --link shipyard-rethinkdb:rethinkdb shipyard/shipyard
docker run -it -d --name shipyard-cli \ --restart always \ shipyard/shipyard-cli
cadvisor
Section titled “cadvisor”docker run -it -d \ --volume /:/rootfs:ro \ --volume /var/run:/var/run:rw \ --volume /sys:/sys:ro \ --volume /cgroup:/cgroup \ --volume /var/lib/docker/:/var/lib/docker:ro \ --publish 10.11.1.171:8088:8080 \ --name cadvisor \ --restart always \ google/cadvisor:latest
docker run -it -d \ --volume /:/rootfs:ro \ --volume /var/run:/var/run:rw \ --volume /sys:/sys:ro \ --volume /cgroup:/cgroup \ --volume /var/lib/docker/:/var/lib/docker:ro \ --publish 10.11.1.173:8088:8080 \ --name cadvisor \ --restart always \ google/cadvisor:latest
docker run -it -d \ --volume /:/rootfs:ro \ --volume /var/run:/var/run:rw \ --volume /sys:/sys:ro \ --volume /cgroup:/cgroup \ --volume /var/lib/docker/:/var/lib/docker:ro \ --publish 10.10.1.159:8088:8080 \ --name cadvisor \ --restart always \ google/cadvisor:latest
Sevice Discovery
Section titled “Sevice Discovery”# etcddocker run -it -d \ --name etcd \ -p 10.11.1.171:4001:4001 \ -p 10.11.1.171:7001:7001 \ --restart always \ coreos/etcd
docker run -it -d \ -e HOST_IP=10.11.1.171 \ -e ETCD_HOST=10.11.1.171:4001 \ -v /var/run/docker.sock:/var/run/docker.sock \ --name docker-register \ jwilder/docker-register
Images
Section titled “Images”build image
Section titled “build image”febootstrap -i bash -i wget -i passwd -i telnet -i yum -i iputils -i iproute -i tar \ -i vim-minimal -i openssh-server -i openssh-clients -i lsof -i patch -i diffutils \ centos6-base-min centos6-base-min http://mirrors.sohu.com/centos/6/os/x86_64/ \ -u http://mirrors.sohu.com/centos/6/updates/x86_64/
or:
wget -c http://mirrors.microsocl.com/docker/file/build-centos.shchmod +x build-centos.sh./build-centos.shcat centos6-min.tar.xz | docker import - dk.wizinnov.com/sunkun/centos6-base-min
import to docker
Section titled “import to docker”cd centos6-base-min && tar -c .|docker import - centos6-base-min
tag & push to registry
Section titled “tag & push to registry”docker tag <image> dk.wizinnov.com/sunkun/centos6-base-mindocker push dk.wizinnov.com/sunkun/centos6-base-min
build with Dockerfile
Section titled “build with Dockerfile”docker build -t dk.wizinnov.com/sunkun/centos6-min-ssh http://mirrors.microsocl.com/docker/file/centos6-min-ssh
docker run -d --name test1 -v /opt/datum:/opt/datum ac <image>
docker run pararmeters
Section titled “docker run pararmeters”- -d: Detached mode: Run container in the background, print new container id
- -e: Set environment variables
- -h: Container host name
- -m: Memory limit (format:
, where unit = b, k, m or g) - —name: Assign a name to the container
- -p: Publish a container’s port to the host format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort (use ‘docker port’ to see the actual mapping)
- —privileged: Give extended privileges to this container
- -v: Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)
- —volumes-from: Mount volumes from the specified container(s)
Deploy
Section titled “Deploy”data volume images
Section titled “data volume images”docker build -t dk.wizinnov.com/sunkun/data-datum http://mirrors.microsocl.com/docker/file/data-datumdocker build -t dk.wizinnov.com/sunkun/data-conf-nginx http://mirrors.microsocl.com/docker/file/data-conf-nginxdocker build -t dk.wizinnov.com/sunkun/data-weblogs http://mirrors.microsocl.com/docker/file/data-weblogsdocker build -t dk.wizinnov.com/sunkun/data-projects http://mirrors.microsocl.com/docker/file/data-projectsdocker build -t dk.wizinnov.com/sunkun/data-conf-php http://mirrors.microsocl.com/docker/file/data-conf-php
docker run --name data-datum dk.wizinnov.com/sunkun/data-datumdocker run --name data-conf-nginx dk.wizinnov.com/sunkun/data-conf-nginxdocker run --name data-weblogs dk.wizinnov.com/sunkun/data-weblogsdocker run --name data-projects dk.wizinnov.com/sunkun/data-projectsdocker run --name data-conf-php dk.wizinnov.com/sunkun/data-conf-php
build nginx image
Section titled “build nginx image”docker build -t dk.wizinnov.com/sunkun/centos6-nginx http://mirrors.microsocl.com/docker/file/centos6-nginx
data volume init
Section titled “data volume init”docker run -d --name ssh-data --volumes-from data-datum --volumes-from data-conf-nginx --volumes-from data-weblogs --volumes-from data-projects dk.wizinnov.com/sunkun/centos6-min-ssh
ssh 10.9.1.x// add nginx conf file to /opt/etc/nginx// add ip.conf to /opt/projects/www/ipsource/ip.conf
run nginx image
Section titled “run nginx image”docker run -d --name centos6-nginx --volumes-from data-datum --volumes-from data-conf-nginx --volumes-from data-weblogs --volumes-from data-projects dk.wizinnov.com/sunkun/centos6-nginx
another way
Section titled “another way”# data volumedocker run -d \ --name dev-ngx-conf \ -v /opt/docker/container/dev/ngx-conf:/opt/etc/nginx \ dk.wizinnov.com/sunkun/data-conf-nginxdocker run -d \ --name dev-projects \ -v /opt/docker/container/dev/projects:/opt/projects \ dk.wizinnov.com/sunkun/data-projectsdocker run -d \ --name dev-weblogs \ -v /opt/docker/container/dev/weblogs:/opt/weblogs \ dk.wizinnov.com/sunkun/data-weblogsdocker run -d \ --name dev-datum \ -v /opt/docker/container/dev/datum:/opt/datum \ dk.wizinnov.com/sunkun/data-datum
mkdir -p /opt/docker/container/dev/mysql-confdocker run -d \ --name dev-mysql-conf \ -v /opt/docker/container/dev/mysql-conf:/opt/etc/mysql \ dk.wizinnov.com/sunkun/data-conf-mysql
mkdir -p /opt/docker/container/dev/mysqldatadocker run -d \ --name dev-mysql-data \ -v /opt/docker/container/dev/mysqldata:/opt/mysqldata \ dk.wizinnov.com/sunkun/data-mysql
mkdir -p /opt/docker/container/dev/php55-confdocker run -d \ --name dev-php55-conf \ -v /opt/docker/container/dev/php55-conf:/opt/etc/php \ dk.wizinnov.com/sunkun/data-conf-php
# service# ngxdocker run -dti \ --name dev-ngx-ssh \ --volumes-from dev-ngx-conf \ --volumes-from dev-projects \ --volumes-from dev-weblogs \ --volumes-from dev-datum \ -m 1g \ dk.wizinnov.com/sunkun/centos6-nginx-ssh
# mysqldocker run -dti \ --name dev-mysql \ --volumes-from dev-mysql-conf \ --volumes-from dev-mysql-data \ -m 1g \ dk.wizinnov.com/sunkun/centos6-mysql
# ngx php55docker run -dti \ --name dev-www \ --volumes-from dev-ngx-conf \ --volumes-from dev-php55-conf \ --volumes-from dev-projects \ --volumes-from dev-weblogs \ --volumes-from dev-datum \ -m 1g \ dk.wizinnov.com/sunkun/centos6-nginx-php55-ssh
docker run -dti \ --name dev-mysql2 \ --volumes-from dev-mysql-conf \ --volumes-from dev-mysql-data \ -m 1g \ dk.wizinnov.com/sunkun/centos6-mysql
docker run --rm \ --name dev-www2 \ --volumes-from dev-ngx-conf \ --volumes-from dev-php55-conf \ --volumes-from dev-projects \ --volumes-from dev-weblogs \ --volumes-from dev-datum \ --link dev-mysql2:db \ -m 1g \ dk.wizinnov.com/sunkun/centos6-nginx-php55-ssh env
HOSTNAME=670dbea2e59dDB_PORT=tcp://10.9.1.58:3306DB_PORT_3306_TCP=tcp://10.9.1.58:3306DB_PORT_3306_TCP_ADDR=10.9.1.58DB_PORT_3306_TCP_PORT=3306DB_PORT_3306_TCP_PROTO=tcpDB_NAME=/dev-www2/db
networking
Section titled “networking”create bridge
Section titled “create bridge”vim /etc/sysconfig/network-scripts/ifcfg-br1
DEVICE=br1TYPE=BridgeONBOOT=yesNM_CONTROLLED=yesBOOTPROTO=noneIPADDR=10.8.1.1NETMASK=255.255.255.0IPV6INIT=noUSERCTL=no
ifup br1
iptable forward
Section titled “iptable forward”10.11.1.0/24 (for container)
Section titled “10.11.1.0/24 (for container)”#iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -o eth1 -j MASQUERADE#iptables -t nat -A POSTROUTING -s 10.9.0.0/16 -o eth1 -j MASQUERADEiptables -t nat -A POSTROUTING ! -d 10.0.0.0/8 -o eth0 -j MASQUERADE
171 (10.11 gateway)
Section titled “171 (10.11 gateway)”-> net10 (for container)
Section titled “-> net10 (for container)”iptables -t nat -A POSTROUTING -d 10.10.0.0/16 -o tun0 -j MASQUERADE
159 (10.10 gateway)
Section titled “159 (10.10 gateway)”-> net11 (for container)
Section titled “-> net11 (for container)”iptables -t nat -A POSTROUTING -d 10.11.0.0/16 -o tun0 -j MASQUERADE
net8 -> net10
Section titled “net8 -> net10”iptables -t nat -A POSTROUTING -s 10.7.0.0/16 -o eth1 -j MASQUERADE```aaa
#### backup
iptables-save > /etc/sysconfig/iptablesiptables-restore < /etc/sysconfig/iptables
### pipework
#yum install -y http://rdo.fedorapeople.org/rdo-release.rpmyum install -y https://repos.fedorapeople.org/repos/openstack/openstack-icehouse/rdo-release-icehouse-4.noarch.rpmyum install -y iproute
<https://github.com/jpetazzo/pipework>
./pipework br1 ssh-data 10.8.1.12/[email protected]
send mail---------
### on host:
strat sendmail daemon
`vim /etc/mail/access`, add
Connect:10.9 RELAY
### on container
use -S smtp=xxx
mail -v -S smtp=smtp://10.11.1.171 -s ‘tx44444444’ -r ‘[email protected]’ [email protected]
API & commands--------------
### API
curl http://dk.wizinnov.com/v1/search curl http://dk.wizinnov.com/v1/repositories/wizinnov/centos6-ssh/tags curl -XDELETE http://dk.wizinnov.com/v1/repositories/sunkun/centos6-base-min/ curl http://dk.wizinnov.com/v1/images/<image-id>/json
### commands
* docker inspect <container> # show container information* docker images --no-trunc # show full image id* docker ps --no-trunc # show full container id* docker port CONTAINER PORT* docker run -i -t CONTAINER_ID /bin/bash* docker top CONTAINER_ID # show running process* cat /cgroup/memory/docker/<container>/memory.stat* docker ps -a | awk '{print $1, $2, $NF}' | column -t* docker ps -a | grep Exited | grep -v sunkun/data
cat /proc/mounts | grep "mapper/docker" | awk '{print $2}' | xargs -r umount
### remove all containers
docker stop $(docker ps -a -q) docker rm $(docker ps -a -q)
### supervisord
* supervisord: 初始启动Supervisord, 启动、管理配置中设置的进程* supervisorctl stop programxxx: 停止某一个进程(programxxx), programxxx为[program:chatdemon]里配置的值, 这个示例就是chatdemon* supervisorctl start programxxx: 启动某个进程* supervisorctl restart programxxx: 重启某个进程* supervisorctl stop groupworker: 重启所有属于名为groupworker这个分组的进程(start,restart同理)* supervisorctl stop all: 停止全部进程, 注:start、restart、stop都不会载入最新的配置文件* supervisorctl reload: 载入最新的配置文件, 停止原有进程并按新的配置启动、管理所有进程* supervisorctl update: 根据最新的配置文件, 启动新配置或有改动的进程, 配置没有改动的进程不会受影响而重启
> 注意: 用stop停止掉的进程, 用reload或者update都不会自动重启
### reload supervisord
* in container: kill -HUP <pid>* out container: docker kill -s HUP CONTAINER_ID
### clean
# localesrm -rf /usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive}# docsrm -rf /usr/share/{man,doc,info,gnome/help}# cracklibrm -rf /usr/share/cracklib# i18nrm -rf /usr/share/i18n# slnrm -rf /sbin/sln# ldconfigrm -rf /etc/ld.so.cacherm -rf /var/cache/ldconfig/*
### kexec
update kernel
Section titled “update kernel”yum install kexec-tools
latestkernel=ls -t /boot/vmlinuz-* | sed "s/\/boot\/vmlinuz-//g" | head -n1
echo $latestkernel
kexec -l /boot/vmlinuz-${latestkernel} —initrd=/boot/initramfs-${latestkernel}.img —append=“cat /proc/cmdline
”
kexec -e
QA----
### sshd
1. disable PAM2. disable GSSAPIAuthentication
### timezone
docker run -v /etc/localtime:/etc/localtime:ro ...
or set in Dockerfile
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
reference---------
* https://docs.docker.com/reference/api/registry_api/* http://www.4linuxfun.com/centos-with-docker/* http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/* http://feilong.me/2011/03/monitor-processes-with-supervisord* http://knktc.com/2014/08/09/docker-cheat-sheet/* https://github.com/jdeathe/centos-ssh* https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-memory.html* http://unix.stackexchange.com/questions/79924/determine-if-reboot-is-required-to-update-kernel