docker介紹
Docker是一個應(yīng)用容器引擎匀伏,完全使用沙箱機制相互之間不會有任何接口昂拂。它只是一種虛擬化技術(shù)并不是虛擬機碟绑,其實現(xiàn)原理和虛擬機沒有一毛關(guān)系单默。
大部分人對docker和虛擬機區(qū)別的理解是下面這張圖
如圖碘举,虛擬機的Hypervisor層會對硬件資源進(jìn)行虛擬化,然后在這之上再安裝獨立的系統(tǒng)搁廓。而docker直接使用硬件資源引颈,每個docker容器使用的也是宿主機的系統(tǒng)內(nèi)核,所以docker相比虛擬機更輕量枚抵,速度更快线欲。這個理解是對的,但是這里容易有個誤區(qū)汽摹。按照圖片中的理解李丰,你是不是認(rèn)為docker安裝在了宿主機上,而docker容器運行在了docker引擎里逼泣?
docker容器本質(zhì)上是宿主機的進(jìn)程趴泌,Docker通過namespace實現(xiàn)了資源隔離,通過cgroups實現(xiàn)了資源限制拉庶。docker容器并不是安裝在docker引擎里嗜憔。docker引擎只是在宿主機上為每個docker容器開辟了一個獨立的進(jìn)程。不是docker實現(xiàn)的這一切氏仗,它也是利用的Linux內(nèi)核的輕量級虛擬化(容器)服務(wù)吉捶。
首先介紹的是Linux內(nèi)核的namespace技術(shù)。在同一個 namespace 下的進(jìn)程可以感知彼此的變化,而對外界的進(jìn)程一無所知呐舔。這樣就可以讓容器中的進(jìn)程產(chǎn)生錯覺币励,認(rèn)為自己置身于一個獨立的系統(tǒng)中,從而達(dá)到隔離的目的珊拼。具體的實現(xiàn)方式是把一個或多個進(jìn)程的相關(guān)資源指定在同一個 namespace 中食呻。
docker 安裝
- 安裝工具:
yum install -y yum-utils
- 設(shè)置 yum 倉庫:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
- 下載docker:
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 啟動docker:
systemctl start docker
- 開機自啟動docker:
systemctl enable docker
- 查看docker信息:
docker info
- 配置docker鏡像加速,方便從github拉取鏡像
vim /etc/docker/daemon.json
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
systemctl restart docker
安裝portainer澎现,portainer是一款容器管理可視化界面仅胞,方便對容器進(jìn)行管理。
docker pull portainer/portainer
docker run -d -p 9000:9000 --restart=always -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer
SSL證書加密遠(yuǎn)程鏈接
創(chuàng)建證書腳本docker_cert.sh
注意:變量的等號左右不能有空格剑辫。字符串可以不加引號干旧,但是如果字符串中有空格必須加單引號或者雙引號
#!/bin/sh
ip=公網(wǎng)ip
password=密碼
dir=/root/docker/cert
if [ ! -d "$dir" ];then
echo ""
echo "$dir , not dir , will create"
echo ""
mkdir -p $dir
else
echo ""
echo "$dir , dir exist , will delete and create"
echo ""
rm -rf $dir
mkdir -p $dir
fi
cd $dir
# 創(chuàng)建根證書RSA私鑰
openssl genrsa -aes256 -passout pass:$password -out ca-key.pem 4096
# 創(chuàng)建CA證書
openssl req -new -x509 -days 365 -key ca-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=CN/ST=BeiJing/L=BeiJing/O=yao/CN=$ip"
# 創(chuàng)建服務(wù)端私鑰
openssl genrsa -out server-key.pem 4096
# 創(chuàng)建服務(wù)端簽名請求證書文件
openssl req -subj "/CN=$ip" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = IP:$ip,IP:0.0.0.0 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
# 創(chuàng)建簽名生效的服務(wù)端證書文件
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out server-cert.pem -extfile extfile.cnf
# 創(chuàng)建客戶端私鑰
openssl genrsa -out key.pem 4096
# 創(chuàng)建客戶端簽名請求證書文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
echo extendedKeyUsage = clientAuth > extfile-client.cnf
# 創(chuàng)建簽名生效的客戶端證書文件
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out cert.pem -extfile extfile-client.cnf
# 刪除多余文件
rm -f -v client.csr server.csr extfile.cnf extfile-client.cnf
# 修改證書為只讀權(quán)限保證證書安全
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
編輯docker.service配置文件:
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/root/docker/cert/ca.pem --tlscert=/root/docker/cert/server-cert.pem --tlskey=/root/docker/cert/server-key.pem -H fd:// -H tcp://0.0.0.0:2376
重啟:systemctl daemon-reload && systemctl restart docker
docker 常用命令
導(dǎo)出鏡像(優(yōu)先使用這種方式)
提交:docker commit <容器id> nginx:1.0.0
導(dǎo)出:docker save -o nginx.tar nginx:1.0.0
導(dǎo)入:docker load -i nginx.tar
重命名鏡像:docker tag [鏡像id] [新鏡像名稱]:[新鏡像標(biāo)簽]
導(dǎo)出容器
導(dǎo)出:docker export -o postgres.tar postgres
導(dǎo)入:docker import postgres.tar postgres:latest
日志
docker logs -f --tail 10 efb78392fcc6
查看鏡像列表
docker images
查看正運行的容器
docker ps
查看所有容器
docker ps -a
刪除鏡像
docker rmi -f 鏡像ID
刪除容器
docker rm -f 容器ID
啟動容器
docker start 容器ID
停止容器
docker stop 容器ID
重啟容器
docker restart 容器ID
進(jìn)入容器
docker attach 容器ID
attach直接進(jìn)入容器啟動命令的終端,不會啟動新的進(jìn)程揭斧。當(dāng)多個窗口同時使用該命令進(jìn)入該容器時莱革,所有的窗口都會同步顯示。如果有一個窗口阻塞了讹开,那么其他窗口也無法再進(jìn)行操作盅视。
docker exec -it 容器ID /bin/bash
exec在容器中打開新的終端,啟動新的進(jìn)程旦万。/bin/bash如果不管用使用/bin/sh闹击。
常見問題
1、以非root用戶身份成艘,運行Docker容器應(yīng)用
容器的root用戶映射到宿主機也是root用戶赏半,所以容器應(yīng)用進(jìn)程具有很高的權(quán)限,甚至可以對宿主機系統(tǒng)進(jìn)行修改淆两。為了降低潛在的安全風(fēng)險断箫,可以在非root用戶下執(zhí)行Docker。非root用戶執(zhí)行docker命令有一些限制秋冰,這時候后可以使用sudo仲义。
2、容器掛載目錄的權(quán)限問題
如果執(zhí)行docker run命令的時候使用的并不是root用戶剑勾。主機上的目錄的權(quán)限與容器內(nèi)的進(jìn)程權(quán)限不匹配埃撵,可能導(dǎo)致無法訪問或無法寫入掛載的目錄。這時候我們將宿主機的掛載目錄權(quán)限設(shè)置為最高就可以虽另。
chmod -R 777 {宿主機掛載目錄}
常用軟件命令
- mysql
docker run -p 3306:3306 --name mysql --privileged=true --restart=always -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql -v /data/mysql/log:/logs -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -d mysql:latest --lower_case_table_names=1
- postgres
docker run --name postgres --restart=always -v /data/postgre/FaceService:/opt/FaceService -v /data/postgre/postgreData:/var/lib/postgresql/data -v /etc/localtime:/etc/localtime:ro -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres:12.11
- redis (需要自己下載redis.conf文件放進(jìn)去)
docker run -d --restart=always --name=redis -p 6379:6379 -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data redis:latest redis-server /etc/redis/redis.conf --appendonly yes
- tomcat
docker run -d -p 8090:8080 --name tomcat --restart=always -v /data/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5