日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker安装与镜像,容器命令管理

發(fā)布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker安装与镜像,容器命令管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

docker和容器的關(guān)系

-Docker是完整的一套容器管理系統(tǒng)

-Docker提供了一組命令, 讓用戶更加方便直接地使用容器技 術(shù),而不需要過多關(guān)心底層內(nèi)核技術(shù)

一.Docker的安裝

1.配置環(huán)境變量

-需要64位操作系統(tǒng)

-至少RHEL6.5以上的版本,強烈推薦RHEL7(主要是因為內(nèi)核限制,3.1以上即可)

-關(guān)閉防火墻(不是必須的)

2.docker的安裝

1)安裝前檢查

# 檢查內(nèi)核與linux版本 ~]# hostnamectlStatic hostname: VM-0-51-centosIcon name: computer-vmChassis: vmMachine ID: 35b12e3f2e994abebdafc2f42fe653dfBoot ID: 816a7c7dd74a48b69fc74b0330106201Virtualization: kvmOperating System: CentOS Linux 7 (Core)CPE OS Name: cpe:/o:centos:centos:7Kernel: Linux 3.10.0-1127.19.1.el7.x86_64Architecture: x86-64 ? # 開啟路由轉(zhuǎn)發(fā) ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 ~]# sysctl -p ? ## 運用阿里的yum源安裝 # 下載yum配置 ~]#wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 刷新并安裝 ~]# yum clean all && yum repolist && yum makecache

注:因為容器里有一塊網(wǎng)卡docker0,如果eth0不設(shè)置路由轉(zhuǎn)發(fā)的話,他們之間也就無法轉(zhuǎn)發(fā)通信

2)安裝Docker

# 查看最新版本并安裝 ~]# yum list docker-ce --showduplicates | sort -r ~]# yum install -y docker-ce ? # 安裝成功后,使用docker version命令查看是否安裝成功,安裝成功后------如下 ~]# docker version Client:Version: ? ? ?17.05.0-ceAPI version: ?1.29Go version: ? go1.7.5Git commit: ? 89658beBuilt: ? ? ? Thu May ?4 22:06:25 2017OS/Arch: ? ? linux/amd64 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

或則下載安裝包安裝

安裝包官方地址:Index of linux/static/stable/x86_64/

## 可以先下載到本地,然后通過ftp工具上傳到服務(wù)器上,或者在服務(wù)器上使用命令下載 ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz# 解壓 ~]# tar -zxvf docker-18.06.3-ce.tgz# 將解壓出來的docker文件復(fù)制到?/usr/bin/ 目錄下 ~]# cp docker/* /usr/bin/# 在/etc/systemd/system/目錄下新增docker.service文件,內(nèi)容如下,這樣可以將docker注冊為service服務(wù) ~]# vim /etc/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target[Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1 ExecReload=/bin/kill -s HUP $MAINPID # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity # Uncomment TasksMax if your systemd version supports it. # Only systemd 226 and above support this version. #TasksMax=infinity TimeoutStartSec=0 # set delegate yes so that systemd does not reset the cgroups of docker containers Delegate=yes # kill only the docker process, not all processes in the cgroup KillMode=process # restart the docker process if it exits prematurely Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s[Install] WantedBy=multi-user.target# 此處的--insecure-registry=127.0.0.1(此處改成你私服ip)設(shè)置是針對有搭建了自己私服Harbor時允許docker進行不安全的訪問,否則訪問將會被拒絕。## 啟動docker # 給docker.service文件添加執(zhí)行權(quán)限 ~]# chmod +x /etc/systemd/system/docker.service # 重新加載配置文件(每次有修改docker.service文件時都要重新加載下) ~]# systemctl daemon-reload ?

3)啟動容器

~]# systemctl start docker.service ? # 驗證安裝是否成功(有client和service兩部分表示docker安裝啟動都成功了) ~]# docker version Client: Docker Engine - CommunityVersion: ? ? ? ? ? 18.09.9API version: ? ? ? 1.39Go version: ? ? ? go1.11.13Git commit: ? ? ? 039a7df9baBuilt: ? ? ? ? ? ? Wed Sep ?4 16:50:02 2019OS/Arch: ? ? ? ? ? linux/amd64Experimental: ? ? ?false ? Server: Docker Engine - CommunityEngine:Version: ? ? ? ? ?18.09.9API version: ? ? ?1.39 (minimum version 1.12)Go version: ? ? ? go1.11.13Git commit: ? ? ? 039a7df9baBuilt: ? ? ? ? ? Wed Sep ?4 16:55:50 2019OS/Arch: ? ? ? ? linux/amd64Experimental: ? ? false ? # 設(shè)置開機自啟動 ~]# systemctl enable docker

二.鏡像與容器

Docker的三大核心概念:鏡像、容器、倉庫

1.鏡像

1)鏡像的概述

類似虛擬機的鏡像、用俗話說就是安裝文件。

\- 鏡像是啟動容器的核心

- 在Docker中容器是基于鏡像啟動的

- 鏡像采用分層設(shè)計

-使用COW技術(shù)(寫實復(fù)制,最多只能是255層)

寫實復(fù)制:

Copy-On-Write簡稱COW,是一種用于程序設(shè)計中的優(yōu)化策略。其基本思路是,從一開始大家都在共享同一個內(nèi)容,當(dāng)某個人想要修改這個內(nèi)容的時候,才會真正把內(nèi)容Copy出去形成一個新的內(nèi)容然后再改,這是一種延時懶惰策略

什么是CopyOnWrite容器:

CopyOnWrite容器即寫時復(fù)制的容器。通俗的理解是當(dāng)我們往一個容器添加元素的時候,不直接往當(dāng)前容器添加,而是先將當(dāng)前容器進行Copy,復(fù)制出一個新的容器,然后新的容器里添加元素,添加完元素之后,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行并發(fā)的讀,而不需要加鎖,因為當(dāng)前容器不會添加任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器

注:所以說容器是基于鏡像的讀寫層創(chuàng)建的

2)獲取鏡像

-官方倉庫下載或自己制作

-官方倉庫

Docker Hub

# 如果下不了國外的鏡像也可以設(shè)置國內(nèi)的(daemon.json文件需自己創(chuàng)建) ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://registry.docker-cn.com", "http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]} ~]# systemctl restart docker.service # 重啟生效

3)鏡像的管理命令

命令作用概述
docker images查看鏡像
docker search 關(guān)鍵字查找鏡像默認(rèn)查看國外的
docker pull 鏡像名稱下載鏡像
docker push 鏡像名稱:鏡像標(biāo)簽 倉庫地址
docker save 鏡像名稱:鏡像標(biāo)簽 -o 文件名(tar 格式)備份鏡像(導(dǎo)出鏡像)
docker load -i 備份文件名稱(.tar)恢復(fù)鏡像(導(dǎo)入鏡像)
docker inspect 鏡像名稱:鏡像標(biāo)簽查看鏡像詳細(xì)信息
docker history 鏡像名稱:鏡像標(biāo)簽查看鏡像的層(制作歷史)
docker tag 鏡像名稱:鏡像標(biāo)簽 (舊的) 鏡像名稱:鏡像標(biāo)簽(新得)給鏡像添加新的名稱和標(biāo)簽
docker rmi 鏡像名稱:鏡像標(biāo)簽刪除鏡像要先停止容器

4)示例

# 查找鏡像(默認(rèn)從官網(wǎng)找) ~]# docker search centos NAME ? ? ? DESCRIPTION ? ? ? ? ? ? ? ? STARS ? ? ? ? ? ? ? OFFICIAL ? ? ? ? ? AUTOMATED centos ? The official build of CentOS. ? 6963 ? ? ? ? ? ? ? [OK] ? ? ? ? ? ? ? ? ansible/centos7-ansible Ansible on Centos7 ? ? ? ? ?135 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [OK] consol/centos-xfce-vnc ? ? ? ? ? Centos container with "headless" VNC session… ? 132 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [OK] # 下載鏡像 ~]# docker pull centos ..... Status: Downloaded newer image for centos:latest ? # 上傳鏡像 ~]# docker push centos:latest 倉庫地址 NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED
鏡像的名字鏡像的簡單描述鏡像被點贊的次數(shù)代表是否是由官方提供的
## 備份鏡像 # 用標(biāo)簽 ~]# docker save centos:latest -o centos.tar # 用ID ~]# docker save 5d0da3dc9764 -o centos.tar ? ## 恢復(fù)鏡像(導(dǎo)入) ~]# docker load -i centos.tar ## 查看鏡像 ~]# docker iamges REPOSITORY ? ? TAG ? ? ? ? IMAGE ID ? ? ? ? ? CREATED ? ? ? ? ? ? SIZE centos ? ? ? ? latest ? ? ? 5d0da3dc9764 ? ? ? ?3 months ago ? ? ? 231MB REPOSITORYTAGIMAGE IDCREATEDSIZE
鏡像名稱鏡像標(biāo)簽鏡像ID鏡像的創(chuàng)建時間鏡像的大小
## 查看鏡像詳細(xì)信息 # 用標(biāo)簽 ~]# docker inspect centos:latest # 用ID ~]# docker inspect 5d0da3dc9764 ..... # 容器內(nèi)的配置信息 "Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" # 代表用該鏡像啟動容器的環(huán)境變量],"Cmd": ["/bin/bash" # 默認(rèn)的啟動命令],"Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}}, ...... ## 查看鏡像的層 ~]# docker history centos:latest IMAGE CREATED CREATED BY SIZE COMMENT 5d0da3dc9764 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB # 更改新的名稱和標(biāo)簽 ~]# docker tag centos:latest centos:myos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 3 months ago 231MB centos myos 5d0da3dc9764 3 months ago 231MB ## 刪除鏡像 # 直接刪除 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 3 months ago 231MB ~]# docker rmi centos 或 docker rmi centos:myos Untagged: centos:latest # 如果如器是啟動狀態(tài)則要先停止容器 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e4921f57189 centos:myos "/bin/bash" 38 seconds ago Up 2 seconds ... heuristic_benz ~]# docker stop 7e4921f57189 ~]# docker rmi centos:myos # 強制刪除(容器的不需要停止,但一些數(shù)據(jù)會刪除,比如數(shù)據(jù)庫容器會損壞表等) ~]# docker rmi -f centos Untagged: centos:latest

5)鏡像的名稱和標(biāo)簽的概述

  • 每一個鏡像都對應(yīng)唯一的鏡像 id

  • 鏡像名稱(文件名稱)+標(biāo)簽 (路徑) ==唯一

  • 每一個鏡像都有標(biāo)簽,如果沒寫就是默認(rèn)標(biāo)簽 latest

  • 我們在調(diào)用鏡像的時候,如果沒有指定標(biāo)簽也是 latest

2.容器

類似一個輕量級的沙箱,容器是從鏡像創(chuàng)建應(yīng)用運行實例,

可以將其啟動、開始、停止、刪除、而這些容器都是相互隔離、互不可見的。

1)容器的管理命令

容器的管理命令說明
docker run -it(d) 鏡像名稱:標(biāo)簽 啟動命令創(chuàng)建啟動并進入容器,后臺容器使用參數(shù)d
docker ps查看容器-a所有容器,包含未啟動的,-q只顯示id
docker rm 容器ID-f強制刪除,支持命令重入
docker start|stop|restart 容器id啟動、停止、重啟容器
docker cp 本機文件路徑 容器id:容器內(nèi)路徑把本機文件拷貝到容器(上傳)
docker cp 容器id:容器內(nèi)路徑 本機文件路徑從容器內(nèi)拷貝文件到宿主機(下載)
docker inspect 容器ID查看容器詳細(xì)信息
docker attach 容器id進入容器默認(rèn)進程,推出后關(guān)閉默認(rèn)進程(變相關(guān)閉容器)
docker attach 容器id{ctr+p,ctl+q}進入容器以后,退出容器而不關(guān)閉的方法
docker exec -it 容器id 啟動命令進入容器新的進程,推出后容器不會關(guān)閉

2)docker run命令參數(shù)

docker run 命令

-docker run -參數(shù) 鏡像名稱:鏡像標(biāo)簽 啟動命令

查看 run的參數(shù)

-docker help run

run = 創(chuàng)建+啟動+進入

  • 參數(shù) -i,交互式

- 參數(shù) -t,終端

- 參數(shù) -d,后臺運行

- 參數(shù) --name 容器名字

示例

# 啟動centos 容器,并進入容器 ~]# docker run -it centos:latest /bin/bash ~]# exit #退出后容器自動關(guān)閉(使用ctrl+p,Ctrl+q # 使用快捷鍵退出,保證容器不關(guān)閉) ## 啟動命令 # 但不知道啟動命令時則不寫(不寫則用默認(rèn)的) ~]# docker run -it centos # 當(dāng)寫了啟動命令時就不會執(zhí)行默認(rèn)的, # 默認(rèn)的用處比如應(yīng)用程序容器nginx,apache等 ~]# docker run -it nginx:latest #此時是不可以交互的,直接退出會關(guān)閉容器(可以使用快捷鍵退出,放入后臺),但此時多次一舉不如直接放入后臺 ~]# docker run -itd nginx:latest ~]# ps -ef ..... root 25795 12099 0 16:42 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/753ff4121bdac92221be

3)示例

## 查看容器 # 查看啟動的容器 ~]# docker ps# 查看所有容器,包含未啟動的 ~]# docker ps -a# 只查看啟動容器的id ~]# docker ps -q # 查看所有容器的id ~]# docker ps -aq ## 刪除容器 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 753ff4121bda centos "/bin/bash" 45 minutes ago Up 45 minutes vigilant_payne # 正常刪除 ~]# docker rm 753ff4121bda# 當(dāng)容器還是啟動時則不能正常刪除,需停止容器再刪除 ~]# docker stop 753ff4121bda ~]# docker rm 753ff4121bda# 強制刪除(會損壞數(shù)據(jù),如運行時的數(shù)據(jù)庫,會損壞表庫等) ~]# docker rm -f 753ff4121bda# 刪除所有容器 ~]# docker rm $(docker stop $(docker ps -aq)) ## 啟動、停止、重啟容器 # 格式 docker start|stop|restart 容器ID|容器名字 ~]# docker start 753ff4121bda|vigilant_payne ~]# docker stop 753ff4121bda|vigilant_payne ~]# docker restart 753ff4121bda|vigilant_payne ## 查看容器詳細(xì)信息 # 格式 ~]# docker inspect 容器ID|容器名字 ~]# docker inspect vigilant_payne [ ........ "NetworkSettings": {"Bridge": "","SandboxID": "4640bfda49bca0c2fe676cd805150bed1521a8da84f0968f7184ecb9864f1c19","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/4640bfda49bc","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "cf4686443b5ccfe73609cdcb6ff3381f944fe84bf9bb96cb02aedbec11881381","Gateway": "172.18.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.18.0.5","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:12:00:05","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "a98aa42f05e6d61e49409a1411c93dc65db871eec3c0518acab20d42e938a858","EndpointID": "cf4686443b5ccfe73609cdcb6ff3381f944fe84bf9bb96cb02aedbec11881381","Gateway": "172.18.0.1","IPAddress": "172.18.0.5","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:12:00:05","DriverOpts": null}}}} ] # 注:有用的信息如上,網(wǎng)絡(luò)配置只有啟動容器才有 ## 從容器內(nèi)拷貝首頁文件到宿主機,修改后拷貝回容器內(nèi)# 下載格式 ~]# docker cp 容器ID:容器路徑 本機文件路徑 ~]# docker cp 9cae0af944d8:/usr/share/nginx/html/index.html ./index.html ~]# vim index.html Hello Tedu Hello Tedu Hello Tedu# 上傳格式 ~]# docker cp 本機文件路徑 容器id:容器內(nèi)路徑 ~]# docker cp ./index.html 9cae0af944d8:/usr/share/nginx/html/index.html # 測試 剛剛的詳細(xì)信息可查看IP地址 ~]# curl http://172.18.0.5/ ## 啟動容器 # 使用 attach啟動(可以不帶啟動命令) ~]# docker attach 753ff4121bda #注:推出后容器會關(guān)閉(解決翻案快捷鍵ctl+p,ctl+q),只能進入有交互式的容器,入nginx的應(yīng)用服務(wù)則不會動 /]# ctl+p,ctl+q >> read escape sequence# 使用exec(必須帶啟動命令) ~]# docker exec -it 753ff4121bda /bin/bash # 退出后不會關(guān)閉容器,可以進入任意容器#注:attach連接的是容器的啟動進程(主要用于排錯)而exec進入的則是新進程(主要用于維護管理) ~]# docker attach 753ff4121bda # 此時啥也沒有~]# curl http://172.18.0.5/haha.html curl: (7) Failed connect to 172.18.0.5:80; Connection refused # 此時容器內(nèi)就會報錯

三.容器的進程管理

1.上帝進程的概述

簡單的說就是系統(tǒng)創(chuàng)建之初產(chǎn)生的第一個進程

特點:

-沒有父進程

-PID==1

-所有進程都是他的子進程,孫子進程,曾孫,玄孫進程

-上帝進程死亡系統(tǒng)實例也就不存在

2.上帝進程與容器的關(guān)系

容器的啟動進程就是上帝進程,他的pid==1

上帝進程退出==容器關(guān)閉

如何保證容器不關(guān)閉?

-容器的啟動進程不能被關(guān)閉

-容器的啟動進程必須在前臺運行

前臺服務(wù)與后臺服務(wù)

容器的啟動進程在后臺運行不等于容器在后臺運行

容器的啟動服務(wù)

-前臺服務(wù)(-it)

????????一般能與用戶交互的程序,比如/bin/bash /bin/sh

-后臺服務(wù)(-itd)

????????一般是一個程序的服務(wù),比如apache、nginx、redis等

示例

# 查看該容器的啟動進程 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 09:35 pts/0 00:00:00 /bin/bash # 查看當(dāng)前進程 /]# echo $$ 1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 753ff4121bda centos "/bin/bash" 3 hours ago Exited (0) 2 seconds ago vigilant_payne

3.僵尸進程與孤兒進程的基本概念

我們知道在unix/linux中,正常情況下,子進程是通過父進程創(chuàng)建的,子進程在創(chuàng)建新的進程。子進程的結(jié)束和父進程的運行是一個異步過程,即父進程永遠無法預(yù)測子進程 到底什么時候結(jié)束。 當(dāng)一個 進程完成它的工作終止之后,它的父進程需要調(diào)用wait()或者waitpid()系統(tǒng)調(diào)用取得子進程的終止?fàn)顟B(tài)。

孤兒進程:

一個父進程退出,而它的一個或多個子進程還在運行,那么那些子進程將成為孤兒進程。孤兒進程將被init進程(進程號為1)所收養(yǎng),并由init進程對它們完成狀態(tài)收集工作?! ?/p>

僵尸進程:

一個進程使用fork創(chuàng)建子進程,如果子進程退出,而父進程并沒有調(diào)用wait或waitpid獲取子進程的狀態(tài)信息,那么子進程的進程描述符仍然保存在系統(tǒng)中。這種進程稱之為僵死進程。

問題及危害

  unix提供了一種機制可以保證只要父進程想知道子進程結(jié)束時的狀態(tài)信息, 就可以得到。這種機制就是: 在每個進程退出的時候,內(nèi)核釋放該進程所有的資源,包括打開的文件,占用的內(nèi)存等。 但是仍然為其保留一定的信息(包括進程號the process ID,退出狀態(tài)the termination status of the process,運行時間the amount of CPU time taken by the process等)。直到父進程通過wait / waitpid來取時才釋放。 但這樣就導(dǎo)致了問題,如果進程不調(diào)用wait / waitpid的話, 那么保留的那段信息就不會釋放,其進程號就會一直被占用,但是系統(tǒng)所能使用的進程號是有限的,如果大量的產(chǎn)生僵死進程,將因為沒有可用的進程號而導(dǎo)致系統(tǒng)不能產(chǎn)生新的進程. 此即為僵尸進程的危害,應(yīng)當(dāng)避免。

孤兒進程是沒有父進程的進程,孤兒進程這個重任就落到了init進程身上,init進程就好像是一個民政局,專門負(fù)責(zé)處理孤兒進程的善后工作。每當(dāng)出現(xiàn)一個孤兒進程的時候,內(nèi)核就把孤 兒進程的父進程設(shè)置為init,而init進程會循環(huán)地wait()它的已經(jīng)退出的子進程。這樣,當(dāng)一個孤兒進程凄涼地結(jié)束了其生命周期的時候,init進程就會代表黨和政府出面處理它的一切善后工作。因此孤兒進程并不會有什么危害。

任何一個子進程(init除外)在exit()之后,并非馬上就消失掉,而是留下一個稱為僵尸進程(Zombie)的數(shù)據(jù)結(jié)構(gòu),等待父進程處理。這是每個 子進程在結(jié)束時都要經(jīng)過的階段。如果子進程在exit()之后,父進程沒有來得及處理,這時用ps命令就能看到子進程的狀態(tài)是“Z”。如果父進程能及時 處理,可能用ps命令就來不及看到子進程的僵尸狀態(tài),但這并不等于子進程不經(jīng)過僵尸狀態(tài)。 如果父進程在子進程結(jié)束之前退出,則子進程將由init接管。init將會以父進程的身份對僵尸狀態(tài)的子進程進行處理。

僵尸進程危害場景:

  例如有個進程,它定期的產(chǎn) 生一個子進程,這個子進程需要做的事情很少,做完它該做的事情之后就退出了,因此這個子進程的生命周期很短,但是,父進程只管生成新的子進程,至于子進程 退出之后的事情,則一概不聞不問,這樣,系統(tǒng)運行上一段時間之后,系統(tǒng)中就會存在很多的僵死進程,倘若用ps命令查看的話,就會看到很多狀態(tài)為Z的進程。 嚴(yán)格地來說,僵死進程并不是問題的根源,罪魁禍?zhǔn)资钱a(chǎn)生出大量僵死進程的那個父進程。因此,當(dāng)我們尋求如何消滅系統(tǒng)中大量的僵死進程時,答案就是把產(chǎn)生大 量僵死進程的那個元兇槍斃掉(也就是通過kill發(fā)送SIGTERM或者SIGKILL信號啦)。槍斃了元兇進程之后,它產(chǎn)生的僵死進程就變成了孤兒進 程,這些孤兒進程會被init進程接管,init進程會wait()這些孤兒進程,釋放它們占用的系統(tǒng)進程表中的資源,這樣,這些已經(jīng)僵死的孤兒進程 就能瞑目而去了。

4.服務(wù)在前臺運行實驗

1)容器內(nèi)安裝apache服務(wù)

# 刪除所有容器(防止影響測試) ~]# docker rm -f $(docker ps -aq) # 啟動一個容器 ~]# docker run -it --name myapache centos:latest # 搭建yum倉庫,由于容器是與宿主機共享資源的,直接可以用宿主機的配置 /]# cd /etc/yum.repos.d/ && rm -rf *.repo # --------------不要退出這個終端,在另一個終端拷貝 yum 配置文件到容器-------------------- ~]# cp /etc/yum.repos.d/CentOS-Base.repo myapache:/etc/yum.repos.d/ #------------------------回到創(chuàng)建容器的終端繼續(xù)執(zhí)行命令--------------------- # 安裝軟件 /]# yum install -y net-tools httpd # 寫一個默認(rèn)網(wǎng)頁 /]# echo Hello world >/var/www/html/index.html## 由于容器內(nèi)么有systemd進程所以只能用手動啟動啟動 /]# ps -ef #可以看出沒有systemd進程 UID PID PPID C STIME TTY TIME CMD root 1 0 0 09:35 pts/0 00:00:00 /bin/bash root 31 1 0 11:11 pts/0 00:00:00 ps -ef # 查看服務(wù)的啟動參數(shù) ~]# cat /usr/lib/systemd/system/httpd.service ..... ExecStart=/usr/sbin/httpd -D $OPTIONS -DFOREGROUND ....... # 可以發(fā)現(xiàn)有一個環(huán)境變量,此時查看 ~]# cat /etc/sysconfig/httpd ...... #OPTIONS= .... LANG=C .... # 配置環(huán)境變量 /]# export LANG=C # 查看網(wǎng)卡ip /]# ifconfig ..... ...172.17.0.2... ..... # 手動啟動 /]# /usr/sbin/httpd -DFOREGROUND # 此時會發(fā)現(xiàn)會占用此終端(ctl+p,ctl+q) # 訪問測試 ~]# curl http://172.17.0.2/ Hello world

總結(jié)

管理鏡像使用 名稱:標(biāo)簽

管理容器使用 **容器ID

總結(jié)

以上是生活随笔為你收集整理的Docker安装与镜像,容器命令管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。