Docker 概述

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

Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。

Docker的设计宗旨:Build,Ship and Run Any App,Anywhere,
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。

容器化越来越受欢迎,因为容器是:
●灵活:即使是最复杂的应用也可以集装箱化。
●轻量级:容器利用并共享主机内核。
●可互换:可以即时部署更新和升级。
●便携式:可以在本地构建,部署到云,并在任何地方运行。
●可扩展:可以增加并自动分发容器副本。
●可堆叠:可以垂直和即时堆叠服务。

容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

Docker与虚拟机的区别

特性Docker容器虚拟机
启动速度秒级分钟级
计算能力损耗几乎无损耗 50%左右
性能接近原生弱于
系统支持量(单机)上千个几十个
隔离性资源隔离/限制完全隔离

namespace的六项隔离

namespace系统调用参数隔离内容
UTSCLONE_NEWUTS主机名与域名
IPCCLONE_NEWWIPC信号量、消息队列和共享内存
PIDCLONE_NEWPID进程编号
NETWORKCLONE_NEWNET网络设备、网络栈、端口等
MOUNTCLONE_NEWNS挂载点(文件系统)
USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持〉

Docker核心概念

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

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

●仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。

Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker

安装 Docker

在这里插入图片描述

[root@localhost ~]# systemctl stop firewalld.service && setenforce 0
[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su

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


[root@docker01 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
#设置阿里云镜像源


[root@docker01 ~]# yum install -y docker-ce docker-ce-cli containerd.io
#安装 Docker-CE并设置为开机自动启动

[root@docker01 ~]# systemctl start docker.service

--------------------------------------------------------------------------------------------
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
--------------------------------------------------------------------------------------------
[root@docker01 ~]# systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 六 2023-04-22 18:16:54 CST; 9s ago
     Docs: https://docs.docker.com
 Main PID: 38000 (dockerd)
   Memory: 31.3M
   CGroup: /system.slice/docker.service
           └─38000 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/conta...

422 18:16:53 docker01 dockerd[38000]: time="2023-04-22T18:16:53.933111832+...c
422 18:16:53 docker01 dockerd[38000]: time="2023-04-22T18:16:53.933647467+...c
422 18:16:53 docker01 dockerd[38000]: time="2023-04-22T18:16:53.933670360+...c
422 18:16:53 docker01 dockerd[38000]: time="2023-04-22T18:16:53.983036183+..."
422 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.147471090+..."
422 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.183113548+...4
422 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.183319945+..."
422 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.205515678+...c
422 18:16:54 docker01 systemd[1]: Started Docker Application Container Engine.
422 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.210028329+..."
Hint: Some lines were ellipsized, use -l to show in full.

在这里插入图片描述

[root@docker01 ~]# docker version

在这里插入图片描述

[root@docker01 ~]# docker info
## docker 信息查看

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.10.4
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.17.2
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0    # 容器数量
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0    # 镜像数量
 Server Version: 23.0.4     # server 版本
 Storage Driver: overlay2    # docker 使用的是 overlay2 文件驱动
  Backing Filesystem: xfs    # 宿主机上的底层文件系统
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs    # Cgroups 驱动
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 2806fc1057397dbaeefbea0e4e17bddfbd388f38
 runc version: v1.1.5-0-gf19387a
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-693.el7.x86_64    # 宿主机的相关信息
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 12
 Total Memory: 3.843GiB
 Name: docker01
 ID: 0b29a2d9-809e-444c-9c78-808fbf340159
 Docker Root Dir: /var/lib/docker   # docker 数据存储目录
 Debug Mode: false
 Registry: https://index.docker.io/v1/   # registry 地址
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
  Registry Mirrors:							# 加速站点
 Live Restore Enabled: false


在这里插入图片描述

Docker 镜像操作

搜索镜像

格式:docker search 关键字

[root@docker01 ~]# docker search nginx

在这里插入图片描述

获取镜像

格式:docker pull 仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。

docker pull nginx

在这里插入图片描述

镜像加速下载

浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置**
在这里插入图片描述

mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://y3m1b6i6.mirror.aliyuncs.com"]
}
EOF


systemctl daemon-reload
systemctl restart docker

在这里插入图片描述

查看镜像信息

镜像下载后存放在 /var/lib/docker 。
Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。

查看下载的镜像文件信息

cat /var/lib/docker/image/overlay2/repositories.json

在这里插入图片描述

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

[root@docker01 ~]#  docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    6efc10a0510f   10 days ago   142MB

REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;

根据镜像的唯一标识 ID 号,获取镜像详细信息

格式:docker inspect 镜像ID号

docker inspect 6efc10a0510f

在这里插入图片描述

为本地的镜像添加新的标签

格式:docker tag 名称:[标签] 新名称:[新标签]

docker tag nginx:latest nginx:web

docker images | grep nginx

删除镜像

格式:
docker rmi 仓库名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签
或者
docker rmi 镜像ID号 #会彻底删除该镜像

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

docker rmi nginx:web

存出镜像:将镜像保存成为本地文件

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

docker save -o nginx nginx:latest			#存出镜像命名为nginx存在当前目录下
ls -lh

载入镜像:将镜像文件导入到镜像库中

格式:
docker load < 存出的文件
或者
docker load -i 存出的文件

docker load < nginx

上传镜像

默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。

docker tag nginx:latest soscscs/nginx:web		#添加新的标签时必须在前面加上自己的dockerhub的username
docker login								#登录公共仓库
Username:soscscs
password:abc123456
docker push soscscs/nginx:web					#上传镜像

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Docker 容器操作

容器创建:就是将镜像加载到容器的过程。

新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

格式:docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell

[root@docker01 ~]# docker create -it nginx:latest /bin/bash
2154c8b190f0284bd0b2b2733f642a1228b78f9720d428952fd8ea0076e8bbad

在这里插入图片描述

查看容器的运行状态

[root@docker01 ~]# docker ps -a   #-a 选项可以显示所有的容器
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS    PORTS     NAMES
2154c8b190f0   nginx:latest   "/docker-entrypoint.…"   6 seconds ago   Created             dazzling_wescoff

容器的ID号	   加载的镜像     运行的程序               创建时间       当前的状态  端口映射  名称

在这里插入图片描述

基于现有镜像创建

首先启动一个镜像,在容器里做修改

[root@docker01 ~]# docker run -it centos:7 /bin/bash
#启动容器
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7

在这里插入图片描述

[root@048ef3f5bf35 /]#  yum install -y epel-release
#安装epel源

在这里插入图片描述

[root@048ef3f5bf35 /]# yum install -y nginx
#安装nginx

在这里插入图片描述

[root@048ef3f5bf35 /]#  yum install net-tools -y
 #安装tools工具

在这里插入图片描述

[root@048ef3f5bf35 /]# nginx
#启动服务

[root@048ef3f5bf35 /]# netstat -natp |grep 80
##  #查看端口是否开启

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      131/nginx: master p 
tcp6       0      0 :::80                   :::*                    LISTEN      131/nginx: master p 
[root@048ef3f5bf35 /]# 

在这里插入图片描述

[root@048ef3f5bf35 /]# exit
exit
[root@docker01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                       PORTS     NAMES
048ef3f5bf35   centos:7       "/bin/bash"               7 minutes ago    Exited (127) 5 seconds ago             nifty_greider
2154c8b190f0   nginx:latest   "/docker-entrypoint.…"   21 minutes ago   Created                                dazzling_wescoff

在这里插入图片描述

然后将修改后的容器提交为新的镜像,需要使用该容器的ID号创建新镜像

[root@docker01 ~]# docker commit -m "new nginx" -a "[指定作者信息]" 048ef3f5bf35 nginx:centos
sha256:5ca4481808e7e4e34d664c905feee425516c6962e05d8bb6fa69e5b86a80c538

#常用选项:
 -m 指定说明信息;
 -a 指定作者信息;
 -p 生成过程中停止容器的运行。
 048ef3f5bf35 原容器ID。
 nginx:centos  生成新的镜像名称。

在这里插入图片描述

[root@docker01 ~]# docker images
#查看生成的新镜像

REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
nginx             centos    5ca4481808e7   2 minutes ago   482MB
docker.../nginx   web       6efc10a0510f   10 days ago     142MB
nginx             latest    6efc10a0510f   10 days ago     142MB
centos            7         eeb6ee3f44bd   19 months ago   204MB

在这里插入图片描述

[root@docker01 ~]# docker run -itd nginx:centos bash
#使用新的镜像创建容器

55d1507297fa970885698e4b85ea096bfd146598c809951c5bc927e457a4f6c2

在这里插入图片描述

[root@docker01 ~]#  docker ps -a
#查看容器状态

CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                       PORTS     NAMES
55d1507297fa   nginx:centos   "bash"                    21 seconds ago   Up 21 seconds                          elegant_yalow
048ef3f5bf35   centos:7       "/bin/bash"               15 minutes ago   Exited (127) 7 minutes ago             nifty_greider
2154c8b190f0   nginx:latest   "/docker-entrypoint.…"   28 minutes ago   Created                                dazzling_wescoff

在这里插入图片描述

[root@docker01 ~]# docker exec -it 55d1507297fa bash
#进入容器

在这里插入图片描述

[root@55d1507297fa /]# nginx
#启动nginx服务
[root@55d1507297fa /]# netstat -natp |grep 80
#查看80端口是否开启
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      30/nginx: master pr 
tcp6       0      0 :::80                   :::*                    LISTEN      30/nginx: master pr 

在这里插入图片描述

部署Apache镜像

建立工作目录

[root@55d1507297fa /]# exit
exit
[root@docker01 ~]#  mkdir /opt/apache
[root@docker01 ~]# cd /opt/apache

在这里插入图片描述

准备Dockerfile文件

[root@docker01 apache]# vim Dockerfile


 FROM centos:7
 MAINTAINER this is apache image <dockerbmm>
 RUN yum -y install httpd
 EXPOSE 80
 ADD index.html /var/www/html/
 ADD run.sh /run.sh
 RUN chmod 755 /run.sh
 CMD ["/run.sh"]
ENTRYPOINT ["/usr/sbin/apachectl"]
 CMD ["-D", "FOREGROUND"]

在这里插入图片描述

准备执行脚本。使用方法一的情况下需要准备执行脚本

[root@docker01 apache]#  vim run.sh

#!/bin/bash
 rm -rf /run/httpd/*
 /usr/sbin/apachectl -D FOREGROUND

在这里插入图片描述

准备网站页面

[root@docker01 apache]#  echo "this is apache web" > index.html

在这里插入图片描述

生成镜像(构建镜像)

[root@docker01 apache]# docker build -t httpd:centos .


在这里插入图片描述

使用新镜像运行容器

[root@docker01 apache]#  docker run -d -p 1314:80 httpd:centos
#指定映射端口1314
f03db882f1c9d269fc45cf9ede3e2dcd3f7b8ba11e6962f4f6824c7726ddd68f

在这里插入图片描述

[root@docker01 apache]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                        PORTS                                   NAMES
f03db882f1c9   httpd:centos   "/usr/sbin/apachectl…"   31 seconds ago   Up 30 seconds                 0.0.0.0:1314->80/tcp, :::1314->80/tcp   practical_meninsky
55d1507297fa   nginx:centos   "bash"                    21 minutes ago   Up 21 minutes                                                         elegant_yalow
048ef3f5bf35   centos:7       "/bin/bash"               35 minutes ago   Exited (127) 28 minutes ago                                           nifty_greider
2154c8b190f0   nginx:latest   "/docker-entrypoint.…"   49 minutes ago   Created                                                               dazzling_wescoff

在这里插入图片描述

使用主机IP和1314端口,测试网页访问

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐