docker鏡像管理


  本篇博文理論知識比較少,較多實操,但比較糙,可以當做docker入門的博文來看,后面講的k8s沒有資源,還是那句話:基礎不牢,地動山搖.但我還是把它記錄下來了,得"一步一個腳印,做大做強,再創輝煌.--電影<<無名之輩>>".之后的博文寫的內容都是mage的docker跟k8s,質量有保證,大家可以放心閱讀.

1.安裝

# k8s官方要求是使用docker1.12.6版本的,所以為了以后少踩坑,我們用阿里雲的docker-ce源或者epel源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
或者
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
或者
yum -y install epel-release
yum -y install docker bash-completion
systemctl start docker
systemctl enable docker
docker info
...
Server Version: 1.13.1
...
# 阿里雲登錄網址:https://cr.console.aliyun.com
# 為你的docker配置加速器
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd-current --registry-mirror=https://a14c78qe.mirror.aliyuncs.com \
systemctl daemon-reload
systemctl restart docker.service
docker daemon --help  # 可以查看到所有支持的參數

解決報錯:
Failed to start Docker Application Container Engine
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- Unit docker.service has failed.
-- The result is failed.
Unit docker.service entered failed state.
docker.service failed.

  這是因為在啟動腳本里加了這一行--registry-mirror,加這一行的時候一定要注意橫線的輸入法,我這里是格式寫錯了,導致啟動腳本有問題,格式正確之后,啟動正常,所以說:操作規范化,可以讓我們少踩很多坑.

# 還可以這樣去添加加速器,這是阿里官網上推薦的
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jh4x39ut.mirror.aliyuncs.com"]
}
EOF
# 目前docker保存在本地的路徑是/var/lib/docker,如果想要改變路徑則,在啟動腳本中添加
--graph=/data/docker

2.鏡像管理

a.獲取鏡像--語法:docker pull NAME[:TAG]

NAME是鏡像倉庫的名稱(用來區分鏡像),TAG是鏡像的標簽(用來表示版本信息)

b.搜索鏡像

docker search [image-name]:從docker倉庫搜索docker鏡像,后面是關鍵詞

c.查看鏡像

docker images
REPOSITORY               TAG                 IMAGE ID       CREATED       SIZE
docker.io/alpine         latest              caf27325b298   2 weeks ago   5.53 MB
來自於哪個倉庫/鏡像名    鏡像標簽            鏡像ID         創建時間      鏡像大小
docker inspect {IMAGE_ID | IMAGE_NAME}:獲取鏡像詳細信息
docker pull nginx
docker inspect nginx
# 返回的是一個JSON格式的消息,如果我們只要其中一項內容時,可以使用參數-f來指定,例如獲取鏡像的Architecture
docker inspect -f {{".Architecture"}} nginx
amd64
# 以上是服務器能夠聯網的情況下獲取鏡像的方法,docker默認也提供了離線方法
docker save nginx >/opt/nginx.tar.gz  # 鏡像導出
ssh-copy-id -i ~/.ssh/id_dsa.pub root@10.0.0.21  # 做一下主機互信
scp /opt/nginx.tar.gz root@10.0.0.21:/opt
docker load < /opt/nginx.tar.gz
Loaded image: docker.io/nginx:latest
# 用 docker images 可以看到離線load,和在線安裝的效果是一樣的

d.運行鏡像報錯

docker run -it alpine sh
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: 
starting container process caused "process_linux.go:245: running exec setns process for init caused \"exit status 17\"".
找了很多博客,都沒有在本質上說明原因,太亂太雜,最后只能升級內核,不確定是不是內核版本低導致的,但升級了之后,解決問題了.
未升級之前的內核版本:CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
# 導入yum源的認證key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安裝yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# 在yum的elrepo源中,有mainline(4.0.2)這個內核版本
yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel-ml -y
# 查看默認啟動順序
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg 
# 默認啟動的順序是從0開始
grub2-set-default 0 && reboot
uname -r 
4.20.10-1.el7.elrepo.x86_64

CentOS 7.0運行Docker出現內核報錯解決方法:https://www.linuxidc.com/Linux/2015-05/118084.htm

e.查看容器

docker ps -a  # 查看所有的容器
docker ps  # 查看正在運行的容器
docker run -it alpine sh  # 當exit退出時,容器會關閉,不想讓其關閉,可以按住Ctl,按一下p鍵,按一下q鍵
docker run -it --rm --name mynginx nginx
-i:interactive交互式的
-t:TTY終端
--rm:退出時,自動刪除容器,生產環境慎用
--name:運行鏡像時,會給這個容器隨機起一個名字,此參數可以自定義名字
啟動nginx鏡像的默認命令是:nginx -g "daemon off"
進入容器的三種方法
docker attch mynginx  # 這個不實用
docker exec -it mynginx sh  # 這個最常用
第三種方法得找到容器的pid
yum install -y net-tools
cat docker_in.sh
pid=`docker inspect --format "{{.State.Pid}}" $1`
nsenter -t $pid -m -u -i -n -p

f.刪除鏡像

  docker rmi centos:用來刪除指定鏡像,其中后面的參數可以是tag,如果是tag時,實際上是刪除該tag,只要該鏡像還有其他tag,就不會刪除該鏡像.當后面的參數為鏡像ID時,則會徹底刪除整個鏡像,連同所有標簽一同刪除.docker rmi -f centos:強制刪除,一般不建議使用,后續可能會出現一些問題.

  剛才那種啟動方式,在前台就這么夯住了,不實用,使用-d讓其后台運行,docker run -it -d --name secondnginx nginx,--rm和-d是沖突的,不能同時使用.如何刪除一個正在運行的容器?要么強制刪,要么停止之后再刪:docker rm -f 容器ID或者docker stop 容器ID && docker rm 容器ID.

g.獲取內部配置

# 獲取鏡像nginx的內部配置可以用兩種方式
docker inspect --format "{{.ContainerConfig.Hostname}}" nginx
docker inspect -f {{.ContainerConfig.Hostname}} nginx
# 獲取容器的內部配置也是這兩種方式
# 查看日志
curl 172.17.0.3
docker logs secondnginx  # 或者使用容器ID的前三位
docker logs -f secondnginx  # 查看連續日志

 

Docker初識:https://blog.51cto.com/jinlong/2104972


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM