1、image
- image层的概念
现有的image都是怎么来的呢?其实image就是通过编译运行Dockerfile所得来的,这也是推荐使用的一种方式。
每个image其实都是如下图这种结构,底层是操作系统的image,在上层不断的添加新的层,最终形成自己想要的image。
image.png-
创建 image
-
方式一:Dockerfile【推荐】
我们可以看官方的Tomcat image是怎么做的
FROM openjdk:8-jdk ENV CATALINA_HOME /usr/local/tomcat ENV PATH $CATALINA_HOME/bin:$PATH RUN mkdir -p "$CATALINA_HOME" WORKDIR $CATALINA_HOME ....省略.... EXPOSE 8080 CMD ["catalina.sh", "run"]
image就是通过Dockerfile进行各种命令的组成,在基础image之上又添加了自己需要的内容。
当我们使用
image.pngdocker pull tomcat
这些步骤其实就是在运行Dockerfile中的命令。
- 构建自定义 image
image.pngFROM openjdk:8-jdk MAINTAINER Sunny LABEL name="Sunny" COPY spring-boot-docker-1.0.jar /spring-boot-docker-1.0.jar EXPOSE 8080 CMD ["java","-jar","spring-boot-docker-1.0.jar"]
-
通过docker build 命令可以根据Dockerfile生成新的 image。上面的 Step 1 ~ 6 就是我们在Dockerfile中编写的命令,一个步骤就是一层。
运行自己的容器,就可以访问映射到物理机的端口了。
image.png-
方式二:docker commit
想要创建一个新的image,不仅可以使用Dockerfile来生成,还可以在一个已有的container之上增加新的功能,使其形成新的image。
image.png
可以看到原来的 tomcat 镜像是没有 vim 命令的,我们通过yum install vim
安装。结果发现 yum也没有,此时可以通过其他方式进行安装。
再敲 yum 命令就可以看到已经安装好了
image.png
接下来通过 docker commit myTomcat new-tomcat
创建一个新的image
可以看到通过 commit 方式也可以创建 image,通过这个 image 启动的容器就会有安装好的 vim 命令了
不推荐用 commit 方式创建 image,因为通过这种方式创建的 image 我们完全不知道它是怎么来的。
而通过Dockerfile的方式创建的 image 我们知道它是经过哪些步骤哪些命令从而产生的 image。
-
Dockerfile 语法
-
FROM
- 指定基础镜像
- FROM openjdk:8-jdk
-
MAINTAINER
- 作者信息
- MAINTAINER Sunny
-
RUN
- 在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用
\
- RUN groupadd -r mysql && useradd -r -g mysql mysql
- 在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用
-
ENV
- ENV MYSQL_MAJOR 5.7
- 设置变量的值,可以通过docker run --e key=value修改,后面可以直接使
用${MYSQL_MAJOR}
-
LABEL
-
设置镜像标签
LABEL email="sunny@163.com"
LABEL name="sunny"
-
-
VOLUME
- 指定数据的挂在目录
- VOLUME /var/lib/mysql
-
COPY
- 将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和解压
- COPY docker-entrypoint.sh /usr/local/bin/
-
ADD
- 将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压
- ADD mysql-5.7.tar /usr/local
-
WORKDIR
-
指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建
WORKDIR /usr/local
WORKDIR tomcat
RUN touch test.txt
会在/usr/local/tomcat下创建test.txt文件
WORKDIR /root
ADD app.yml test/会在/root/test下多出一个app.yml文件
-
-
CMD
- 容器启动的时候默认会执行的命令,若有多个CMD命令,则最后一个生效
- CMD ["java", "-jar", "xxx.jar"] 或 CMD java
-
ENTRYPOINT
- 和CMD的使用类似
- ENTRYPOINT ["docker-entrypoint.sh"]
-
基本的一些语法就说这些,其他的一些命令大家根据自己的需要去查询,后面也会慢慢补充。
-
2、镜像仓库
我们想要拉取镜像或者推送镜像都需要一个仓库,而docker的镜像仓库有很多,比如官方的仓库、阿里的仓库,还有自己搭建的仓库。
如果要推送镜像到仓库,首先得有一个账户,这块大家自己去注册就好。接下来看如何推送 image 到镜像仓库中。
-
官方镜像仓库
-
在docker机器上登录
- docker login
- 输入用户名和密码
-
docker push [docker id docker仓库自己的用户名]/test-springboot
-
如果要给 image 打个标签
- docker tag test-springboot[[docker id]/test-springboot-image:v1.0
- 推送打上标签的 image 即可
-
-
push 成功之后,就可以通过 docker pull [docker id]/test-springboot-image:v1.0 拉取镜像了
-
-
阿里云镜像仓库
-
首先也要在阿里云注册账号
-
注册登录后,创建命名空间和仓库
-
-
仓库类型如果是私有,那只有管理员自己才可以下载,公开的就别人也可以下载。
-
点击创建好的仓库,阿里云会告诉你如何去拉取和推送镜像
-
自建镜像仓库
-
自建仓库其实已经有人帮我们实现了,可以在github中搜索
harbor
项目,下载到想当做仓库服务器的机器上。 -
使用 harbor 有个前提,就是必须得先安装好 docker-compose
-
解压tar包后进入harbor目录,修改 harbor.yml 文件
- 主要是ip地址的修改成当前机器的ip地址
- 同时也可以看到Harbor的密码,默认是Harbor12345
# Configuration file of Harbor # The IP address or hostname to access admin UI and registry service. # DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients. # 配置外网可以访问的域名或ip hostname: reg.mydomain.com # http related config http: # port for http, default is 80. If https enabled, this port will redirect to https port port: 80 # 安全的https协议 https: # https port for harbor, default is 443 port: 443 # The path of cert and key files for nginx certificate: /your/certificate/path private_key: /your/private/key/path # 默认密码 harbor_admin_password: Harbor12345 # Harbor DB configuration database: # The password for the root user of Harbor DB. Change this before any production use. password: root123 # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained. max_idle_conns: 50 # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections. # Note: the default number of connections is 100 for postgres. max_open_conns: 100 # The default data volume data_volume: /data clair: # The interval of clair updaters, the unit is hour, set to 0 to disable the updaters. updaters_interval: 12 jobservice: # Maximum number of job workers in job service max_job_workers: 10 notification: # Maximum retry count for webhook job webhook_job_max_retry: 10 chart: # Change the value of absolute_url to enabled can enable absolute url in chart absolute_url: disabled # Log configurations log: # options are debug, info, warning, error, fatal level: info # configs for logs in local storage local: # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated. rotate_count: 50 rotate_size: 200M # The directory on your host that store log location: /var/log/harbor _version: 1.10.0 proxy: http_proxy: https_proxy: # no_proxy endpoints will appended to 127.0.0.1,localhost,.local,.internal,log,db,redis,nginx,core,portal,postgresql,jobservice,registry,registryctl,clair,chartmuseum,notary-server no_proxy: components: - core - jobservice - clair
-
-
安装harbor
- sh install.sh
-
安装完成后会默认以当前机器的80端口启动,访问之后输入用户名密码即可。
- 用户名为:admin
-
推送 image
- 标记镜像
- docker tag [image名称] [:TAG] [域名]/[仓库]/[image名称] [:TAG]
- 推送镜像
- docker push [域名]/[仓库]/[image名称] [:TAG]
- 标记镜像
3、Image常用操作
-
查看本地image列表
- docker image ls
- docker images
-
获取远端镜像
- docker pull
-
删除镜像
[注意此镜像如果正在使用,或者有关联的镜像,则需要先删除容器]
- docker rm -f $(docker ps -aq) 删除所有容器
- docker image rm imageid
- docker rmi -f imageid
- docker rmi -f $(docker image ls) 删除所有镜像
-
运行镜像
- docker run image
-
发布镜像
- docker push
4、container
-
container介绍
前面我们已经知道 container 是由 image 运行起来的,那么可以理解为 container 和 image 是有某种关系存在的。
其实可以理解为 container 只是基于 image 之后的 layer(层)而已,也就是可以通过docker run image 创建出一个 container 出来。
下面这张图中,Container Layer 就是我们在运行一个容器之后增加的层,它是可以进行读写操作的,而下面的层都是只读的,不能去进行修改。
在上一节中,我们知道 container 是由 image 生成的,而 image 也可以由 container 去形成,这里就不再重复了。
-
container资源限制
在前面章节中我们知道 docker 创建的容器是共享物理机资源的,如果不对 container 的资源进行限制,它就会无限制地使用物理机的资源,这样显然是不合适的。
-
查看资源情况
- docker stats tomcat01
- 类似于Linux中的 top 命令
- docker top tomcat01
- 类似于Linux中的 ps -ef | grep tomcat
- docker stats tomcat01
-
内存限制
-
docker run -d --memory 100M --name tomcat01 tomcat
-
限制 tomcat 容器的内存大小为100M
-
-
-
CPU限制
- --cpu-shares
- docker run -d --cpu-shares 1024 --name tomcat02 tomcat
- 设置容器 tomcat02 的权重为1024,默认就是1024
- shares 不能单纯的通过一个容器的share值来看,而是多个在一起对比,比如A和B两个容器,A配置的是1024,B配置的是512,那么A最大可以使用的CPU资源是B的两倍
- 这种配置是有弹性的,如果A容器一直闲着,那B容器是可以使用空闲资源的
- --cpu-period 和 --cpu-quota
- 这两个参数是相互配合使用的,--cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,而--cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟--cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。
- 默认的
完全公平调度
周期是100毫秒。 - docker run -d --cpu-period=50000 --cpu-quota=25000 --name tomcat02 tomcat
- 如果有1个CPU,这意味着容器每50毫秒可以获得50%的CPU运行时间。
- --cpus=0.5 可以达到上面同样的效果,如果设置 --cpus=0.0,则相当于无限制
- --cpuset-cpus
- 设置允许容器执行的CPU。
- docker run -it --cpuset-cpus="0-2" --name tomcat03 tomcat
- 这意味着容器中的进程可以在cpu 1和cpu 3上执行。
- docker run -it --cpuset-cpus="0-2" --name tomcat04 tomcat
- 这意味着容器中的进程可以在cpu 0、cpu 1和cpu 2上执行。
- --cpu-shares
-
图形化资源监控
-
github上也有人已经开发好了,搜索weaveworks/scope
-
sudo curl -L git.io/scope -o /usr/local/bin/scope
-
sudo chmod a+x /usr/local/bin/scope
-
scope launch ip1 ip2
- 可以同时监控多台机器,不过每台机器都需要执行上面相同的命令
-
scope stop 停止scope
-
按照步骤操作即可
image.png
-
-
container常用操作
-
根据镜像创建容器
- docker run -d --name -p 9090:8080 my-tomcat tomcat
-
查看运行中的container
- docker ps
-
查看所有的container[包含退出的]
- docker ps -a
-
删除container
- docker rm containerid
- docker rm -f $(docker ps -a) 删除所有container
-
进入到一个container中
- docker exec -it container bash
-
根据container生成image
- docker build
-
查看某个container的日志
- docker logs container
-
查看容器资源使用情况
- docker stats
-
查看容器详情信息
- docker inspect container
-
停止/启动容器
- docker stop/start container
-
5、 底层技术支持
Container是一种轻量级的虚拟化技术,不用模拟硬件创建虚拟机。
Docker是基于Linux Kernel的Namespace、CGroups、UnionFileSystem等技术封装成的一种自
定义容器格式,从而提供一套虚拟运行环境。
- Namespace:用来做隔离的,比如pid[进程]、net[网络]、mnt[挂载点]等
- CGroups: Controller Groups用来做资源限制,比如内存和CPU等
- Union file systems:用来做image和container分层
网友评论