Docker日常笔记

2015-12-02

快速安装

apt-get -y install docker.io

升级Docker

sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
apt-get update
apt-get install lxc-docker

从本地提交镜像

1. 登录私有镜像仓库
docker login -u [用户名] -p [密码] -e [电子邮件] https://xxx.com
2. 给本地host的镜像打tag
docker tag [镜像ID] xxx.com/[用户名]/[镜像名称:标签]
3. 推送镜像到私有仓库
docker push xxx.com/[用户名]/[镜像名称:标签]

查看镜像

docker images

删除镜像

docker rmi [镜像名称:标签]

删除容器

docker rm [容器ID]
docker rm -f [容器ID]   #强制删除运行中的容器
docker ps -a -q|xarge docker rm   #删除所有不在运行的容器

拉取镜像

docker pull [镜像路径]

登录daocloud帐号:

docker login daocloud.io

运行镜像:

docker run -d -p [外网端口]:[镜像端口] -e [环境变量] [镜像ID]

查看运行中的docker:

docker ps

查看所有启动过的docker:

docker ps -a

停止/启动docker:

docker stop  [docker运行ID]
docker start [docker运行ID]

登录容器:

docker exec -it [container_id] /bin/bash

查看容器日志:

docker logs [docker运行ID]

查看容器运行信息:

docker inspect [docker运行ID]

查看容器资源占用信息:

docker stats [docker运行ID]

添加新用户:

useradd -r -m -s /bin/bash

删除docker0网卡

虚拟网卡docker0其实是一个网桥,如果想删除它,只需要按照删除网桥的方法即可。

ifconfig docker0 down
brctl delbr docker0

docker0这个网桥是在启动Docker Daemon时创建的,因此,这种删除方法并不能根本上删除docker0,下次daemon启动(假设没有指定-b参数)时,又会自动创建docker0网桥。

在启动时不创建网桥:

docker -d --bridge=none 

开启docker远程API

1.编辑配置文件

vim /etc/default/docker

DOCKER_OPTS='-H unix:///var/run/docker.sock -H 0.0.0.0:5000'

比如我开放5000端口

2.重启docker

service docker restart

3.通过接口查看所有容器运行状态

http://localhost:5000/containers/json?all=1

更多接口使用,参考官方文档

给运行中容器添加端口:

获得容器IP,将container_name 换成实际环境中的容器名

docker inspect 'container_name' | grep IPAddress

iptable转发端口,将容器的8000端口映射到Docker主机的8001端口

iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.2:8000

查看iptables映射情况:

iptables -t nat -L

只查看DOCKER链并显示规则编号:

iptables -L DOCKER --line-numbers -n -t nat

删除(其中5就是规则编号):

iptables -D DOCKER 5 -t nat

也可以commit一个出来,再重新运行

32位系统部署Docker

由于Docker Hub Registry上面的镜像都是64位的,所以这里需要自己做一个Ubuntu的镜像,这里使用import命令,该命令的官方解释为:Create a new filesystem image from the contents of a tarball.这里使用openVZ的模板来创建.

openVZ模板的下载地址为:http://openvz.org/Download/templates/precreated

执行导入:

wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz
cat ubuntu-14.04-x86-minimal.tar.gz | docker import - ubuntu:14.04

也可以直接导入:

docker import http://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz

接下来就可以运行了:

docker run -i -d ubuntu:14.04 -t /bin/bash

然后可以根据需要自己构建(进入Dockerfile目录):

docker build -t malu/docker_lamp .

基于32位的镜像生成新的镜像,期间如果构建出错可以修改Dockerfile再次构建,默认会调用缓存。

重命名镜像tag

docker run -d [镜像ID] -t /bin/bash    #先启动一个
docker commit -a 'aa' [容器ID] ubuntu:first    #然后把它提交成新镜像

这样就新生成了一个镜像:

root@ACER-mini:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              first               a70f0f795d4b        5 seconds ago       205.2 MB
ubuntu              14.04               65161a7b2077        3 hours ago         205.2 MB

当然上面的方法很傻,其实我们只要:

docker tag imageid name:tag   #新建tag
docker rmi name:oldtag    #删除原来tag

备份迁移

打包成tar

docker save -o filename.tar [镜像ID]

恢复打包文件

docker load -i filename.tar

重命名容器名:

root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE                 COMMAND               CREATED             STATUS                    PORTS                    NAMES
ec7d53c91621        70683c8feae9:latest   "/run.sh"             2 hours ago         Exited (64) 2 hours ago                            goofy_stallman      
0a3869ba2838        b9ec47bb8b8d:latest   "/run.sh"             22 hours ago        Up 2 hours                0.0.0.0:9221->9200/tcp   logstash            
3ad0379db41d        70683c8feae9:latest   "/run.sh"             25 hours ago        Exited (0) 25 hours ago                            cranky_rosalind     
6d829565caf4        f9aabae65d48:latest   "/usr/local/run.sh"   28 hours ago        Exited (0) 5 hours ago                             naughty_curie       
root@ubuntu:~# docker rename goofy_stallman one
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE                 COMMAND               CREATED             STATUS                    PORTS                    NAMES
ec7d53c91621        70683c8feae9:latest   "/run.sh"             2 hours ago         Exited (64) 2 hours ago                            one                 
0a3869ba2838        b9ec47bb8b8d:latest   "/run.sh"             22 hours ago        Up 2 hours                0.0.0.0:9221->9200/tcp   logstash            
3ad0379db41d        70683c8feae9:latest   "/run.sh"             25 hours ago        Exited (0) 25 hours ago                            cranky_rosalind     
6d829565caf4        f9aabae65d48:latest   "/usr/local/run.sh"   28 hours ago        Exited (0) 5 hours ago                             naughty_curie 

aufs文件系统安装

http://cloud.51cto.com/art/201412/461261.htm

生成requirements.txt文件:

pip install redis
pip freeze > requirements.txt

docker容器故障致无法启动解决办法

首先通过启动日志查看问题原因:

docker logs [docker运行ID]

然后根据问题,到启动数据/var/lib/docker/aufs/diff/路径下。

比如我遇到Nginx启动失败,那就查找nginx配置文件:

root@ubuntu:/var/lib/docker/aufs/diff# find ./ -name 'nginx.conf'
./399145668ccb628a0a9cc572431b93c17a72f84625d8430d9897fd46e572f4dd/etc/nginx/nginx.conf
./0609441079c15cc8214d1f55bdcdb270da9b94008e4432f81d98a96460f54f25/etc/nginx/nginx.conf

然后去修改对应问题。

参考文档:http://dockerpool.com/static/books/docker_practice/index.html

新浪SEC安装docker环境

以下是安装记录

yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum install docker-io

yum upgrade device-mapper-libs 

sudo groupadd docker

sudo usermod -a -G docker $USER 

service docker start

chkconfig docker on

docker -d

docker images

sudo docker info

docker-composer

官方安装文档:https://docs.docker.com/compose/install/

安装:

curl -L --fail https://github.com/docker/compose/releases/download/1.14.0/run.sh > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

如果提示版本不匹配,docker最新版本安装

apt-get update
apt-get install -t wheezy-backports linux-image-amd64
curl -sSL https://get.docker.com/ | sh