Docker

Docker 概述

官网:https://www.docker.com/
文档:https://docs.docker.com/ 文档超级详细
docker github:https://hub.docker.com/ 可以git push git pull 一些自己的镜像
Docker镜像。基于Go语言开发,(运行+环境).来源于集装箱的思想。Docker 的核心思想是隔离。而且Docker可以将服务器利用到极致。

Docker的历史:

2010年dotCloud公司做的。2013年开源。2014年发行Docker1.0版本。

Docker 和Vmware区别:

Docker(几M) 相比vmware (几G)小巧。 都属于虚拟化技术。
虚拟机相当于kernel+lib+app 相当笨重麻烦。步骤复杂。操作系统+软件。
Docker 不是一个完整的操作系统。一个容器崩了,不影响其他的。 容器是运行在宿主上,没有内核。没有虚拟硬件。
DevOps(developer+运维)
Docker 是内核级别的虚拟化。可以在一台物理机上运行很多docker,服务器性能被压榨到极致。

Docker 安装

Docker 的基本组成:


image.png

镜像(image):docker镜像好比一个模版,可以通过这个创建容器。例如tomcat 服务,—>run—>tomcat01容器,提供服务。最终项目运行就是在容器中的。

容器(container):独立运行一个或一组应用。通过镜像来创建。启动,停止,删除基本命令。

可以理解为简易的linux系统。

仓库(repository):存放镜像的地方。分为共有仓库和私有仓库。

安装:
参考官方文档进行对应系统进行安装:
https://docs.docker.com/get-docker/
1.卸载老的版本
2.需要的安装包
3.安装镜像仓库(找阿里云的镜像地址)
4.更新yum 软件包索引:yum makecache fast
5.安装docker 相关 ce 是社区版 ee 是企业版
6.启动docker:systemctl start docker
docker version 查看docker version 判断是否安装成功。
docker run hello-world 如果展现hello from Docker 说明运行成功。
通过docker images 可以查看现有本机镜像。
卸载的话,就是yum remove 依赖,删除目录。rm -fr /var/lib/docker 这是默认工作路径。
systemctl restart docker 重启docker

docker run 的运行原理:

执行docker run 首先判断本机是否有这个镜像,有则使用这个镜像,run,没有则去docker hub 上下载。如果找不到,返回错误。 如果找到就下载到本地。

Docker 工作原理:

docker 是一个client-server 结构。Docker 有一个守护进程,运行在主机上。通过Socket进行客户端访问。

DockerServer 接收Docker-client的命令,就会执行这条命令。

Docker 常用命令:

在帮助文档中查看docker 的命令:https://docs.docker.com/reference/
docker version 显示版本信息
docker info 查看docker 系统信息包含镜像和容器数量
docker —help 帮助命令。万能命令。

镜像命令:
docker images 查看本地所有的镜像,也可以通过docker images —help
REPOSITY 镜像的仓库源
TAG 镜像标签
IMAGE ID 这是镜像的id
CREATE 镜像创建时间
SIZE 镜像大小
--all , -a 列出所有的镜像
--quiet , -q 只显示镜像的id

docker search <name>搜索镜像
docker search mysql —filter=STARS=3000 搜索出来收藏大于3000的
docker pull <name>下载镜像默认拉取最新的。 会进行分层下载。
docker pull mysql 等价于 docker pull docker.io/library/mysql:latest
docker pull mysql:5.7 下载指定版本。
docker rmi -f id 删除指定镜像(remove image)。也可以通过空格删除多个。
docker rmi -f $(docker images -aq) 删除所有的

容器命令:
用docker pull centos 来学习,下载一个centos 的镜像
通过docker run 命令来启动。 也可以通过docer run —help 来查看帮助文档。
--name 起名字tomcat01 tomcat02
-d 后台启动
-i t 使用交互方式进入查看容器。
-p 指定容器端口 -p 8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口。
docker run -it centos /bin/bash 这个就是启动了centos ,并进入容器。
ls centos 就是个小型的os。
exit 是退出。
docker ps 查看运行的容器。
docker ps -a 查看曾经运行过的容器+正在运行的容器。
-n=? 显示最近运行的n个容器。
docker ps -a -n=1 查看1个。
docker ps -aq

退出容器:
ctrl+p+q 容器不停止退出。
exit 容器停止退出。

删除容器:
docker rm -f <容器id>删除指定容器。 这里是强制删除
docker rm -f $(docker ps -aq) 删除所有的容器。

启动 和停止
docker start <容器id> 启动
docker restart <容器id>重启
docker stop <容器id> 停止
docker kill <容器id> 杀掉

后台启动:

docker run -d centos
执行docker ps 发现centos 停止了。如果centos 要后台运行,就必须有一个前台进程。 就会自动停止。
查看日志:
docker logs --help
docker run centos /bin/sh -c “while true; do echo sheik; sleep 1;done”
docker ps
docker logs -tf --tail 10 <容器id>

查看docker 内部的进程信息:
docker top <容器id>

显示容器的信息:
docker inspect <容器的id> 显示容器的所有信息

进入当前正在运行的容器:
dockter exec -it <容器id> /bin/bash 进入后,打开一个新的终端。
docker attach <容器id> 正在执行当前的代码。终端

容器内的数据拷贝到目的主机上:
docker cp <容器id>:/home/test.java /home/

docker run -it --rm tomcat:9.0

--rm 用来测试,用完即删除。

docker pull tomcat

docker run -d -p 3355:8080 tomcat

docker exec <id> /bin/bash

把webapps.disk 中的内容全部copy 到webapps 目录下,可以通过http://localhost:3355/ 进行访问。

可以通过docker stop <id> 进行停止。

通过docker stats 来查看cpu 的状态。

如果硬件太慢,可以通过-e ES_JAVA_OPTS=“-Xms64m -Xmx512m”

curl localhost:3355

Protainer 可视化面板。

分层的原理: 就是记录一次,如果有的,就不会进行下载(pull)相当于UnioFS。

image 镜像层是不会改变的。容器是在镜像层新加了一层。所有操作都在容器层。

commit 自己的镜像

docker commit

docker commit -m=“提交的描述信息” -a=“作者” 容器id 容器镜像名[TAG]

timdeMBP:~ tim$ docker commit -a="sheik" -m="add webapps" 3262514243b0 sheiktomcat:1.0

sha256:0c63aa5e6c0b6aa65bd882585e2fe723a3e6a8bea06a564534450a6f8a1f272b

timdeMBP:~ tim$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

sheiktomcat 1.0 0c63aa5e6c0b 4 seconds ago 673MB. —比下面大了一些。

tomcat 9 266d1269bb29 9 days ago 668MB

tomcat latest 266d1269bb29 9 days ago 668MB

docker/getting-started latest 083d7564d904 2 months ago 28MB

容器数据卷:

将应用以及环境打包成一个镜像。数据不会放到容器中,要进行持久化。这里可以使用挂载技术,把数据保存在linux 或者本地中。也就是容器的同步和持久化技术,数据进行共享。
docker run -it -v
docker run -it -v /Users/Tim/test:/home centos /bin/bash 这个可以挂载多个。 一般用于配置文件修改等。
主机地址 容器内地址
通过dockter inspect 来查看是否挂在成功。 这样其实就可以 让容器和本地保持一个同步。

好处,就是在本地修改,会自动进行同步。即使删掉容器,本地数据也不会丢失。

查看所有卷的情况:docker volume ls

匿名卷 和具名卷:
如果没有指明 本地名,那么就是匿名卷。 如果有名字就是具名卷。
docker run -it -v /Users/Tim/test:/home centos /bin/bash 这就是匿名挂载
docker run -it -v centos:/home centos /bin/bash 这就是具名centos挂载(常用)
-v 容器内路径 匿名挂载
-v 名称:容器内路径。具名挂载
-v 宿主机路径:容器内路径。指定路径挂载

如果没有指定目录,可以通过docker inspect 来查看, 一般来讲都会存在var/lib/docker/volumes/ 路径下

还有 容器内路径的权限限定。ro 只读 rw读写
docker run -it -v /Users/Tim/test:/home:ro centos /bin/bash
docker run -it -v /Users/Tim/test:/home:rw centos /bin/bash

docker File:

用来构建docker镜像文件创建。里面就是一些脚本命令。
1.首先在本地建一个路径。
2.在路径下创建一个文件,写脚本:指令+参数构成。指令都是大写。
FROM centos // 从哪里来的
MAINTAINER sheik111@163.com
ENV MYPATH /usr/local
WORKDIR $MYPATH
VOLUME (“volume1”, “volume2”)// 挂载的数据卷目录
RUN yum -y install vim
RUN yum -y net -toos
CMD echo “_____end____”
CMD /bin/bash

然后执行 docker build -f /home/**/刚才创建的文件 -t 镜像名称 当前路径

通过这种方式进行直接进行挂载。如果没有挂载,后面就通过-v 进行挂载。

数据卷容器: 容器和容器进行同步。

--volumes-from 容器2 数据卷容器(容器1)
docker run —name 01 -it 容器1id
docker run —name 02 —volume-from 01 -it 容器1id 这样就实现了两个容器的同步

Dockerfile:

1.编写dockerfile 文件。
2.docker build
3.docker run
4.docker pull 发布
Docker file 命令:
FROM #基础镜像 一切都从这里构建。
MAINTAINER #谁写的,谁维护 一般是姓名+ 邮箱
RUN #构建的时候,需要运行的命令。
ADD # 添加组件,添加内容,自动解压
WORKDIR #工作目录
VOLUME #挂载目录
EXPOSE #暴露端口 -p 同理
CMD #指令,指定容器运行的命令。 替换。 只执行最后一个CMD。 docker run id -l ,那么-l 会替换CMD中的内容
ENTRYPOINT:#可以追加命令。 追加
ONBUILD:#当一个继承dockerfile的时候会被调用。
COPY:#类似add 命令。 文件copy到镜像中。
ENV:#设置环境变量。

Centos的dockfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL
org.label-schema.schema-version="1.0"
org.label-schema.name="CentOS Base Image"
org.label-schema.vendor="CentOS"
org.label-schema.license="GPLv2"
org.label-schema.build-date="20201113"
org.opencontainers.image.title="CentOS Base Image"
org.opencontainers.image.vendor="CentOS"
org.opencontainers.image.licenses="GPL-2.0-only"
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"]

hub.docker 99%的镜像都是从基础scratch开始的。

通过docker history 可以查看到某个docker 的构建步骤。

也可以通过压缩包进行构建镜像。例如制作tomcat,那么需要tomcat 压缩包和jdk 压缩包。
创建Dockerfile ,这是官方推荐命名。
ADD 都会自动解压。
设置环境变量。
暴露端口等。

发布镜像到dockerhub:

1.注册账号
2.账号可以登录
3.在服务器上提交。
首先要登录:
docker login -u * -p * 登录
docker logout 退出登录
docker push 作者名字/容器名字:version
通过docker tag 容器id 然后是新的TAG 名字。
例如:docker tag id aaaa:1.0

发布到阿里云镜像:

1.登录到阿里云
2.找到容器镜像服务。
3.创建命名空间。 指的是一个大项目。
4.创建镜像。
在阿里云界面会有各种上传/拉取的命令。

docker 网络:路由

docker0:docker 地址
lo:本机回环地址。
etho:公网地址

docker 如何处理网络访问的:
Linux 可以直接ping 通docker 的ip 地址。
root@be594b83e415:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
link/tunnel6 :: brd ::
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft foreve

每启动一个容器,docker 就会给每一个容器分配一个ip,我们只要安装了docker,就会有一个docker0的网卡桥接模式。
使用的是evth-pair技术。
evth-pair 是连接网络虚拟设备的。
容器间也可以ping 通。 这种通信不是直接连接。而是通过docker0的evth-pair 技术,到docker0之后,再到容器2.

--link 解决ip地址变化,导致无法通信的问题。

通过名称无法ping 通
docker exec -it —name tomcat02 ping tomcat01

可以通过下面方式进行连接:
docker run -d -P —name tomcat03 —link tomcat02 tomcat
这时就可以ping 通
docker exec -it tomcat03 ping tomcat02
反向不可以ping 通
docker exec -it tomcat02 ping tomcat03

因为一旦用 --link之后,进入tomcat03的/etc/hosts 文件会写tomcat02的配置进去。
如果需要相互访问,那么就要启动相互绑定,但是要进行重启。

自定义网络:

使用docker network ls 查看所有的docker 网络。
timdeMBP:~ timdocker network ls NETWORK ID NAME DRIVER SCOPE 1ed681fdec45 bridge bridge local bb658ada48bd host host local 56d64f32a033 none null local timdeMBP:~ tim

bridge 桥接模式(默认)。
none 不配置网络
host 主机模式,和主机共享网络。

timdeMBP:~ tim$ docker network --hlep
unknown flag: --hlep
See 'docker network --help'.

Usage: docker network COMMAND

Manage networks

Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.

创建自定义网络: 都已经创建好了各个容器对应关系。
docker network create --driver bridge --subnet 192.168.0.0 --gateway 192.168.0.1 mynet

docker network inspect mynet

启动容器的时候是: 这个时候就可以ping 通。
docker run -d -P --name tomcat01 --net mynet tomcat
docker run -d -P --name tomcat02 --net mynet tomcat
docker exec -it tomcat01 ping tomcat02
docker exec -it tomcat02 ping tomcat01

好处:不同的集群使用不同的网络

网络联通:

Docker0 和mynet 两个网络。
使用connect 命令。 基本原理是:把容器直接放到mynet 下,相当于一个容器两个ip,一个公网,一个私网。
docker network connect mynet tomcat01

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

推荐阅读更多精彩内容

  • docker的常用命令 docker version #显示docker的版本信息 docker info ...
    MrH_永无BUG阅读 214评论 0 2
  • 本文主要转载自:docker常用命令详解本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节...
    YDDMAX_Y阅读 191评论 1 0
  • 官方镜像仓库 https://hub.docker.com/ Windows10 docker 连接已有私有仓库...
    盆栽酱阅读 198评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,030评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 6,870评论 0 2