容器的生命周期
先简单了解一下容器的生命周期上图
容器安装
如需卸载旧版本docker
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
一键部署docker(这里以centos7为例)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl disable --now firewalld
yum install -y yum-utils
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -y
yum makecache fast -y
yum install docker-ce docker-ce-cli containerd.io -y
systemctl enable --now docker
getenforce
可验证selinux是否关闭这里一般重启服务器后生效
docker使用常见命令
docker 进程启动、停止、重启
docker 进程启动、停止、重启,常见的三种 case
# 启动docker
service docker start
# 关机docker
service docker stop
# 重启docker
service docker restart
镜像操作
镜像的搜索,下载,删除,检索
# 镜像列表
docker images
# 检索镜像, 从镜像仓库中检索
docker search xxx
# 下载镜像
docker pull xxx
# 删除镜像
docker rmi xxx
创建镜像
# 通过容器创建镜像
docker commit -m="描述信息" -a="版权声明" dd85eb055fe8 yh/centos:v0.1
# 镜像历史查询
docker history yh/centos
上面的几个参数进行说明
参数-m 和 git 的提交一样,后面更上描述信息
参数-a 版权声明,这个东西是我创建的,有啥问题,找我
dd85eb055fe8 容器 id
yhh/quick-os:0.1 创建的镜像名
镜像上传registry仓库
登陆registry仓库
docker login -u admin -p password 域名或者IP:端口号#这里指定仓库地址不加默认为docker hub仓库
#给镜像打标签
docker tag d4ff818577bc 域名或者IP:端口号/hk_gongkai/rsshub:v1
# 通过容器创建镜像
docker commit -m="描述信息" -a="版权声明" dd85eb055fe8 hk_neibu/centos:v0.1
#推镜像
docker push 域名或者IP:端口号/hk_gongkai/rsshub:v1
私有仓库(自签证书的)登陆需配置证书信任,就好比浏览器访问https://
要点高级再点继续访问才会弹出网页页面一样
配置思路修改连接发起端(客户端)docker的配置文件
vi /etc/docker/daemon.json(没有该文件就创建该文件)
{
"insecure-registries": ["域名或者IP:端口号"]
#多条参数时注意不要漏掉“ , ”号,不然docker启动会失败
}
systemctl daemon-reload #重启守护线程
systemctl restart docker #重启docker
docker info | grep -i 域名或者IP:端口号 #验证有显示则生效
镜像下载至本地&上传
容器提交为镜像
docker commit -m="描述信息" -a="版权声明" dd85eb055fe8 hk_neibu/centos:v0.1
#想要导出更改后的容器需要通过docker commit命令,可以将容器修改的内容保存为镜像,由于镜像的结构很像代码仓库里的修改记录,而记录容器修改的过程又像是在提交代码,所以可以更形象的称之为提交容器的更改。
镜像导出
docker save -o ./webapp-1.0.tar webapp:1.0
#镜像导出之后可以找到已经存储镜像内容的webapp-1.0.tar文件。通过解压软件查看其中的内容,会看到里面就是镜像所基于的几个镜像层的记录文件。
镜像导入
docker load -i webapp-1.0.tar
#镜像导入后,就可以通过docker images看到,导入的镜像会延用原有的镜像名称。
查看镜像详细信息
docker inspect 容器id
容器操作
容器的各种操作,启动,关闭,重启,日志查询以及各种进入容器内部搞事情
万事开头第一步,加载镜像,创建容器
docker run 镜像名:版本
run 后面可以跟很多的参数,比如容器暴露端口指定,存储映射,权限等等,由于参数过多,下面只给出几个不同的例子,来具体的演示参数可以怎么加
示例1: -it -d创建并后台执行
docker run -i -t -d centos:latest
其中关键参数为-d,指定容器运行与前台或者后台,不加上时前台
-i: 打开 STDIN,用于控制台交互
-t: 支持终端登录
示例2: -d运行一个带命令在后台不断执行的容器
docker run -d centos:latest ping www.baidu.com
示例3: --restart=always运行一个容器挂了自动重启继续跑
docker run -d --restart=always centos:latest ping www.baidu.com
注意:如果想要在ping www.baidu.com 追加“-t”传参需得在Dockerfile构建镜像时使用entrypoint,那么-t就会认为是cmd。可正常执行。
若是使用的cmd,那么ping www.baidu.com -t会报错。使用docker run --entrypoint ping www.baidu.com -t覆盖
cmd entrypoint使用可参照https://zhuanlan.zhihu.com/p/30555962文章
示例4: --name指定容器名
docker run -d --name=yhh_centos centos:latest
示例5: -p暴露容器端口 80,并与宿主机端口 8080 绑定
docker run -d --name=yhh_centos -p 8080:80 centos:latest
示例6: -v指定容器与宿主机目录(/home/web/html/www)共享
docker run -d --name=yhh_centos -v /home/web/html/www:/var/www centos:latest
基本操作-容器启动、停止、重启、删除
容器创建完毕之后,就是一些基本操作了,启动、停止、重启、删除
# 查看容器列表, 列出所有的容器
docker ps -a
# 启动容器,start后面可以跟上容器名,或者容器id
docker start xxx # (这里的xxx可以是容器名:yhh_centos 也可以是容器id:f57398ab22c5)
# 关闭容器
docker stop xxx
# 重启
docker restart xxx
# 删除
docker rm xxx
在查看容器列表时,如果某个容器的启动参数特别长,直接使用docker ps -a会发现看不到完整的启动命令,这个时候可以带上参数–no-trunc来显示完整命令
docker ps -a --no-trunc
配置文件说明
docker(daemon.json)
修改daemon.json文件
vi /etc/docker/daemon.json(没有该文件就创建该文件)
{
#用一组新的注册表替换守护程序将向其推送不可分发工件的注册表集
"allow-nondistributable-artifacts": [],
"api-cors-header": "",
#指定要使用的授权插件
"authorization-plugins": [],
"bip": "",
#标志设置docker0为默认桥接网络
"bridge": "",
"cgroup-parent": "",
"cluster-advertise": "",
#使用新地址重新加载发现存储。
"cluster-store": "",
#使用新选项重新加载发现存储。
"cluster-store-opts": {},
"containerd": "/run/containerd/containerd.sock",
"containerd-namespace": "docker",
"containerd-plugin-namespace": "docker-plugins",
"data-root": "",
#当设置为 true 时,它将守护程序更改为调试模式
"debug": true,
"default-address-pools": [
{
"base": "172.30.0.0/16",
"size": 24
},
{
"base": "172.31.0.0/16",
"size": 24
}
],
"default-cgroupns-mode": "private",
"default-gateway": "",
"default-gateway-v6": "",
"default-runtime": "runc",
"default-shm-size": "64M",
"default-ulimits": {
"nofile": {
"Hard": 64000,
"Name": "nofile",
"Soft": 64000
}
},
#设定容器DNS的地址,在容器的 /etc/resolv.conf文件中可查看
"dns": [],
"dns-opts": [],
#设定容器的搜索域
"dns-search": [],
"exec-opts": [],
"exec-root": "",
"experimental": false,
#明确启用或禁用特定功能
"features": {},
"fixed-cidr": "",
"fixed-cidr-v6": "",
"group": "",
"hosts": [],
"icc": false,
"init": false,
"init-path": "/usr/libexec/docker-init",
"insecure-registries": [],
"ip": "0.0.0.0",
"ip-forward": false,
"ip-masq": false,
#阻止 Docker 守护进程添加 iptables 规则
"iptables": false,
"ip6tables": false,
"ipv6": false,
#docker主机的标签,很实用的功能,例如定义:–label nodeName=host-121
"labels": [],
#启用在守护进程停机期间保持容器活动
"live-restore": true,
#Default driver for container logs (default "json-file")
"log-driver": "json-file",
"log-level": "",
#日志配置
"log-opts": {
"cache-disabled": "false",
"cache-max-file": "5",
"cache-max-size": "20m",
"cache-compress": "true",
"env": "os,customer",
"labels": "somelabel",
"max-file": "5",
"max-size": "10m"
},
#每次拉取的最大并发下载量
"max-concurrent-downloads": 3,
#每次推送的最大并发上传量
"max-concurrent-uploads": 5,
#每次拉取的最大下载尝试次数
"max-download-attempts": 5,
"mtu": 0,
"no-new-privileges": false,
"node-generic-resources": [
"NVIDIA-GPU=UUID1",
"NVIDIA-GPU=UUID2"
],
"oom-score-adjust": -500,
"pidfile": "",
"raw-logs": false,
#镜像源管理
"registry-mirrors": [],
#可用于运行容器的可用OCI运行时列表
"runtimes": {
"cc-runtime": {
"path": "/usr/bin/cc-runtime"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"--debug"
]
}
},
"seccomp-profile": "",
#默认 false,启用selinux支持
"selinux-enabled": false,
"shutdown-timeout": 15,
"storage-driver": "",
"storage-opts": [],
"swarm-default-advertise-addr": "",
#启动TLS认证开关
"tls": true,
"tlscacert": "",
"tlscert": "",
"tlskey": "",
"tlsverify": true,
"userland-proxy": false,
"userland-proxy-path": "/usr/libexec/docker-proxy",
"userns-remap": ""
}
修改完后
sudo systemctl daemon-reload
sudo systemctl restart docker