http://dockone.io/article/277html
chroot
。若是你不知道
chroot
是什么的话,后一种解释可能没法帮助你理解什么是Docker。
chroot是一种操做,能改变当前运行的进程和子进程的根目录。 程序运行在这样的一个被修改的环境中,它不能访问这个环境目录树以外的文件和命令,这个被修改的环境就是“chroot牢笼”。
-- Arch Linux 的 wiki 中对 chroot 的解释
# Running processes on Host for a VM $ pstree VM -+= /VirtualBox.app |--= coreos-vagrant
ps
,
kill
等命令进行检查和维护。
# Docker在主机中的进程 $ pstree docker -+= /docker |--= /bin/sh |--= node server.js |--= go run app |--= ruby server.rb ... |--= /bin/bash
Dockerfile
来构建镜像, 还能够经过commit
一个运行的容器来建立一个镜像,这个镜像能够会被标记,能够推到Registry或者从Registry上拉下来,能够经过建立或者运行镜像的方式来启动容器,能够被stop
,也能够经过rm
来移除它。# Commands for interacting with images $ docker images # 查看全部镜像. $ docker import # 从tarball建立镜像 $ docker build # 经过Dockerfile建立镜像 $ docker commit # 从容器中建立镜像 $ docker rmi # 删除镜像 $ docker history # 列出镜像的变动历史
docker commit container-id
、
docker import url-to-tar
或者
docker build -f Dockerfile .
来建立镜像。
# 经过commit的方式来建立镜像 $ docker run -i -t debian:jessie bash root@e6c7d21960:/# apt-get update root@e6c7d21960:/# apt-get install postgresql root@e6c7d21960:/# apt-get install node root@e6c7d21960:/# node --version root@e6c7d21960:/# curl https://iojs.org/dist/v1.2.0/iojs-v1.2.0- linux-x64.tar.gz -o iojs.tgz root@e6c7d21960:/# tar xzf iojs.tgz root@e6c7d21960:/# ls root@e6c7d21960:/# cd iojs-v1.2.0-linux-x64/ root@e6c7d21960:/# ls root@e6c7d21960:/# cp -r * /usr/local/ root@e6c7d21960:/# iojs --version 1.2.0 root@e6c7d21960:/# exit $ docker ps -l -q e6c7d21960 $ docker commit e6c7d21960 postgres-iojs daeb0b76283eac2e0c7f7504bdde2d49c721a1b03a50f750ea9982464cfccb1e
docker commit
来建立镜像,可是这种方式有点凌乱并且很难复制, 更好的方式是经过Dockerfile来构建镜像,由于它步骤清晰而且容易复制:
FROM debian:jessie # Dockerfile for postgres-iojs RUN apt-get update RUN apt-get install postgresql RUN curl https://iojs.org/dist/iojs-v1.2.0.tgz -o iojs.tgz RUN tar xzf iojs.tgz RUN cp -r iojs-v1.2.0-linux-x64/* /usr/local
$ docker build -tag postgres-iojs .
FROM debian:jessie # Dockerfile for postgres-iojs RUN apt-get update && \ apt-get install postgresql && \ curl https://iojs.org/dist/iojs-v1.2.0.tgz -o iojs.tgz && \ tar xzf iojs.tgz && \ cp -r iojs-v1.2.0-linux-x64/* /usr/local
apt-get install
docker run -v
设置的, 那么将被建立为/var/lib/docker/volumes
docker run image cmd
命令覆盖。经常使用于提供一个默认的可执行程序并使用命令做为参数。# 用于与容器交互的命令 $ docker create # 建立一个容器,但不启动它 $ docker run # 建立并启动一个容器 $ docker stop # 中止容器 $ docker start # 启动容器 $ docker restart # 重启容器 $ docker rm # 删除容器 $ docker kill # 给容器发送kill信号 $ docker attach # 链接到正在运行的容器中 $ docker wait # 阻塞直到容器中止为止 $ docker exec # 在运行的容器中执行一条命令
docker run
是用户启动新容器的命令, 这里是一些通用的运行容器的方法:
# 交互式运行容器 $ docker run -it --rm ubuntu
# 后台运行容器 $ docker run -d hadoop
# 运行一个命名容器并给它传一些环境变量 $ docker run \ --name mydb \ --env MYSQL_USER=db-user \ -e MYSQL_PASSWORD=secret \ --env-file ./mysql.env \ mysql
# 发布容器的80端口到主机上的随机端口 $ docker run -p 80 nginx # 发布容器端口80和主机上的8080端口 $ docker run -p 8080:80 nginx # 发布容器80端口到主机127.0.0.0.1的8080端口 $ docker run -p 127.0.0.1:8080:80 nginx # 发布全部容器中暴露的端口到主机的随机端口上 $ docker run -P nginx
FROM debian:wheezy MAINTAINER NGINX "docker-maint@nginx.com" EXPOSE 80 443
# 启动postgres容器,给它起名为mydb $ docker run --name mydb postgres # 把mydb 连接到 myqpp 的db $ docker run --link mydb:db myapp
主机名:端口
的形式访问对应的端口。# 限制内存大小 $ docker run -m 256m yourapp # 限制进程可使用的cpu份数(cpu shares)(总CPU份数为1024) $ docker run --cpu-shares 512 mypp # 改变运行进程的用户为www,而不是root(出于安全考虑) $ docker run -u=www nginx
docker exec
容许咱们在已经运行的容器内部执行命令,这点在debug的时候颇有用。
# 使用id 6f2c42c0在容器内部运行shell $ docker exec -it 6f2c42c0 sh
# Start a new nginx container with /var/log as a volume $ docker run -v /var/log nginx
docker inspect container-id
找到。
# 启动新的nginx容器,设置/var/log为卷,并映射到主机的/tmp目录下 $ docker run -v /tmp:/var/log nginx
--valumes-from
选项从别的容器中挂载卷。
# 启动容器db $ docker run -v /var/lib/postgresql/data --name mydb postgres # 启动backup容器,从mydb容器中挂载卷 $ docker run --volumes-from mydb backup
docker push
到Docker Hub,Docker pull则会拉取镜像下来。
docker run
一个本地不存在的镜像,则会自动开始
docker pull
操做。
$ docker ps # 显示运行的容器 $ docker inspect # 显示容器信息(包括ip地址) $ docker logs # 获取容器中的日志 $ docker events # 获取容器事件 $ docker port # 显示容器的公开端口 $ docker top # 显示容器中运行的进程 $ docker diff # 查看容器文件系统中改变的文件 $ docker stats # 查看各类纬度数据、内存、CPU、文件系统等
docker ps
和
docker inspect
,这两个命令最经常使用了。
# 列出全部容器,包括已中止的。 $ docker ps --all CONTAINER ID IMAGE COMMAND NAMES 9923ad197b65 busybox:latest "sh" romantic_fermat fe7f682cf546 debian:jessie "bash" silly_bartik 09c707e2ec07 scratch:latest "ls" suspicious_perlman b15c5c553202 mongo:2.6.7 "/entrypo some-mongo fbe1f24d7df8 busybox:latest "true" db_data # Inspect the container named silly_bartik # Output is shortened for brevity. $ docker inspect silly_bartik 1 [{ 2 "Args": [ 3 "-c", 4 "/usr/local/bin/confd-watch.sh" 5 ], 6 "Config": { 10 "Hostname": "3c012df7bab9", 11 "Image": "andersjanmyr/nginx-confd:development", 12 }, 13 "Id": "3c012df7bab977a194199f1", 14 "Image": "d3bd1f07cae1bd624e2e", 15 "NetworkSettings": { 16 "IPAddress": "", 18 "Ports": null 19 }, 20 "Volumes": {}, 22 }]
# Get the id (-q) of the last (-l) run container # 获取最后(-l)一个启动的容器id(-q) $ docker ps -l -q c8044ab1a3d0
docker inspect
能够带格式化的字符串----Go语言模板做为参数,详细描述所需的数据。写脚本时同时有用。
$ docker inspect -f '{{ .NetworkSettings.IPAddress }}' 6f2c42c05500 172.17.0.11
docker exec
来跟运行中的容器进行交互。
# 获取容器环境变量 $ docker exec -it 6f2c42c05500 env PATH=/usr/local/sbin:/usr... HOSTNAME=6f2c42c05500 REDIS_1_PORT=tcp://172.17.0.9:6379 REDIS_1_PORT_6379_TCP=tcp://172.17.0.9:6379 ...
1 FROM dockerfile/nodejs:latest 2 3 MAINTAINER Anders Janmyr "anders@janmyr.com" 4 RUN apt-get update && \ 5 apt-get install zlib1g-dev && \ 6 npm install -g pm2 && \ 7 mkdir -p /srv/app 8 9 WORKDIR /srv/app 10 COPY . /srv/app 11 12 CMD pm2 start app.js -x -i 1 && pm2 logs 13
$ docker build -t myapp . $ docker run -it --rm myapp
docker-compose
的工具。(之前它叫
fig
, 由另外一家公司开发,而后最近Docker收购了他们)
docker-compose
在单个
docker-compose.yml
文件中声明多个容器的信息。来看一个例子,管理web和redis两个容器的配置文件:
1 web: 2 build: . 3 command: python app.py 4 ports: 5 - "5000:5000" 6 volumes: 7 - .:/code 8 links: 9 - redis 10 redis: 11 image: redis
docker-compose up
命令
$ docker-compose up Pulling image orchardup/redis... Building web... Starting figtest_redis_1... Starting figtest_web_1... redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3 web_1 | * Running on http://0.0.0.0:5000/
docker-compose up -d
,而后能够经过
docker-compose ps
查看容器中跑了啥东西:
$ docker-compose up -d Starting figtest_redis_1... Starting figtest_web_1... $ docker-compose ps Name Command State Ports ------------------------------------------------------------ figtest_redis_1 /usr/local/bin/run Up figtest_web_1 /bin/sh -c python app.py Up 5000->5000
# 从web容器中获取环境变量 $ docker-compose run web env # 扩展到多个容器中(Scale to multiple containers) $ docker-compose scale web=3 redis=2 # 从全部容器中返回日志信息 $ docker-compose logs
systemd
做为init服务,它的性能超级好,还能很好的处理启动依赖关系, 强大的日志系统,还支持socket-activation。etcd
是分布式的,一致性 K-V 存储用于配置共享和服务发现。fleet
,集群管理器,是systemd
的扩展,能与多台机器工做,采用etcd
来管理配置并运行在每个台CoreOS服务器上。