20190329 Docker基礎命令

Docker:相比虛擬機的交付速度更快,資源消耗更低,Docker 採用客戶端/服務端架構,使用遠程 API 來管理和創建 Docker 容器,其可以輕鬆的創建一個輕量級的、可移植的、自給自足的容器,docker 的三大理念是 build(構建)、ship(運輸)、run(運行),Docker 遵從aoache 2.0 協議,並通過(namespace 及cgroup 等)來提供容器的資源隔離與安全保障等,所以 Docke 容器在運行時不需要類似虛擬機(空運行的虛擬機佔用物理機 6-8%性能)的額外資源開銷,因此可以大幅提高資源利用率,總而言之 Docker 是一種用了新穎方式實現的輕量級虛擬機,類似於 VM 但是在原理和應用上和 VM 的差別還是很大的,並且 docker的專業叫法是應用容器(Application Container)。
docker 的組成:
Docker 客戶端(Client):客戶端使用 docker 命令或其他工具調用 docker API。
Docker 服務端(Server):Docker 守護進程,運行 docker 容器。
Docker 鏡像(Images):鏡像可以理解爲創建實例使用的模板。
Docker 容器(Container): 容器是從鏡像生成對外提供服務的一個或一組服務。
Docker 倉庫(Registry): 保存鏡像的倉庫,類似於 git 或 svn 這樣的版本控制系統,官方倉庫: https://hub.docker.com/
Docker 主機(Host):一個物理機或虛擬機,用於運行 Docker 服務進程和容器。

![](https://s1.51cto.com/images/blog/201904/04/abc94e6408edc838d772408d490d8865.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)![]

Docker 的優勢:
快速部署:短時間內可以部署成百上千個應用,更快速交付到線上。
高效虛擬化:不需要額外的 hypervisor 支持,直接基於 linux 實現應用虛擬化,相比虛擬機大幅提高性能和效率。
節省開支:提高服務器利用率,降低 IT 支出。
簡化配置:將運行環境打包保存至容器,使用時直接啓動即可。
快速遷移和擴展:可跨平臺運行在物理機、虛擬機、公有云等環境,良好的兼容性可以方便將應用從 A 宿主機遷移到 B 宿主機,甚至是 A 平臺遷移到 B 平臺。
Docker的缺點:隔離性:各應用之間的隔離不如虛擬機。
docker(容器)的核心技術:
容器規範:除了 docker 之外的 docker 技術,還有 coreOS 的 rkt,還有阿里的 Pouch,爲了保證容器生態的標誌性和健康可持續發展包括 Google、Docker 等公司共同成立了一個叫 open container(OCI)的組織,其目的就是制定開放的標準的容器規範,目前OCI 一共發佈了兩個規範,分別是 runtime spec 和 image format spec,有了這兩個規範,不通的容器公司開發的容器只要兼容這兩個規範,就可以保證容器的可移植性和相互可操作性。
容器 runtime:runtime 是真正運行容器的地方,因此爲了運行不同的容器 runtime 需要和操作系統內核緊密合作相互在支持,以便爲容器提供相應的運行環境。
目前主流的三種 runtime:
Lxc:linux 上早期的 runtime,Docker 早期就是採用 lxc 作爲 runtime。
runc:目前 Docker 默認的 runtime,runc 遵守 OCI 規範,因此可以兼容 lxc。
rkt:是 CoreOS 開發的容器 runtime,也符合 OCI 規範,所以使用 rktruntime 也可以運行 Docker 容器。
容器管理工具:管理工具連接 runtime 與用戶,對用戶提供圖形或命令方式操作,然後管理工具將用戶操作傳遞給 runtime 執行。
Lxd 是 lxc 的管理工具。Rkt 的管理工具是 rkt cli。
Runc 的管理工具是 docker engine,docker engine 包含後臺 deamon 和 cli 兩部分,大家經常提到的 Docker 就是指的 docker engine。
容器定義工具:容器定義工具允許用戶定義容器的屬性和內容,以方便容器能夠被保存、共享和重建。
Docker image:是 docker 容器的模板,runtime 依據 docker image 創建容器。
Dockerfile:包含 N 個命令的文本文件,通過 dockerfile 創建出 docker image。
ACI(App container image):與 docker image 類似,是 CoreOS 開發的 rkt 容器的鏡像格式。
Registry:統一保存共享鏡像的地方,叫做鏡像倉庫。
Image registry:docker 官方提供的私有倉庫部署工具。
Docker hub:docker 官方的公共倉庫,已經保存了大量的常用鏡像,可以方便大家直接使用。
Harbor:vmware 提供的自帶 web 的鏡像倉庫,目前有很多公司使用。
編排工具:使用k8s,當多個容器在多個主機運行的時候,單獨管理每個容器是相當負載而且很容易出錯,而且也無法實現某一臺主機宕機後容器自動遷移到其他主機從而實現高可用的目的,也無法實現動態伸縮的功能,因此需要有一種工具可以實現統一管理、動態伸縮、故障自愈、批量執行等功能,這就是容器編排引擎。容器編排通常包括容器管理、調度、集羣定義和服務發現等功能。
Docker swarm:docker 開發的容器編排引擎。
Kubernetes:google 領導開發的容器編排引擎,內部項目爲 Borg,且其同時支持docker 和 CoreOS。
Mesos+Marathon:通用的集羣組員調度平臺,mesos 與 marathon 一起提供容器編排引擎功能。
docker(容器)的依賴技術:
容器網絡:docker 自帶的網絡 docker network 僅支持管理單機上的容器網絡,當多主機運行的時候需要使用第三方開源網絡,例如calico、flannel 等。不存放數據。
服務發現:
容器的動態擴容特性決定了容器 IP 也會隨之變化,因此需要有一種機制開源自動識別並將用戶請求動態轉發到新創建的容器上,kubernetes 自帶服務發現功能,需要結合 kube-dns 服務解析內部域名。
容器監控:
可以通過原生命令 docker ps/top/stats 查看容器運行狀態,另外也可以使heapster/Prometheus等第三方監控工具監控容器的運行狀態。
數據管理:
容器的動態遷移會導致其在不通的 Host 之間遷移,因此如何保證與容器相關的數據也能隨之遷移或隨時訪問,可以使用邏輯卷/存儲掛載等方式解決。
日誌收集:錯誤日誌:(500/403),訪問日誌:用戶是從哪裏訪問的。
docker 原生的日誌查看工具 docker logs,但是容器內部的日誌需要通過 ELK 等專門的日誌收集分析和展示工具進行處理

DOcker安裝及基礎命令:官方網址:https://www.docker.com/

阿里雲docker鏡像站:https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
自2017 年推出(將 docker 更名爲)新的項目Moby,github 地址:https://github.com/moby/moby,Moby 項目屬於 Docker 項目的全新上游,Docker 將是一個隸屬於的 Moby 的子產品,而且之後的版本之後開始區分爲 CE 版本(社區版本)和 EE(企業收費版)。
一、yum安裝:[root@host-172-20-102-99 src]#yum install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.3.ce-3.el7.x86_64.rpm
[root@99 src]#systemctl start docker
[root@99 src]#ps -ef |grep docker 此時守護進程已開啓:
root 12712 1 0 21:25 ? 00:00:00 /usr/bin/dockerd
root 12719 12712 0 21:25 ? 00:00:00 docker-containerd --config /var/run/docker/containerd/containerd.toml
root 12915 3911 0 21:26 pts/0 00:00:00 grep --color=auto docker
[root@99 src]#docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.06.3-ce
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: a592beb5bc4c4092b1b1bac971afed27687340c5
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.1.3.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.795GiB
Name: 99
ID: 76UK:CYYR:3EEB:7IGO:4JAS:ZAQH:FB7N:EHP4:KV2J:V3S3:O5MU:4U32
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
驗證網卡:在 docker 安裝啓動之後,默認會生成一個名稱爲 docker0 的網卡並且默認 IP 地址爲 172.17.0.1 的網卡。
[root@99 ~]#ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:4d:eb:6d:8f txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
二、通過修改 yum 源安裝:[root@docker-server1 ~]# rm -rf /etc/yum.repos.d/*
[root@docker-server1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker-server1 ~]# wget -O /etc/yum.repos.d/epel.repo
http://mirrors.aliyun.com/repo/epel-7.repo
[root@docker-server1 ~]# wget -O /etc/yum.repos.d/docker-ce.repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker-server1 ~]# yum install docker-ce
[root@106 yum.repos.d]#systemctl start docker
[root@106 yum.repos.d]#systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

這時,我們做鏡像的導出和導入:從99主機導出,並導入到106主機:
[root@99 ~]#docker save nginx:1.14.2 > /opt/nginx-docker-images_1.14.12.tar.gz
[root@99 ~]#scp /opt/nginx-docker-images_1.14.12.tar.gz 172.20.102.106:/opt/
[root@106 apps]#docker load < /opt/nginx-docker-images_1.14.12.tar.gz
5dacd731af1b: Loading layer 58.45MB/58.45MB
Loaded image: nginx:1.14.2

鏡像倉庫官網:https://hub.docker.com

20190329  Docker基礎命令
20190329  Docker基礎命令
[root@99 src]#docker pull nginx:1.14.2 下載Nginx:centos/php 的下載方式與此一樣。
1.14.2: Pulling from library/nginx
27833a3ba0a5: Pull complete
0f23e58bd0b7: Pull complete
8ca774778e85: Pull complete
Digest: sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
Status: Downloaded newer image for nginx:1.14.2
20190329  Docker基礎命令
[root@99 src]#docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete
Digest: sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861
Status: Downloaded newer image for centos:latest
[root@99 src]#docker pull centos:7.5.1804
7.5.1804: Pulling from library/centos
5ad559c5ae16: Pull complete
Digest: sha256:c777d447a06ac17206510fdbbafe1a9ae49c26684c01c7663a1214a1a476bbdf
Status: Downloaded newer image for centos:7.5.1804
查看下載的鏡像:[root@99 src]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14.2 295c7be07902 7 days ago 109MB
centos 7.5.1804 cf49811e3cdb 2 weeks ago 200MB
centos latest 9f38484d220f 2 weeks ago 202MB

docker 鏡像加速配置:官網地址:http://cr.console.aliyun.com

[root@99 ~]#mkdir -p /etc/docker
[root@99 ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://9916w1ow.mirror.aliyuncs.com"] 把鏡像加速器地址指向阿里雲。
}
[root@99 ~]#systemctl daemon-reload
[root@99 ~]#systemctl restart docker
[root@99 ~]#docker info
CPUs: 2
Total Memory: 1.795GiB
Name: 99
ID: 76UK:CYYR:3EEB:7IGO:4JAS:ZAQH:FB7N:EHP4:KV2J:V3S3:O5MU:4U32
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/ 默認地址!!
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://9916w1ow.mirror.aliyuncs.com/ 我們給指定的地址!!
Live Restore Enabled: false
這時候我們再去pull下載鏡像就會非常快了!

Docker 鏡像基礎命令:

1、搜索鏡像:[root@99 ~]#docker search (images)centos:7.2.1809 #帶指定版本號
[root@99 ~]#docker search (images)centos #不帶版本號默認爲latest
2、下載鏡像:從 docker 倉庫將鏡像下載到本地。
[root@docker-server1 ~]# docker pull (images)nginx
3、查看本地鏡像:[root@docker-server1 ~]# docker images
REPOSITORY #鏡像所屬的倉庫名稱
TAG #鏡像版本號(標識符),默認爲 latest
IMAGE ID #鏡像唯一 ID 標示
CREATED #鏡像創建時間
VIRTUAL SIZE #鏡像的大小
鏡像導出:可以將鏡像從本地導出爲一個壓縮文件,然後複製到其他服務器進行導入使用。
4、從鏡像啓動一個容器:會直接進入到容器,並隨機生成容器 ID 和名稱
[root@99 src]#docker run -it docker.io/nginx bash
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
27833a3ba0a5: Already exists
e83729dd399a: Pull complete
ebc6a67df66d: Pull complete
Digest: sha256:c8a861b8a1eeef6d48955a6c6d5dff8e2580f13ff4d0f549e082e7c82a8617a2
Status: Downloaded newer image for nginx:latest

/>root@e7d1c0d66e05:/#(ctrl+p+q)#退出容器不註銷
5、顯示所有的容器,包括當前正在運行以及已經關閉的所有容器:[root@99 src]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7d1c0d66e05 nginx "bash" 28 seconds ago Up 27 seconds 80/tcp compassionate_jang
6、刪除運行中的容器:即使容正在運行當中,也會被強制刪除掉:
[root@99 src]#docker rm -f e7d1c0d66e05
e7d1c0d66e05
7、刪除鏡像:[root@99 src]#docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:c8a861b8a1eeef6d48955a6c6d5dff8e2580f13ff4d0f549e082e7c82a8617a2
Deleted: sha256:2bcb04bdb83f7c5dc30f0edaca1609a716bda1c7d2244d4f5fbbdfef33da366c
Deleted: sha256:dfce9ec5eeabad339cf90fce93b20f179926d5819359141e49e0006a52c066ca
Deleted: sha256:166d13b0f0cb542034a2aef1c034ee2271e1d6aaee4490f749e72d1c04449c5b
8、導出鏡像:[root@99 ~]#docker save nginx:1.14.2 > /opt/nginx-docker-images_1.14.12.tar.gz
9、導入鏡像:[root@106 apps]#docker load < /opt/nginx-docker-images_1.14.12.tar.gz
5dacd731af1b: Loading layer 58.45MB/58.45MB
Loaded image: nginx:1.14.2
10、隨機映射端口:
#前臺啓動並隨機映射本地端口到容器的 80;#前臺啓動的會話窗口無法進行其他操作,除非退出,但是退出後容器也會退出,如下:
20190329  Docker基礎命令
[root@99 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :::32768 :::
[root@99 ~]#lsof -i:32768
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 13062 root 4u IPv6 418992 0t0 TCP
:filenet-tms (LISTEN)
訪問端口:
20190329  Docker基礎命令
12、指定端口映射:
方法一、[root@99 src]#docker run -p 172.20.102.99:82:80 --name nginx-test-port2 docker.io/nginx
[root@99 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 172.20.102.99:82 :::
訪問端口:
20190329  Docker基礎命令
方式二、本地端口 81 映射到容器 80 端口: # docker run -p 81:80 --name nginx-test-port1 nginx
方式三、本地 IP:本地隨機端口:容器端口: # docker run -p 192.168.10.205::80 --name nginx-test-port3 docker.io/nginx
方式四、本機 ip:本地端口:容器端口/協議,默認爲 tcp 協議 # docker run -p 192.168.10.205:83:80/udp --name nginx-test-port4 docker.io/nginx
方式五、一次性映射多個端口+協議: # docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5docker.io/nginx
13、查看 Nginx 容器訪問日誌:[root@99 ~]#docker logs nginx-test-port2
172.20.0.1 - - [04/Apr/2019:00:38:41 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"
2019/04/04 00:38:41 [error] 6#6:
3 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.20.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "172.20.102.99:82"
172.20.0.1 - - [04/Apr/2019:00:38:41 +0000] "GET /favicon.ico HTTP/1.1" 404 154 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"
14、查看容器已經映射的端口:[root@99 ~]#docker port nginx-test-port2
80/tcp -> 172.20.102.99:82
15、自定義容器名稱:
[root@99 ~]#docker run -it --name nginx-test nginx
20190329  Docker基礎命令
16、後臺啓動容器:
[root@99 ~]#docker run -d -P --name nginx-test1 docker.io/nginx
7f9ece042db26cf70fbccbfd2576e850af81ac75e251cfc306e188bfc8468236
[root@99 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f9ece042db2 docker.io/nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:32769->80/tcp nginx-test1
17、創建並進入容器:
[root@99 ~]#docker run -t -i --name test-centos2 docker.io/centos
/bin/bash[root@d5e849aaa78b /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.1 11820 1904 pts/0 Ss 00:59 0:00 /bin/bash 第一個進程
root 14 0.0 0.0 51740 1728 pts/0 R+ 01:00 0:00 ps -aux
18、容器退出後自動刪除:
[root@99 ~]#docker run -it --rm --name nginx-delete-test docker.io/nginx
端口映射部分的參數:
-d:表示以“守護模式”執行,日誌不會出現在輸出終端上。
-i:表示以“交互模式”運行容器,-i 則讓容器的標準輸入保持打開
-t:表示容器啓動後會進入其命令行,-t 選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上
-v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>,-v 標記來創建一個數據卷並掛載到容器裏。在一次 run 中多次使用可以掛載多個數據卷。
-p:表示宿主機與容器的端口映射,此時將容器內部的 22 端口映射爲宿主機的 9999 端口,這樣就向外界暴露了9999 端口,可通過 Docker 網橋來訪問容器內部的 22 端口了。
19、傳遞運行命令:
[root@99 ~]#docker run -d centos /usr/bin/tail -f '/etc/hosts'
f8e576fcb93b012e5351c6bbbc264ce149cd308669347f75d82890db3e40c355
[root@99 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8e576fcb93b centos "/usr/bin/tail -f /e…" 9 seconds ago Up 8 seconds gallant_hawking
20、容器的啓動與關閉:
[root@99 ~]#docker stop f8e576fcb93b
f8e576fcb93b
[root@99 ~]#docker start f8e576fcb93b
f8e576fcb93b
21、進入到正在運行的容器:
nsenter 命令需要通過 PID 進入到容器內部,不過可以使用docker inspect 獲取到容器的 PID:
[root@99 ~]#docker inspect -f "{{.State.Pid}}" nginx-test1
15159
[root@99 ~]#nsenter -t 15159 -m -u -i -n -p
root@7f9ece042db2:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
22、腳本方式:
將 nsenter 命令寫入到腳本進行調用,如下:
[root@99 home]#vim docker-in.sh
#!/bin/bash
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
nsenter -t ${PID} -m -u -i -n -p
}
docker_in $1
[root@99 home]#chmod a+x docker-in.sh
[root@99 home]#./docker-in.sh nginx-test1
root@7f9ece042db2:/# pwd
/
root@7f9ece042db2:/# exit
logout
23、查看容器內部的 hosts 文件:
[root@99 home]#nsenter -t 15159 -m -u -i -n -p
root@7f9ece042db2:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 7f9ece042db2 #默認會將實例的 ID 添加到自己的 hosts 文件
24、批量關閉正在運行的容器:
[root@99 ~]# docker stop $(docker ps -a -q)
f8e576fcb93b
c7eb5c22a0d2
3ce69f1ebd4b
d5e849aaa78b
7f9ece042db2
6210779e62d6
57053f0350f0
83d2c5e41730
d1e0d3d093f4
25、批量強制關閉正在運行的容器:[root@99 ~]#docker kill $(docker ps -a -q)
26、批量刪除所有容器:[root@99 ~]# docker rm -f $(docker ps -a -q)
27、批量刪除已退出容器:[root@99 ~]# docker rm -f docker ps -aq -f status=exited
28、批量強制關閉正在運行的容器:[root@99 ~]# docker kill $(docker ps -a -q)
DNS服務​:
默認採用宿主機的dns地址:一是將 dns 地址配置在宿主機二是將參數配置在 docker 啓動腳本里面 dns=1.1.1.1
[root@99 ~]# docker run -it --rm --dns 223.6.6.6 nginx bash
root@d7adf3567f69:/# cat /etc/resolv.conf
search openstacklocal
nameserver 223.6.6.6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章