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服務器上。