docker命令

docker入門

主要是docker使用命令

docker守護進程

修改守護進程的網絡

sudo docker daemon -H tcp://0.0.0.0:2375  
這條命令將docker守護進程
//使用docker_host環境變量
export DOCKER_HOST = "tcp:0.0.0:2375`

檢查docker是否運行

sudo status docker        //sudo service docker status

啓動和關閉

sudo stop docker        //sudo service docker stop
sudo start docker        //sudo service docker  start

docker容器操做

查看docker是否正常工做

sudo docker info

運行容器

sudo docker run -i -t ubuntu /bin/bash
//-i標記保證容器是STDIN開啓的
//-t標記告訴docker要建立的容器分配一個僞tty終端
//ubuntu 指定鏡像
// /bin/bash告訴docker容器要運行什麼命令

容器命名

docker默認爲建立的容器生成一個隨機的名稱,可經過--name標記來給容器命名html

sudo docker run --name myName -i -t ubuntu /bin/bash

啓動已經中止的容器

sudo docker start myName  //也可經過id指定
//也可以使用docker restart命令

附着到容器上

docker容器從新啓動的時候,會沿用docker run命令時指定的參數來運行,所以上例中從新啓動會運行一個交互式的shell,此外也能夠用docker attach從新附着到該容器的會話上nginx

sudo docker attach myName    //也可經過id指定

建立守護式容器

除了交互式運行的容器,也能夠建立長期運行的容器,守護式容器沒有交互式會話,很是適合運行應用程序和服務。git

sudo docker run --name daemon_name -d ubuntu /bin/sh -c "while true; do echo hello world;sleep 1;done"
//-d 標記docker將容器放在後臺運行
//while循環一直打印hello world

查看docker容器

docker ps         //查看正在運行的容器
docker ps -a     //查看全部的容器

查看容器內部

docker logs daemon_name    //獲取容器的日誌,可經過-f來追蹤日誌

日誌驅動

docker1.6開始,可經過--log-driver選項來控制docker守護線程和容器全部的日誌驅動,能夠在執行docker守護線程或者執行docker run命令時使用這個選項。github

sudo docker run --log-driver="syslog" --name daemon_name -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
//將daemon_name容器的日誌輸出到syslog,致使docker logs命令不會輸出任何東西

查看容器內的進程

sudo docker top daemon_name

在容器內部運行進程

sudo docker exec -d daemon_name touch /etc/new_config_file
//-d 標記運行一個後臺進程 後面明智執行名氣的名字以及執行的命令
sudo docker exec -t -i daemon_name /bin/bash
//建立TTY並捕捉STDIN

關閉容器

sudo docker stop daemon_name

深刻容器

sudo docker inspect daemon_name 
//查看更多容器的信息
//該命令也可用來查看鏡像信息

刪除容器

sudo docker rm 80430f8d0921        //經過指定容器id
//刪除所有容器
sudo docker rm `sudo docker ps -a -q`    //-q標記表示只返回容器的id

docker鏡像

列出docker鏡像

sudo docker images
//本地鏡像都保存在docker宿主機的/var/lib/docker目錄i西安,每一個鏡像都保存在docker所採用的存儲驅動目錄下面,如aufs或者devicemapper,也能夠在/var/bin/docker/containers目錄下看到全部容器

拉取鏡像

sudo docker pull ubuntu:12.04

運行一個帶標籤的docker鏡像

sudo docker run -t -i --name new_container ubuntu:12:04 /bin/bash

查找鏡像

能夠經過docker search命令來查找全部docker hub上公共的可用鏡像web

sudo docker search puppet
NAME                        DESCRIPTION                                     STARS   OFFICIAL       AUTOMATED
puppet/puppetserver         A Docker Image for running Puppet Server. Wi…   75                               
alekzonder/puppeteer        GoogleChrome/puppeteer image and screenshots…   51                     [OK]
  • 倉庫名
  • 鏡像描述
  • stars,用戶評價
  • official,是否官方,由上游開發者管理的鏡像(如fedora鏡像由fedora團隊管理)。
  • automated,自動構建,表示這個鏡像由docker hub的自動構建流程構建的。

構建鏡像

構建鏡像有兩種方式

  • docker commit命令
  • docker build命令和dockerfile文件

如今並不推薦使用docker commit命令,而應該使用更靈活、更強大的dockerfile來構建docker鏡像docker

通常來講都是基於已有的基礎鏡像,而不是「建立」新鏡像,從0開始能夠參考:https://docs.docker.com/develop/develop-images/baseimages/shell

建立docker hub帳號

建立完鏡像以後,能夠將鏡像推送到docker hub或者私有的registryzhong,完成這個操做須要在docker hub上建立一個帳號。
https://hub.docker.com/signupapache

登錄到docker hub

sudo docker login
Username:
Password:
Login Succeeded

用docker commit來建立鏡像

//建立一個新容器
sudo docker run -i -t ubuntu /bin/bash
//在容器內部安裝一些軟件...

//獲得剛剛建立容器的id
docker ps -l -q
9649de16bffb

//提交定製容器
sudo docker commit 9649de16bffb    dack/apache2
    
//檢查新建立的鏡像
docker images dack/apache2
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
dack/apache2        latest              2c5cd556c3f2        About a minute ago   209MB

也能夠在提交鏡像時指定更多的數據(包含標籤)來詳細描述所作的修改ubuntu

sudo docker commit -m "A new custom image" -a "dack huang" 9649de16bffb dack/apache2:webserver

//-m 提交信息
//-a 做息信息
//dack/apache2:webserver 執行鏡像的用戶名和倉庫名,併爲該鏡像增長一個webserver的標籤

用Dockerfile構建鏡像

並不推薦用docker commit構建鏡像,相反推薦使用Dockerfile的定義文件和docker build來構建鏡像緩存

Dockerfile使用基本的基於DSL(Domain Specific Language)語法的指令來構建一個docker鏡像,對比docker commit,其更具有可重複性、透明性和冪等性。

保存Dockerfile的目錄稱爲上下文,docker會在構建鏡像時將構建的上下文和該上下文的文件和目錄上傳到docker守護進程。這樣docker守護進程就能夠直接訪問用戶想在鏡像中存儲的任何代碼、文件或者其餘數據。

dockerfile中每條指令從上到下依次執行,大致的流程以下:

  • docker從基礎鏡像中運行一個容器
  • 執行一條指令,對容器作出修改
  • 執行相似docker commit的操做,提交一個新的鏡像層
  • docker再基於剛提交的鏡像運行一個新容器
  • 執行下一條指令直至所有執行完畢

因此儘管某一步執行失敗了,仍是獲得一個可使用的鏡像

# Version : 0.01
FROM ubuntu:14.04
MAINTAINER dack huang "dack_huang@163.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi, I am in your container' \
    >/usr/share/nginx/html/index.html
EXPOSE 80


FROM            //指定基礎鏡像
MAINTAINER        //指定鏡像做者
RUN                //在當前鏡像中運行的命令,默認在shell裏面使用/bin/sh -c執行
EXPOSE            //應用程序會使用容器指定的接口

經過docker build構建鏡像

docker build -t="dack/static_web"
//-t設置鏡像標籤

//從git倉庫上面構建鏡像
//假設這個git倉庫存在Dockerfile
docker build -t="dack/static" git@github.com:dack/docker-static_web

docker將每一步的構建過程都提交爲鏡像,因此docker會將以前的鏡像層當作緩存,當修改某個步驟以後再次構建的,docker會直接從該步驟開始。

可用docker build --no-cache略過緩存

docker build --no-cache -t="dack/static_web"

docker history查看鏡像的每一層

[root@dack static_web]# docker history e5f55354c141
IMAGE               CREATED             CREATED BY                                      SIZE            COMMENT
e5f55354c141        5 hours ago         /bin/sh -c #(nop)  EXPOSE 80                    0B                  
66d44cca6536        5 hours ago         /bin/sh -c echo 'Hi, I am in your container'…   27B                 
022c0b46f4f8        5 hours ago         /bin/sh -c apt-get update && apt-get install…   34.3MB              
34d2d2b790f5        5 hours ago         /bin/sh -c #(nop)  MAINTAINER dack huang "da…   0B                  
390582d83ead        3 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           3 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B

參考

  • 第一本docke書
相關文章
相關標籤/搜索