本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Docker基本命令和优化
环境:centos7.4
Docker安装、更换国内源等
容器更改时间: export TZ='Asia/Shanghai'
#Docker下载yum源安装
[root@docker ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/Docker.repo
[root@docker ~]# yum -y install docker-ce
#Docker下载指定版本的rpm包,yum安装
[root@docker ~]# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
[root@docker ~]# yum localinstall docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
#配置阿里云Docker Yum源
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 git
[root@docker ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
下载指定版本docker-ce及docker-cli
[root@docker ~]# yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15
Docker卸载,清除docker的环境
[root@docker ~]# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
Docker启动、查看版本等
[root@docker ~]# systemctl restart docker.service
[root@docker ~]# systemctl enable docker.service
#查看Docker版本
[root@docker ~]# docker -v
[root@docker ~]# docker version
#查看docker运行状态
[root@docker ~]# docker info
Docker配置加速器
cr.console.aliyun.com/cn-beijing/…
[root@docker ~]# mkdir -p /etc/docker
[root@docker ~]# tee /etc/docker/daemon.json <<-EOF
{
"registry-mirrors":["https://s38uybez.mirror.aliyuncs.com"],
"insecure-registries":["harobr.deockerharobr.com"]
}
EOF
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker
"insecure-registries":["harbor.deockerharbor.com"] #为harbor不用htts协议传输。
Docker的基本命令
#查看docker的本地镜像
[root@docker ~]# docker images
#搜索某个镜像
[root@docker ~]# docker search nginx
#拉取镜像
[root@docker ~]# docker pull centos
#更换tag标签:centos:latest为之前的旧的,linux为新的标签,更改后ID不变
[root@docker ~]# docker docker tag centos:latest linux
#启动镜像:-itd -i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动
[root@docker ~]# docker run -itd centos
#查看正在运行的容器:-a可以查看所有容器,包括未运行的
[root@docker ~]# docker ps -a
[root@docker ~]# docker container ls -a
#删除镜像
[root@docker ~]# docker rmi centos
#进入到某个容器中:可以通过id和names进入
[root@docker ~]# docker exec -it 9d90e36af749 bash
#把本地容器制作成镜像:docker commit -m "注释和备注信息" -a "用于指定与作者相关信息" 容器ID 镜像名字
[root@docker ~]# docker commit -m "这是一个nginx" -a "Miwanzo" nginx nginx-name-miwanzo
#busybox集合很多命令
[root@docker ~]# docker pull busybox
#查看nginx容器的具体信息
[root@docker ~]# docker inspect nginx
#查看nginx镜像的具体信息
[root@docker ~]# docker image inspect nginx
DockerFile的基本命令
[root@docker ~]# docker run --name myapp --net bridge -id --entrypoint /bin/sh demoapp:v0.2
[root@docker ~]# vim Dockerfile
FROM nginx:latest #基于的构建镜像
LABEL MAINTAINER "构建姓名 <邮箱>" #构建作者信息
COPY index.html /data/web/html #拷贝文件,第一个为本地文件目录,第二个为容器目录
WORKDIR /usr/local/src/ #默认容器目录,可以多次制定
ADD nginx.tar.gz ./ #拷贝并解压,支持url, url中不支持解压缩
VOLUME /data/mysql/ #挂载
ENV key=value #定义环境变量,在启动容器后是可以直接引用的
RUN cd /usr/local/src && \
tar -x nginx-1.15.2.tar.gz -C ./ #运行命令
CMD /bin/httpd -f -h /data/web/html #Docker的默认运行程序,可以存在多个,仅最后一个生效
ENTRYPOINT /bin/httpd -f -h /data/web/html #与CDM的区别是,docker run时候后面执行命令当成参数使用,可以定义多个,只有最后一个生效
当CMD和ENTRYPOINT同时存在,CMD会当成参数传递给ENTRYPOINT。CMD要写成数组的形式。
CMD ["/bin/httpd","-f","-h /data/web/html"]
ENTRYPOINT ["/bin/sh","-c"] #这样会运行bash,然后把CMD当成参数传递给ENTRYPOINT
HEALTHCHECK NONE #不进行健康检查检测
HEALTHCHECK --start-period=30 #Docker启动后,等待里面的主进程启动后,在进行监控检查,默认0秒
HEALTHCHECK --interval=5m #健康检查间隔时间,默认30s
HEALTHCHECK --timeout=3s #健康检查超时时间,默认30s
HEALTHCHECK --retries=N #监控健康检查失败次数,然后重启,默认3次
HEALTHCHECK --interval=5m --timeout=3s --start-period=30 \
CMD curl -f http://localhost/ || exit 1 #启动30s后,每个5分钟健康检查一次,超时时间3s,失败执行1,表示不监控
0为监控,1为不健康,2为自定义
[root@docker ~]# docker build -t nginx:v1.1 ./ #根据dockerfile创建镜像
[root@docker ~]# wget -O - -q 地址 #wget访问
DockerFile优化思路
1、减少层数:尽可能合并相似功能的层,RUN command1 && command2
2、清除缓存:编译缓存、安装程序包生成的缓存
3、利用构建缓存:bult缓存,bult缓存不会添加到镜像中
条件:父层缓存没有变化,构建指令不变、添加文件校验和
4、缩短网络传输时间:充分利用国内的镜像服务
5、多阶段构建镜像:把构建过程和最终生成结果相分离
Dokcer的启动命令
[root@docker ~]# docker top nginx #查看docker容器内的top
--cpus 2 #限制2核CPU --vm 2
--cpuset-cpus 0,2 #限制运行在0和2cpu上面
--cpu-shares 1024 #尽可能多的占用cpu资源,按比例划分
--m 256m #限制内存256M --cpu 8