docker学习笔记

devops:运维人员会在项目开发期间就介入到开发过程中,了解开发人员使用的系统架构和技术路线,从而制定适当的运维方案。而开发人员也会在运维的初期参与到系统部署中,并提供系统部署的优化建议。


image.png
image.png

DevOps的实施,促进开发和运维人员的沟通,增进彼此的理(gan)解(qing)。

docker 学什么

  • docker概述
  • docker安装
  • docker命令
  • docker镜像!
  • 容器数据卷!!!
  • DockerFile
  • Docker网络原理
  • IDEA整合daocker
  • Docker Compose
  • Docker Swarm(简化版K8S)
  • CI/CD jenkins

docker概述

image.png
docker为什么出现?

项目阶段:开发-上线 两套环境!
应用环境、应用环境
开发 | 运维

问题:我在我电脑上可以运行! 版本更新导致服务不可用!这十分考验运维
解决:开发即运维
吐槽:java后端作为全栈真的累,要会前端,要会后台、要会运维、还要会架构

问题:环境配置麻烦,每一个机器都要部署环境(集群redis、ES、hadoop)部署麻烦,且不能跨平台!!windos,最后发布到linux
发布一个jar很简单,需要的环境(redistribution、nysqk,jdk,ES,tomcat)可能一天都部署不好
传统解决方案:开发人员提供jar,运维来部署
现在解决:发布一个项目(jar + 环境),项目带上环境安装打包。开发部署上线,一套流程做完

docker给上面问题提出了解决方案!
java -> jar => 打包项目带上环境(镜像) =》Docker仓库 =》下载发布的镜像 =》直接运行

docker的思想来自于集装箱
系统上运行多个应用,多个应用之前可能产生冲突(端口冲突、配置冲突...)

docker将应用打包装箱,每个箱子互相隔离

docker的历史

docker为什么火

相比于虚拟机技术,十分的轻巧

聊聊docker
docker是基于go语言开发的,开源项目
官网:https://www.docker.com/
仓库地址:https://registry.hub.docker.com/

docker能做什么

容器化技术
容器化技术不是模拟的一个完整的操作系统
容器之间互相隔离

devOps

  • 更快速的交付和部署(docker打包镜像部署,一键运行)
  • 更便捷的升级和扩缩容
    -更简单的系统运维(使用docker之后,开发测试环境都是高度一致的)
    -更高效的计算资源利用(docker是内核级别的虚拟化,可以在一个物理机上运行很多个容器,高效使用服务齐性能!!)

docker安装

docker的基本组成

image.png
镜像(image)

镜像是一种轻量级、可执行的独立软件包、用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容、包括代码、运行时、库、环境变量和配置文件
所有的应用,直接打包docker镜像,就可以直接运行
如何得到镜像:

  • 从远程仓库拉取
  • 拷贝
    -自己制作一个镜像DockerFile
容器(container)
仓库(repository)

存放镜像的地方
仓库分为共有仓库和私有仓库
docker hub(默认国外)
阿里云等都有容器服务(配置镜像加速)

1. 卸载旧的版版本

$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine

2. 安装yum-utils软件包(提供yum-config-manager实用程序)并设置稳定的存储库。
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo (默认国外的)

##修改为阿里云镜像地址
$ sudo yum-config-manager \
    --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安装docker引擎

更新 yum makecache fast

$ sudo yum install docker-ce docker-ce-cli containerd.io
docker-ce:社区版(推荐使用)
docker-ee:企业版
默认安装最新版本

我安装的版本sudo yum install docker-ce-18.09.3-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io

启动docker、测试

$ sudo systemctl start docker
docker version查看是否安装成功

卸载docker

卸载docker引擎 sudo yum remove docker-ce docker-ce-cli containerd.io 删除docker 镜像,容器,自定义配置文件等: sudo rm -rf /var/lib/docker

阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://3x9xdpne.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker权限配置

通常我们使用Docker的时候都是使用的root,官方说法如下

The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can access it with sudo. For this reason, docker daemon always runs as the root user.
To avoid having to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.

docker序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字是由root用户拥有的,其他用户可以使用sudo访问它。因此,docker守护程序始终以root用户身份运行。为了避免在使用docker命令时必须使用sudo,请创建一个名为docker的Unix组并将用户添加到其中。 docker守护程序启动时,它将使docker组可以读取/写入Unix套接字的所有权。

创建docker组

sudo groupadd docker

将当前用户加入docker组

sudo gpasswd -a ${USER} docker

重启docker服务

sudo service docker restart
或 sudo systemctl restart docker

更新用户组

newgrp docker #更新用户组

docker底层原理

docker怎么工作?
docker是一个CS结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问,dockerServer接收到docker-client的指令,执行命令


image.png

docker为什么比VM快?

  1. docker有比虚拟机更少的抽象层


    image.png
  2. docker利用的是宿主机的内核,VM需要加载Guest OS

docker常用命令

帮助命令

docker version           #显示docker版本信息
docker info              #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help       #帮助命令

帮助文档地址:https://docs.docker.com/reference/

镜像命令

docker images           #查看所有本地主机上的镜像
docker search           #搜索镜像,默认是搜索DockerHub
docker pull                #拉取镜像
docker rmi                #删除镜像
docker rmi -f $(docker images -aq)  #删除全部镜像

容器命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 新建容器并启动
参数说明:
--name="XXX" 容器名字
-d 以后台方式运行
-it 使用交互方式运行,进入容器查看内容
-P 指定容器端口: -p 主机端口:容器端口(常用)
          -P 容器端口
         容器端口
         -p 随机指定端口

docker run -it centos /bin/bash   #启动并进入容器
docker ps   #列出当前正在运行的容器
docker ps  -a  #列出当前正在运行的容器 + 历史运行过的容器
docker ps  -n=?    #显示最近创建的容器
docker rm   容器id #删除容器
docker start 容器id  #启动一个已经创建的容器
docker restart 容器id #重启容器
docker stop 容器id  #停止当前正在运行容器
docker kill 容器id  #强制停止当前容器

常用其他命令

常见的坑:
docker容器使用后台运行,就必须要有前台进程,docker发现没有应用,就会自动停止

docker run -d  镜像名  #docker ps发现容器停止了,
docker logs  -tf --tail n 容器id  #查看容器日志
docker top 容器id[ps options]      #查看容器中的进程信息!!!!!!
docker inspect [OPTIONS] NAME|ID [NAME|ID...]#查看镜像元数据!!!!!!!!!!!!!!!!!!
docker  exec -it 容器id   bashshell  #进入当前正在运行的容器(进入容器后开启一个新的终端)!!!
docker attach 容器id     #进入当前正在运行的容器(进入容器正在执行的终端)!!!
docker cp 容器id:容器内路径   宿主机路径#从容器内拷贝文件到宿主机
docker stats         #查看cpu的状态

小结

image.png

docker可视化

  • portainer
  • ranch(CI/CD使用)!!

portainer

docker图形化界面管理工具
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

docker镜像加载原理

UnionFS(联合文件系统,UFS)

联合文件系统(Union File System):2004年由纽约州立大学石溪分校开发,它可以把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS允许只读和可读写目录并存,就是说可同时删除和增加内容。UnionFS应用的地方很多,比如在多个磁盘分区上合并不同文件系统的主目录,或把几张CD光盘合并成一个统一的光盘目录(归档)。另外,具有写时复制(copy-on-write)功能UnionFS可以把只读和可读写文件系统合并在一起,虚拟上允许只读文件系统的修改可以保存到可写文件系统当中。

docker镜像分层

docker镜像的结构就像花卷一样,是一层一层的,比如tomcat镜像,它有450M左右,但我们实际的tomcat却很小,为什么tomcat镜像那么大呢,是因为,tomcat镜像的最里面是kernel内核,外面的一层是centos镜像,再外面可能是jdk镜像,最外面才是暴露出来的tomcat镜像,所以这么大,docker这么做的好处就是可以实现镜像资源的共享,所有层的镜像都会在本地缓存一份,再次下载相同的镜像的时候,直接拿来使用就可以了。

commit镜像

docker commit    -m="提交的描述细腻些"   -a="作者"  容器id   目标镜像名:[tag]   #提交容器成为一个新的副本

容器数据卷

思考: docker将应用和环境打包成一个镜像,如果数据都在容器中,如果容器删除,数据将会丢失
需求:数据库数据可以存储在本地
解决:容器间可以有一个数据共享的技术。docker容器中产生的数据,同步到本地

这就是卷技术,将容器内的目录,挂载到宿主机上,实现容器的持久化和同步操作,容器间可以实现数据共享

使用数据源

方式一:直接使用命令挂载 -v

docker run -it -v 主机目录:容器内目录
eg:  docker run -it -v ~/docker_practice/v_test:/home --name nginx02 nginx /bin/bash

docker volume inspect ###查看数据卷

具名挂载、匿名挂载

docker run -it -v 容器内目录  --name nginx02 nginx /bin/bash    #匿名挂载


docker run -it -v ${name}:/home --name nginx02 nginx /bin/bash  #具名挂载

所有的docker容器内的卷,没有指定目录的情况下都是在var/lib/docker/volumes/xxx/_data

方式二 使用Dockerfile
Dockerfile用来构建doucker镜像的构建文件,是一个脚本,通过这个脚本,可以生产一个镜像

方式三 数据卷容器 --volumes-from

docker run -it --name  ${name} --volumes-from  容器  镜像

DockerFile

构建步骤

  1. 编写一个dockerfile文件
  2. docker build 构建一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(dockerbub、阿里云镜像、私有仓库)

基础知识
1.每个保留关键字(指令)都必须大写
2.执行从上到下顺序执行
3.#表示注释
每一个指令都会创建提交一个新的镜像层,并提交

image.png
/**
*dockerfile命令
*/
FROM    XXXX    //基础镜像
MAINTAINER     //j镜像作者,姓名+邮箱
RUN                   //镜像构建的时候需要运行的命令
ADD                   //拷贝文件到镜像中
WORKDIR          //镜像的工作目录
VOLUME           //挂载的目录
EXPOSE           //暴露端口
CMD                 //指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT     //指定容器启动的时候要运行的命令,可以追加命令
ONBUILD      //当构建一个被继成的dockerfile,会运行ONBUILD的指令
COPY           //类似ADD命令,将文件拷贝到镜像中
ENV             #构建的时候设置环境变量
image.png

docker build -f xxx -t name:tag .

dockse history 镜像 #查看镜像制作步骤

发布镜像

发布到dockerhub

  1. 注册账号
    2.在我们服务器上提交自己的镜像
    3.登陆 docker login
    4.提交镜像docker push

发布到阿里云镜像
1.登陆阿里云,找到容器镜像服务
2.创建一个命名空间
3.创建一个容器镜像仓库

4.
image.png

docker网络

理解docker0
每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的是evth-pair技术

evth-pair技术
就是一对的虚拟设备接口,一端连着协议,一端彼此相连
evth-pair充当一个桥梁,连接各种虚拟网络设备
openStack,docker容器、ovs的连接,都是使用的evth-pair技术

image.png

docker Compose 容器编排

docker swarm 集群部署

CI/CD jenkins 流水线

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容