Docker Docker官網:https://cloud.docker.com/ 1. Docker 基礎用法和命令幫助 參考材料基礎: "Docker學習筆記" Docker手冊翻譯: "中文指南" 菜鳥教程: "Docker實例應用" 比較有深度的教程: "Docker入門教程" 1.1 常用 ...
Docker
Docker官網:https://cloud.docker.com/
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:
- '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) # 添加鏈接到另外一個容器
- --name="" Assign a name to the container # 設置容器名
- --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 # 指定容器工作目錄
- 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 定製鏡像
- Build an image from a 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:~/software/docker > ls Dockerfile james@james:~/software/docker/Dockerfile > cat Dockerfile FROM scratch ADD env.sh /usr/local/bin/run.sh CMD ["/usr/local/bin/run.sh"] james@james:~/software/docker > sudo docker build Dockerfile Sending build context to Docker daemon 3.584 kB Step 1 : FROM scratch ---> Step 2 : ADD env.sh /usr/local/bin/run.sh ---> 21f12d548a6a Removing intermediate container db83a72432ae //這裡會移除中間容器 Step 3 : CMD /usr/local/bin/run.sh ---> Running in 38a7909a0683 ---> 22ecdd838f05 Removing intermediate container 38a7909a0683 Successfully built 22ecdd838f05 james@james:~/software/docker > sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 22ecdd838f05 14 minutes ago 760 B scratch latest ff266ec37e11 34 minutes ago 0 B james@james:~/software/docker > sudo docker tag 22ecdd scratch:shell
- 此時新創建的images的REPOSITORY和TAG都是空的,使用上面的命令可以修改。
docker tag imageid name:tag
Dockerfile
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 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