Docker基础——从入门到精通
docker client
docker daemon
docker images
docker containers
镜像:创建容器所使用的模板,存放在镜像仓库中。
kvm是虚拟出来的虚拟机,也就是整个操作系统,使用起来比较复杂,启动的过程也相对较慢,模板文件较大。
但是虚拟出来的系统和物理完全隔离,虚拟的完整的系统,可以登录并实现管理。
仅仅是虚拟出来一部分用户空间,不方便管理。
快速部署、实现隔离、一个主机可以运行多个容器、提高开发的效率
简化配置过程,实现软件的跨平台。
docker的部署:
阿里mirros上找到docker-ce.repo的yum源,并下载。
然后执行yum install docker-ce -y
然后在docker配置阿里的镜像加速,然后启动docker的后台进程。
docker image ls
docker pull busybox
docker image history busybox
docker image history busybox --no-trunc
docker image save busybox > busybox.tar
docker image save busybox:1.31.0 -o busybox.tar
docker image rm busybox
docker image rm busybox:1.31.0
docker image load < busybox.tar
docker image load -i busybox.tar
docker image inspect busybox
docker image prune
docker image prune -f
docker iamge tag busybox:1.31.1 ken:v1
push —— 镜像仓库
import —— 基于容器来制作image
docker run -d nginx
docker ps
docker ps --no-trunc
docker inspect container-name
docker -v
docker对内核的要求较高,内核版本至少3.8以上,uname -r查看内核版本。
export导出的镜像使用import导入时,在run的时候,需要手动输入后台要一直运行的命令,如:
docker run -d nginx sh ,否则会闪退,因为docker是执行完所有要执行的命令就会自动退出。
docker run -d --name nginx nginx
docker ps —— docker container ls
docker stop container-name
docker ps -qa
docker ps -a
docker stop $(docker ps -qa)
docker rm $(docker ps -qa)
docker rm cotainer-id #无法删除正在运行的容器
docker rm -f cotainer-id #可以-f强制删除
docker run -d --name nginx --rm nginx
docker start container-id
docker kill container-id
docker pause container-id
docker unpause container-id
docker logs nginx
docker logs nginx -f
docker stats nginx #查看容器的cpu,mem,netio等
docker top nginx #查看uid pid等
docker inspect nginx
docker wait nginx #打印退出返回码
docker container prune -f #删除已经停掉的容器。
docker exec nginx touch ken
docker exec nginx ls /
docker exec -it nginx sh
docker exec -it nginx bash
docker attach nginx #容器会自动退出
docker run -it busybox #执行完命令自动就退出了。
docker exec busybox ip a
docker history nginx
docker diff nginx #告诉你哪些文件被改动了
docker cp nginx:/test.txt .
docker cp test.txt nginx:/
docker exec nginx ls /
-p -P
实现了外部网络访问内部容器的服务
-P:容器端口映射为宿主机的一个随机端口
-p:容器端口映射为宿主机的一个特定端口、特定网卡上的随机端口、特定网卡上的特定端口。
多个端口使用多个-p来进行特定端口或者特定网卡的映射。
docker run -P -d nginx
docker port container-id
docker run -d -p 80:80 nginx
docker run -d -p 192.168.27.20::80 nginx
docker run -d -p 192.168.27.20:81:80 nginx
docker rm -f container-id
commit制作镜像
dockerfile 制作镜像
tar包制作镜像
为了保持数据的一致性,在使用commit制作镜像的时候,加上-p,commit制作的镜像实际上是保存了写入的内容。
docker image ls
直接从容器到镜像的制作方式。
docker run -d ken:v1
docker run -it ken:v2 cat test1
image —— image : save load
cotainer—— image : export import #注意没有后台执行的CMD
tar -xf ngnix.tar #会发现实际上就是容器
docker image ls
docker run -d ken:v3 bash
docker history nginx
使用dockerfile制作的镜像里面的每一行就是申明镜像的每层内容。
通过docker history nginx 可以看到一层层的内容。
编写的注意事项:#——表示注释 第一个非注释行一定要是FROM指令
编写dockerfile必须在一个目录下进行,这个目录就是dockerfile的工作目录
Dockerfile的文件名的首字母必须是大写:Dockerfile
制作镜像所要使用的文件必须放在工作目录之下,或者工作目录的子目录下面,不能放到其他目录之中。
基于dockerfile制作镜像本质上还是基于现有镜像去制作镜像。
可以通过隐藏文件.dockerignore来指定不要放到镜像中的文件,一行是一个文件。
FROM nginx:latest
LABLE author ken
ENV name=ken age=22
ENV school kkk #这样只能声明一个变量
RUN yum install nginx -y;systemctl restart nginx \
mkdir ken \
touch test
RUN yum install ngnix -y && systemctl restart nginx
COPY src dest
COPY ["src","dest"]
COPY test.txt /usr/share/nginx/html/
源文件使用相对路径,目标一边使用绝对路径。可以使用统配符,但是源文件必须要在工作目录或其子目录当中。
目标路径可以不存在,会自从创建,所以要注意你的路径。
如果源文件是目录,那么会递归复制其下的内容,而源文件的目录本身并不会被复制。
如果复制了多个文件,或者使用了通配符,那么目标路径的目录必须要以/结尾。
ADD——复制文件,可以自动解压tar包文件,可以在网络上下载文件,下载的是tar包则不可以解压。
ADD https://xxxxxxx /date/
ADD ken.tar /date/
WORKDIR /usr/share/nginx/html/ #声明工作目录
EXPOSE 80 3306 #声明暴露的端口,只是什么而已,要真正暴露需要-p -P来实现。
VOLUME /var/lib/mysql #声明数据卷的位置,如果不映射,那么会自动挂载到宿主机的一个随机目录。
ONBUILD CMD ADD https:xxxx #其他人在使用该镜像制作新镜像的时候会触发的动作
docker history nginx
CMD ["touch","test"]
CMD ["test1","test2"]
ENTRYPOINT touch test
ENTRYPOINT ["touch","test"]
ENTRYPOINT ["touch"]
docker history registry
私有仓库就是公司保存公司做的镜像的地方:
docker image load < registry.tar
docker run -d -p 5000:5000 -v /registry:/var/lib/registry registry
要推送至私有仓库,需要首先tag打上标签。
docker image tag test1:v1 192.168.64.15:5000/test1:v2
然后更改/etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
docker push 192.168.64.15:5000/test1:v2
其他客户端拉取:
docker pull 192.168.64.15:5000/test1:v2
docker image tag 192.168.64.15:5000/test1:v2 test1:v2
cgroup——资源限额,全称control group ,liunx系统通过设置进程使用cpu,mem和io资源的限额。
namespace——实现资源隔离
docker ps
docker stats container-id
CPU MEM I/O
docker update -m 64M container-id
/sys/fs/cgroup
liunx实现这种方式的技术就是namespace,namespace管理着host中全局唯一的资源,并可以让每一个容器都觉得只有自己在使用它,
也就是说namespace实现了容器之间的资源隔离。
Mount —— mount namespace 让容器看上去拥有整个文件系统。容器有自己的/,可以mount 和 umount ,当然这些只是在当前容器中
生效,不会影响到host和其他容器。
UTS UTS namespace 让容器有自己的hostname,默认情况下容器的hostaname是容器的短id,可以通过-h或者--hostname参数设置。
docker run -it -h ken busybox sh
查看hostname
docker run -it --privileged busybox sh
在容器里面更改hostname
PID PID namespace:容器在host当中以进程的形式运行,容器内的pid 不同于host中对应的pid,容器中的1号进程也不是systemd,
也就是说容器拥有一套独立的pid
Network network namespace:让容器拥有独立的网卡,ip,路由等资源。
User user namespace:让容器能够管理自己的用户,host不能看到容器创建的用户。
新的镜像是从base镜像中一层层叠加生成的,每安装一个软件,就在原有的镜像上叠加一层。
最大的好处之一就是共享资源。如:如果多个镜像是从一个基础镜像中的来的,那么docker host只需要在磁盘上保存一份base镜像,
同时内存中加载一份base镜像,就可以为所有的镜像服务了,而且镜像的每一层都可以被共享。
答案是不会!修改被限制在单个的容器里。
这就是容器的copy-on-write特性。
当一个容器被启动时,一个新的可写层就被加载到了镜像的顶部。这一层通常叫做容器层,其下的叫做镜像层。
docker history httpd —— 查看iamge的历史创建信息。
历史构建信息中有VOLUME,如果不指定-v映射那么默认会自己映射host的随机卷。
指定的容器路径(/usr/share/nginx/html/)如果不存在,那么默认会自动创建。
docker run -it -v /test busybox
容器中/test 随机映射到/var/lib/docker/volumes/下的一个随机目录,使用docker inspect container-id
docker volume ls —— 查看volume
docker volume ls
docker volume rm volume-name
docker volume ls | grep xxxx
在删除容器的时候删除卷:
docker rm -f -v cotainer-id
正在使用的卷,默认是删除不掉的。
docker volume rm $(docker volume ls -q)
docker run -d -p 80:80 -v /ken:/usr/local/apache2/htdocs httpd
docker run -d -p 81:80 --volumes-from container-id httpd
两个端口访问是一样的。
docker image load < mysql.tar
docker run -d -p 3306:3306 mysql
发现起不来,起来之后就推出了。
查看日志:
docker logs container-id
docker run -d -p 3306:3306 -v /mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql
docker network ls #默认三种网络,host none bridge
docekr run -it --network=none busybox #只有本地lo地址
docker run -it --network=host busybox #共享了host的网络,打通了容器和宿主机的network namespace 和 hostname
host网络模式下需要注意和host主机的port冲突问题。
bridge——这也是docker默认使用的网络模式。
docker run -it --network=bridge busybox 相当于 docker run -it busybox
默认使用相同网络模式的容器的ip 在同一个网段:
docker network inspect bridge
会发现宿主机的docker0网卡是容器docker桥接模式的gateway
host bridge——能通外网,none——不能通外网
docker network create -d bridge ken
docker run -it --network=ken busybox
同样能通外网,为什么?
docker network inspect ken
docker network create -d bridge --subnet 10.0.0.0/24 --gateway=10.0.0.1 ken1
docker run -it --network=ken1 busybox
docker run -it --network=ken1 --ip=10.0.0.5 busybox
获取特定的ip需要自定义网络才能实现。
自定义网段,自定义ip均可以通外网。
1、通过ip地址,相同网段。
2、通过DNS
3、通过join通信
相当于添加一块网卡,加入到ken网络。
docker network disconnect ken container-id
相当于卸载一张网卡。
使用这种方法需要给容器指定容器名。
docker run -it --name a1 --network=ken1 busybox
docker run -it --name a2 --network=ken1 busybox
但是docker 的自带网络是无法通过DNS通信的,如果你自定义的网络也不能通过DNS进行通信的话,这也是正常的,有些硬件的却不支持。
一个容器使用另外一个容器的network namespace
docker run -it --name:b2 busybox
docker run -it --network=container:b2 busybox
两个容器使用的是同一个network namespace
joined通信非常适合以下场景:
1、不同容器程序希望通过loopback高效快速通信。如web server 和app server
2、希望监控其他容器的网络流量,如运行在独立容器里的网络监控程序。
总体来讲是使用了NAT技术,进行了网络地址转换。
首先在host上查看网桥信息:
brctl show
发现docker0网卡上有一个vethbxxxxx
这个vethbxxxx在宿主机的网上能够看到,通过ip a,发现有一个vethbxxxxx@ifxx
进入容器查看ip : eth0@ifxx
也就是说容器已经连接到了docker0这张网卡上了,那么docker0是怎么访问外网的呢?实际上就是通过iptables进行转发。
iptables -t nat -S
其中有一条规则会将来自容器的流量,只要通过docker0就会对其进行伪装,将其转换为自己的网卡。
ip r ——可以看到自己宿主机的网卡通过哪个网关去访问外网。
yum install tcpdump -y
tcpdump -i docker0 -n icmp —— 发现是来自容器的ip访问外网,到这里会被伪装。
tcpdump -i ens33 -n icmp —— 发现变成了自己的ens33的ip去访问外网。
实际上容器的端口映射-p也是通过iptables实现的,做了一个DNAT。
容器自带的三个监控命令:ps top stats logs
weave scope监控容器
weave scope的最大特点就是能够生成一张docker容器地图,能够让人直观地理解、监控和控制容器,也是个人比较喜欢的监控软件。
安装weave scope:
curl -L git.io/scope -o /usr/local/bin/scope
chmod a+x /usr/local/bin/scope
scope launch
浏览器访问即可实现监控。
如果有多台主机需要监控:
在要监控的主机上每台均执行:scope launch ip1 ip2 ....
#前提是要在每台主机上执行:
#curl -L git.io/scope -o /usr/local/bin/scope
#chmod a+x /usr/local/bin/scope
#并且要删掉之前的运行的weave scope容器
那么就会监控你的多台主机上的容器情况了。
Docker基础——从入门到精通的更多相关文章
- [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)
linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...
- Docker 基础篇 入门篇
1.Docker入门 1.为什么要用docker? 相比于传统: 部署非常慢 成本非常高 资源浪费 难于迁移和扩展 可能会被限定硬件厂商 由于物理机的诸多问题,后来出现了虚拟机 一个物理机可以部署多个 ...
- linux常用命令大全(linux基础命令入门到精通+命令备忘录+面试复习+实例)
作者:蓝藻(罗蓝国度) 创建时间:2018.7.3 编辑时间:2019.4.29 前言 本文特点 授之以渔:了解命令学习方法.用途:不再死记硬背,拒绝漫无目的: 准确无误:所有命令执行通过(环境为ce ...
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述 PV操作是对信号量进行的操作. 进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...
- 【UML】NO.70.EBook.9.UML.4.001-【PowerDesigner 16 从入门到精通】- 基础概念
1.0.0 Summary Tittle:[UML]NO.70.EBook.9.UML.4.001-[PowerDesigner 16 从入门到精通]- 基础概念 Style:DesignPatte ...
- Docker基础入门
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- 大神教你零基础学PS,30堂课从入门到精通
ps视频教程,ps自学视频教程.ps免费视频教程下载,大神教你零基础学PS教程视频内容较大,分为俩部分: 大神教你零基础学PS--30堂课从入门到精通第一部分:百度网盘,https://pan.bai ...
- 小白学 Python 爬虫(4):前置准备(三)Docker基础入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- Python基础知识详解 从入门到精通(七)类与对象
本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...
随机推荐
- 【网摘自CSDN网站】当文本内容过多,展开更多 (css控制,)
<div class="more"><p class="btn">显示全部内容</p></div> .more ...
- 当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in position 38: invalid continuation by
1.windows中安装虚拟环境virtualenv时, 当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in po ...
- oracle 高级函数2
原 oracle 高级函数 2017年08月17日 16:44:19 阅读数:1731 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013278 ...
- VS2019 发布单文件
在项目.csproj文件下添加 <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework&g ...
- Spring Boot Security JWT 整合实现前后端分离认证示例
前面两章节我们介绍了 Spring Boot Security 快速入门 和 Spring Boot JWT 快速入门,本章节使用 JWT 和 Spring Boot Security 构件一个前后端 ...
- vue配置、创建项目及运行
首先安装Node.js, npm i -g cnpm --registry=https://registry.npm.taobao.org 安装镜像 安装以后cnpm可以代替npm cnpm i -g ...
- springcloud gateway nullpointerexception (NettyRoutingFilter)
最近在做一个下载功能时,发现直接调用服务是可以下载的,但是通过gateway路由下载会报NPE异常,具体如下 java.lang.NullPointerException: null at java. ...
- 设计模式课程 设计模式精讲 8-10 单例设计模式-ThreadLocal线程单例
1 课程讲解 1.1 应用场景 2 代码演练 2.1 threadLocal应用 1 课程讲解 1.1 应用场景 多线程的时候: 使用同步锁使用时间换空间的方式,(线程排队时间比较长) 而使用thre ...
- uniGUI之MainModule(12)
1]必须设置. 一个 user 一个, 在此放数据库控件是各 user 独立 2]常用属性: 应用 MainModule 正确的方法是将连接组件放置在 MainModule 上, 并将数据集放在窗体 ...
- 无线冲方案 WPC Qi v1.2.4 update
参考: 1. Qi标准v1.2.4最新版 2. Qi Baseline Power Profile (BPP) and Extended Power Profile (EPP) Wireless Ch ...