docker常用命令操作及案例容器創建
注:之前的工作中使用過一段時間docker,最近項目需要使用k8s+docker做dockers管理,順便帶個小MM。好記性不如爛筆頭,整理點文檔出來,歡迎諸位大牛指點。目標:整理出docker基礎入門,docker kubernetes 集羣基礎,spark on kubernetes的基礎等幾篇文檔。持續更新ing~
1.搜索容器&run一個容器
1.搜索容器
docker search redis
2.後臺run某個容器
docker run -d redis
3.指定鏡像版本
docker run -d redis:3.1
4.列出剛剛創建的容器或列出所有容器
docker ps /docker ps -a
5.查看單個容器信息
docker inspect <container-id|container-name>
6.查看容器logs
docker logs <container-id|container-name>
2.創建一個容器指定端口以及掛載卷
2.1簡單粗暴的幾個常用參數
docker run -d 後臺運行 --name 指定容器名稱 -p 指定映射端口 -v 指定本地存儲路徑 鏡像名稱
docker run -d --name redisMapped -p 6379:6379 -v /opt/docker/data/redis:/data redis
Tip:默認情況下,主機端口映射爲0.0.0.0,即所有IP地址。
您可以在定義端口映射時指定特定的IP地址例如-p 127.0.0.1:6379:6379
2.2 簡單介紹一下上面兩個概念點
2.2.1 端口映射
在啓動容器時,如果不配置宿主機器與虛擬機的端口映射,外部程序是無法訪問虛擬機的,因爲沒有端口。
docker run -p ip:hostPort:containerPort redis
常用方式:
127.0.0.1:3306:3306,映射本機的3306端口到虛擬機的3306端口
127.0.0.1::3306,映射本機的3306端口到虛擬機的3306端口
3306:3306,映射本機的3306端口到虛擬機的3306端口(最常用)
2.2.2文件掛載
掛載主機目錄/opt/docker/data/redis 容器本地目錄 /software容器目錄,在創建前容器是沒有software目錄的,docker 容器會自己創建
2.2.3 操作容器
docker exec -it redis bash
通過主機命令行進入master容器,意思就是進入容器中運行redis 的bash環境。
不準確的來說理解成一個獨立的linux環境即可。
3.來一些docker常用命令備忘
3.1 docker run 參數
docker run 參數
-d, --detach=false 指定容器運行於前臺還是後臺,默認爲false
-i, --interactive=false 打開STDIN,用於控制檯交互
-t, --tty=false 分配tty設備,該可以支持終端登錄,默認爲false
-u, --user="" 指定容器的用戶
-a, --attach=[] 登錄容器(必須是以docker run -d啓動的容器)
-w, --workdir="" 指定容器的工作目錄
-c, --cpu-shares=0 設置容器CPU權重,在CPU共享場景使用
-e, --env=[] 指定環境變量,容器中可以使用該環境變量
-m, --memory="" 指定容器的內存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname="" 指定容器的主機名
-v, --volume=[] 給容器掛載存儲卷,掛載到容器的某個目錄
--volumes-from=[] 給容器掛載其他容器上的卷,掛載到容器的某個目錄
--cap-add=[] 添加權限,權限清單詳見:http://linux.die.net/man/7/capabilities
--cap-drop=[] 刪除權限,權限清單詳見:http://linux.die.net/man/7/capabilities
--cidfile="" 運行容器後,在指定文件中寫入容器PID值,一種典型的監控系統用法
--cpuset="" 設置容器可以使用哪些CPU,此參數可以用來容器獨佔CPU
--device=[] 添加主機設備給容器,相當於設備直通
--dns=[] 指定容器的dns服務器
--dns-search=[] 指定容器的dns搜索域名,寫入到容器的/etc/resolv.conf文件
--entrypoint="" 覆蓋image的入口點
--env-file=[] 指定環境變量文件,文件格式爲每行一個環境變量
--expose=[] 指定容器暴露的端口,即修改鏡像的暴露端口
--link=[] 指定容器間的關聯,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc時使用
--name="" 指定容器名字,後續可以通過名字進行容器管理,links特性需要使用名字
--net="bridge" 容器網絡設置:
bridge 使用docker daemon指定的網橋
host //容器使用主機的網絡
container:NAME_or_ID >//使用其他容器的網路,共享IP和PORT等網絡資源
none 容器使用自己的網絡(類似--net=bridge),但是不進行配置
--privileged=false 指定容器是否爲特權容器,特權容器擁有所有的capabilities
--restart="no" 指定容器停止後的重啓策略:
no:容器退出時不重啓
on-failure:容器故障退出(返回值非零)時重啓
always:容器退出時總是重啓
--rm=false 指定容器停止後自動刪除容器(不支持以docker run -d啓動的容器)
--sig-proxy=true 設置由代理接受並處理信號,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
3.2 docker 容器操作
docker build -t friendlyname . # 使用當前目錄下的內容創建Dockerfile鏡像文件
docker run -p 4000:80 friendlyname # 運行名爲“friendlyname”的鏡像,並設置端口映射
docker run -d -p 4000:80 friendlyname # 後臺運行容器
docker container ls # 查看運行中的容器
docker container ls -a # 查看所有的容器,包括爲運行的
docker container stop <hash> # 優雅的停止容器進程
docker container kill <hash> # 張志停止容器進程
docker container rm <hash> # 從當前機器移除指定容器
docker container rm $(docker container ls -a -q) # 移除所有容器
docker image ls -a # 查看當前機器上的所有鏡像
docker image rm <image id> # 從當前機器上移除指定鏡像
docker image rm $(docker image ls -a -q) # 從機器上移除所有容器
docker login # 使用docker用戶名密碼登錄CLI
docker tag <image> username/repository:tag # 給鏡像打標籤
docker push username/repository:tag # 上傳鏡像到筆者個人倉庫
docker run username/repository:tag # 運行指定鏡像的指定版本
3.3 docker服務操作
docker stack ls # 列出應用程序
docker stack deploy -c <composefile> <appname> # 運行制動的composefile
docker service ls # 列出與應用關聯的正在運行的服務
docker service ps <service> # 列出與應用程序關聯的任務
docker inspect <task or container> # 檢查任務或容器狀態
docker container ls -q # 列出容器ID
docker stack rm <appname> # 刪除一個應用程序
docker swarm leave --force # 用swam管理下掉集羣的一個節點
3.4 swarms操作
Swarms操作
docker-machine create --driver virtualbox myvm1 # 在(Mac, Win7, Linux)創建一個VM
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1 # 查看有關節點的基本信息
docker-machine ssh myvm1 "docker node ls" # 列出swarm羣中的節點
docker-machine ssh myvm1 "docker node inspect <node ID>" # 檢查節點
docker-machine ssh myvm1 "docker swarm join-token -q worker" # 查看連接令牌
docker-machine ssh myvm1 # 與VM打開一個SSH會話;鍵入“exit”結束
docker node ls # 查看swarm中的節點(登錄到管理器時)
docker-machine ssh myvm2 "docker swarm leave" # 使worker脫離swarm
docker-machine ssh myvm1 "docker swarm leave -f" # 使master脫離swarm並殺掉swarm
docker-machine ls # 列出虛擬機,星號顯示這個shell正在與哪個虛擬機通話
docker-machine start myvm1 # 啓動一個當前沒有運行的虛擬機
docker-machine env myvm1 # 顯示myvm1的環境變量和命令
eval $(docker-machine env myvm1) # Mac命令將shell連接到myvm1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression # Windows命令將shell連接到myvm1
docker stack deploy -c <file> <app> # 部署一個應用程序;命令shell必須設置爲與管理器(myvm1)通信,使用本地Compose文件
docker-machine scp docker-compose.yml myvm1:~ # 將文件複製到節點的主目錄(只有在使用ssh連接到管理器並部署應用程序時才需要
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>" # 使用ssh部署應用程序(您必須首先將撰寫文件複製到myvm1)
eval $(docker-machine env -u) # 斷開與虛擬機的shell,使用本地docker
docker-machine stop $(docker-machine ls -q) # 停止所有運行的VM
docker-machine rm $(docker-machine ls -q) # 刪除所有虛擬機及其磁盤映像