docker 經常使用命令合集
文章目錄
1、docker概論
- Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從 Apache2.0 協議開源。
- Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux
機器上,也能夠實現虛擬化。 - 容器是徹底使用沙箱機制,相互之間不會有任何接口(相似 iPhone 的 app),更重要的是容器性能開銷極低。
- Docker 從 17.03 版本以後分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),咱們用社區版就能夠了
2、Docker的應用場景
Web 應用的自動化打包和發佈。
自動化測試和持續集成、發佈。
在服務型環境中部署和調整數據庫或其餘的後臺應用。
從頭編譯或者擴展示有的 OpenShift 或 Cloud Foundry 平臺來搭建本身的 PaaS 環境。
html
2.1 Docker 的優勢
Docker 是一個用於開發,交付和運行應用程序的開放平臺。Docker 使您可以將應用程序與基礎架構分開,從而能夠快速交付軟件。藉助 Docker,您能夠與管理應用程序相同的方式來管理基礎架構。經過利用 Docker 的方法來快速交付,測試和部署代碼,您能夠大大減小編寫代碼和在生產環境中運行代碼之間的延遲。
(1)、快速,一致地交付您的應用程序
Docker 容許開發人員使用您提供的應用程序或服務的本地容器在標準化環境中工做,從而簡化了開發的生命週期。
容器很是適合持續集成和持續交付(CI / CD)工做流程,請考慮如下示例方案:
您的開發人員在本地編寫代碼,並使用 Docker 容器與同事共享他們的工做。
他們使用 Docker 將其應用程序推送到測試環境中,並執行自動或手動測試。
當開發人員發現錯誤時,他們能夠在開發環境中對其進行修復,而後將其從新部署到測試環境中,以進行測試和驗證。
測試完成後,將修補程序推送給生產環境,就像將更新的鏡像推送到生產環境同樣簡單。
(2)、響應式部署和擴展
linux
Docker 是基於容器的平臺,容許高度可移植的工做負載。Docker 容器能夠在開發人員的本機上,數據中心的物理或虛擬機上,雲服務上或混合環境中運行。
Docker 的可移植性和輕量級的特性,還可使您輕鬆地完成動態管理的工做負擔,並根據業務需求指示,實時擴展或拆除應用程序和服務。
(3)、在同一硬件上運行更多工做負載
Docker 輕巧快速。它爲基於虛擬機管理程序的虛擬機提供了可行、經濟、高效的替代方案,所以您能夠利用更多的計算能力來實現業務目標。Docker 很是適合於高密度環境以及中小型部署,而您能夠用更少的資源作更多的事情。
nginx
3、 Docker 架構
- Docker 包括三個基本概念:
鏡像(Image):Docker 鏡像(Image),就至關因而一個 root 文件系統。好比官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
容器(Container):鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。
倉庫(Repository):倉庫可當作一個代碼控制中心,用來保存鏡像。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和建立Docker容器。
Docker 容器經過 Docker 鏡像來建立。
容器與鏡像的關係相似於面向對象編程中的對象與類。 - Docker 面向對象
- 容器 對象
- 鏡像 類
4、 docker安裝
- 部署19版docker
4.1安裝依賴包
yum -y install yum-utils device-mapper-persistent-data lvm2
//yum-utils 提供了yum-config-manager
//device mapper 存儲驅動程序須要device-mapper-persistent-data和lvm2
//device mapper 是Linux2.6內核中支持邏輯卷管理的通用設備映射機制。
//它爲實現用於存儲資源管理的塊設備驅動提供了一個而高度模塊化的內核架構
4.2 設置阿里雲鏡像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.3安裝docker-ce
yum -y install docker-ce systemctl start docker.service systemctl enable docker.service setenforce 0 vim /etc/selinux/config SELINUX=disabled
4.4 鏡像加速
進入阿里雲官網》》搜索鏡像加速》》選擇centos版的web
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://1i3tpy0i.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
4.5 網絡優化
vim /etc/sysctl.conf net.ipv4.ip_forward=1 sysctl -p service network restart systemctl restart docker
5、docker 鏡像使用
- 查看docker版本
docker version
- 搜索Nginx鏡像(公有倉庫)
docker search nginx
- 下載Nginx鏡像
docker pull nginx
- 下載Redis官方最新鏡像,至關於:docker pull redis:latest
docker pull redis
- 下載倉庫全部Redis鏡像
docker pull -a redis
- 下載私人倉庫鏡像
後面會詳細介紹私有庫的創建
docker pull bitnami/redis
- AUFS (聯合文件系統) 若干層下載
- 下載後存放在 /var/lib/docker
- /var/lib/docker/image/overlay/repositories/json //下載文件信息
- 查看鏡像列表
docker images //查看下載鏡像信息 [root@localhost opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7e4d58f0e5f3 8 days ago 133MB REPOSITORY:表示鏡像的倉庫源 TAG:鏡像的標籤 IMAGE ID:鏡像ID CREATED:鏡像建立時間 SIZE:鏡像大小 //含中間映像層 docker images -a //只顯示鏡像ID docker images -q //含中間映像層 docker images -qa //顯示鏡像摘要信息(DIGEST列) docker images --digests //顯示鏡像完整信息 docker images --no-trunc
- 獲取鏡像信息
docker inspect 7e4d58f0e5f3
- 添加新標籤
docker tag nginx:latest nginx:web [root@localhost opt]# docker tag nginx:latest nginx:web [root@localhost opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7e4d58f0e5f3 8 days ago 133MB nginx web 7e4d58f0e5f3 8 days ago 133MB //查看鏡像Nginx信息 [root@localhost opt]# docker images | grep nginx nginx latest 7e4d58f0e5f3 8 days ago 133MB nginx web 7e4d58f0e5f3 8 days ago 133MB
- 刪除鏡像
docker rmi nginx:web (若是隻有一個別名,那麼這個就是刪除docker。若是是多個標籤,那麼就是隻是刪除一個標籤)
- 刪除docker
docker rmi docker——id 注:刪除docker若是有其餘別名須要刪除只剩一個,才能刪除docker 在刪除容器以前須要先中止容器
- 單個鏡像刪除,至關於:docker rmi redis:latest
docker rmi redis
- 強制刪除(針對基於鏡像有運行的容器進程)
docker rmi -f redis
- 多個鏡像刪除,不一樣鏡像間以空格間隔
docker rmi -f redis tomcat nginx
- 批量刪除本地所有鏡像
docker rmi -f $(docker images -q)
- 導出Nginx鏡像命名爲Nginx存放在目錄opt下
docker save -o 文件名 鏡像id或者鏡像別名 [root@localhost ~] docker save -o /opt/nginx 7e4d58f0e5f3 [root@localhost opt] docker save -o nginx1 nginx:latest [root@localhost ~]cd /opt [root@localhost opt] ll 總用量 133636 drwx--x--x. 4 root root 28 9月 17 15:43 containerd -rw-------. 1 root root 136841216 9月 19 19:04 nginx drwxr-xr-x. 2 root root 6 10月 31 2018 rh
- 導入鏡像
docker load --input 導出文件名redis
docker load < 導出文件名docker
[root@localhost opt] docker load --input nginx Loaded image ID: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d [root@localhost opt] docker load < nginx Loaded image ID: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d [root@localhost opt] docker load --input nginx1 Loaded image: nginx:latest
6、docker容器的使用
- 容器建立
docker create -it nginx:latest /bin/bash [root@localhost opt] docker create -it nginx:latest /bin/bash 59c4c2f2b6a00bceb196f1bbcfe02fc5a2e16edc66feb12310c9474bf939d833
- -i: 交互式操做。
- -t: 終端。
- /bin/bash:放在鏡像名後的是命令,這裏咱們但願有個交互式 Shell,所以用的是 /bin/bash。
- docker run :建立一個新的容器並運行一個命令
語法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS說明: -a stdin: 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項; -d: 後臺運行容器,並返回容器ID; -i: 以交互模式運行容器,一般與 -t 同時使用; -P: 隨機端口映射,容器內部端口隨機映射到主機的端口 -p: 指定端口映射,格式爲:主機(宿主)端口:容器端口 -t: 爲容器從新分配一個僞輸入終端,一般與 -i 同時使用; --name="nginx-lb": 爲容器指定一個名稱; --dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致; -h "mars": 指定容器的hostname; -e username="ritchie": 設置環境變量; --env-file=[]: 從指定文件讀入環境變量; --cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運行; -m :設置容器使用內存最大值; --net="bridge": 指定容器的網絡鏈接類型,支持 bridge/host/none/container: 四種類型; --link=[]: 添加連接到另外一個容器; --expose=[]: 開放一個端口或一組端口; --volume , -v: 綁定一個卷 實例 使用docker鏡像nginx:latest之後臺模式啓動一個容器,並將容器命名爲mynginx。 docker run --name mynginx -d nginx:latest 使用鏡像nginx:latest之後臺模式啓動一個容器,並將容器的80端口映射到主機隨機端口。 docker run -P -d nginx:latest 使用鏡像 nginx:latest,之後臺模式啓動一個容器,將容器的 80 端口映射到主機的 80 端口,主機的目錄 /data 映射到容器的 /data。 docker run -p 80:80 -v /data:/data -d nginx:latest 綁定容器的 8080 端口,並將其映射到本地主機 127.0.0.1 的 80 端口上。 $ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash 使用鏡像nginx:latest以交互模式啓動一個容器,在容器內執行/bin/bash命令。 runoob@runoob:~$ docker run -it nginx:latest /bin/bash
- 查看容器
docker ps -a [root@localhost opt] docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59c4c2f2b6a0 nginx:latest "/docker-entrypoint.…" 2 minutes ago Created pedantic_bose //顯示最近建立容器 docker ps -l //顯示最近建立的3個容器 docker ps -n 3 //不截斷輸出 docker ps --no-trunc //獲取鏡像redis的元信息 docker inspect redis //獲取正在運行的容器redis的 IP docker inspect --format='{ {range .NetworkSettings.Networks}}{ {.IPAddress}}{ {end}}' redis //查看正在運行的容器 docker ps //查看正在運行的容器的ID docker ps -q //查看正在運行+歷史運行過的容器 docker ps -a //顯示運行容器總文件大小 docker ps -s
- 啓動容器
docker start 59c4c2f2b6a0 查看鏡像 up 狀態 [root@localhost opt] docker start 59c4c2f2b6a0 59c4c2f2b6a0 [root@localhost opt] docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59c4c2f2b6a0 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 9 seconds 80/tcp pedantic_bose
- 中止容器
docker stop 容器ID
- 重啓容器
docker restart 容器ID
- 啓動執行命令查看系統根目錄
docker pull centos 7
docker create it centos 7 /bin/bash
docker start 8c6dd3246eb4
docker run nginx /usr/bin/bash -c ls
-
執行完成直接關閉,狀態是exited數據庫
-
持續在後臺執行apache
-
容器進入編程
[root@localhost opt] docker exec -it 8c6dd3246eb4 /bin/bash docker exec :在運行的容器中執行命令 -d :分離模式: 在後臺運行 -i :即便沒有附加也保持STDIN 打開 -t :分配一個僞終端 docker exec -i -t mynginx /bin/bash docker exec -it 9df70f9a0714 /bin/bash exit 退出
- 容器導出
docker export 8c6dd3246eb4 > nginx_c 8c6dd3246eb4:容器ID Nginx_c :導出容器文件名
- 容器導入(會生成鏡像,而不會建立容器)
cat nginx_c | docker import - nginx:web nginx_c:導出的容器文件名 nginx:web:新的容器名
- 刪除容器(容器必須在中止狀態)
[root@localhost opt] docker rm 8c6dd3246eb4 Error response from daemon: You cannot remove a running container 8c6dd3246eb42099dbf58e2730f348acc21b685a4f27c60185d9a427e1282f09. Stop the container before attempting removal or force remove [root@localhost opt] docker stop 8c6dd3246eb4 8c6dd3246eb4 [root@localhost opt] docker rm 8c6dd3246eb4 8c6dd3246eb4
- 批量刪除容器
方法一:docker ps -a | awk '{print "docker rm $1"}' | bash 方法二: [root@localhost opt]docker rm -f $(docker ps -aq) 395dab3d44df 2b52ff42681f 1627dc7213cd 960857ff1ba0 59c4c2f2b6a0 //強制殺死進程容器(處於運行狀態才能殺死進程-docker start id) docker kill id
- 刪除一個運行中的容器
docker rm -f redis
- 刪除多個容器
docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
- -l 移除容器間的網絡鏈接,鏈接名爲 db
docker rm -l db
- -v 刪除容器,並刪除容器掛載的數據卷
docker rm -v redis
- 刪除none鏡像
vim none.sh docker ps -a | grep "Exited" | awk '{print $1}'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1}'|xargs docker rm docker images|grep none|awk '{print $3}'|xargs docker rmi
-
-f :經過 SIGKILL 信號強制刪除一個運行中的容器。json
-
-l :移除容器間的網絡鏈接,而非容器自己
-
-v :刪除與容器關聯的卷。
-
容器進程
//top支持 ps 命令參數,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS] //列出redis容器中運行進程 docker top redis(容器ID) //查看全部運行容器的進程信息 for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
- 容器日誌
//查看redis容器日誌,默認參數 docker logs rabbitmq //查看redis容器日誌,參數:-f 跟蹤日誌輸出;-t 顯示時間戳;--tail 僅列出最新N條容器日誌; docker logs -f -t --tail=20 redis //查看容器redis從2019年05月21往後的最新10條日誌。 docker logs --since="2019-05-21" --tail=10 redis
-
docker pause :暫停容器中全部的進程
-
docker unpause :恢復容器中全部的進程。
實例 暫停數據庫容器db01提供服務。 docker pause db01 恢復數據庫容器db01提供服務。 docker unpause db01
7、建立鏡像
- 基於已有的鏡像容器進行建立鏡像
docker create -it jasonlix/docker-cobbler /bin/bash docker commit -m "new" -a "daoke" c83aee844ae0 daoke:test docker images | grep daoke
- 基於本地模板建立
將文件debian-7.0-x86-minimal.tar.gz拖至opt目錄中 [root@localhost opt] cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new sha256:6683b936f5574560c919751a6622d4131bb7fb4d88f7a9614c55fb7f554ef2c0 [root@localhost opt] docker images | grep new daoke new 6683b936f557 13 seconds ago 215MB
- 基於dockerfile構建鏡像
mkdir apache cd apache vim Dockerfile #基於的基礎鏡像 FROM centos #維護鏡像的用戶信息 MAINTAINER The project <cloud-ops@centos.org> #鏡像操做指令安裝Apache軟件 RUN yum -y update RUN yum -y install httpd #開啓80端口 EXPOSE 80 #複製網站首頁文件 ADD index.html /var/www/html/index.html #將執行腳本複製到鏡像中 ADD run.sh /run.sh RUN chmod 755 /run.sh #啓動容器時執行腳本 CMD ["/run.sh"] vim run.sh #!/bin/bash rm -rf /run/httpd/* exec /usr/sbin/apachectl -D FOREGROUND echo "web test" > index.html
- 生產鏡像
docker build -t httpd:centos1 . (注意別忘了末尾有「.」)
- 新鏡像運行容器
docker run -d -p 1216:80 httpd:centos1 docker start 4fbc428fac3a (開啓容器) [root@localhost apache]docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4fbc428fac3a httpd:centos1 "/run.sh" 8 seconds ago Up 7 seconds 0.0.0.0:1216->80/tcp affectionate_lovelace a4f43a12352e registry "/entrypoint.sh /etc…" 2 hours ago Exited (2) 40 minutes ago goofy_bose ba786a224305 registry "/entrypoint.sh /bin…" 2 hours ago Exited (127) 2 hours ago zen_hamilton
- 測試真機瀏覽器
- http://192.168.75.200:1216/
8、docker的數據管理
(1)數據管理操做
- 方便查看容器內產生的數據
- 多容器間實現數據共享
(2)兩種管理方式
- 數據卷:宿主機和容器之間共享
- 數據卷容器: 容器與容器之間共享
- 數據卷:是一個提供容器使用的特殊目錄
(3)建立數據卷
docker run -d -v /data1 -v /data2 --name web httpd:centos
- 掛載宿主機目錄做爲數據卷(宿主機目錄與容器目錄同步)
docker run -d -v /var/www:/data1 --name web-1 httpd:centos
- web-1 是指容器名,httpd:centos 是鏡像,是指掛載一個目錄而且生成一個容器web-1鏡像爲httpd 標籤是centos
docker pull centos //宿主機目錄/var/www掛載容器中的/data1 docker run -v /var/www:/data1 --name web1 -it centos /bin/bash cd /data1 touch test123 //返回宿主機進行查看 ls /var/www
- 數據卷容器
//數據卷容器
docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash ##(加/bin/bash 就是能夠直接進入容器)
- 新容器掛載數據卷容器web100
docker run -it -volumes-from web100 --name db1 centos /bin/bash 註釋:容器web100 和容器db1 所掛載的目錄data1和data2 數據是同步運行的。
- 端口映射
docker run -d -p httpd:centos
docker run -d -p 49280:80 httpd:centos
docker ps -a
9、本地私有倉庫創建
docker pull registry [root@localhost /]# docker pull registry Using default tag: latest latest: Pulling from library/registry cbdbe7a5bc2a: Pulling fs layer 47112e65547d: Pulling fs layer 46bcb632e506: Pulling fs layer c1cc712bcecd: Pulling fs layer 3db6272dcbfa: Pulling fs layer latest: Pulling from library/registry cbdbe7a5bc2a: Pulling fs layer 47112e65547d: Pulling fs layer 46bcb632e506: Pulling fs layer c1cc712bcecd: Pulling fs layer 3db6272dcbfa: Pulling fs layer open /var/lib/docker/tmp/GetImageBlob684407966: no space left on device --------------------------------------------------- vim /etc/docker/daemon.json { "insecure-registries":["192.168.75.200:5000"], //添加 "registry-mirrors": ["https://1i3tpy0i.mirror.aliyuncs.com"] } ~ systemctl restart docker.service docker create -it registry /bin/bash #新建容器 docker ps -a [root@localhost docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba786a224305 registry "/entrypoint.sh /bin…" 44 minutes ago Exited (127) 9 minutes ago zen_hamilton docker start 231d40e811cd ##開啓(不是up是正確的) ##宿主機的/data/registry自動建立掛載容器中的/tmp/registry docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry docker pull httpd ##更改標記爲192.168.75.200:5000/httpd docker tag httpd:latest 192.168.75.200:5000/httpd (標記IP地址與私有倉庫的地址和端口相一致) docker push 192.168.75.200:5000/httpd ##上傳鏡像 ##獲取私有倉庫列表 curl -XGET http://192.168.75.200:500/v2/_catalog docker pull 192.168.75.200:500/httpd ##測試私有倉庫下載鏡像
- 端口映射
docker run -d -P httpd:centos ##隨機分配外部的映射端口 docker run -d -p 43992:80 httpd:centos ##指定端口映射 docker ps -a ##查看
10、容器互聯
(1)端口映射進行容器互聯
- 建立並運行容器取名爲web1,端口號自動映射
docker run -itd -P --name web1 ecntos /bin/bash
- 建立並運行容器取名web2,鏈接到web1和其通訊
docker run -itd -P --name web2 --link web1:web1 centos /bin/bash
- 進web2容器 ping web1
端口映射並非惟一把 docker 鏈接到另外一個容器的方法。
docker 有一個鏈接系統容許將多個容器鏈接在一塊兒,共享鏈接信息。
docker 鏈接會建立一個父子關係,其中父容器能夠看到子容器的信息。
(2)網絡設置進行容器互聯
新建網絡 下面先建立一個新的 Docker 網絡。 $ docker network create -d bridge test-net 參數說明: -d:參數指定 Docker 網絡類型,有 bridge、overlay。 其中 overlay 網絡類型用於 Swarm mode,在本小節中你能夠忽略它。 鏈接容器 運行一個容器並鏈接到新建的 test-net 網絡: $ docker run -itd --name test1 --network test-net ubuntu /bin/bash 打開新的終端,再運行一個容器並加入到 test-net 網絡: $ docker run -itd --name test2 --network test-net ubuntu /bin/bash apt-get update apt install iputils-ping 下面經過 ping 來證實 test1 容器和 test2 容器創建了互聯關係。 若是 test一、test2 容器內中無 ping 命令,則在容器內執行如下命令安裝 ping(即學即用:能夠在一個容器裏安裝好,提交容器到鏡像,在以新的鏡像從新運行以上倆個容器)。
11、總結
- docker的容器技術能夠在一臺主機上輕鬆爲任何應用建立一個輕量級的、可移植的、自給自足的容器。
- 鏡像、容器、倉庫是docker的三大核心概念。
- dockerfile是一種被docker程序解釋的腳本,dockerfile由多條的指令組成,每條指令對應Linux下面的一條命令。
- 管理docker容器中數據主要數據卷和數據卷容器方式。