1 介紹
容器就是在隔離的環(huán)境運(yùn)行的一個進(jìn)程,如果進(jìn)程停止,容器就會銷毀。隔離的環(huán)境擁有自己的系統(tǒng)文件、IP地址、主機(jī)名等。
容器共用宿主機(jī)內(nèi)核,不需要指令級模擬。
1.1 docker工作流程

1.2 docker核心技術(shù)
1.2.1 Namespace
實(shí)現(xiàn)Container的進(jìn)程、網(wǎng)絡(luò)、消息、文件系統(tǒng)和主機(jī)名隔離。目前l(fā)inux內(nèi)核實(shí)現(xiàn)的namespace主要有:
- Mount namespace(CLONE_NEWNS):系統(tǒng)掛載點(diǎn)
- UTS namespace (CLONE_NEWUTS):Hostname等信息
- IPC namespace(CLONE_NEWIPC):進(jìn)程間通訊
- PID namespace(CLONE_NEWPID):進(jìn)程號
- Network namespace(CLONE_NEWNET):網(wǎng)絡(luò)相關(guān)資源
- User namespace(CLONE_NEWUSER):用戶ID
1.2.2 Cgroup
實(shí)現(xiàn)對資源(cpu個數(shù)、內(nèi)存大小等)的配額和度量
1.3 docker特性
- 文件系統(tǒng)隔離:每個容器運(yùn)行在完全獨(dú)立的根文件系統(tǒng)里
- 資源隔離:系統(tǒng)資源,像CPU和內(nèi)存可以分配到不同的容器中,使用cgroup
- 網(wǎng)絡(luò)隔離:每個進(jìn)程容器運(yùn)行在自己的網(wǎng)絡(luò)空間,虛擬接口和IP地址
- 日志記錄:Docker收集和記錄每個進(jìn)程容器的標(biāo)準(zhǔn)流(stdout/stdin/stderr),用于實(shí)時檢索或批量檢索
- 變更管理:容器文件系統(tǒng)的變更可以提交到新的鏡像中,并可重復(fù)使用以創(chuàng)建更多的container,無需使用模版或手動配置。
- 交互式shell:Docker可以分配一個虛擬終端并關(guān)聯(lián)到任何容器的標(biāo)準(zhǔn)輸入上,例如運(yùn)行一個一次性交互shell
1.4 container運(yùn)行條件
docker容器內(nèi)的第一個進(jìn)程(初始命令)必須一直處于前臺運(yùn)行的狀態(tài),否則這個容器就會處于退出狀態(tài)。
業(yè)務(wù)在容器中運(yùn)行:夯住,啟動服務(wù)
1.5 container運(yùn)行時覆蓋3個文件
容器運(yùn)行時,會覆蓋/etc/hostname、/etc/hosts、/etc/resolve.conf這3個文件。使容器有自己的主機(jī)名、hosts解析、dns服務(wù)器
2 安裝
2.1 安裝環(huán)境依賴
yum -y install yum-utils device-mapper-persistent-data lvm2
2.2 安裝yum源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.3 yum安裝
yum install -y docker-ce docker-ce-cli containerd.io
2.4 啟動docker
systemctl start docker
systemctl enable docker
2.5 鏡像加速
鏡像可以添加多個,中間用,分隔
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://阿里云頁面查看.mirror.aliyuncs.com","http://hub-mirror.c.163.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.6 默認(rèn)root目錄
/var/lib/docker
2.7 開啟路由轉(zhuǎn)發(fā)功能
yum安裝后默認(rèn)會開啟,確認(rèn)方式
cat /proc/sys/net/ipv4/ip_forward
1
手動開啟方法
vim /etc/sysctl.conf
...
net.ipv4.ip_forward = 1
sysctl -p
2.9 關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld
2.10 重啟docker
重啟docker,調(diào)用內(nèi)核模塊netfilter增加規(guī)則
systemctl restart docker
2.11(可選)重啟docker容器不會停止
修改配置文件/etc/docker/daemon.json,一般不建議配置
{
"registry-mirrors": ["..."],
"live-restore": true
}
sudo systemctl daemon-reload
sudo systemctl restart docker
3 基本命令
3.1 docker info
docker info查看基本信息:
- 默認(rèn)工作目錄:/var/lib/docker
- 默認(rèn)請求的鏡像倉庫:https://index.docker.io/v1/
- 自己配置的鏡像倉庫:Registry Mirrors部分
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.7
Storage Driver: overlay2
Backing Filesystem: xfs
Docker Root Dir: /var/lib/docker #默認(rèn)工作目錄
Debug Mode: false
Registry: https://index.docker.io/v1/ #默認(rèn)請求的鏡像倉庫
Registry Mirrors: #鏡像倉庫
https://bigsky000.mirror.aliyuncs.com/
3.2 docker search
docker search [OPTIONS] image 搜索鏡像
[root@centos7-wht ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6638 [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 89
#NAME:鏡像名字,/前是項(xiàng)目名,/后是鏡像名
#OFFICIAL:是否 docker 官方發(fā)布
#STARS:表示點(diǎn)贊、喜歡的意思
#AUTOMATED:自動構(gòu)建
3.3 docker pull
docker pull [OPTIONS] NAME[:TAG|@DIGEST] 拉取鏡像
docker pull centos #從默認(rèn)倉庫中下載鏡像
docker pull hub.c.163.com/library/tomcat:latest #直接下載其他站點(diǎn)的鏡像
3.4 docker load
dokcer load -i image位置 導(dǎo)入已經(jīng)下載好的docker鏡像
3.5 docker images/docker image
3.5.1 docker images
查看現(xiàn)有鏡像
[root@centos7-wht ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 69593048aa3a 7 weeks ago 1.24MB
127.0.0.1:5000/busybox v1 69593048aa3a 7 weeks ago 1.24MB
registry latest 1fd8e1b0bb7e 3 months ago 26.2MB
centos centos7 8652b9f0cb4c 8 months ago 204MB
127.0.0.1:5000/busybox,這類的鏡像名表示鏡像來自127.0.0.1:5000倉庫,而非docker-hub官方庫
3.5.2 docker image
鏡像相關(guān)操作
Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
例子:
將registry鏡像打包成registry.tar文件
docker image save -o registry.tar registry
載入tar格式的registry.tar鏡像
docker image load -i registry.tar
3.6 docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 運(yùn)行一個container
OPTIONS 常用參數(shù):
通常-i和-t配合使用
-i 以交互模式運(yùn)行
-t 為容器分配一個偽輸入終端
-d 后臺運(yùn)行容器,并返回容器ID
-c 接在bash COMMAND后,為container中bash運(yùn)行的命令
-c --cpu-shares 后面接數(shù)字,限制容器的cpu權(quán)重,默認(rèn)權(quán)重是1024
-m --memory 單位b, k, m, or g,限制容器的內(nèi)存使用量
-p 將host端口映射給container端口,默認(rèn)是tcp端口,要映射多個端口寫多個-p
eg:ip:[hostPort]:containerPort | hostPort:containerPort | hostPort:containerPort:udp
-P 隨機(jī)將一個host端口映射給container
--name 后面接container名字
-h 后面接container的主機(jī)名
--restart always:在容器退出時總是重啟容器,容器會伴隨docker啟動
no:默認(rèn)策略,容器退出時不重啟
on-failure:在容器非正常退出時(退出狀態(tài)非0),才會重啟
on-failure:3:在容器非正常退出時(退出狀態(tài)非0),最多重啟3次
unless-stopped:在容器退出時總是重啟容器,但是不考慮在Docker守護(hù)進(jìn)程啟動時就已經(jīng)停止了的容器
-v HOST-DIR:CONTAINER-DIR[:權(quán)限] 將容器內(nèi)部的目錄mount到host的目錄下,權(quán)限是rw、ro等以逗號分隔,要mount多個目錄寫多個-v參數(shù)
volume:CONTAINER-DIR,容器在/var/lib/docker/volumes目錄下創(chuàng)建數(shù)據(jù)卷,刪除容器后數(shù)據(jù)卷不消失
--mount 默認(rèn):source=volume名字,destination=CONTAINER-DIR。默認(rèn)情況下用來掛載volume,但也可以用來創(chuàng)建bind mount和tmpfs。
bind mount:type=bind,source=HOST-DIR,destination=CONTAINER-DIR,source必須是絕對路徑,且路徑必須已經(jīng)存在。
--volumes-from 掛載已有的數(shù)據(jù)卷
-e 設(shè)置container內(nèi)部的環(huán)境變量,eg: -e "SSH_PWD=123",SSH_PWD為容器內(nèi)部定義的變量
--privileged Docker將啟用對宿主機(jī)上所有設(shè)備的訪問,允許容器對宿主機(jī)的訪問幾乎與在宿主機(jī)上容器外部運(yùn)行的進(jìn)程相同,可以直接掛載宿主機(jī)的磁盤
--rm 容器命令運(yùn)行結(jié)束后,自動刪除容器,自動釋放資源
--device onhost:incontainer[:mode],將host的設(shè)備映射給container,/dev/sdc:/dev/xvdc:rwm
--device-write-bps 單位kb、mb、gb,限制容器寫IO速度
--device-read-bps 單位kb、mb、gb,限制容器讀IO速度
--ip 設(shè)置容器的IPv4地址
--network 設(shè)置容器連接的網(wǎng)絡(luò),默認(rèn)是docker0
例子:
以交互模式運(yùn)行centos,并運(yùn)行container中的bash
docker run -it centos:latest bash
后臺運(yùn)行container,每隔10s不斷輸出hello world
docker run -d centos:latest bash -c "while true;do echo hello world;sleep 10;done"
3.7 docker ps
docker ps列出正在運(yùn)行的容器狀態(tài)

docker ps -a列出所有容器的狀態(tài),包括沉睡/退出狀態(tài)的容器
docker ps -q 只顯示容器的CONTAINER IDdocker ps -l 只顯示最后創(chuàng)建的容器信息docker ps --no-trunc 不縮略,顯示容器的全部信息
3.8 docker logs
docker logs 容器ID/名字從容器中取日志,檢查docker的標(biāo)準(zhǔn)輸出。
docker logs 4336a96cc275
hello world
hello world
hello world
3.9 docker kill
docker kill 容器ID/名字殺死一個container實(shí)例
3.10 docker rename
docker rename 舊容器名 新容器名 更改容器名
3.11 docker update
docker update 參數(shù) 容器ID/名字 更新容器參數(shù),只能更新cpu、內(nèi)存、io、pid策略、重啟策略
docker update --restart always centos
3.12 docker exec
docker exec [OPTIONS] CONTAINER COMMAND [ARG...] 進(jìn)入創(chuàng)建一個偽終端,類似于ssh,不會因?yàn)檩斎雃xit而終止容器
OPTIONS 常用參數(shù):
通常-i和-t配合使用
-i 以交互模式執(zhí)行
-t 為容器分配一個偽輸入終端
-d 后臺執(zhí)行
例子:
以交互模式在container中運(yùn)行bash
docker exec -it centos bash
3.13 docker attach
會通過連接stdin,連接到容器內(nèi)輸入輸出流,會在輸入exit后終止進(jìn)程。會進(jìn)入第1個偽終端。
3.14 臨時回到host主機(jī)
ctrl+p,ctrl+q 臨時回到host主機(jī)
docker attach ...再次回到docker偽終端
3.15 docker rm
docker rm [OPTIONS] CONTAINER [CONTAINER...]刪除已經(jīng)建立的容器
刪除建立的所有容器
docker rm -f `docker ps -a -q`
3.16 docker inspect
docker inspect [OPTIONS] 容器NAME|容器ID [NAME|ID...] 查看容器的祥細(xì)信息
docker inspect ssh_nginx
[
{
"Id": "973c9487f8dbf2c6dfa5c443dd3b2697eced2ac78d896dd9cd50b00cf87f6816",
"Created": "2021-09-01T08:32:08.645237423Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 23325,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-09-01T08:32:08.951092626Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
...
3.17 docker build
以dockerfile創(chuàng)建鏡像,PATH為dockerfile所在目錄
docker build -t name:tag PATH