docker 再认识
1.RUN && CMD && ENTRYPOINT 区别:
RUN :执行命令并且创建新的image layer
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令
2.shell和exec格式
shell格式:
RUN yum install -y vim
CMD echo 'hello world'
ENTRYPOINT echo 'hello world'
exec格式:
RUN ["yum","install","-y","vim"]
CMD ["/bin/echo","hello world"]
ENTRYPOINT ["/bin/echo","hello world"]
3.解析ENTRYPOINT的shell和exec格式命令执行显示的区别:
FROM centos
ENV Name Docker
#shell格式命令,会显示hello Docker
ENTRYPOINT echo "hello $Name"
#exec格式,显示为空!因为没有bash环境去执行echo命令
ENTRYPOINT ["/bin/echo", "hello $Name"]
#虽然给了bash环境,但是命令需要写在一起,执行为空
ENTRYPOINT ["/bin/bash", "-c", "echo", "hello $Name"]
#exec格式,显示为hello Docker
ENTRYPOINT["/bin/bash", "-c", "echo hello $Name"]
4.将自制的镜像push到docker-hub上:
首先需要到docker-hub上面设置账号密码
将自己的镜像名改为github账号名/name的形式
docker login 输入账号密码
docker push github账号名/name
登录到dockerhub中查看镜像
5.私有仓库的创建:
仓库端设置:
1)docker run -d -p 5000:5000 --restart always --name registry registry:2
2)查看registry是否已经启动,保证5000端口打开
默认镜像文件存放在:/var/lib/registry/docker/registry/v2/repositories
docker-镜像端设置:
添加配置文件:/etc/docker/daemon.json ---->
{ "insecure-registries":["仓库ip地址:5000"] }
修改docker启动文件:/lib/systemd/system/docker.service
15行添加 EnvironmentFile=-/etc/docker/daemon.json
重现启动docker ----> service docker restart
将本地的Image改名:
docker tag image:tag 仓库ip:5000/名称
上传到仓库: docker push 仓库ip:5000/名称
查看上传结果: http://仓库ip:5000/v2/_catalog
6.使用dockerfile创建一个命令行带参数执行的镜像:
FROM ubuntu
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"]
CMD []
docker build -t 镜像名 .
docker run -it 镜像名 --vm 1 --verbose
7.针对容器资源限制
docker run --help 查看帮助
内存(如果只设定内存没设置swap,swap空间会和内存一样大小):
docker run --memory=200M 镜像名称
内存总和大小是memory+swap=400M
cpu:相对权重
docker run --cpu-share=10 --name test 镜像名称
docker run --cpu-share=5 --name test1 镜像名称
此时test和test1占cpu的权重比是2:1,一共是100%
8.docker 底层技术支持
Namespaces:做隔离pid,net、ipc、mnt、uts
Control groups:做资源限制
Union file system:Container和image的分层