Docker核心概念

⚡️镜像Image
联合文件系统:
镜像的基础是联合文件系统 (UnionFS) ;
这个联合文件系统我们可以简单的理解为把多个目录挂载到一个目录下;
这里创建 A 和 B 以及 C 三个目录;
A 目录下有 a.txt 文件和 z.txt 文件;
B 目录下有 b.txt 文件和 z.txt 文件;
C 目录下是空的;

|-- A
|   |-- a.txt
|   `-- z.txt
|-- B
|   |-- b.txt
|   `-- z.txt
`-- C

那联合文件系统就可以实现把 a.txt 、 b.txt 、 z.txt 挂载到 C 目录下;
这里是使用的 Linux 的 mount 命令;

sudo mount -t aufs -o dirs=./A:./B none ./C

-t aufs:使用AUFS文件系统
-o dir=./A:.B/:把目录A和目录B联合在一起:后面可以跟读写权限,比如./A:rw:
none:不需要设备
./C:将前面的目录联合到C目录下
执行命令后的效果是这样:

|-- A
|   |-- a.txt
|   `-- z.txt
|-- B
|   |-- b.txt
|   `-- z.txt
`-- C
    |-- a.txt
    |-- b.txt
    `-- z.txt

当我们修改 C 目录下的 a.txt 的时候就相当于修改 A 目录下的 a.txt 文件;
a.txt 和 b.txt 还好理解点;
那这个A 和 B 目录下都有的 z.txt 怎么样呢?
实际上如果我们修改了 C 目录下的 z.txt 文件;
只有 A 目录下的 z.txt 文件会被改变;
B 目录下的 z.txt 文件并没有变动;
原因是 mount 如果没有指定权限的时候默认最左边的目录可读写;
后面的目录都是只读的;
这样我们可以引申出层的概念;
就是把文件分为只读、以及读写的层;
我们可以一层一层的加东西了;
这就有点 Git 的 commit 的感觉了;
好了;上面这些作为了解即可;
下面进入主题 Docker .
常用命令:

#拉取镜像(不指定版本则拉取latest版)
docker pull ubuntu
#拉取镜像(指定版本)
docker pull ubuntu:19.04
#列出镜像列表
docker images
#删除镜像(指定IMAGE ID)
docker rmi cfccdd3336ca3
#删除镜像(使用REPOSITORY + TAG)
docker rmi ubuntu:latest

Docker与联合文件系统:
早期的Docker使用的AUFS,16.04以后的版本已经换成overlay2,docker pull成功拉取的镜像存储在/var/lib/docker/overlay2目录,这里面的目录最终会通过联合文件系统合并成一个Ubuntu.


⚡️容器Container
容器就是镜像的一个运行实例.
启动容器
拉取的Ubuntu镜像,现在来启动一个容器:

docker run -i -t ubuntu /bin/bash

-i:让容器标准输入保持打开
-t:让容器分配一个伪终端
如此就进入到一个ubuntu系统中,执行exit可以退出容器.
如果不想退出容器,让容器保持后台运行可以使用-d参数.

docker run -dit ubuntu

可以明显感觉到启动一个容器比启动一个虚拟机容易方便太多了.
查看容器

#查看正在运行的容器
docker ps
#查看所有的容器(包括正在运行或者已退出的)
docker ps -a

退出容器

#停止正在运行的容器
docker stop CONTAINER ID

启动处于终止的容器

docker start CONTAINER ID

进入容器

#进入到正在运行的容器中
docker exec -it CONTAINER ID /bin/bash

删除容器

docker rm CONTAINER ID
#如果容器正在运行中,可以增加-f强制删除
docker rm -f CONTAINER ID

⚡️仓库Repository
Docker Hub
仓库是用来存放发布镜像的地方,Docker官方提供了仓库服务Docker Hub,docker pull拉取的镜像就是从Docker Hub仓库中拉取的.使用Docker Hub前注册一个账号,后在命令行中登录:

docker login

登录后即可推送自己的镜像,这和Github的push代码很像.
拉取镜像、启动容器、推送到仓库

#拉取一Ubuntu
docker pull ubuntu
#启动容器
docker run -it ubuntu /bin/bash
#在跟容器的根目录下创建一个test目录
mkdir /test
#退出容器查看/var/lib/docker/overlay2目录
#可以看到新建了一个目录
#test目录就存放在里面,相当于一层
#其他目录没有变化#如果希望保留对Ubuntu的修改
#则需要用到commit命令
docker commit -m 'Add test' -a "libang" 3556258649b2 test

-m:根git的-m一样用于描述信息
-a:作者
3556258649b2:容器ID
test:生成的镜像REPOSITORY

#接着给镜像打个tag
docker tag test:latest librang/test:latest
#把镜像上传到librang/test这个项目
docker push librang/test:lastest
#这个镜像启动后则自带test目录

⚡️数据卷Volumes
有些容器在运行时会产生数据,这种容器就叫做有状态容器(例如MySQL容器),在创建镜像的时候希望保留的是MySQL各种配置以及扩展,并不想把M有SQL的数据也打包到镜像中,数据卷就是为此场景而生的,数据卷分为两种类型:

  • 绑定挂载的volume(bind mount volume)
#创建一个测试数据卷
docker run -it -v /root/test:/test librang/test /bin/bash

-v:创建数据卷
/root/test:/test:把本地的/root/test目录加载到容器的/test目录

#在容器的test目录中创建一个a.php文件
touch /test/a.php

我们退出容器回到宿主机可以发现/root/test目录下也有了a.php文件

  • 受管理的volume(managed volume)
    绑定挂载的volume的方案并不优雅,因为它将宿主机和容器进行了强耦合.
#创建一个受管理的volume
docker run -it -v /test librang/test /bin/bash
#命令中没有指定宿主机的目录
#Docker会创建到/var/lib/docker/volumes目录下
#通过命令查看
docker volume ls

挂载数据卷

#把刚创建的数据卷挂载到容器上
docker run -it --mount source=vm_test,target=/test librang/test  /bin/bash
#在容器中创建个文件
touch /test/volume.txt
#退出容器在宿主机的volume目录查看

删除数据卷

docker volume rm vm_test

⚡️网络Network
端口映射
默认容器在外部默认是不可访问的,比如进入到容器里面才能操作,这对于网络请求的应用就不友好.比如常见的Nginx,如果想让容器可被访问,此时需要使用-P参数分配端口.

docker run -d -P nginx

在这里插入图片描述
如果使用的各云服务器需要注意的是要开放端口,如果想让Docker分配指定的端口可以使用-p参数.

docker run -d -p 80:80 nginx

左边的80是宿主机的端口,右边的80是容器内的端口.
容器互联
Nginx是需要对外提供服务的,而MySQL一般不对外提供服务,但是Nginx需要能访问MySQL容器,而且需要通过容器name来访问,这时候就需要容器之间互联了,可以创建一个网络,把这些需要互联的容器放再一个网络中.
查看网络

docker network ls

创建网络

#创建一个测试网络
docker network create test
#创建带网络的容器
docker run -it --name nginx --network test nginx /bin/bash
docker run -it --name mysql --network test mysql /bin/bash
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值