新四季網

kubernetes與docker的關係(Kubernetes全棧架構師Docker基礎)

2023-04-12 14:28:45

kubernetes與docker的關係?Docker:它是一個開源的軟體項目,在Linux作業系統上,docker提供了一個額外的軟體抽象層及作業系統層虛擬化的自動管理機制,接下來我們就來聊聊關於kubernetes與docker的關係?以下內容大家不妨參考一二希望能幫到您!

kubernetes與docker的關係

目錄docker基礎入門Docker基本命令Dockerfile用法製作小鏡像上多階段製作小鏡像下Scratch空鏡像Docker基礎入門

Docker:它是一個開源的軟體項目,在Linux作業系統上,docker提供了一個額外的軟體抽象層及作業系統層虛擬化的自動管理機制。

物理機:

安裝系統依賴環境應用程式多個物理機提高並發量

虛擬機:

把一個物理機虛擬機虛擬成多個機器把依賴環境打成一個系統的模板

容器化:

鏡像基礎(依賴環境的鏡像;根據基礎鏡像放入自己的代碼或者包;按層存儲)啟動時間特別快,秒級啟動

容器:把自己的應用程式,根據某個依賴的基礎鏡像,生成一個應用程式鏡像應用程式鏡像,可以運行在任何部署了Docker環境的機器上。

Docker基本命令查看Docker版本Docker詳細信息搜索鏡像拉取鏡像推送鏡像啟動鏡像查看容器查看日誌進入容器複製文件刪除鏡像修改記錄保存狀態查看Docker版本

[root@k8s-master01 ~]# docker versionClient: Docker Engine - Community Version: 20.10.7 API version: 1.40 Go version: go1.13.15 Git commit: f0df350 Built: Wed Jun 2 11:58:10 2021 OS/Arch: linux/amd64 Context: default Experimental: trueServer: Docker Engine - Community Engine: Version: 19.03.15 API version: 1.40 (minimum version 1.12) Go version: go1.13.15 Git commit: 99e3ed8919 Built: Sat Jan 30 03:16:33 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.6 GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d runc: Version: 1.0.0-rc95 GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7 docker-init: Version: 0.18.0 GitCommit: fec3683

Docker詳細信息

[root@k8s-master01 ~]# docker infoClient: Context: default Debug Mode: false # 可以按需修改 Plugins: app: Docker App (Docker Inc., v0.9.1-beta3) buildx: Build with BuildKit (Docker Inc., v0.5.1-docker) scan: Docker Scan (Docker Inc., v0.8.0)Server: Containers: 6 Running: 4 Paused: 0 Stopped: 2 Images: 9 Server Version: 19.03.15 Storage Driver: overlay2 # 官方推薦的存儲驅動,要求文件系統是xfs,必須支持d_type(目錄條目類型,內核上的一個數據,安裝系統的時候必須把ftype設置為1,不然的話很影響docker的性能),目前流行的Storage Driver有aufs(ubuntu支持)、overlay、brtfs Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file # docker日誌的存儲類型,json-file會存儲在本地,目錄在Docker Root Dir Cgroup Driver: systemd Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive # 容器編排工具,inactive未啟動 Runtimes: runc Default Runtime: runc # docker運行的核心 Init Binary: docker-init containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7 init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 4.19.12-1.el7.elrepo.x86_64 # 內核版本低於3.18不能使用overlay2存儲驅動,linux3.18才加入的 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 1.923GiB Name: k8s-master01 ID: PYSL:2OAV:4C7N:WAI3:7G3J:IBR5:6BXI:7OEG:YNCL:6RAR:3CTF:CTDD Docker Root Dir: /var/lib/docker # 這個目錄可以修改,生產環境推薦使用ssd硬碟存儲,掛載在該目錄,可以提高docker的性能,條件不足的情況下,最好使用一個單獨的磁碟進行掛載,不要和宿主機用同一個磁碟 Debug Mode: false Registry: https://index.docker.io/v1/ # 官方鏡像倉庫,訪問較慢,可以修改為自己的鏡像倉庫 Labels: Experimental: false Insecure Registries: # 如果使用的非官方鏡像倉庫地址不是https,需要把連結加入到此非安全列表 127.0.0.0/8 Live Restore Enabled: false # 生產環境中需要打開,重啟docker進程不會重啟正在運行的容器,如果容器沒有設置自動重啟就會被關閉,不會重啟

查看d_type信息(ftype=1說明系統支持d_type)

[root@k8s-master01 ~]# xfs_info /meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=1113856 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0data = bsize=4096 blocks=4455424, imaxpct=25 = sunit=0 swidth=0 blksnaming =version 2 bsize=4096 ascii-ci=0 ftype=1log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1realtime =none extsz=4096 blocks=0, rtextents=0

進入Docker Root Dir,進入任何一個容器目錄既可查看對應容器的日誌,每次docker重啟的時候日誌就會被清除

[root@k8s-master01 ~]# cd /var/lib/docker/containers/[root@k8s-master01 containers]# lltotal 0drwx-----x 4 root root 165 Jul 12 10:54 10b58a593a5f417d466fbb2eba54c6ac0e8322a3712cbc6eb46f9cae5b48e4d8[root@k8s-master01 10b58a593a5f417d466fbb2eba54c6ac0e8322a3712cbc6eb46f9cae5b48e4d8]# lltotal 16-rw-r----- 1 root root 4042 Jul 12 10:53 10b58a593a5f417d466fbb2eba54c6ac0e8322a3712cbc6eb46f9cae5b48e4d8-json.log

Insecure Registries目錄

[root@k8s-master01 ~]# vim /etc/docker/daemon.json{ "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ], "exec-opts": ["native.cgroupdriver=systemd"], "max-concurrent-downloads": 10, # 並發下載的線程數 "max-concurrent-uploads": 5, # 並發上傳的線程數 "log-opts": { "max-size": "300m", # 限制日誌文件最大容量,超過則分割 "max-file": "2" # 日誌保存最大數量 }, "live-restore": true # 更改docker配置之後需要重啟docker才能生效,這個參數可以使得重啟docker不影響正在運行的容器進程}

搜索鏡像

[root@k8s-master01 ~]# docker search centosNAME DESCRIPTION STARS OFFICIAL AUTOMATEDcentos The official build of CentOS. 6631 [OK] ansible/centos7-ansible Ansible on Centos7 134 [OK]consol/centos-xfce-vnc Centos container with "headless" VNC session… 129 [OK]jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 118 [OK]centos/systemd systemd enabled base container. 100 [OK]centos/mysql-57-centos7 MySQL 5.7 SQL database server 88 imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 58 [OK]tutum/centos Simple CentOS docker image with SSH access 48 centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Relational … 45 jdeathe/centos-ssh-apache-php Apache PHP - CentOS. 31 [OK]kinogmt/centos-ssh CentOS with SSH 29 [OK]guyton/centos6 From official centos6 container with full up… 10 [OK]nathonfowlie/centos-jre Latest CentOS image with the JRE pre-install… 8 [OK]centos/tools Docker image that has systems administration… 7 [OK]drecom/centos-ruby centos ruby 6 [OK]mamohr/centos-java Oracle Java 8 Docker image based on Centos 7 3 [OK]darksheer/centos Base Centos Image -- Updated hourly 3 [OK]miko2u/centos6 CentOS6 日本語環境 2 [OK]amd64/centos The official build of CentOS. 2 dokken/centos-7 CentOS 7 image for kitchen-dokken 2 indigo/centos-maven Vanilla CentOS 7 with Oracle Java Developmen… 2 [OK]mcnaughton/centos-base centos base image 1 [OK]blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK]starlabio/centos-native-build Our CentOS image for native builds 0 [OK]smartentry/centos centos with smartentry 0 [OK]

OFFICIAL的值是ok代表官方容器,一般都是使用官方的

拉取鏡像

alpine可以作為基礎鏡像,拉取鏡像的時候如果本地已經存在,則不會重複拉取

可以通過官網搜索鏡像:https://hub.docker.com/

拉取鏡像,如果本地已有該鏡像,則不會重複拉取

[root@k8s-master01 ~]# docker pull alpine:latestlatest: Pulling from library/alpine5843afab3874: Pull complete Digest: sha256:234cb88d3020898631af0ccbbcca9a66ae7306ecd30c9720690858c1b007d2a0Status: Downloaded newer image for alpine:latestdocker.io/library/alpine:latest

默認拉取官方鏡像,如果需要拉取指定鏡像,需要添加地址,版本號

推送鏡像

查看鏡像

[root@k8s-master01 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 4cdc5dd7eaad 7 days ago 133MBkubernetesui/dashboard v2.3.1 e1482a24335a 3 weeks ago 220MBalpine latest d4ff818577bc 4 weeks ago 5.6MBregistry.cn-beijing.aliyuncs.com/dotbalo/node v3.15.3 d45bf977dfbf 10 months ago 262MBregistry.cn-beijing.aliyuncs.com/dotbalo/pod2daemon-flexvol v3.15.3 963564fb95ed 10 months ago 22.8MBregistry.cn-beijing.aliyuncs.com/dotbalo/cni v3.15.3 ca5564c06ea0 10 months ago 110MBkubernetesui/dashboard v2.0.3 503bc4b7440b 12 months ago 225MBregistry.cn-beijing.aliyuncs.com/dotbalo/coredns 1.7.0 bfe3a36ebd25 13 months ago 45.2MBregistry.cn-beijing.aliyuncs.com/dotbalo/metrics-scraper v1.0.4 86262685d9ab 15 months ago 36.9MBregistry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64 3.2 80d28bedfe5d 17 months ago 683kB

鏡像打標籤到自己的鏡像倉庫

[root@k8s-master01 ~]# docker tag registry.cn-beijing.aliyuncs.com/dotbalo/pod2daemon-flexvol:v3.15.3 mingsonzheng/pod2daemon-flexvol:v3.15.3

登錄遠程鏡像倉庫

[root@k8s-master01 ~]# docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username: mingsonzhengPassword: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

登錄到指定倉庫

docker login xxx.com

推送鏡像

[root@k8s-master01 ~]# docker push mingsonzheng/pod2daemon-flexvol:v3.15.3The push refers to repository [docker.io/mingsonzheng/pod2daemon-flexvol]f0e55d2e215d: Pushed 7b2f85666007: Pushed 752045c6df15: Pushed ca07dc9dd06e: Pushed 1d0352c1c217: Pushed 540c65dd0455: Pushed 48855504bcc3: Pushed v3.15.3: digest: sha256:6bd1246d0ea1e573a6a050902995b1666ec0852339e5bda3051f583540361b55 size: 1788

啟動鏡像前臺啟動後臺啟動

前臺啟動,如果本地沒有鏡像會先拉取

[root@k8s-master01 ~]# docker run -ti centos:8 bashUnable to find image 'centos:8' locally8: Pulling from library/centos7a0437f04f83: Pull complete Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1Status: Downloaded newer image for centos:8[root@a4cb8f5d6bd5 /]#

後臺啟動

[root@k8s-master01 ~]# docker run -d centos:8 bash617a1213ae5ce5c4bed0716fd5b3212b25ed7bcc2099ba329db54cccd3c0b8d5[root@k8s-master01 ~]#

查看容器

查看正在運行的容器

[root@k8s-master01 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES617a1213ae5c centos:8 "bash" About a minute ago Exited (0) About a minute ago vigilant_boyd04b21dff00f5 centos:8 "bash" 2 minutes ago Exited (0) 2 minutes ago objective_satoshia4cb8f5d6bd5 centos:8 "bash" 5 minutes ago Exited (127) 2 minutes ago reverent_elgamal

查看所有狀態的容器

[root@k8s-master01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1d906297395d centos:8 "bash" 2 minutes ago Exited (0) 2 minutes ago wonderful_hermann617a1213ae5c centos:8 "bash" 22 minutes ago Exited (0) 22 minutes ago vigilant_boyd04b21dff00f5 centos:8 "bash" 22 minutes ago Exited (0) 22 minutes ago objective_satoshia4cb8f5d6bd5 centos:8 "bash" 26 minutes ago Exited (127) 22 minutes ago reverent_elgamala3db403fd0be kubernetesui/dashboard "/dashboard --insecu…" 46 hours ago Up 46 hours k8s_kubernetes-dashboard_kubernetes-dashboard-67484c44f6-brz2z_kubernetes-dashboard_bb016e8e-a4b1-48e6-912c-022addfb72bf_08cd76e9123b3 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 46 hours ago Up 46 hours k8s_POD_kubernetes-dashboard-67484c44f6-brz2z_kubernetes-dashboard_bb016e8e-a4b1-48e6-912c-022addfb72bf_0dbec965d88da registry.cn-beijing.aliyuncs.com/dotbalo/node "start_runit" 2 days ago Up 2 days k8s_calico-node_calico-node-gn8ws_kube-system_16eeb29c-3383-4e62-b84c-40bf3dae7d07_0e9869813fc1b registry.cn-beijing.aliyuncs.com/dotbalo/pod2daemon-flexvol "/usr/local/bin/flex…" 2 days ago Exited (0) 2 days ago k8s_flexvol-driver_calico-node-gn8ws_kube-system_16eeb29c-3383-4e62-b84c-40bf3dae7d07_010b58a593a5f registry.cn-beijing.aliyuncs.com/dotbalo/cni "/install-cni.sh" 2 days ago Exited (0) 2 days ago k8s_install-cni_calico-node-gn8ws_kube-system_16eeb29c-3383-4e62-b84c-40bf3dae7d07_0610909969be1 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 2 days ago Up 2 days k8s_POD_calico-node-gn8ws_kube-system_16eeb29c-3383-4e62-b84c-40bf3dae7d07_0

查看正在運行的容器的id

[root@k8s-master01 ~]# docker ps -qa3db403fd0be8cd76e9123b3dbec965d88da610909969be1

查看所有的容器的id

[root@k8s-master01 ~]# docker ps -aq1d906297395d617a1213ae5c04b21dff00f5a4cb8f5d6bd5a3db403fd0be8cd76e9123b3dbec965d88dae9869813fc1b10b58a593a5f610909969be1

查看日誌

[root@k8s-master01 ~]# docker logs -f a3db403fd0be

對應日誌路徑

/var/lib/docker/containers/a3db403fd0be5eacb8aa1769cc8d215da93eb74da84262aa1aac11551c37a84d

進入容器

啟動容器

[root@k8s-master01 ~]# docker run -ti nginx:1.14.2 sh#

Xshell 7新建一個連結到伺服器

查看運行中的容器

[root@k8s-master01 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2ef850f11136 nginx:1.14.2 "sh" 29 seconds ago Up 28 seconds 80/tcp funny_leavitta3db403fd0be kubernetesui/dashboard "/dashboard --insecu…" 2 days ago Up 2 days k8s_kubernetes-dashboard_kubernetes-dashboard-67484c44f6-brz2z_kubernetes-dashboard_bb016e8e-a4b1-48e6-912c-022addfb72bf_08cd76e9123b3 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 2 days ago Up 2 days k8s_POD_kubernetes-dashboard-67484c44f6-brz2z_kubernetes-dashboard_bb016e8e-a4b1-48e6-912c-022addfb72bf_0dbec965d88da registry.cn-beijing.aliyuncs.com/dotbalo/node "start_runit" 3 days ago Up 3 days k8s_calico-node_calico-node-gn8ws_kube-system_16eeb29c-3383-4e62-b84c-40bf3dae7d07_0610909969be1 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" 3 days ago Up 3 days k8s_POD_calico-node-gn8ws_kube-system_16eeb29c-3383-4e62-b84c-40bf3dae7d07_0

進入容器

[root@k8s-master01 ~]# docker exec -ti 2ef850f11136 sh# lsbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var# exit[root@k8s-master01 ~]#

複製文件

後臺啟動nginx

[root@k8s-master01 ~]# docker run -tid -p 12345:80 nginx:latestb75ad319e61326e05905d41d67616112be51af4d1234f51bef5d21807e9bc42d[root@k8s-master01 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb75ad319e613 nginx:latest "/docker-entrypoint.…" 8 seconds ago Up 6 seconds 0.0.0.0:12345->80/tcp upbeat_brahmagupta

訪問地址:http://192.168.232.128:12345/

進入容器

[root@k8s-master01 ~]# docker exec -ti b75ad319e613 bashroot@b75ad319e613:/# cd /usr/share/nginx/html/root@b75ad319e613:/usr/share/nginx/html# ls50x.html index.htmlroot@b75ad319e613:/usr/share/nginx/html# exitexit

複製文件到容器中

[root@k8s-master01 ~]# echo "test cp" > index.html[root@k8s-master01 ~]# docker cp index.html b75ad319e613:/usr/share/nginx/html/

訪問地址:http://192.168.232.128:12345/

複製容器中的文件到本地

[root@k8s-master01 ~]# docker cp b75ad319e613:/usr/share/nginx/html/index.html .

刪除鏡像

[root@k8s-master01 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 4cdc5dd7eaad 8 days ago 133MB[root@k8s-master01 ~]# docker rmi 4cdc5dd7eaadError response from daemon: conflict: unable to delete 4cdc5dd7eaad (cannot be forced) - image is being used by running container b75ad319e613# 刪除容器[root@k8s-master01 ~]# docker rm b75ad319e613Error response from daemon: You cannot remove a running container b75ad319e61326e05905d41d67616112be51af4d1234f51bef5d21807e9bc42d. Stop the container before attempting removal or force remove# 停止容器運行[root@k8s-master01 ~]# docker stop b75ad319e613b75ad319e613[root@k8s-master01 ~]# docker rm b75ad319e613b75ad319e613[root@k8s-master01 ~]# docker rmi 4cdc5dd7eaadError response from daemon: conflict: unable to delete 4cdc5dd7eaad (must be forced) - image is being used by stopped container cd2a20f47459[root@k8s-master01 ~]# docker rm cd2a20f47459cd2a20f47459[root@k8s-master01 ~]# docker rmi 4cdc5dd7eaadUntagged: nginx:latestUntagged: nginx@sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9Deleted: sha256:4cdc5dd7eaadff5080649e8d0014f2f8d36d4ddf2eff2fdf577dd13da85c5d2fDeleted: sha256:63d268dd303e176ba45c810247966ff8d1cb9a5bce4a404584087ec01c63de15Deleted: sha256:b27eb5bbca70862681631b492735bac31d3c1c558c774aca9c0e36f1b50ba915Deleted: sha256:435c6dad68b58885ad437e5f35f53e071213134eb9e4932b445eac7b39170700Deleted: sha256:bdf28aff423adfe7c6cb938eced2f19a32efa9fa3922a3c5ddce584b139dc864Deleted: sha256:2c78bcd3187437a7a5d9d8dbf555b3574ba7d143c1852860f9df0a46d5df056aDeleted: sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7

修改記錄

[root@k8s-master01 ~]# docker imagesregistry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64 3.2 80d28bedfe5d 17 months ago 683kB[root@k8s-master01 ~]# docker history registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2IMAGE CREATED CREATED BY SIZE COMMENT80d28bedfe5d 17 months ago ENTRYPOINT ["/pause"] 0B buildkit.dockerfile.v0 17 months ago ADD bin/pause-amd64 /pause # buildkit 683kB buildkit.dockerfile.v0 17 months ago ARG ARCH 0B buildkit.dockerfile.v0

保存狀態

假設我們複製了文件到容器中,想要保存容器狀態需要使用 docker commit

# 拉取鏡像[root@k8s-master01 ~]# docker pull nginx:latestlatest: Pulling from library/nginxb4d181a07f80: Pull complete 66b1c490df3f: Pull complete d0f91ae9b44c: Pull complete baf987068537: Pull complete 6bbc76cbebeb: Pull complete 32b766478bc2: Pull complete Digest: sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9Status: Downloaded newer image for nginx:latestdocker.io/library/nginx:latest# 後臺啟動容器[root@k8s-master01 ~]# docker run -tid -p 12345:80 nginx:latest8ddcc9d728450c9398579155e793aca873713632d72a8402e5684ebb6f613437# 獲取容器ID[root@k8s-master01 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8ddcc9d72845 nginx:latest "/docker-entrypoint.…" 28 seconds ago Up 27 seconds 0.0.0.0:12345->80/tcp confident_leavitt# 複製文件到容器中[root@k8s-master01 ~]# docker cp index.html 8ddcc9d72845:/usr/share/nginx/html/# 提交修改記錄[root@k8s-master01 ~]# docker commit -a "mingsonzheng" -m "update index.html" 8ddcc9d72845 nginx:commitsha256:f62c69e4853e45951b1b83eec2432e48e436d65a14a62b087e5fe6c7c9398771# 查看鏡像[root@k8s-master01 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx commit f62c69e4853e 40 seconds ago 133MB# 啟動容器,加上--rm,則關閉之後會刪除,不會產生大量狀態為Exited的容器[root@k8s-master01 ~]# docker run -ti --rm nginx:commit bashroot@c657e57078c1:/# cd /usr/share/nginx/html/root@c657e57078c1:/usr/share/nginx/html# ls50x.html index.htmlroot@c657e57078c1:/usr/share/nginx/html# exitexit# 查看容器,該容器不會出現在列表中[root@k8s-master01 ~]# docker ps

Dockerfile用法Dockerfile指令Dockerfile用法Dockerfile指令FROM:繼承基礎鏡像MAINTAINER:鏡像製作作者信息RUN:用來執行shell命令EXPOSE:暴露埠號CMD:啟動容器默認執行的命令ENTRYPOINT:啟動容器真正執行的命令VOLUME:創建掛載點ENV:配置環境變量ADD:添加文件到容器COPY:複製文件到容器WORKDIR:設置容器的工作目錄USER:容器使用的用戶

nginx官方Dockerfile:https://github.com/nginxinc/docker-nginx/blob/master/Dockerfile-alpine.template

繼承alpine基礎鏡像

FROM alpine:%%ALPINE_VERSION%%

MAINTAINER:鏡像製作作者信息,新版本推薦使用LABEL

LABEL

執行shell命令

RUN set -x

apk是alpine安裝包的工具

apk add --no-cache --virtual .cert-deps

暴露埠號

EXPOSE 80

啟動容器默認執行的命令

CMD ["nginx", "-g", "daemon off;"]

CMD命令可以被覆蓋,比如bash

[root@k8s-master01 ~]# docker run -ti --rm nginx:commit bash

CMD 和 ENTRYPOINT 必須有一個,如果兩者都有的話,ENTRYPOINT 就是啟動命令,而 CMD 就是它的參數

ENTRYPOINT 對應 k8s 的 COMMAND

CMD 對應 k8s 的 arg

VOLUME 是一個匿名的掛載點,Docker 不建議保留容器產生的文件,但是有一些文件是必須保留的,比如資料庫,我們可以為其創建一個掛載點,將宿主機的目錄掛載到容器裡面,這樣就可以保留它的數據

配置環境變量

ENV NGINX_VERSION %%NGINX_VERSION%%ENV NJS_VERSION %%NJS_VERSION%%ENV PKG_RELEASE %%PKG_RELEASE%%

但是不建議寫在 Dockerfile 中,建議通過命令行 -e 傳入參數,獨立到鏡像之外,可以動態修改

[root@k8s-master01 ~]# docker run -ti -e a=b -e c=d

ADD:複製文件到容器,如果複製壓縮文件會自動解壓

COPY:複製文件到容器,不會解壓,直接複製

WORKDIR:設置容器的工作目錄,如果有設置則進入容器時會進入到該目錄下

USER:容器使用的用戶,系統默認用戶是root,但是在業務容器容器化的時候不建議使用root,因為不安全,可能會造成對宿主機有危險的操作

[root@k8s-master01 ~]# whoamiroot

Dockerfile用法

新增Dockerfile

[root@k8s-master01 ~]# mkdir dockerfiles[root@k8s-master01 ~]# cd dockerfiles/[root@k8s-master01 dockerfiles]# vim Dockerfile# 添加以下內容FROM centos:8LABELLABEL test=dockerfileRUN useradd mingsonzhengRUN mkdir /opt/mingsonzheng

在當前目錄下構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:user .Sending build context to Docker daemon 2.048kBStep 1/5 : FROM centos:8 ---> 300e315adb2fStep 2/5 : LABEL ---> Running in cccd20f9b0f5Removing intermediate container cccd20f9b0f5 ---> f6dc016add09Step 3/5 : LABEL test=dockerfile ---> Running in e4d1962c630bRemoving intermediate container e4d1962c630b ---> 3977dc88a2f2Step 4/5 : RUN useradd mingsonzheng ---> Running in d3905f2c7dc4Removing intermediate container d3905f2c7dc4 ---> 30968f5c2285Step 5/5 : RUN mkdir /opt/mingsonzheng ---> Running in 811c4ceb3e70Removing intermediate container 811c4ceb3e70 ---> 0cd811c2fadfSuccessfully built 0cd811c2fadfSuccessfully tagged centos:user

啟動鏡像

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:user bash[root@828f29ae30bf /]#

調試的時候一定要加上 --rm,不然會有很多Exited記錄

查看用戶

[root@828f29ae30bf /]# cat /etc/passwdmingsonzheng:x:1000:1000::/home/mingsonzheng:/bin/bash

製作完鏡像之後,如果調試沒有問題,記得推送到鏡像倉庫

如果測試通過之後,需要優化一下RUN語句,沒有必要分開寫,因為docker有緩存機制,假設有20個RUN語句,執行第18個的時候失敗了,前面17個執行成功的沒有必要再執行一次,修改之後直接從第18個RUN語句繼續執行

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfile#RUN useradd mingsonzheng#RUN mkdir /opt/mingsonzhengRUN useradd mingsonzheng && /opt/mingsonzheng

這樣docker的層級會少一層,存儲大小會小一點

CMD:啟動容器默認執行的命令

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfileRUN useradd mingsonzhengRUN mkdir /opt/mingsonzhengCMD [ "sh", "-c", "echo 1"]#RUN useradd mingsonzheng && /opt/mingsonzheng

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:cmd .

如果文件不在當前目錄,可以使用-f

[root@k8s-master01 dockerfiles]# mkdir t[root@k8s-master01 dockerfiles]# cp Dockerfile t[root@k8s-master01 dockerfiles]# docker build -t centos:cmd -f t/Dockerfile

查看鏡像

[root@k8s-master01 dockerfiles]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos cmd a008df4670f8 2 minutes ago 210MB

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:cmd1

可以看到列印了一個1就退出了

使用bash覆蓋CMD命令

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:cmd bash[root@924006c7dc0e /]# exitexit

可以看到它就不列印了,覆蓋了CMD命令

在k8s中不建議將CMD命令打到鏡像中,因為我們遵循的構建策略是一次構建到處運行,啟動的命令可能不是統一的,可以指定配置文件讓啟動命令根據配置文件變成不同環境的命令,這樣可以使用k8s的arg或者cmd去覆蓋掉它的啟動參數,所以CMD可以不打到鏡像中,當然也可以使用變量的注入方式

使用ENTRYPIOINT,CMD可以被覆蓋,如果有ENTRYPIOINT的話,CMD就是ENTRYPIOINT的參數

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfileRUN useradd mingsonzhengRUN mkdir /opt/mingsonzhengENTRYPOINT ["echo"]CMD [ "3"]#RUN useradd mingsonzheng && /opt/mingsonzheng

打包鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:ep .

運行容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:ep 1010[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:ep mingsonzhengmingsonzheng

可以看到CMD就是ENTRYPIOINT的參數,CMD可以被覆蓋,我們可以把命令相同的部分打入到ENTRYPIOINT,不同的部分通過CMD覆蓋

ENV:配置環境變量

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfileENV test_env1 env1ENV test_env2 env2RUN useradd mingsonzhengRUN mkdir /opt/mingsonzheng#ENTRYPOINT ["echo"]CMD echo "test_env1 test_env2"#RUN useradd mingsonzheng && /opt/mingsonzheng

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:env .

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:envtest_env1 test_env2

環境變量也可以這麼寫

ENV env1=test1 env2=test2

正式應用的ENV變量不要寫在Dockerfile裡面,應該使用k8s資源文件,或者docker的-e參數注入進去,這樣也能減少構建鏡像的層數

ADD:添加文件到容器

# 新增文件[root@k8s-master01 dockerfiles]# echo 123 > index.html# 壓縮文件[root@k8s-master01 dockerfiles]# tar zcf index.tar.gz index.html t/# 編輯Dockerfile[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfileENV test_env1 env1ENV test_env2 env2RUN useradd mingsonzhengRUN mkdir /opt/mingsonzheng#ENTRYPOINT ["echo"]ENV env1=test1 env2=test2ADD ./index.tar.gz /opt/CMD echo "test_env1 test_env2"#RUN useradd mingsonzheng && /opt/mingsonzheng

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:add .

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:add bash[root@b2dacca0f34f /]# cd /opt/[root@b2dacca0f34f opt]# lsindex.html mingsonzheng t

可以看到文件被複製到容器的指定目錄下,並且自動解壓了

COPY:複製文件到容器

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfileENV test_env1 env1ENV test_env2 env2RUN useradd mingsonzhengRUN mkdir /opt/mingsonzheng#ENTRYPOINT ["echo"]ENV env1=test1 env2=test2ADD ./index.tar.gz /opt/COPY ./t /opt/mingsonzheng/CMD echo "test_env1 test_env2"#RUN useradd mingsonzheng && /opt/mingsonzheng

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:add .

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:add bash[root@3ca8cddbf8b3 /]# cd /opt/mingsonzheng/[root@3ca8cddbf8b3 mingsonzheng]# lsDockerfile

可以看到docker把t目錄下的文件複製進來了,並不會複製目錄,如果想要複製目錄的話,只能多加一層目錄

COPY複製壓縮文件的話不會解壓

docker build的時候會把當前目錄下所有東西發送到內存中,所以文件必須要放在執行docker build命令的文件目錄下

WORKDIR:設置容器的工作目錄

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfileENV test_env1 env1ENV test_env2 env2RUN useradd mingsonzhengRUN mkdir /opt/mingsonzheng#ENTRYPOINT ["echo"]ENV env1=test1 env2=test2ADD ./index.tar.gz /opt/COPY ./t /opt/mingsonzheng/CMD echo "test_env1 test_env2"WORKDIR /opt/mingsonzhengCMD pwd ; ls#RUN useradd mingsonzheng && /opt/mingsonzheng

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:workdir .

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:workdir/opt/mingsonzhengDockerfile

USER:容器使用的用戶

# 啟動容器[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:workdir bash# 查看當前用戶[root@87983e2581da mingsonzheng]# whoamiroot# 查看系統其他用戶[root@87983e2581da mingsonzheng]# cat /etc/passwdmingsonzheng:x:1000:1000::/home/mingsonzheng:/bin/bash

切換用戶

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfileENV test_env1 env1ENV test_env2 env2RUN useradd mingsonzhengRUN mkdir /opt/mingsonzheng#ENTRYPOINT ["echo"]ENV env1=test1 env2=test2ADD ./index.tar.gz /opt/COPY ./t /opt/mingsonzheng/CMD echo "test_env1 test_env2"WORKDIR /opt/mingsonzhengUSER 1000CMD pwd ; ls#RUN useradd mingsonzheng && /opt/mingsonzheng

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:workdir .

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:workdir bash[mingsonzheng@f6110f7e8e3a mingsonzheng]$ whoamimingsonzheng

使用鏡像倉庫地址(xxx.com)構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t xxx.com/centos:workdir .

查看鏡像

[root@k8s-master01 dockerfiles]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZExxx.com/centos workdir cf9572a3833e 3 minutes ago 210MB

VOLUME:創建掛載點

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容FROM centos:8LABELLABEL test=dockerfileENV test_env1 env1ENV test_env2 env2RUN useradd mingsonzhengRUN mkdir /opt/mingsonzheng#ENTRYPOINT ["echo"]ENV env1=test1 env2=test2ADD ./index.tar.gz /opt/COPY ./t /opt/mingsonzheng/CMD echo "test_env1 test_env2"WORKDIR /opt/mingsonzheng#USER 1000VOLUME /dataCMD pwd ; ls#RUN useradd mingsonzheng && /opt/mingsonzheng

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:workdir .

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm centos:workdir bash[root@6aecced2b780 mingsonzheng]# cd / [root@6aecced2b780 /]# lsbin data dev etc home lib lib64 lost found media mnt opt proc root run sbin srv sys tmp usr var

可以看到data目錄,它會與本地 /var/lib/docker/volumes/ 的目錄下生成一個volume的目錄,然後掛載到容器中的data下,退出容器則會清除本地目錄下的data

通過-v將mysql_data目錄掛載到容器中,使用-v則系統不會自動創建掛載目錄

[root@k8s-master01 ~]# mkdir mysql_data[root@k8s-master01 ~]# docker run -ti -v /root/mysql_data/:/data xxx.com/centos:workdir bash

製作小鏡像

一定不要使用centos基礎鏡像,可以使用alpine,busybox,scratch,debian

修改基礎鏡像

[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容#FROM centos:8FROM alpine:3.8LABELLABEL test=dockerfileENV test_env1 env1ENV test_env2 env2RUN adduser -D mingsonzhengRUN mkdir -p /opt/mingsonzheng#ENTRYPOINT ["echo"]ENV env1=test1 env2=test2ADD ./index.tar.gz /opt/COPY ./t /opt/mingsonzheng/WORKDIR /opt/mingsonzheng#USER 1000VOLUME /dataCMD pwd ; ls#RUN useradd mingsonzheng && /opt/mingsonzheng

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t centos:workdir .

查看鏡像

[root@k8s-master01 dockerfiles]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEalpine workdir 7fc05207414a 22 seconds ago 4.42MBcentos workdir b165153a0132 36 minutes ago 210MB

alpine與centos相比,SIZE非常小,適合做為基礎鏡像,基礎鏡像可以在官方倉庫查找,不需要自己製作

如果需要用到glibc,可以使用node:slim,python:slim,net作為基礎鏡像

多階段製作小鏡像

分開兩個步驟:編譯操作和生成最終鏡像的操作

新建一個go文件

[root@k8s-master01 dockerfiles]# vim main.go# 修改為以下內容package mainimport "fmt"func main { fmt.Println("Hello World")}

新建一個Dockerfile文件

[root@k8s-master01 dockerfiles]# mv Dockerfile t/123[root@k8s-master01 dockerfiles]# vim Dockerfile# 修改為以下內容FROM golang:1.14.4-alpineWORKDIR /optCOPY main.go /optRUN go build /opt/main.goCMD "./main"

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t hello:single_build .

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm hello:single_buildHello World

查看鏡像

[root@k8s-master01 dockerfiles]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello single_build ca11178a0c13 44 seconds ago 372MB

查看包大小

[root@k8s-master01 dockerfiles]# docker run -ti --rm hello:single_build sh/opt # ls -lhtotal 2M -rwxr-xr-x 1 root root 2.0M Jul 16 08:30 main-rw-r--r-- 1 root root 77 Jul 16 08:24 main.go/opt #

2M的包生成的鏡像有372M,我們應該使用分階段構建

[root@k8s-master01 dockerfiles]# vim Dockerfile# 修改為以下內容# build stepFROM golang:1.14.4-alpineWORKDIR /optCOPY main.go /optRUN go build /opt/main.goCMD "./main"# create real app imageFROM alpine:3.8COPY --from=0 /opt/main /CMD "./opt/main"

--from=0就是第一步的操作(# create real app image上面的操作)

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t hello:alpine .

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm hello:alpine sh/ # lsbin dev etc home lib main media mnt proc root run sbin srv sys tmp usr var/ # ./mainHello World

查看鏡像

[root@k8s-master01 dockerfiles]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello alpine 66fa14e35f3c About a minute ago 6.48MBhello single_build ca11178a0c13 11 minutes ago 372MB

可以看到單階段和多階段鏡像大小的區別,所以一定要進行分階段構建

使用builder命令複製包到根目錄

[root@k8s-master01 dockerfiles]# vim Dockerfile# 修改為以下內容# build stepFROM golang:1.14.4-alpine as builderWORKDIR /optCOPY main.go /optRUN go build /opt/main.goCMD "./main"# create real app imageFROM alpine:3.8COPY --from=builder /opt/main /CMD "./opt/main"

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t hello:alpine .

查看鏡像

[root@k8s-master01 dockerfiles]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello alpine 66fa14e35f3c 9 minutes ago 6.48MB

鏡像大小和前面的差別不大,我們只是將第一個步驟打包成鏡像,然後把它裡面的文件複製到現在的鏡像裡面

php Dockerfile

[root@k8s-master01 dockerfiles]# mv Dockerfile goDockerfile[root@k8s-master01 dockerfiles]# vim Dockerfile# 修改為以下內容FROM php:7.1.22-fpm-alpineRUN apk add --no-cache binutils freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev libc6-compat libxml2 libxml2-dev libmcrypt libmcrypt-dev libc-dev icu-dev gettext-dev openssl-dev bzip2-devRUN docker-php-ext-install pdo pdo_mysql mcrypt zip gd pcntl opcache bcmath#RUN docker-php-ext-install gettextRUN docker-php-ext-install mysqli#RUN apk add --no-cache php7-sysvsem php7-pdo_dblib php7-sockets php-soap php7-xmlrpc##RUN apk add --no-cache php7-sysvsem php7-pdo_dblib php7-sockets php-soap php7-xmlrpc##RUN apk add --no-cache freetds-dev##RUN docker-php-ext-install pdo_dblib#RUN docker-php-ext-install soap#RUN docker-php-ext-install sockets#RUN docker-php-ext-install sysvsem#RUN docker-php-ext-install xmlrpc#RUN apk add --no-cache freetds-dev#RUN docker-php-ext-install pdo_dblib#RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/#RUN docker-php-ext-install -j$(nproc) gd#FROM php:7.1.22-fpm-alpine#COPY --from=0 /usr/local/lib/php/extensions/no-debug-non-zts-20160303 /usr/local/lib/php/extensions/no-debug-non-zts-20160303#RUN apk add --no-cache freetds-dev php7-sysvsem php7-pdo_dblib php7-sockets php-soap php7-xmlrpc binutils freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev libc6-compat libxml2 libxml2-dev libmcrypt libmcrypt-dev libc-dev icu-dev gettext-dev openssl-dev bzip2-dev && cd /usr/local/lib/php/extensions/no-debug-non-zts-20160303 && docker-php-ext-enable *.so && rm -rf /var/cache/apk/*

第一步是選擇基礎鏡像php:7.1.22-fpm-alpine第二步是根據基礎鏡像安裝依賴環境,php的一堆擴展包

多階段的就是編譯在一個鏡像裡面完成,第二個鏡像使用第一個鏡像編譯的產物,省去了編譯產生的緩存

Scratch空鏡像

Scratch空鏡像不可拉取,但是可以直接使用

使用scratch

[root@k8s-master01 dockerfiles]# cp Dockerfile t/phpDockerfile[root@k8s-master01 dockerfiles]# cp goDockerfile Dockerfilecp: overwrite 『Dockerfile』? y[root@k8s-master01 dockerfiles]# vim Dockerfile # 修改為以下內容# build stepFROM golang:1.14.4-alpine as builderWORKDIR /optCOPY main.go /optRUN go build /opt/main.goCMD "./main"# create real app imageFROM scratchCOPY --from=builder /opt/main /CMD "./main"

構建鏡像

[root@k8s-master01 dockerfiles]# docker build -t hello:scratch .

查看鏡像

[root@k8s-master01 dockerfiles]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello scratch 4d747be3b21b About a minute ago 2.07MB

啟動容器

[root@k8s-master01 dockerfiles]# docker run -ti --rm hello:scratch /mainHello World

基於最基礎的鏡像,製作依賴環境的鏡像可以使用,但是建議使用官方製作好的鏡像

如果Dockerfile中引用的鏡像發生了更新,需要使用pull參數

課程連結

http://www.kubeasy.com/

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了