Docker灵魂探讨

一、docker常见命令的操做

docker pull	拉取镜像
docker run	根据某个镜像建立容器
-d		后台运行
--name		指定要建立容器的名称
-p		将容器的端口映射到宿主机的端口
docker exec -it 	进入到某个容器中
docker rmi 	删除image
docker ps		查看运行的container	
docker rm		删除container 
docker ps -a 查看全部的container
复制代码

二、Image and Container

2.1 深刻探讨Image

说白了,image就是由一层一层的layer组成的。

2.1.1 官方image

github.com/docker-libr…java

2.1.2 Dockerfile

不妨咱们也来制做一个本身的image镜像,顺便学习一下Dockerfile文件中常见语法mysql

MAINTAINER mouliu
LABEL name="dockerfile-demo" version="1.0" author="mouliu"
COPY cechealth-daq-worker-hospif-1.0-SNAPSHOT.jar dockerfile-image.jar
CMD ["java","-jar","dockerfile-image.jar"]
复制代码
2.1.2.1 FROM

指定基础镜像,好比FROM ubuntu:14.04git

FROM ubuntu:14.04
复制代码
2.1.2.2 RUN

在镜像内部执行一些命令,好比安装软件,配置环境等,换行可使用github

RUN groupadd -r mysql && useradd -r -g mysql mysql
复制代码
2.1.2.3 ENV

设置变量的值,ENV MYSQL_MA JOR 5.7,能够经过docker run --e key=value修改,后面能够直接使 用${MYSQL_MA JOR}sql

ENV MYSQL_MAJOR 5.7
复制代码
2.1.2.4 LABEL

设置镜像标签docker

LABEL email="15828626971@163.com"
LABEL name="dzzgml"
复制代码
2.1.2.5 VOLUME

指定数据的挂在目录ubuntu

VOLUME /var/lib/mysql
复制代码
2.1.2.6 COPY

将主机的文件复制到镜像内,若是目录不存在,会自动建立所须要的目录,注意只是复制,不会提取和 解压vim

COPY docker-entrypoint.sh /usr/local/bin/
复制代码
2.1.2.7 ADD

将主机的文件复制到镜像内,和COPY相似,只是ADD会对压缩文件提取和解压centos

ADD application.yml /etc/dzzgml/
复制代码
2.1.2.8 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文件

2.1.2.9 CMD

容器启动的时候默认会执行的命令,如有多个CMD命令,则最后一个生效

CMD ["mysqld"] 或
CMD mysqld
复制代码
2.1.2.10 ENTRYPOINT

和CMD的使用相似

ENTRYPOINT ["docker-entrypoint.sh"]
复制代码

和CMD的不一样 docker run执行时,会覆盖CMD的命令,而ENTRYPOINT不会

2.1.2.11 EXPOSE

指定镜像要暴露的端口,启动镜像时,可使用-p将该端口映射给宿主机

EXPOSE 3306
复制代码
2.1.3 Dockerfile实战Spring Boot项目
(1)建立一个Spring Boot项目
(2)写一个controller @RestController
    public class DockerController {
        @GetMapping("/dockerfile")
        @ResponseBody
        String dockerfile() {
            return "hello docker" ;
        }
}
(3)mvn clean package打成一个jar包
在target下找到"dockerfile-demo-0.0.1-SNAPSHOT.jar" (4)在docker环境中新建一个目录"first-dockerfile" (5)上传"dockerfile-demo-0.0.1-SNAPSHOT.jar"到该目录下,而且在此目录建立Dockerfile
(6)建立Dockerfile文件,编写内容 FROM openjdk:8
    MAINTAINER itcrazy2016
    LABEL name="dockerfile-demo" version="1.0" author="itcrazy2016"
    COPY dockerfile-demo-0.0.1-SNAPSHOT.jar dockerfile-image.jar
    CMD ["java","-jar","dockerfile-image.jar"]
(7)基于Dockerfile构建镜像
docker build -t test-docker-image .
(8)基于image建立container
docker run -d --name user01 -p 6666:8080 test-docker-image
(9)查看启动日志docker logs user01 (10)宿主机上访问curl localhost:6666/dockerfile
hello docker
(11)还能够再次启动一个
docker run -d --name user02 -p 8081:8080 test-docker-image
复制代码
2.1.4 镜像仓库
2.1.4.1 docker hub

hub.docker.com

(1)在docker机器上登陆 docker login
(2)输入用户名和密码
(3)docker push itcrazy2018/test-docker-image
[注意镜像名称要和docker id一致,否则push不成功]
(4)给image重命名,并删除掉原来的
docker tag test-docker-image itcrazy2018/test-docker-image docker rmi -f test-docker-image
(5)再次推送,刷新hub.docker.com后台,发现成功
(6)别人下载,而且运行
docker pull itcrazy2018/test-docker-image
docker run -d --name user01 -p 6661:8080 itcrazy2018/test-docker-image
复制代码
2.1.4.2 阿里云docker hub

阿里云docker仓库 cr.console.aliyun.com/cn-hangzhou… 参考手册 cr.console.aliyun.com/repository/…

(1)登陆到阿里云docker仓库
sudo docker login --username=itcrazy2016@163.com registry.cn- hangzhou.aliyuncs.com
(2)输入密码 (3)建立命名空间,好比itcrazy2016
(4)给image打tag
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test- docker-image:v1.0
(5)推送镜像到docker阿里云仓库
sudo docker push registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test-docker- image:v1.0
(6)别人下载,而且运行
docker pull registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test-docker-
image:v1.0
    docker run -d --name user01 -p 6661:8080 registry.cn-
hangzhou.aliyuncs.com/itcrazy2016/test-docker-image:v1.0
复制代码
2.1.4.3 搭建本身的Docker Harbor
(1)访问github上的harbor项目
https://github.com/goharbor/harbor
(2)下载版本,好比1.7.1 https://github.com/goharbor/harbor/releases
(3)找一台安装了docker-compose[这个后面的课程会讲解],上传并解压 tar -zxvf xxx.tar.gz
(4)进入到harbor目录 修改harbor.cfg文件,主要是ip地址的修改为当前机器的ip地址 同时也能够看到Harbor的密码,默认是Harbor12345
(5)安装harbor,须要一些时间 sh install.sh
(6)浏览器访问,好比39.100.39.63,输入用户名和密码便可
复制代码

2.2 深刻探讨Container

既然container是由image运行起来的,那么是否能够理解为container和image有某种关系?

理解 :其实能够理解为container只是基于image以后的layer而已,也就是能够经过docker run image 建立出一个container出来。

2.2.1 container到image

既然container是基于image之上的,想一想是否可以由一个container反推出image呢? 确定是能够的,好比经过docker run运行起一个container出来,这时候对container对一些修 改,而后再生成一个新的image,这时候image的由来就不只仅只能经过Dockerfile咯。

(1)拉取一个centos image docker pull centos
(2)根据centos镜像建立出一个container
docker run -d -it --name my-centos centos
(3)进入my-centos容器中
docker exec -it my-centos bash
(4)输入vim命令
bash: vim: command not found
(5)咱们要作的是 对该container进行修改,也就是安装一下vim命令,而后将其生成一个新的centos
(6)在centos的container中安装vim yum install -y vim
(7)退出容器,将其生成一个新的centos,名称为"vim-centos-image" docker commit my-centos vim-centos-image
(8)查看镜像列表,而且基于"vim-centos-image"建立新的容器
docker run -d -it --name my-vim-centos vim-centos-image
(9)进入到my-vim-centos容器中,检查vim命令是否存在 docker exec -it my-vim-centos bash
vim
复制代码

能够经过docker commit命令基于一个container从新生成一个image,可是通常获得image的 方式不建议这么作,否则image怎么来的就全然不知咯

2.2.2 container资源限制

若是不对container的资源作限制,它就会无限制地使用物理机的资源,这样显然是不合适的。 查看资源状况 :docker stats

2.2.2.1 内存限制
--memory Memory limit
若是不设置 --memory-swap,其大小和memory同样
docker run -d --memory 100M --name tomcat1 tomcat
复制代码
2.2.2.2 CPU限制
--cpu-shares 权重
docker run -d --cpu-shares 10 --name tomcat2 tomcat
复制代码
2.2.2.3 图形化资源监控

github.com/weaveworks/…

sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod a+x /usr/local/bin/scope
scope launch 39.100.39.63

# 中止scope scope stop
# 同时监控两台机器,在两台机器中分别执行以下命令
scope launch ip1 ip2
复制代码
2.2.3 container常见操做
(1)根据镜像建立容器
docker run -d --name -p 9090:8080 my-tomcat tomcat
(2)查看运行中的container docker ps
(3)查看全部的container[包含退出的] docker ps -a
(4)删除container
docker rm containerid docker rm -f $(docker ps -a)
(5)进入到一个container中
docker exec -it container bash
(6)根据container生成image docker
(7)查看某个container的日志 docker logs container
(8)查看容器资源使用状况 docker stats
(9)查看容器详情信息
docker inspect container
(10)中止/启动容器
docker stop/start container
复制代码
2.3 底层技术支持

Container是一种轻量级的虚拟化技术,不用模拟硬件建立虚拟机。 Docker是基于Linux Kernel的Namespace、CGroups、UnionFileSystem等技术封装成的一种自 定义容器格式,从而提供一套虚拟运行环境。

Namespace:用来作隔离的,好比pid[进程]、net[网络]、mnt[挂载点]等
CGroups: Controller Groups用来作资源限制,好比内存和CPU等
Union file systems:用来作image和container分层
复制代码