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快速開始
- Portainer将docker的指令行模式能提供的資訊和操作通過web來實作
- 可以在它提供的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的基本環境,并不能運作
- 方法2:
//表示從/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