Docker ——Docker基本管理

Posted 封玖FJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker ——Docker基本管理相关的知识,希望对你有一定的参考价值。

Docker概述

Docker是什么

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

Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱

鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序

Docker的设计宗旨:Build,Ship and Run Any App,Anywhere,

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

容器

定义

容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量

容器的优点

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

docker与虚拟机的区别

  • 容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
  • 虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
特性 Docker容器 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎无 损耗 50%左右
性能 接近原生 弱于
系统支持量(单机) 上千个 几十个
隔离性 资源隔离/限制 完全隔离

容器在内核中支持2种重要技术

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

Docker核心概念

1)镜像

Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。

通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。

2)容器

Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。

可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。

3)仓库

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

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

Docker的安装

1. 安装依赖包

systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0

yum install -y yum-utils device-mapper-persistent-data lvm2

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

2. 设置阿里云镜像源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 安装Docker-CE

yum install -y docker-ce

vim /etc/selinux/config
SELINUX=disabled
systemctl start docker.service 
systemctl enable docker.service

1)配置阿里云镜像加速,不然下载速度很慢

  • 加速地址从自己的阿里云上获取
  • 阿里云官网:https://account.aliyun.com/
  • 获取方式:登录阿里云–>控制台–>在上面搜索容器镜像服务–>左下角的镜像加速器
  • 在此页面中显示阿里云的镜像加速地址和配置方法
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-EOF

  "registry-mirrors": ["https://xxxxxxxxxx.mirror.aliyuncs.com"]

EOF
#每个人都不一样
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl daemon-reload 
systemctl restart docker

2)网络优化

vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
service network restart
systemctl restart docker

4. 基础命令

查看 docker 版本信息

docker version
docker info

1)镜像的操作

①查找指定镜像
docker search 服务名
例如:
docker search nginx

②下载镜像
docker pull 服务名
例如:
docker pull nginx

③查看镜像信息
docker images
docker inspect 镜像的ID
例如
docker images
docker inspect 605c77e624dd

④添加新标签(打标签)
docker tag 仓库名:原镜像名 仓库名:新镜像名
例如:
docker tag nginx:latest nginx:test
docker images
docker images | grep nginx

⑤删除镜像
  • 指定镜像ID删除的时候,要求不能有该镜像不能有标签
    docker rmi 镜像的ID
    docker rmi 仓库名:镜像名
    例如:
    docker rmi 605c77e624dd
    docker images
    docker rmi nginx:test
    docker images

⑥将镜像存储到本机上,命名为nginx_latest
docker save -o 存放镜像的位置 仓库名:镜像名
例如:
docker save -o /opt/nginx_latest nginx:latest

⑦载入镜像
方法一:
docker load < 本地导出的镜像名
方法二:
docker --input 本地导出的镜像名

例如:
docker load < nginx_latest
docker load --input nginx_latest

方法一:

方法二:

⑧上传镜像

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

  • 将本地的镜像上传到公有的镜像仓库,要先登陆到镜像仓库
  • 上传镜像前要修改标签,标签前面要加上Docker官网的账号名
    • 标签格式: Docker官网的账号名/仓库名:镜像名
  • 不过一般不会上传到公有仓库中,公司内部都使用私有仓库
docker push [OPTIONS] NAME[:TAG]

例如:按照下面的流程就可以上传到公有云,有兴趣的可以上传
#改标签
docker tag 仓库名:镜像名 用户名/仓库名:镜像名
#登录
docker login
Username:   #用户名
Password:   #密码

#上传
docker push 用户名/仓库名:镜像名

Docker 容器操作

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

  • 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器
  • docker create命令能够基于镜像创建容器。
  • 该命令执行的效果类似于docker run -d,即创建一个将在系统后台运行的容器。
  • 但是与docker run -d不同的是,docker create创建的容器并未实际启动,还需要执行docker start命令或docker run命令以启动容器。
  • 事实上,docker create命令常用于在启动容器之前进行必要的设置。
格式:docker create [选项] 镜像
常用选项:
-i:让容器的输入保持打开
-t:让 Docker 分配一个伪终端

docker create -it nginx:latest /bin/bash

注:
-it就等于-i和-t,这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式(也就是直接进入到容器里面)
后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash

2. 查看容器的运行状态

docker ps -a    #-a 选项可以显示所有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b0a7be0ff58 nginx:latest "/docker-entrypoint.…" 57 seconds ago Created inspiring_swanson

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

3. 启动容器

格式:docker start 容器的ID/名称
docker start 9cfd4fc2a234
docker ps -a

4. 创建并启动容器

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

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

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:

1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
2)利用镜像创建并启动一个容器;
3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
5)分配一个地址池中的 IP 地址给容器;
6)执行用户指定的应用程序,执行完毕后容器被终止运行。

docker run centos:7 /usr/bin/bash -c ls /
docker ps -a    #会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

5. 在后台持续运行 docker run 创建的容器

需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。

docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"

docker ps -a    #可以看出容器始终处于 UP,运行状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2592d3fad0fb centos:7 "/usr/bin/bash -c w…" 2 seconds ago Up 2 seconds peaceful_chatelet

docker run -itd --name test1 centos:7 /bin/bash   #给容器重命名,并以守护形式在后台运行

6. 终止容器运行

格式: docker   stop/kill   容器ID/名称
stop: 停止容器,可以给容器一个等待时间,以防止数据的丢失。
kill: 立即强行停止一个容器(相当于linux命令 kill -9) ,不会给容器反应时间,可能会造成数据丢失

docker start 容器ID:启动一个或多个已经被停止的容器
docker stop 容器ID:停止一个运行中的容器
docker restart 容器ID:重启容器
例:
docker start 9cfd4fc2a234
docker ps -a
docker stop 9cfd4fc2a234
docker ps -a
docker restart 9cfd4fc2a234

docker run [选项] 镜像 [命令] [变量]
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-c 命令表示后面的参数将会作为字符串读入作为执行的命令
-v: 绑定一个卷
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="名称": 为容器指定一个名称
--link name:alias 添加链接到另一个容器,格式“--link容器名:别名”
例如:
docker run nginx
docker run -d nginx
docker run -d nginx /bin/bash -c "ls"

7. 容器的进入

需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。

格式:docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。

docker start 9cfd4fc2a234   #进入容器前,确保容器正在运行
docker exec -it 9cfd4fc2a234 /bin/bash
ls
exit    #退出容器后,容器仍在运行
docker ps -a

8 . 从宿主机上将文件导入到容器中

docker ps -a                                               #先获取需要导入到的容器ID,然后重新开一个终端

另一个终端上操作
echo "this is test file" >> 123.txt                   #创建测试文件
docker cp 123.txt eff0e22dfc4a:/opt                 #将测试文件导入到容器内后到容器内的/opt目录下查看


9. 容器的导出与导入

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

#导出格式:docker export 容器ID/名称 > 文件名
docker export eff0e22dfc4a > centos7.tar

#导入格式:cat 文件名 | docker import – 镜像名称:标签
cat centos7.tar | docker import - centos7:test  #导入后会生成镜像,但不会创建容器

10. 删除容器

格式:docker rm [-f] 容器ID/名称
docker stop eff0e22dfc4a
docker rm eff0e22dfc4a  #删除已经终止状态的容器

docker rm -f eff0e22dfc4a   #强制删除正在运行的容器

docker ps -a | awk NR>=2print "docker stop "$1 | bash    #批量停止容器

docker ps -a | awk NR>=2print "docker rm "$1 | bash  #批量删除所有容器

docker images | awk NR>=2print "docker rmi "$3 | bash    #批量删除镜像

删除容器和强制删除容器:

批量停止和删除容器:

以上是关于Docker ——Docker基本管理的主要内容,如果未能解决你的问题,请参考以下文章

docker基本介绍与安装

docker镜像管理基础

docker镜像管理基础

docker镜像管理基础

docker镜像管理基础

docker的安装及基本命令