Docker灵魂探讨


1、docker常见命令的操作

docker pull 拉取镜像

docker run 根据某个镜像创建容器

-d 后台运行

--name 指定要创建容器的名称

-p 将容器的端口映射到宿主机的端口

docker exec -it 进入到某个容器中

docker rmi 删除image

docker ps 查看运行的container

docker rm 删除container

docker ps -a 查看所有的container

2、Image and Container

2.1 深入探讨Image


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

2.1.1 官方image

github.com/docker-libr…

2.1.2 Dockerfile

不妨我们也来制作一个自己的image镜像,顺便学习一下Dockerfile文件中常见语法

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.04

FROM ubuntu:14.04

2.1.2.2 RUN

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

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}

ENV MYSQL_MAJOR 5.7

2.1.2.4 LABEL

设置镜像标签

LABEL email="15828626971@163.com"

LABEL name="dzzgml"

2.1.2.5 VOLUME

指定数据的挂在目录

VOLUME /var/lib/mysql

2.1.2.6 COPY

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

VOLUME /var/lib/mysql

2.1.2.7 ADD

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

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等技术封装成的一种自 定义容器格式,从而提供一套虚拟运行环境。

N

Namespace:用来做隔离的,比如pid[进程]、net[网络]、mnt[挂载点]等

CGroups: Controller Groups用来做资源限制,比如内存和CPU等

Union file systems:用来做image和container分层


前期我也和很多小伙伴一样,到处收集了很多资料,后面发现很多重复的!下面都是自己整理好的!现在BAT梦想成真,我就把资料贡献出来给有需要的人!

顺便求一波关注,哈哈~各位小伙伴关注我后私信【Java】就可以免费领取哒!

作者:dzzgml

链接:https://juejin.im/post/5e1eb1326fb9a02fcf18dce4

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • docker常用命令详解 - CSDN博客 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的...
    Meathill大魔王阅读 810评论 1 2
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,748评论 0 7
  • 1. Docker是什么? Docker是一个用来装应用的容器,就好比用书包来装书,用水杯来装水,你可以把你想到的...
    ce5154e79490阅读 841评论 0 0
  • Docker Image的制作两种方法 方法1 docker commit # 保存 container 的当前状...
    章工运维阅读 951评论 0 0
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,385评论 0 27