Docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

一个完整的Docker有以下几个部分组成:

  1. dockerClient客户端
  2. Docker Daemon守护进程
  3. Docker Image镜像
  4. DockerContainer容器

容器:

存储、运输工具

实现对容器内部的物品实现包含(实现了一个相对隔离的环境)

容器:模拟(虚拟)出一个相对隔离的空间

镜像:

用来创建容器的模版,放在镜像仓库中,例如nginx,redis,httpd等

Docker与Kvm的对比

kvm:

1. 虚拟机

2. 使用复杂

3. 启动过程相对慢(分钟)

4. 模版文件较大

5. 和物理完全隔离

6. 模拟的是一个完整系统,可以登录并实现管理

docker:

1. 直接虚拟出来一个用户空间

2. 使用简单

3. 启动非常块(秒级)

4. 模版文件很小

5. 在一定程度上和物理机隔离

6. 仅仅是模拟一部分用户空间,不方便管理

Docker使用理由

1. 快速部署服务

2. 实现隔离

3. 让一个主机运行多个容器

4. 提高开发效率

5. 简化配置过程

6. 实现软件的跨平台

Docker镜像加速配置

第一步:打开阿里云网站

  1. https://www.aliyun.com/?utm_content=se_1000301910

第二步:进行阿里云注册

第三步:点击控制台

第四步:点击产品与服务>镜像与服务

第五步:点击镜像加速器,记住自己的加速器地址

Docker的安装与配置

安装docker需要配置网络yum源,centos7自带的版本太低了

第一步:下载阿里云的docker安装包

在yum仓库的目录之下

  1. [root@localhost yum.repos.d]# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

还需要使用到extra和epel源

 
  1. [extra]
  2. name=centos extra
  3. enabled=1
  4. gpgcheck=0
  5. baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
  6. [epel]
  7. name=epel
  8. enabled=1
  9. gpgcheck=0
  10. baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/
 

第二步:使用yum即可进行安装

docker-ce是社区版,是免费的

docker-ee是企业版,是收费的

这里我们下载社区版的

  1. [root@ken ~]# yum install docker-ce -y

第三步:添加加速器地址

把刚才注册得到的镜像加速地址如下步骤填写进去

  1. [root@ken ~]# mkdir /etc/docker
  2. [root@ken ~]# cat /etc/docker/daemon.json
  3. {
  4. "registry-mirrors": ["https://XXX.mirror.aliyuncs.com"]
  5. }

第四步:重启docker

  1. [root@ken ~]# systemctl restart docker

Docker有关镜像的操作命令详解

第一步:获取镜像的使用帮助

  1. [root@ken ~]# docker image --help
  2.  
  3. Usage: docker image COMMAND
  4.  
  5. Manage images

第二步:docker镜像的使用命令详解

 
  1. build docker文件里面创建镜像
  2. history 显示一个镜像的历史
  3. import 从归档文件中创建镜像
  4. inspect 显示一个一个或多个镜像的详细信息
  5. load 加载一个镜像从tar压缩包或者标准输入
  6. ls 列出镜像
  7. prune 移除没有被使用的镜像
  8. pull 从注册处拉取一个镜像或者镜像库
  9. push 把一个镜像或者镜像库推送至注册处
  10. rm 移除一个或多个镜像
  11. save 保存一个或者多个镜像到tar压缩包,默认情况下流式传输到
  12. tag 创建一个引用SOURCE_IMAGE的标记TARGET_IMAGE
 

Docker镜像的操作命令演示

一. 查看注册表中是否有nginx镜像

 
  1. [root@ken ~]# docker search nginx
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. nginx Official build of Nginx. 10326 [OK]
  4. jwilder/nginx-proxy Automated Nginx reverse proxy for docker con?? 1471 [OK]
  5. richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of?? 650 [OK]
  6. jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p?? 441 [OK]
  7. kong Open-source Microservice & API Management la?? 249 [OK]
  8. webdevops/php-nginx Nginx with PHP-FPM 117 [OK]
  9. kitematic/hello-world-nginx A light-weight nginx container that demonstr?? 112
  10. ...
 

二.下载nginx镜像

  1. [root@ken ~]# docker image pull nginx

三:查看本地镜像

  1. [root@ken ~]# docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. nginx latest e81eb098537d 10 days ago 109MB

四:导入镜像

这里我准备了一个redis的镜像压缩包

这样就获取到了redis的镜像

压缩包不需要解压

 
  1. [root@ken ~]# docker image load < redis_img.tar.gz
  2. d626a8ad97a1: Loading layer [==================================================>] 58.46MB/58.46MB
  3. fd0ff4158c63: Loading layer [==================================================>] 338.4kB/338.4kB
  4. f1e69ab74fb6: Loading layer [==================================================>] 3.034MB/3.034MB
  5. 5935063a73de: Loading layer [==================================================>] 24.83MB/24.83MB
  6. 72ebea29957d: Loading layer [==================================================>] 1.536kB/1.536kB
  7. 56631ad86187: Loading layer [==================================================>] 3.584kB/3.584kB
  8. Loaded image: redis:latest
  9. [root@ken ~]# docker image ls
  10. REPOSITORY TAG IMAGE ID CREATED SIZE
  11. nginx latest e81eb098537d 10 days ago 109MB
  12. redis latest 55cb7014c24f 5 months ago 83.4MB
  13. [root@ken ~]#
 

五:镜像导出

写成压缩包的形式

  1. [root@ken ~]# docker image save nginx > /tmp/nginx.tar.gz
  2. [root@ken ~]# ls /tmp/nginx.tar.gz
  3. /tmp/nginx.tar.gz

六:显示nginx镜像的详细信息

 
  1. [root@ken ~]# docker inspect nginx
  2. [
  3. {
  4. "Id": "sha256:e81eb098537d6c4a75438eacc6a2ed94af74ca168076f719f3a0558bd24d646a",
  5. "RepoTags": [
  6. "nginx:latest"
  7. ],
  8. "RepoDigests": [
  9. "nginx@sha256:31b8e90a349d1fce7621f5a5a08e4fc519b634f7d3feb09d53fac9b12aa4d991"
  10. ],
  11. "Parent": "",
  12. "Comment": "",
  13. "Created": "2018-11-16T13:32:10.147294787Z",
  14. "Container": "d4fa15093ad8ad3df60d7403c1752a379503686e32a76b70771b3ea268ec5d66",
  15. "ContainerConfig": {
  16. "Hostname": "d4fa15093ad8",
  17. "Domainname": "",
  18. "User": "",
  19. "AttachStdin": false,
  20. "AttachStdout": false,
  21. "AttachStderr": false,
  22. "ExposedPorts": {
  23. ...
 

七:删除nginx的镜像

 
  1. [root@ken ~]# docker image rm nginx
  2. Untagged: nginx:latest
  3. Untagged: nginx@sha256:31b8e90a349d1fce7621f5a5a08e4fc519b634f7d3feb09d53fac9b12aa4d991
  4. Deleted: sha256:e81eb098537d6c4a75438eacc6a2ed94af74ca168076f719f3a0558bd24d646a
  5. Deleted: sha256:7055505a92c39c6f943403d54a1cda020bfeb523b55d9d78bfe1dad0dd32bb2d
  6. Deleted: sha256:378a8fcc106dc4d3a9f2dc0b642b164e25de3aab98a829e72b2d8c0cf0bad8ee
  7. Deleted: sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3
  8. [root@ken ~]# docker image ls
  9. REPOSITORY TAG IMAGE ID CREATED SIZE
  10. redis latest 55cb7014c24f 5 months ago 83.4MB
 

Docker有关容器的操作命令详解

第一步:获取容器的命令的使用帮助

  1. [root@ken ~]# docker container --help
  2.  
  3. Usage: docker container COMMAND
  4.  
  5. Manage containers

第二步:docker容器的使用命令详解

 
  1. attach 将本地标准输入,输出和错误流附加到正在运行的容器
  2. commit 根据容器的更改创建新镜像
  3. cp 在容器和本地文件系统之间复制文件/文件夹
  4. create 创建一个新的容器
  5. diff 检查容器文件系统上的文件或目录的更改
  6. exec 在正在运行的容器中运行命令
  7. export 将容器的文件系统导出为tar存档
  8. inspect 显示一个或多个容器的详细信息
  9. kill 杀死一个或多个正在运行的容器
  10. logs 获取容器的日志
  11. ls 列出容器
  12. pause 暂停一个或多个容器中的所有进程
  13. port 列出端口映射或容器的特定映射
  14. prune 删除所有已停止的容器
  15. rename 重命名容器
  16. restart 重启一个或多个容器
  17. rm 删除一个或多个容器
  18. run 在新容器中运行命令
  19. start 启动一个或多个已停止的容器
  20. stats 显示容器资源使用情况统计信息的实时流
  21. stop 停止一个或多个正在运行的容器
  22. top 显示容器的运行进程
  23. unpause 取消暂停一个或多个容器中的所有进程
  24. update 更新一个或多个容器的配置
  25. wait 等待,直到一个或多个容器停止,然后打印退出代码
 

Docker容器的操作命令演示

一.启动redis容器

–name:指定容器名字

-d:表示后台运行

  1. [root@ken ~]# docker container run --name redis1 -d redis
  2. 4cd31fa09d483ed87c8fe390a49c13fdba0652df33e2ae1cb44a1f8426578afd

二.查看容器

使用ls

  1. [root@ken ~]# docker container ls
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 4cd31fa09d48 redis "docker-entrypoint.s?? 39 seconds ago Up 38 seconds 6379/tcp redis1

三.查看所有的容器

ps -a: 列出所有的容器包括运行和停止的

ps: 仅仅列出正在运行的

 
  1. [root@ken ~]# docker container ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 4cd31fa09d48 redis "docker-entrypoint.s?? About a minute ago Up About a minute 6379/tcp redis1
  4. 054bc8b8aab7 redis "docker-entrypoint.s?? 2 minutes ago Exited (0) 2 minutes ago confident_goldstine
 

四.查看容器的详细信息

inspect后面加上容器名字即可获取有关容器的详细信息

 
  1. [root@ken ~]# docker container inspect redis1
  2. [
  3. {
  4. "Id": "4cd31fa09d483ed87c8fe390a49c13fdba0652df33e2ae1cb44a1f8426578afd",
  5. "Created": "2018-11-26T20:22:23.099937767Z",
  6. "Path": "docker-entrypoint.sh",
  7. "Args": [
  8. "redis-server"
  9. ],
  10. "State": {
  11. "Status": "running",
  12. "Running": true,
  13. "Paused": false,
  14. "Restarting": false,
  15. "OOMKilled": false,
  16. "Dead": false,
  17. ...
 

五.停止容器

使用stop

  1. [root@ken ~]# docker container stop redis1
  2. redis1
  3. [root@ken ~]# docker container ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

六.启动容器

使用start

 
  1. [root@ken ~]# docker container start redis1
  2. redis1
  3. [root@ken ~]# docker container ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 4cd31fa09d48 redis "docker-entrypoint.s?? 8 minutes ago Up 1 second 6379/tcp redis1
 

七.登录容器

第一种方法:

exec -it   容器名 /bin/sh

-i: 表示启动为交互模式

-t:表示分配一个终端

登录进去之后发现我们可以执行有挂redis的命令了

 
  1. [root@ken ~]# docker container exec -i -t redis1 /bin/sh
  2. #
  3. #
  4. # redis-cli
  5. 127.0.0.1:6379> set ken 520
  6. OK
  7. 127.0.0.1:6379> get ken
  8. "520"
 

退出之后容器没有停止

  1. [root@ken ~]# docker container ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 4cd31fa09d48 redis "docker-entrypoint.s?? 13 minutes ago Up 4 minutes 6379/tcp redis1

第二种方法:

attach:会导致当退出的时候,自动停止容器

不建议使用

  1. [root@ken ~]# docker container attach redis1
  2.  
  3. ^C1:signal-handler (1543264604) Received SIGINT scheduling shutdown...
  4. 1:M 26 Nov 20:36:44.315 # User requested shutdown...
  5. 1:M 26 Nov 20:36:44.315 * Saving the final RDB snapshot before exiting.
  6. 1:M 26 Nov 20:36:44.327 * DB saved on disk
  7. 1:M 26 Nov 20:36:44.327 # Redis is now ready to exit, bye bye...
  8. [root@ken ~]# docker container ps
  9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

第三种方法:

基于nsenter进入

第一步:启动容器

 
  1. [root@ken ~]# docker container start redis1
  2. redis1
  3. [root@ken ~]# docker container ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 4cd31fa09d48 redis "docker-entrypoint.s?? 16 minutes ago Up 6 seconds 6379/tcp redis1
 

第二步:获取容器的pid

  1. [root@ken ~]# docker container inspect -f '{{.State.Pid}}' redis1
  2. 6036

第三步:登录容器

-t: 从中获取名称空间的目标进程

-u: 输入UTS名称空间(主机名等)

-i: 进入System V IPC命名空间

-n: 输入网络命名空间

-p:输入pid命名空间

 
  1. [root@ken ~]# nsenter -t 6036 -u -i -n -p
  2. [root@4cd31fa09d48 ~]# ps
  3. PID TTY TIME CMD
  4. 2595 pts/0 00:00:01 bash
  5. 6216 pts/0 00:00:00 nsenter
  6. 6217 pts/0 00:00:00 bash
  7. 6250 pts/0 00:00:00 ps
 

退出时不会停止容器

 
  1. [root@4cd31fa09d48 ~]# exit
  2. logout
  3. [root@ken ~]# docker container ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 4cd31fa09d48 redis "docker-entrypoint.s?? 23 minutes ago Up 6 minutes 6379/tcp redis1
 

八.删除容器

第一步:需要停止容器

  1. [root@ken ~]# docker container stop redis1
  2. redis1
  3. [root@ken ~]# docker container ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

第二步:删掉容器

  1. [root@ken ~]# docker container rm redis1
  2. redis1
  3. [root@ken ~]# docker container ls
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

补充:一次性删除全部已经退出的容器

[root@ken1 ~]# docker rm $(docker ps -aq)

docker stop 与 docker kill 均可以将容器停掉,但二者究竟有什么区别呢?首先,摘录一下官网对这两个功能的描述:

  • docker stopStop a running container (send SIGTERM, and then SIGKILL after grace period) […] The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL. [emphasis mine]
  • docker killKill a running container (send SIGKILL, or specified signal) […] The main process inside the container will be sent SIGKILL, or any signal specified with option –signal. [emphasis mine]

docker stop,支持“优雅退出”。先发送SIGTERM信号,在一段时间之后(10s)再发送SIGKILL信号。Docker内部的应用程序可以接收SIGTERM信号,然后做一些“退出前工作”,比如保存状态、处理当前请求等。

docker kill,发送SIGKILL信号,应用程序直接退出。

按用途容器大致可分为两类:服务类容器和工具类的容器。

1. 服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。

2. 工具类容器通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行,比如:

运行 busybox,run -it 的作用是在容器启动后就直接进入。执行 exit 退出终端,同时容器停止。

工具类容器多使用基础镜像,例如 busybox、debian、ubuntu 等。

  1. 当 CMD 或 Entrypoint 或 docker run 命令行指定的命令运行结束时,容器停止。如下图
  2. 通过 -d 参数在后台启动容器。
  3. 通过 exec -it 可进入容器并执行命令。

指定容器的三种方法:

  1. 短ID。
  2. 长ID。
  3. 容器名称。 可通过 --name 为容器命名。重命名容器可执行docker rename

容器按用途可分为两类:

  1. 服务类的容器。
  2. 工具类的容器。

无效的 none 镜像

另一种类型的 < none>:< none> 镜像是dangling images ,这种类型会造成磁盘空间占用问题。

像这些 dangling镜像主要是我们触发 docker build 和 docker pull命令产生的。

用一个例子来讲解:

假设我们要构建一个新的镜像,Dockerfile 文件如下

 
1
2
FORM Ubuntu:latest
RUN echo ‘hello world’

当我们构建 docker build -t hello-world ./ 的时候,会生成一个新的镜像。

可是过了一个月之后,Ubuntu发布了新的镜像,这个时候我们再次构建一个 hello world镜像,会依赖于最新的 Ubuntu

问题来了,我们引用旧的Ubuntu的hello-world镜像,这个时候就会成为没有标签的 dangling镜像!使用下面的命令可以清理

  1. [root@ken-node3 ~]# docker rmi $(docker images -f "dangling=true" -q)

docker没有自动垃圾回收处理机制,未来可能会有这方面的改进,但是目前我们只能这样手动清理(写个脚本就好)。

Docker介绍及常用操作演示(一)的更多相关文章

  1. Docker介绍及常用操作演示(一)--技术流ken

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互 ...

  2. Git介绍及常用操作演示(一)--技术流ken

    Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...

  3. docker 介绍及安装操作

    docker 介绍及安装操作 1.docker概述 2.docker安装及操作 1.docker概述: Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源 是在L ...

  4. Docker安装及常用操作

    Docker简介: Docker是一个轻量级容器技术,类似于虚拟机技术,但性能远远高于虚拟机,Docker支持将软件编译成一个镜像(image),在这个镜像中做好对软件的各种配置,然后可以运行这个镜像 ...

  5. CI 知识 :Git介绍及常用操作

    Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...

  6. Docker 镜像的常用操作

    镜像作为 Docker 三大核心概念中,最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录 一 Docker 下载镜像 1.1 下 ...

  7. 二、docker 镜像容器常用操作(让我们用docker 溜得飞起)

    前言 上篇讲了我们如何安装docker,现在该我们一展拳脚的时候了.接下来让我们一起学习一下docker常见的操作,让我们能够会使用 docker. 基本概念 在讲使用之前,还是先将一下docker ...

  8. docker swarm的常用操作

    1. 说明 本文档针对docker swarm操作. 针对的系统是以一个本地的测试系统为例.其中机器信息如下,172.16.1.13作为docker swarm的管理机. 本地测试的机器列表信息: 主 ...

  9. docker镜像的常用操作

    获取镜像 比如说我们可以这样操作 当然把这个镜像拉过来时间非常长.   查看镜像列表 命令: docker images 说明: 使用docker images命令可以列出本地主机上已有的镜像. 信息 ...

随机推荐

  1. LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式

    作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...

  2. Ubuntu操作系统(文件传输)

    首先选择Ubuntu版本为偶数版本--(系统比较稳定软件源比较齐全) Ubuntu和windows之间的文件传输首先在Windows上安装连接工具winscp 在Ubuntu开启SSH服务(https ...

  3. SpringBoot中Mybatis打印sql日志

    application.yml中加上 # springBoot+Mybatis 控制台打印SQL语句 (方式一) logging: level: com.zoctan.api.mapper : deb ...

  4. python基础 Day5

    python Day5 字典 其他数据类型的缺点 列表可以存储大量的数据,但是关联性不强. 列表的查询速度比较慢 其容器的数据类型为dict 其数据类型的分类 可变(不可哈希)的数据类型:list d ...

  5. linux命令查询网站

    http://linux.51yip.com/ http://man.linuxde.net/ Linux命令查询手册Linux终端下 esc + . 可以获取上次文件名

  6. 2020.5.27 第七篇 Scrum冲刺博客

    Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...

  7. 火狐Firefox 52.90版是最后一个支持WinXP和Vista的版本

    Firefox 52.90版是最后一个支持 Windows XP 和 Windows Vista 的升级版.(参考:https://support.mozilla.org/zh-CN/kb/firef ...

  8. 安装oracleXE快捷版(一)

    yum找不到包,参考了一些文章,用iso上的包安装了.在文章后面贴有我实际的操作(黑体)和日志. 更换yum源https://www.cnblogs.com/zrxuexi/p/11587173.ht ...

  9. js中map()、some()、every()、filter()的区别

    js的Array对象有map.some.every.filter几个方法都能对数组中的每个对象进行处理,但是他们之间的功能又各有差别,所以在记下. map():通过指定函数处理数组的每个元素,并返回处 ...

  10. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...