docker基础

一、docker理论
1、什么是docker?
  • Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
  • Docker是在Linux容器里运行的开源工具,是一种轻量级的“虚拟机”。
  • Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
2、docker的优点 

● 灵活:即使是最复杂的应用也可以集装箱化

● 轻量级:容器利用并共享主机内核

● 可互换:可以即时部署更新和升级

● 便携式:可以再本地构建,部署到云,并在任何地方运行

● 可扩展:可以增加并自动分发容器副本

● 可堆叠:可以垂直和即时堆叠服务

3、docker与虚拟机的差异 
特性docker容器虚拟机
部署难度简单组件多,较为复杂
启动速度秒级分钟级
性能与物理及相差无几vm会占用部分资源
镜像体积MB级别GB级别
管理效率简单组件相互依赖,较为复杂
管理性单进程完整的系统管理
网络连接较弱较为灵活的进行网络管理
计算能力损耗几乎没有损耗50%左右
性能接近原生弱于
系统支持量(单机)上千个几十个
隔离性资源隔离/限制完全隔离
4、容器中重要的技术 

docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500G并不是实际占用物理磁盘500G)。

5、docker的核心概念
5.1镜像

Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量和配置文件。 Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远程一样的环境,这也是Docker镜像的精髓。 

5.2容器

Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。 可以把容器看做是一个简易版的Linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其他的应用程序。

5.3仓库

Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。 Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker目录下。


二、docker的部署以及基础操作
1、服务器环境搭建

先将机器的防火墙以及selinux关闭,disabled表示selinux已关闭

[root@server01 local]# setenforce 0
setenforce: SELinux is disabled
2、安装依赖包

yum-utils:提供了yum-config-manager工具 device mappper:是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。 device mapper存储驱动程序需要device-mapper-persistent-data和lvm2。

[root@server01 local]# yum install -y yum-utils device-mapper-persistent-data lvm2

结果如图所示:

 3、设阿里云镜像并且安装docker-ce且设置开机自启动

[root@server01 local]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

如图所示:

 安装docker-ce

[root@server01 local]# yum install -y docker-ce docker-ce-cli containerd.io

 成功安装如下图所示:

[root@server01 local]# systemctl enable --now docker.service

安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。

三、docker镜像创建与相关操作
1、搜索镜像,格式:docker search 关键字

此处以nginx为例

[root@server01 local]# docker search nginx

 结果如下图所示

2、拉取镜像,格式:docker pull 仓库名称[:标签]

如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest标签,此处不指定标签

[root@server01 local]# docker pull nginx:latest
执行如果出现以下问题
error pulling image configuration: download failed after attempts=6: dial tcp 103.200.31.172:443: connect: connection refused

解决方案如下:

[root@server01 local]# mkdir -p /etc/docker
[root@server01 local]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": [
> "https://do.nark.eu.org",
> "https://dc.j8.work",
> "https://docker.m.daocloud.io",
> "https://dockerproxy.com",
> "https://docker.mirrors.ustc.edu.cn",
> "https://docker.nju.edu.cn"
> ]
> }
> EOF
[root@server01 local]# systemctl daemon-reload
[root@server01 local]# systemctl restart docker   #重启
[root@server01 local]# docker pull nginx:latest   #再次拉去镜像

重启之后再一次拉取镜像,结果如下图所示:

完成之后可以去阿里云进行镜像加速下载,先登录阿里云,点击右侧

选择容器镜像服务

进去后点击镜像工具,选择镜像加速器,然后根据你自己的系统来进行选择操作,我才用的centos系统,接着按照阿里云的命令进行操作

3、查看镜像信息

镜像下载后一般存放在/var/lib/docker

[root@server01 local]# cd /var/lib/docker
[root@server01 docker]# ls
buildkit  containers  engine-id  image  network  overlay2  plugins  runtimes  swarm  tmp  volumes
 查看下载的镜像文件信息
[root@server01 docker]# cat /var/lib/docker/image/overlay2/repositories.json

 结果如图所示:

4、查看下载到本地的所有镜像

REPOSITORY:镜像属于的仓库

TAG:镜像的标签信息,标记同一个仓库中的不同镜像

IMAGE ID:镜像的唯一ID号,唯一标识一个镜像

CREATED:镜像创建的时间

SIZE:镜像大小

[root@server01 docker]# docker images

 

5、根据镜像唯一表示的ID来查看镜像的详细信息

格式:docker inspect 镜像ID号

[root@server01 docker]# docker inspect 5ef79149e0ec  #这里的id就是上一步的IMAGE ID

 详细信息如图所示:

 6、为本地镜像添加新标签

格式:docker tag 原仓库/源镜像名称:[标签]新仓库名/新镜像名称:[标签]

[root@server01 docker]# docker tag nginx:latest nginx:test
[root@server01 docker]# docker images

 

删除镜像

格式: docker rmi 仓库/镜像名称:标签

[root@server01 docker]# docker rmi nginx:latest

 

格式2 docker rmi -f 镜像ID,这个是彻底删除 ,如:

 [root@server01 docker]# docker rmi -f 5ef79149e0ec

注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

7、存入镜像,将镜像存入本地文件

格式:docker save -o 存储文件名 存储的镜像

[root@server01 docker]# docker save -o nginx.tar nginx:latest1
Error response from daemon: reference does not exist
[root@server01 docker]# docker save -o nginx.tar nginx:test

 

上图红色字体所示就是保存的文件

将镜像载入文件

格式1:docker load < 镜像文件

格式2:docker load -i 镜像文件

[root@server01 docker]# docker load < nginx.tar
 四、容器操作
1、创建容器

容器创建就是将镜像加载到容器的过程。 新创建的容器默认处于停止状态,不允许任何程序,需要在其中发起一个进程来启动容器。

格式:docker create [选项] 镜像

常用选项:

-i:让容器的输入保持打开

-t:让Docker分配一个伪终端

[root@server01 docker]# docker create -it nginx:test /bin/bash
7f7e5c77c31a55b76584c086671908c547830f295ac387c6be6d79e13e8eb225
 2、查看容器状态

命令:docker ps -a

[root@server01 docker]# docker ps -a

-a选项可以显示所有的容器

CONTAINER ID:容器ID号

IMAGE:加载的镜像

COMMAND:运行的程序

CREATED:创建时间

STATUS:当前状态

PORTS:端口映射

NAMES:名称(未定义将随机创建)

3、启动容器

格式:docker start 容器ID/名称

[root@server01 docker]# docker start 7f7e5c77c31a

 启动后状态由created变为up,up是正常状态,created容易出问题

4、创建并启动容器

可以直接执行docker run命令,等同于先执行docker create命令,再执行docker start命令。

注意:容器是一个与其中运行的shell命令共存亡的终端,命令运行容器运行,命令结束容器退出。

[root@server01 docker]# docker run centos:7 bash -c ls /
创建并开启容器

 创建启动成功如下图所示:

创建并启动之后查看:

 4.1docker运行条件

docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中pid=1的进程挂了,那么docker容器便会只会退出,也就是说docker容器中必须有一个前台进程,否则认为容器已经挂掉。 可以对docker容器执行一条死循环命令,防止容易的自动退出。

docker容器生命周期

docker容器 七个状态

created 已创建 还未运行的容器

running 正在运行中的容器

restarting 容器正在重启中

removeing 容器正在迁移中

paused 已暂停状态的容器

exited 停止状态的容器

dead 死亡 主要是操作系统出现异常或断点关机等有可能引发dead状态,但是不是很常见。

[root@server01 docker]# docker run centos:7 bash -c "while true;do echo hello;done"
此时机器会一直输出hello,CTRL+C也无法停止,只能再开一个窗口,使用以下命令才能停止
docker stop ce64f6ebf1a3
docker ps -a

 停止后状态如下图所示:

为避免占用终端无法退出的情况可以使用-d选项,docker容器以守护形式在后台运行。 容器所运行的程序不能结束。

[root@server01 docker]# docker run -d centos:7 bash -c "while true;do echo hello;done"
4.2创建容器并使其持续运行
[root@server01 docker]# docker run -itd --name test centos:7 bash

成功后如上图所示

4.3在后台运行过程

(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;

(2)利用镜像创建并启动一个容器; 

(3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;

(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;

(5)分配一个地址池中的IP地址给容器;

(6)执行用户指定的应用程序,执行完毕后容器被终止运行。

5、停止容器运行

格式:docker stop 容器的ID/名称      

[root@server01 docker]# docker stop test
 6、进入容器

需要进入容器进行命令操作时,可以使用docker exec命令进行运行着的容器。 格式:docker exec -it 容器ID/名称 /bin/bash

-i:让容器的输入保持打开

-t:让那个Docker分配一个伪终端

[root@server01 docker]# docker start test   #启动
test
[root@server01 docker]# docker exec -it test bash    #进入
[root@f1de35e68d4d /]# ls                      #进入后可以看到主机名变了
也可在run创建容器时,使用-it选项进入容器,但是退出容器时,容器也将停止运行
[root@server01 docker]# docker run -it --name test1 centos:7 bash
[root@a532d1b2cc54 /]# exit                  #退出
exit
 7、复制相关操作
7.1主机复制到容器中

docker cp 主机的文件 容器名或者id:/opt

[root@server01 docker]# touch test.txt
[root@server01 docker]# docker cp test.txt test:/opt
Successfully copied 1.54kB to test:/opt
[root@server01 docker]# echo "hello world" > test.txt
[root@server01 docker]# docker cp test.txt test:/opt
Successfully copied 2.05kB to test:/opt
[root@server01 docker]# docker exec -it test bash

 如下图所:

7.2从容器复制到主机
[root@server01 docker]# docker cp test:/opt/test.txt 222.txt

 

如上图所示

8.容器的导出与导入
8.1容器的导出

格式:docker export 容器ID/名称 文件名 

[root@server01 docker]# docker export test > /opt/centos.tar

 导出后结果如图;

8.2容器的导入

格式:cat 文件名 | docker import - 镜像名称:标签

[root@server01 opt]# docker stop test
test
[root@server01 opt]# docker rm test
test

删除后如图所示:

然后重新导入:

[root@server01 opt]# cat centos.tar | docker import - centos:test
sha256:80322ebfcdec347db78a34952f44086884756d7ae82b663721faa19dafe7209f

 重新导入后查看:

9.删除容器

 格式:docker rm [-f] 容器ID/名称

[root@server01 opt]# docker rm test1

 容器在运行状态下,需要先stop停止容器才可以将其删除,或使用-f选项

10.批量操作容器

批量停止容器

docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash或

docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop

[root@server01 opt]# docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
或
[root@server01 opt]# docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop

 结果如图:

 批量删除容器

[root@server01 opt]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
或
[root@server01 opt]# docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f

docker rm $(docker ps -a -q)   #此命令亦可

批量删除镜像

[root@server01 docker]# docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash
或
[root@server01 docker]# docker rmi $(docker images -q)

 查看容器进程号

docker inspect -f '{{.State.Pid}}' 容器ID/名称

[root@server01 docker]# docker inspect -f '{{.State.Pid}}' 7f7e5c77c31a

 本文参考文献
原文链接:https://blog.csdn.net/weixin_58376680/article/details/138078623

  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修乙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值