天天看點

Docker基礎

Docker基礎及相關參考文檔

Docker

  • Docker官網:https://cloud.docker.com/
  • 參考書籍:Docker — 從入門到實踐

1. Docker 基礎用法和指令幫助

  • 參考材料基礎:Docker學習筆記
  • Docker手冊翻譯:中文指南
  • 菜鳥教程:Docker執行個體應用
  • 比較有深度的教程:Docker入門教程

1.1 常用指令

  • docker pull && docker push
    • $ sudo docker pull --help
    • pull 拉取鏡像 Usage: docker pull [OPTIONS] NAME[:TAG] Pull an image or a repository from the registry
    • -a, --all-tags=false Download all tagged images in the repository
    • $ sudo docker push
    • push 推送指定鏡像 Usage: docker push NAME[:TAG] Push an image or a repository to the registry
  • 示例:
$ sudo docker pull ubuntu # 下載下傳官方 ubuntu docker 鏡像,預設下載下傳所有 ubuntu 官方庫鏡像 $ sudo docker pull ubuntu:14.04 # 下載下傳指定版本 ubuntu 官方鏡像 
$ sudo docker push 192.168.0.100:5000/ubuntu # 推送鏡像庫到私有源[可注冊 docker 官方賬戶,推送到官方自有賬戶] $ sudo docker push 192.168.0.100:5000/ubuntu:14.04 # 推送指定鏡像到私有源 
           
  • 阿裡雲docker鏡像庫:https://dev.aliyun.com/search.html
  • docker run :
    • Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container
    • --name="" Assign a name to the container # 設定容器名
    • --net="bridge" Set the Network mode for the container # 設定容器網絡模式
      • 'bridge': creates a new network stack for the container on the docker bridge
      • 'none': no networking for this container
      • 'container:<name|id>': reuses another container network stack
      • 'host': use the host network stack inside the container. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.
    • --expose=[] Expose a port from the container without publishing it to your host # 指定對外提供服務端口
    • -P, --publish-all=false Publish all exposed ports to the host interfaces # 自動映射容器對外提供服務的端口
    • -p, --publish=[] Publish a container's port to the host # 指定端口映射
      • format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort (use 'docker port' to see the actual mapping)
    • -h, --hostname="" Container host name # 設定容器主機名
    • -i, --interactive=false Keep stdin open even if not attached # 保持标準輸出開啟即使沒有 attached
    • --link=[] Add link to another container (name:alias) # 添加連結到另外一個容器
    • --rm=false Automatically remove the container when it exits (incompatible with -d) # 如果容器退出自動移除容器和 -d選項沖突
    • -d, --detach=false Detached mode: Run container in the background, print new container id # 背景運作容器
    • -u, --user="" Username or UID # 指定運作容器的使用者uid 或者使用者名
    • -v, --volume=[] 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) # 從指定容器挂載卷
    • -w, --workdir="" Working directory inside the container # 指定容器工作目錄
    • --env=[] Set environment variables # 定義環境變量
    • --entrypoint="" Overwrite the default entrypoint of the image
    • -t, --tty=false Allocate a pseudo-tty # 配置設定僞終端
  • docker attach CONTAINER-ID
    • 目前 shell 下 attach 連接配接指定運作鏡像
  • 相關快捷鍵
    • 使容器退出:Ctrl-D exit
    • 從容器斷開連接配接deattach:Ctrl-P + Ctrl-Q
  • docker start CONTAINER [CONTAINER...]
    • 運作一個或多個停止的容器
  • docker stop CONTAINER [CONTAINER...]
    • 停掉一個或多個運作的容器-t選項可指定逾時時間
  • docker kill [OPTIONS] CONTAINER [CONTAINER...]
    • 預設 kill 發送 SIGKILL 信号-s可以指定發送 kill 信号類型
  • docker restart [OPTIONS] CONTAINER [CONTAINER...]
    • 重新開機一個或多個運作的容器-t選項可指定逾時時間
  • docker pause CONTAINER
    • 暫停一個容器,友善 commit
  • docker unpause CONTAINER
    • 繼續暫停的容器
  • docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
    • 檢視容器或者鏡像的詳細資訊
  • docker docker history [OPTIONS] IMAGE
    • 顯示一個鏡像的曆史

2. Docker管理

  • Docker Web管理工具
  • Portainer:
    • 官網:
    • 安裝:docker pull portainer/portainer
    • 快速開始:Portainer快速開始
    1. Portainer将docker的指令行模式能提供的資訊和操作通過web來實作
    2. 可以在它提供的web中實作docker的指令行操作

Docker 網絡配置

  • docker port
    • Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 檢視映射端口對應的容器内部源端口

Docker 建立鏡像:

  • docker import *.tar
    • Create a new filesystem image from the contents of a tarball
    • 從tar包中的内容建立一個新的檔案系統映像[對應 export]
  • docker build Dockerfile
    • Build an image from a Dockerfile
    • 通過 Dockerfile 定制鏡像
  • 參考:兩種方式建立你自己的 Docker 基本映像
    • 方法2:
      • 在 Docker registry 中,有一個被稱為 Scratch 的使用空 tar 檔案建構的特殊庫,如下能建立一個空鏡像:
      • 注意:因為這個空鏡像沒有運作shell的基本環境,并不能運作
//表示從/dev/null中建立一個新的tar包,重定向到docker import中,成為scratch
james@james:~/software/docker > tar cv --files-from /dev/null |sudo  docker import - scratch
sha256:ff266ec37e11e1759166c7d0212d5516e2b5bb54673059ae7888c89528ebe8c8
james@james:~/software/docker > sudo docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
scratch               latest              ff266ec37e11        8 seconds ago       0 B
portainer/portainer   latest              d449426bc5a4        4 weeks ago         9.162 MB
nfnty/arch-mini       archCustum          393a394f60f0        6 weeks ago         544.8 MB
nfnty/arch-mini       latest              393a394f60f0        6 weeks ago         544.8 MB
hello-world           latest              48b5124b2768        6 weeks ago         1.84 kB
           
  • 之後再使用這個鏡像配合Dockerfile來建立一個新的小容器:
    • 注意:運作docker build指令的目錄下需要有一個Dockerfile目錄,在該目錄下放置Dockerfile配置檔案和相關檔案。指令才能運作,否則會有錯。
james@james:~/code/docker/docker-test-image > cat Dockerfile
#version 0.1
#author chaolong.jiang
#author James Yang

FROM    java:latest
MAINTAINER "James [email protected]"

ADD bin/* /usr/local/

ADD conf/*.yml /meta/

ADD james-spring-boot-core-web/james-spring-boot-core-0.0.1-SNAPSHOT.jar /home/admin/james-spring-boot-core-web

ADD maven/apache-maven-3.3.9  /usr/local/maven

#add dependency package into image
#RUN sh /usr/local/install.sh
ENTRYPOINT ["sh","/usr/local/install.sh"]

#define log path
#Volume ["/usr/local/test/log"]

#run test script
#ENTRYPOINT ["python", "/usr/local/runTest.py"]

#CMD ["--testsuite", "smoking"]
james@james:~/code/docker/docker-test-image > 
james@james:~/code/docker/docker-test-image > docker build .
[sudo] password for james:
Sending build context to Docker daemon 25.97 MB
Step 1 : FROM java:latest
 ---> d23bdf5b1b1b
Step 2 : MAINTAINER "James [email protected]"
 ---> Running in caef1531da40
 ---> 84677306cf1b
Removing intermediate container caef1531da40
Step 3 : ADD bin/* /usr/local/
 ---> 44ebf30c2368
Removing intermediate container 2f7e45dc30d2
Step 4 : ADD conf/*.yml /meta/
 ---> 925759453f19
Removing intermediate container 1fa08beeaad5
Step 5 : ADD james-spring-boot-core-web/james-spring-boot-core-0.0.1-SNAPSHOT.jar /home/admin/james-spring-boot-core-web
 ---> 991f1116acd8
Removing intermediate container 66d975c774d1
Step 6 : ADD maven/apache-maven-3.3.9 /usr/local/maven
 ---> dbb353eac85c
Removing intermediate container 449fcb4314d5
Step 7 : ENTRYPOINT sh /usr/local/install.sh
 ---> Running in 4cb310d5036a
 ---> dfd7d4ac308b
Removing intermediate container 4cb310d5036a
Successfully built dfd7d4ac308b

           
  • 此時新建立的images的REPOSITORY和TAG都是空的,使用上面的指令可以修改。
    • docker tag imageid name:tag

Dockerfile

  • 規則參考:http://www.docker.org.cn/dockerppt/114.html
FROM reg.docker.alibaba-inc.com/rds-mysql-client:1.0 //指定建構鏡像的基礎源鏡像

MAINTAINER james <[email protected]> //指定建立鏡像的使用者
COPY bin /alidata/bin //COPY <src>... <dest> 複制檔案或目錄到容器指定路徑中,和ADD用法一樣,但是不能指定遠端url
#RUN sh /alidata/bin/run.sh //每條RUN指令将在目前鏡像基礎上執行指定指令,并送出為新的鏡像,後續的RUN都在之前RUN送出後的鏡像為基礎
#ENTRYPOINT tail -f /etc/hosts //配置容器啟動後執行的指令,并且不可被 docker run 提供的參數覆寫,而CMD是可以被覆寫的。每個 Dockerfile 中隻能有一個ENTRYPOINT,當指定多個時,隻有最後一個生效。
### 安裝tsar
RUN yum install -y tsar.x86_64
### copy采集script
RUN mkdir -p /usr/alisys
RUN wget http://tianjimon.oss-cn-hangzhou.aliyuncs.com/tjmonitor-docker.tar.gz
RUN tar -zxvf tjmonitor-docker.tar.gz -C /usr/alisys/
RUN echo "*/1 * * * * /usr/alisys/tianjimon/tjmonitor >/dev/null 2>&1" >> /var/spool/cron/root

ENTRYPOINT ["/usr/bin/python", "/alidata/bin/init_metadb.py"] //配置容器啟動後執行的指令,并且不可被 docker run 提供的參數覆寫,而CMD是可以被覆寫的.通過ENTRYPOINT使用 exec form 方式設定穩定的預設指令和選項,而使用CMD添加預設之外經常被改動的選項
CMD ["--action", "upgrade"] //CMD指定在 Dockerfile 中隻能使用一次,如果有多個,則隻有最後一個會生效。
CMD的目的是為了在啟動容器時提供一個預設的指令執行選項。如果使用者啟動容器時指定了運作的指令,則會覆寫掉CMD指定的指令。
### CMD會在啟動容器的時候執行,build 時不執行,而RUN隻是在建構鏡像的時候執行,後續鏡像建構完成之後,啟動容器就與RUN無關了,這個初學者容易弄混這個概念,這裡簡單注解一下。

           
  • VOLUME
    • docker學習筆記18:Dockerfile 指令 VOLUME 介紹

使用Dockerfile生成鏡像

  • 這是一個基于docker官方java鏡像的測試鏡像
james@james:~/code/docker/docker-test-image > cat Dockerfile
#version 0.1
#author James Yang

FROM    java:latest
MAINTAINER "James [email protected]"

ADD bin/* /usr/local/

ADD conf/*.yml /meta/

ADD james-spring-boot-core-web /home/admin/james-spring-boot-core-web

#add dependency package into image
RUN sh /usr/local/install.sh

#define log path
Volume ["/usr/local/test/log"]

#run test script
ENTRYPOINT ["python", "/usr/local/runTest.py"]

CMD ["--testsuite", "smoking"]

           

5.2 更新鏡像

  • docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    • 送出指定容器為鏡像
      • -a, --author="" Author (e.g., "John Hannibal Smith [email protected]")
      • -m, --message="" Commit message
      • -p, --pause=true Pause container during commit
      • 預設 commit 是暫停狀态
airs-MacBook-Air:python air$ docker commit -a James -m "add vi editer" 182 local/archlinux:vi
sha256:b1744e6892723d6ae5a6203ebbe594e3f7704c92fa7ba55ad3b3328800f07fd2
           

5.3 鏡像操作

  • Usage: docker save [OPTIONS] IMAGE [IMAGE...]
    • Save an image(s) to a tar archive (streamed to STDOUT by default)
    • 儲存一個鏡像為一個 tar 包[對應 load]
  • Usage: docker load [OPTIONS]
    • Load an image from a tar archive or STDIN
    • 從一個 tar 包中加載一個鏡像[對應 save]
[root@dmsag /root/dtdream]
#docker load < dtdream-webapp-base-tomcat4.tar