docker技术栈 一

自己总结

阿里镜像仓库登录

  1. 1docker login --username=田田田哒哒哒哒 registry.cn-hangzhou.aliyuncs.com

重新打标记
将本地镜像推送到Registry镜像仓库

  1. docker tag daocloud.io/library/mysql:5.7.5-m15 registry.cn-hangzhou.aliyuncs.com/mingqingxx/nginx:v1.2

docker技术栈 - 图1

上传到自己的仓库

  1. 1docker push registry.cn-shanghai.aliyuncs.com/youngfit/nginx:1.1

镜像操作指令

  1. 2docker run -it -p 80:80 nginx:latest /bin/bash #端口转发
  2. 4docker pull #拉取镜像

1.1按星级搜索镜像

查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 centos 镜像:

  1. 1docker search centos -s 100
  2. 或者
  3. 2docker search ubuntu -f stars=100

1.2查看镜像详情
  1. 1docker inspect +名称 或者id #查看详细信息
  2. 2docker images #查看本地镜像
  3. 3docker images -q #只查看所有镜像的id
  4. 4docker rmi #删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id
  5. 参数解释:
  6. rm Remove one or more containers ---移除一个或多个容器
  7. rmi Remove one or more images ---删除一个或多个镜像

1.3删除所有镜像,慎用
  1. 1docker rmi $(docker images -q)
  2. 2docker rmi `docker images -q`

容器操作指令

1.4容器运行
  1. 1docker run -it nginx:latest /bin/bash #启动容器,容器应用不运行
  2. 2docker run -itd nginx:latest #启动容器,容器应用运行
  3. 3docker run -it nginx:latest /bin/bash #运行容器 加名字 版本
  4. 4docker start name #容器ID也可以 启动容器
  5. 5docker stop name #关闭容器
  6. 6docker rename mytest testmy #旧名称 新名称 修改容器名称
  7. 7docker stats # 动态显示容器的资源消耗情况,包括:CPU、内存、网络I/O

1.5查看容器的运行
  1. 1docker ps #只查看运行状态的容器:
  2. 2docker ps -a # 查看所有容器
  3. 3docker ps -a -q #只查看所有容器id

1.6进入退出容器
  1. 1docker exec -it +名称 或者id #进入容器
  2. 2exit #断开与容器的连接,并且关闭容器
  3. 3 快捷键:ctrl+p+q #断开和容器的连接而不关闭容器:

1.7监控容器
  1. 1、可以使用logstopwait这些子命令
  2. 2docker logs -f nginx1
  3. 3docker top nginx #容器ID也可以
  4. 4docker wait 01d8aa #第二个终端操作
  5. 0
  6. docker run 之后容器退出的状态码:
  7. 0,表示正常退出
  8. 0,表示异常退出(退出状态码采用chroot标准)
  9. 125Docker守护进程本身的错误
  10. 126,容器启动后,要执行的默认命令无法调用
  11. 127,容器启动后,要执行的默认命令不存在

1.8删除容器正确三步曲
  1. 1、先停止容器
  2. 2、然后删除容器
  3. 3、最后删除镜像
  4. # docker rm 容器id或名称
  5. 要删除一个运行中的容器,添加 -f 参数 --慎用。先stop在删除
  6. docker pause c7 #挂起
  7. docker unpause c7 #恢复
  8. pause :暂停容器中所有的进程
  9. unpause:恢复容器内暂停的进程,与pause对应

1.9进入容器快捷指令

如果你想进入一个容器是不是需要 docker exec + 容器+ id /bin/bahs
这个方法是最直接的,有没有一种方法是可以直接进入的呢?回答是有

快速进入
cd /usr/bin/ 进入这个目录下面

docker技术栈 - 图2

vim de #名字自定义

  1. docker exec -it $1 /bin/bash
  2. chomd +x /usr/bin/de #给执行权限

测试

docker技术栈 - 图3

2.0容器之间相互COPY文件
  1. 1docker cp 容器名:/test.sh /root/ #mytest是容器名称 里面的文件 拷贝到那
  2. 2docker cp /root/test.sh 容器名:/ #拷贝进去外面的文件

2.1容器文件系统打包
  1. 第一种方式:
  2. 1docker export -o centos6-1.tar 96e2b726
  3. #前面自定义名称 后面是容器id或名称 -o --output
  4. 第二种方法,强烈建议使用第二种
  5. 2docker export 容器名称或id > 镜像.tar

2.2上传容器tar包到docker
  1. 1 docker import 镜像.tar 名称:版本号 #后面容器名称,版本号自定义

2.3容器创建本地镜像
  1. 将这个新建的文件提交到镜像中保存,生成新的镜像
  2. 第一种方法
  3. 1docker commit 镜像id或名称 soso/test:v2 #后面容器名称,版本号自定义
  4. 第二种方法,强烈建议第二种
  5. 2docker commit -m "my images version1" -a "soso" 108a85b1ed99 daocloud.io/ubuntu:v2
  6. 参数详解
  7. -m 添加注释
  8. -a 作者
  9. 108a85b1ed99 容器环境id
  10. daocloud.io/ubuntu:v2 镜像名称:hub的名称/镜像名称:tag
  11. -p,–pause=true 提交时暂停容器运行

镜像迁移

2.4镜像打包
  1. save
  2. 将镜像打包,与下面的load命令相对应
  3. 1docker save -o nginx.tar daocloud.io/library/nginx #强烈建议后面跟镜像名称
  4. 这里解释一下,为什么后面上跟,镜像名称,如果跟镜像id,你把镜像放到其他docker上面运行镜像,会造成一个现象,那就是不显示镜像名称,只显示镜像id,就会很迷惑

docker技术栈 - 图4

镜像上传
  1. load
  2. 与上面的save命令相对应,将上面sava命令打包的镜像通过load命令导入,(实验环境中原来机器上面有镜像可以先删除掉。)
  3. 1docker load < nginx.tar #上传本地镜像tar包到docker
  4. 参数详解
  5. 把容器导出成tar export import
  6. 把容器做成镜像 commit -a "" -m ""
  7. 把镜像保存为tar save load

2.5-Dockerfile创建镜像,重点中的重点

docker build语法:

  1. 1docker build -t 名称/镜像名称:版本号 #docker镜像编写
  2. 参数详解
  3. docker build docker创建镜像的命令
  4. -t 是标识新建的镜像属于 soso bbauto镜像
  5. v2.1 tag
  6. "."是用来指明 我们的使用的Dockerfile文件当前目录的

2.6Dockerfile指令

详解图片一

docker技术栈 - 图5

详解图片二

dockerfile案例一 目录

新版本的docker 已经不区分 Dockerfile的大小写

  1. 1vim Dockerfile #This is a comment
  2. 2FROM daocloud.io/library/centos:7 #基于哪个基础镜像 最好是提前有,
  3. 3MAINTAINER soso soso@docker-server #指定作者
  4. 4RUN touch a.txt && mkdir /test #写到一层可以缩小镜像
  5. 5RUN yum -y install vim wget

格式说明:

  1. 命令要大写,"#"是注解。 要写在第二行,新版本
  2. 每一个指令后面需要跟空格,语法。
  3. FROM 命令是告诉docker 我们的镜像什么从哪里下载。
  4. MAINTAINER 是描述 镜像的创建人。
  5. RUN 命令是在镜像内部执行。就是说他后面的命令应该是针对镜像可以运行的命令。

dockerfile案例二-nginx

  1. [root@docker-server nginx]# vim Dockerfile
  2. FROM centos:7.8
  3. MAINTAINER mingqing
  4. RUN yum -y install epel-release && yum -y install nginx && yum clean all
  5. EXPOSE 80
  6. CMD ["nginx", "-g", "daemon off;"]

创建镜像

  1. 命令:
  2. # docker build -t mingqing/nginx:v2.
  3. docker build docker创建镜像的命令

查看镜像
docker技术栈 - 图6

实战案例三 jenkins

将以下安装包拷贝至jenkins目录中,我们知道jenkisn,可以运行在tomcat里面
需要配置 三个安装包,都上传到这个目录下面

docker技术栈 - 图7

  1. FROM centos:7.8
  2. MAINTAINER mingqing
  3. ENV JAVA_HOME /usr/local/java
  4. ENV TOMCAT_HOME /usr/local/tomcat
  5. ENV PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH
  6. ADD apache-tomcat-8.5.46.tar.gz /usr/local/
  7. ADD jdk-8u121-linux-x64.tar.gz /usr/local/
  8. RUN mv /usr/local/apache-tomcat-8.5.46 /usr/local/tomcat && mv /usr/local/jdk1.8.0_121 /usr/local/java && rm -rf /usr/local/tomcat/webapps/*
  9. COPY jenkins.war /usr/local/tomcat/webapps
  10. EXPOSE 8080
  11. ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

详解

docker技术栈 - 图8

资源限制

  1. 1.先将没有做限制的命令运行起来
  2. docker run --rm -it progrium/stress --cpu 4
  3. 2.在开启一个终端,运行做了CPU限制的命令
  4. docker run --rm -it -c 512 progrium/stress --cpu 4

因为默认情况下,容器的 CPU share 为 1024,所以这两个容器的 CPU 使用率应该大致为 2:1,下面是启动第二个容器之后的监控截图:

docker技术栈 - 图9

限制容器只能使用 1.5 核数 CPU

  1. 1docker run --rm -it --cpus 1.5 progrium/stress --cpu 3

在容器里启动三个 stress 来跑 CPU 压力,如果不加限制,这个容器会导致 CPU 的使用率为 300% 左右(也就是说会占用三个核的计算能力)。实际的监控如下图:

docker技术栈 - 图10

CPU 绑定

限制容器运行在某些 CPU 核

案例:

假如主机上有 4 个核,可以通过 —cpuset 参数让容器只运行在前两个核上:

  1. 1docker run --rm -it --cpuset-cpus=0,1 progrium/stress --cpu 2

这样,监控中可以看到只有前面两个核 CPU 达到了 100% 使用率。

docker技术栈 - 图11

容器卷

  1. docker run -it --name testnginx -v /test:/test2 daocloud.io/library/nginx /bin/bash

端口转发

使用端口转发解决容器端口访问问题

  1. -p:创建应用容器的时候,一般会做端口映射,这样是为了让外部能够访问这些容器里的应用。可以用多个-p指定多个端口映射关系。