docker知识点-上篇(老男孩架构班14期)

  本篇博文理论知识比较少,较多实操,但比较糙,可以当做docker入门的博文来看,后面讲的k8s没有资源,还是那句话:基础不牢,地动山摇.但我还是把它记录下来了,得"一步一个脚印,做大做强,再创辉煌.--电影<<无名之辈>>".之后的博文写的内容都是马哥2018年的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 [email protected]  # 做一下主机互信
scp /opt/nginx.tar.gz [email protected]:/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

猜你喜欢

转载自www.cnblogs.com/fawaikuangtu123/p/10419285.html